From 723cd931cc15a3ce075c575f1d08e4586177521f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Wed, 27 Oct 2010 16:26:08 +0200 Subject: fix QEventLoop::X11ExcludeTimers with Glib event loop When GSource prepare or check functions return TRUE, Glib does not necessary call the dispatch function immediatelly (probably depends on the ordering of processing events). This means that timerSourceDispatch() may get called from different call of QEventDispatcherGlib::processEvents() than its accompanying timerSourcePrepareHelper() or timerSourceCheckHelper(). This is a problem if a timer becomes pending during a normal processEvents() call but will only be executed during a call to processEvents() with QEventLoop::X11ExcludeTimers. The attached patch fixes this problem by rescheduling the timer for another pass. As for a testcase, this happens when making LibreOffice's KDE integration use Qt event loop, requires setting the useEventLoop property on the QClipboard object, so I'm afraid I don't have anything simple. But fact that Glib can keep an event pending for a little moment is rather obvious from its sources or can be triggered from any Qt application, and I hope the rest is an obvious consequence. Merge-request: 2492 Reviewed-by: Olivier Goffart --- src/corelib/kernel/qeventdispatcher_glib.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp index 8390275..e5136f9 100644 --- a/src/corelib/kernel/qeventdispatcher_glib.cpp +++ b/src/corelib/kernel/qeventdispatcher_glib.cpp @@ -180,6 +180,8 @@ static gboolean timerSourceCheck(GSource *source) static gboolean timerSourceDispatch(GSource *source, GSourceFunc, gpointer) { GTimerSource *timerSource = reinterpret_cast(source); + if (timerSource->processEventsFlags & QEventLoop::X11ExcludeTimers) + return true; timerSource->runWithIdlePriority = true; (void) timerSource->timerList.activateTimers(); return true; // ??? don't remove, right again? -- cgit v0.12