vcl/unx/gtk3/gtk3gtkinst.cxx |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

New commits:
commit a9a19777d53beb762fabad3a67ddc68ad75bca6c
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Thu May 14 14:47:21 2020 +0200
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Thu May 14 17:25:26 2020 +0200

    Keep order of GDK input events intact
    
    As explained at <https://bugzilla.redhat.com/show_bug.cgi?id=1377293#c12>
    "[Wayland] When typing fast at high CPU load, LibreOffice breaks key 
(letter)
    order":  "with a local LO master --with-lang=ALL ASan+UBSan build (i.e., 
which
    executes somewhat slowly):  When typing 'file' in Writer right after it 
started
    up (but no longer after more typing), that gets garbled as 'fiel'."  The 
reason
    for that (but probably not for the original issue reported in that 
rhbz#1377293)
    apparently was:
    
    Two GDK_KEY_PRESS events (A and B) were in the GTK event queue.
    GtkInstance::AnyInput consumed only A, because it broke from the first while
    loop as soon as it saw the first event of appropriate type.  In the second 
while
    loop it put A back on the end of the GTK event loop, so that it now 
followed B.
    GtkSalFrame::signalKey (vcl/unx/gtk3/gtk3gtkframe.cxx) thus received the 
events
    in the wrong order.
    
    Dropping the "break" also reveals that GtkInstance::AnyInput should 
obviously
    use a queue (i.e., deque) rather than a stack to hold the events it 
consumed and
    needs to re-enqueue.
    
    This appears to be a regression introduced with
    658954e8b50fc264428402dc5a95b0d6f690d191 "Resolves: fdo#48011 writer
    idle-callbacks are halting when events pending".
    
    Change-Id: I87d601df118a20ea3dd59e9cebbcf5176db04be8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94202
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Jenkins

diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 549132dad52e..2c34b5db715e 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7,6 +7,9 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
+#include <sal/config.h>
+
+#include <deque>
 #include <stack>
 #include <string.h>
 #include <osl/process.h>
@@ -402,25 +405,24 @@ bool GtkInstance::AnyInput( VclInputFlags nType )
         return true;
 
     bool bRet = false;
-    std::stack<GdkEvent*> aEvents;
+    std::deque<GdkEvent*> aEvents;
     GdkEvent *pEvent = nullptr;
     while ((pEvent = gdk_event_get()))
     {
-        aEvents.push(pEvent);
+        aEvents.push_back(pEvent);
         VclInputFlags nEventType = categorizeEvent(pEvent);
         if ( (nEventType & nType) || ( nEventType == VclInputFlags::NONE && 
(nType & VclInputFlags::OTHER) ) )
         {
             bRet = true;
-            break;
         }
     }
 
     while (!aEvents.empty())
     {
-        pEvent = aEvents.top();
+        pEvent = aEvents.front();
         gdk_event_put(pEvent);
         gdk_event_free(pEvent);
-        aEvents.pop();
+        aEvents.pop_front();
     }
     return bRet;
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to