summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp
Commit message (Collapse)AuthorAgeFilesLines
* glib dispatcher: rework userEventSourcePrepare() event sourceGatis Paeglis2018-10-141-5/+3
| | | | | | | | | | | | | | | | | | | | | | | This is a better solution for fbb485d4f6985643b27da3cc6c5b5f960c32e74d. The existing solution was working fine, but it was exposing logic that is internal to QWindowSystemInterface and platform plugin interaction. Some platform plugins do event filtering at native event level - those that support QAbstractEventDispatcher::filterNativeEvent(). Other plugins rely on QWindowSystemInterface to do the filtering. Dispatchers should not care about this. The new logic rely on the fact that QWindowSystemInterfacePrivate::handleWindowSystemEvent calls QAbstractEventDispatcher::wakeUp(). The same way postEventSourcePrepare() rely on QCoreApplication::postEvent() to call QAbstractEventDispatcher::wakeUp(). Event sources run in the order they are attached, postEventSourcePrepare runs before userEventSourcePrepare(). We rely on that order to pass wakeUpCalled value. Change-Id: I0327f4f2398fd863fb2421b8033bb1df8d65f5af Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Revert "glib dispatcher: ensure all window system events are flushed"Gatis Paeglis2018-10-121-2/+54
| | | | | | | | | | | | | | | | | | | This reverts commit 341bfcd1eaa9116c143e3b7d3219ef04c7b8a0cb. As it turns out there might be use cases where we want to have proper windowing system event integration with glib dispatcher via g_source_attach(). For example with gtk_dialog_run, where GTK blocks in a recursive main loop. We want to continue dispatcing our windowing system events during this nested event loop. Not having a proper glib integration can result in rendering issues, e.g. when resizing parent window via mouse while GTK-based dialog is shown. Can be seen on examples/widgets/richtext/textedit/ -> Format (from menu) -> "Color..." The issue from 341bfcd1eaa actually should be fixed inside XCB platform plugin, by improving integration with event dispatcher. That is handled in follow-up patches. Change-Id: Icabc6d841a554aefbdd460765a3165d22e65f651 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
* glib dispatcher: ensure all window system events are flushedGatis Paeglis2017-08-041-54/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ... when QCoreApplication::processEvents() returns. This is the expected behavior according to the documentation. Checked also the QUnixEventDispatcherQPA dispatcher, which did work according to the documentation. The sequence of events that causes the bad behavior: 1) XCB plugin sends a signals whenever there are new XCB events available for processing. This signal is connected to QXcbConnection::processXcbEvents, which will cause XCB events to be added to the QWindowSystemInterface (QWSI) event queue. 2) When QCoreApplication::processEvents() is called, glib event dispatcher does one iteration on all attached event sources. First it checks which sources are ready, and after that starts dispatching events from each source that reported to be ready. 3) In the case when there are no events in QWSI event queue, the source that handles QWSI event dispatcing returns 'false'; If at the same iteration the source that sends posted events (via QCoreApplication::sendPostedEvents()) has returned 'true' and one of the posted events is to call QXcbConnection::processXcbEvents (due to signal from step 1) then we get an assert in the following code: QCoreApplication::processEvents(); Q_ASSERT(QWindowSystemInterface::windowSystemEventsQueued() == 0); This happens because QXcbConnection::processXcbEvents has posted new events, but they were not dispatched in this iteration. They would be dispatched in the next iteration. Events being dispatched on subsequent iteration doesn't really matter for Qt application, but is inconsistent from API point of view. If we were populating QWSI queue from non-Gui thread, then it would be possible that windowSystemEventsQueued() != 0, but that is not the case on XCB (don't know about other platforms). The issue could be fixed by always returning true from "check source" and then simply dispatch 0 events at "dispatch" step if there isn't any in the queue. But a better solution is to remove the event source all together. It is completely unnecessary to have this indirection, when we can handle QWSI event dispatch directly from Qt (like we do, for example, in QUnixEventDispatcherQPA and QWinRTEventDispatcher). Not having Glib event source for QWSI events would have also avoided issues that were fixed by fbb485d4f6985643b27da3cc6c5b5f960c32e74d. Note, after this re-factoring QWindowSystemInterface::nonUserInputEventsQueued is now unused, but I left it in as the API by itself is all right. Task-number: QTBUG-62297 Change-Id: Ia245b835676bd87e63bf02b67036b42a3b1593cc Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Prevent busy loop in glib event dispatcherGatis Paeglis2017-04-241-6/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | .. when running event loop with QEventLoop::ExcludeUserInputEvents. In a properly functioning code, g_main_context_iteration is expected to block until any event source becomes ready to dispatch an event (or interrupt occurs). Qt provides several custom event sources to the Glib event loop. The bug (busy loop) was caused by faulty event source implementation when QEventLoop::ExcludeUserInputEvents is set. As long as the window system's event queue was not empty, we signaled to the event dispatcher that there is an event ready to be dispatched. This results in the dispatcher calling the relevant dispatch function (which does handle the ExcludeUserInputEvents flag correctly). As we do not dispatch user events, the window system's event queue never becomes empty and we enter a busy loop (CPU running at 100%) where we signal that we have events to dispatch, but we actually do not dispatch them and g_main_context_iteration never gets to block. This busy loop can cause blocking GTK functions such as gtk_dialog_run() never return. Task-number: QTBUG-59760 Task-number: QTBUG-57101 Change-Id: I545b7951108eeaba019614ae8f5a1168c8b26c27 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Gunnar Sletta <gunnar@crimson.no>
* Updated license headersJani Heikkinen2016-01-151-14/+20
| | | | | | | | | | | From Qt 5.7 -> LGPL v2.1 isn't an option anymore, see http://blog.qt.io/blog/2016/01/13/new-agreement-with-the-kde-free-qt-foundation/ Updated license headers to use new LGPL header instead of LGPL21 one (in those files which will be under LGPL v3) Change-Id: I046ec3e47b1876cd7b4b0353a576b352e3a946d9 Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* Update copyright headersJani Heikkinen2015-02-111-7/+7
| | | | | | | | | | | | | | | | | | Qt copyrights are now in The Qt Company, so we could update the source code headers accordingly. In the same go we should also fix the links to point to qt.io. Outdated header.LGPL removed (use header.LGPL21 instead) Old header.LGPL3 renamed to header.LGPL3-COMM to match actual licensing combination. New header.LGPL-COMM taken in the use file which were using old header.LGPL3 (src/plugins/platforms/android/extract.cpp) Added new header.LGPL3 containing Commercial + LGPLv3 + GPLv2 license combination Change-Id: I6f49b819a8a20cc4f88b794a8f6726d975e8ffbe Reviewed-by: Matti Paaso <matti.paaso@theqtcompany.com>
* Update license headers and add new license filesMatti Paaso2014-09-241-19/+11
| | | | | | | | | - Renamed LICENSE.LGPL to LICENSE.LGPLv21 - Added LICENSE.LGPLv3 - Removed LICENSE.GPL Change-Id: Iec3406e3eb3f133be549092015cefe33d259a3f2 Reviewed-by: Iikka Eklund <iikka.eklund@digia.com>
* Update copyright year in Digia's license headersSergio Ahumada2013-01-181-1/+1
| | | | | Change-Id: Ic804938fc352291d011800d21e549c10acac66fb Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* Fix warning - unused variable (d-pointer)Frederik Gladhorn2012-12-141-2/+0
| | | | | Change-Id: I6bc47f12e60bfbda60e3f242d3b680d5684903ea Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
* Return something from QPAEventDispatcherGlib::processEventshjk2012-11-231-1/+1
| | | | | | Change-Id: I0abaf73d4b6b96dbcf499ea86749ced76348c281 Reviewed-by: Oliver Wolff <oliver.wolff@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
* QPAEventDispatcherGlib: Use correct flags when sending eventsOliver Wolff2012-11-211-3/+15
| | | | | | | | | | Instead of assuming that all events should be handled when a user event occurs, userEventSourceDispatch has to use the flags used in QPAEventDispatcherGlib::processEvents. Task-number: QTBUG-27595 Change-Id: Ib13607f89f7d3207ec83ab26f7d59b3c59a28c4e Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
* Change copyrights from Nokia to DigiaIikka Eklund2012-09-221-24/+24
| | | | | | | | Change copyrights and license headers from Nokia to Digia Change-Id: If1cc974286d29fd01ec6c19dd4719a67f4c3f00e Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
* WindowSystemInterface::sendWindowSystemEvents(): Remove unused parameter.Friedemann Kleint2012-07-231-3/+2
| | | | | | | | No need to pass the dispatcher. Get rid of Windows logic to maintain a stack of dispatcher associated with flags. Change-Id: Ic2daad4b6762a46fac3274937effc188af436c9a Reviewed-by: David Faure <faure@kde.org>
* Remove "All rights reserved" line from license headers.Jason McDonald2012-01-301-1/+1
| | | | | | | | | | As in the past, to avoid rewriting various autotests that contain line-number information, an extra blank line has been inserted at the end of the license text to ensure that this commit does not change the total number of lines in the license header. Change-Id: I311e001373776812699d6efc045b5f742890c689 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Update contact information in license headers.Jason McDonald2012-01-231-1/+1
| | | | | | | Replace Nokia contact email address with Qt Project website. Change-Id: I431bbbf76d7c27d8b502f87947675c116994c415 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Update copyright year in license headers.Jason McDonald2012-01-051-1/+1
| | | | | Change-Id: I02f2c620296fcd91d4967d58767ea33fc4e1e7dc Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Compile.Morten Johan Sorvig2011-06-231-1/+1
|
* Add QWindowSystemInterface::windowSystemEventsQueued()Morten Sorvig2011-06-231-1/+1
| | | | | | This removes the last use of QWindowSystemInterfacePrivate from outside QtGui, so we can make that class non-exported again.
* Refactor window system event dispatching.Morten Sorvig2011-06-231-17/+1
| | | | | | | | | | Add QWindowSystemInterface::sendWindowSystemEvents, which contains the canonical "empty and send queued window system events" implementation. Make the Cocoa, QPA, and GLIB dispatchers use the new implementation. Cocoa now no longer inherits from QPA.
* Add lighthouse event dispatcher API.Morten Sorvig2011-06-221-0/+133
Platform plugin creation is now moved forward in order to have a platform plugin instance at event dispatcher creation time. Plugins are now responsible for implementing PlatformIntegration::createEventDispatcher and returning an QAbstractEventDispatcher subclass.