Kaydet (Commit) aeda478a authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

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
üst d4cc603a
......@@ -61,9 +61,13 @@ KDEXLib::KDEXLib() :
eventLoopType( LibreOfficeEventLoop ),
m_bYieldFrozen( false ), m_frameWidth( -1 )
{
// 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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment