diff options
author | James McDonnell <jmcdonnell@blackberry.com> | 2018-04-26 12:33:13 -0400 |
---|---|---|
committer | James McDonnell <jmcdonnell@blackberry.com> | 2018-05-04 14:20:56 +0000 |
commit | fc356a1992753059be34929959ed252e19ff5c7a (patch) | |
tree | ac26c6ea8f7eede9308aa3f844b10053208661c3 /src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp | |
parent | 1e9da7b3fd06dd3edd642d0f6479199b5174c928 (diff) |
QNX: Move screen event retrieval to the GUI thread
Instead of retrieving screen events itself, the screen event thread
now turns screen event notification into a Qt signal. In response to
the signal, the GUI thread processes screen events. Eliminates the
need to coordinate access to a screen event queue. Also prepares the
way for getting rid of the screen event thread. This could be done if
the QNX event dispatcher were switched from poll to MsgReceive
(dispatch).
Change-Id: If5892466d04d67f00828fddaea38b20da5fb18a3
Reviewed-by: Janne Koskinen <janne.p.koskinen@qt.io>
Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
Diffstat (limited to 'src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp')
-rw-r--r-- | src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp index f211883e4f..c6b5bd7396 100644 --- a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp +++ b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp @@ -197,36 +197,39 @@ void QQnxScreenEventHandler::injectKeyboardEvent(int flags, int sym, int modifie void QQnxScreenEventHandler::setScreenEventThread(QQnxScreenEventThread *eventThread) { m_eventThread = eventThread; + connect(m_eventThread, &QQnxScreenEventThread::eventsPending, + this, &QQnxScreenEventHandler::processEvents); } -void QQnxScreenEventHandler::processEventsFromScreenThread() +void QQnxScreenEventHandler::processEvents() { if (!m_eventThread) return; - QQnxScreenEventArray *events = m_eventThread->lock(); + screen_event_t event = nullptr; + if (screen_create_event(&event) != 0) + return; - for (int i = 0; i < events->size(); ++i) { - screen_event_t event = events->at(i); - if (!event) - continue; - (*events)[i] = 0; + int count = 0; + for (;;) { + if (screen_get_event(m_eventThread->context(), event, 0) != 0) + break; - m_eventThread->unlock(); + int type = SCREEN_EVENT_NONE; + screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type); + if (type == SCREEN_EVENT_NONE) + break; + ++count; long result = 0; QAbstractEventDispatcher* dispatcher = QAbstractEventDispatcher::instance(); bool handled = dispatcher && dispatcher->filterNativeEvent(QByteArrayLiteral("screen_event_t"), event, &result); if (!handled) handleEvent(event); - screen_destroy_event(event); - - m_eventThread->lock(); } - events->clear(); - - m_eventThread->unlock(); + m_eventThread->armEventsPending(count); + screen_destroy_event(event); } void QQnxScreenEventHandler::handleKeyboardEvent(screen_event_t event) |