[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - vcl/unx

Jan-Marek Glogowski glogow at fbihome.de
Mon Mar 10 10:10:58 PDT 2014


 vcl/unx/kde4/KDEXLib.cxx |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

New commits:
commit 7dba6e0a71d090f06a6a1a39e87572674593b48a
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Mon Mar 10 14:44:05 2014 +0000

    fdo#73115: Always run timeouts as events
    
    Right-click popup menus run click events throught the LO main loop.
    In case of KDE4 the LO main loop is run by a timer in the main thread,
    with Qt::DirectConnection execution.
    
    If the timeout actually starts a nested event loop for a new dialog,
    the timer is blocked, the nested mainloop detects it was started
    from the timeout and drops the blocked timout from polling, which
    blocks any further LibreOffice event loop processing.
    
    This changes the timers to Qt::QueuedConnection, so they always
    generate an event and are processed by the Qt event loop.
    
    Change-Id: Ie626b22be3d8f9b8934bcc5e9e0e67a365549cfc
    (cherry picked from commit aeda478a02523cec146f6af69710f0391061db56)
    Reviewed-on: https://gerrit.libreoffice.org/8514
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/kde4/KDEXLib.cxx b/vcl/unx/kde4/KDEXLib.cxx
index b4be6d6..4a9b70b 100644
--- a/vcl/unx/kde4/KDEXLib.cxx
+++ b/vcl/unx/kde4/KDEXLib.cxx
@@ -67,9 +67,13 @@ KDEXLib::KDEXLib() :
     eventLoopType( LibreOfficeEventLoop ),
     m_bYieldFrozen( false )
 {
-    // the timers created here means they belong to the main thread
-    connect( &timeoutTimer, SIGNAL( timeout()), this, SLOT( timeoutActivated()));
-    connect( &userEventTimer, SIGNAL( timeout()), this, SLOT( userEventActivated()));
+    // the timers created here means they belong to the main thread.
+    // As the timeoutTimer runs the LO event queue, which may block on a dialog,
+    // the timer has to use a Qt::QueuedConnection, otherwise the nested event
+    // loop will detect the blocking timer and drop it from the polling
+    // freezing LO X11 processing.
+    connect( &timeoutTimer, SIGNAL( timeout()), this, SLOT( timeoutActivated()), Qt::QueuedConnection );
+    connect( &userEventTimer, SIGNAL( timeout()), this, SLOT( userEventActivated()), Qt::QueuedConnection );
 
     // QTimer::start() can be called only in its (here main) thread, so this will
     // forward between threads if needed


More information about the Libreoffice-commits mailing list