diff options
Diffstat (limited to 'src/gui/kernel/qwindowsysteminterface.cpp')
-rw-r--r-- | src/gui/kernel/qwindowsysteminterface.cpp | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index 27bb4bae00..d2add91d66 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -46,6 +46,7 @@ #include "private/qtouchdevice_p.h" #include <QAbstractEventDispatcher> #include <qpa/qplatformdrag.h> +#include <qpa/qplatformintegration.h> #include <qdebug.h> QT_BEGIN_NAMESPACE @@ -53,6 +54,8 @@ QT_BEGIN_NAMESPACE QElapsedTimer QWindowSystemInterfacePrivate::eventTime; bool QWindowSystemInterfacePrivate::synchronousWindowsSystemEvents = false; +QWaitCondition QWindowSystemInterfacePrivate::eventsFlushed; +QMutex QWindowSystemInterfacePrivate::flushEventMutex; //------------------------------------------------------------ // @@ -109,9 +112,10 @@ void QWindowSystemInterface::handleEnterLeaveEvent(QWindow *enter, QWindow *leav } } -void QWindowSystemInterface::handleWindowActivated(QWindow *tlw) +void QWindowSystemInterface::handleWindowActivated(QWindow *tlw, Qt::FocusReason r) { - QWindowSystemInterfacePrivate::ActivatedWindowEvent *e = new QWindowSystemInterfacePrivate::ActivatedWindowEvent(tlw); + QWindowSystemInterfacePrivate::ActivatedWindowEvent *e = + new QWindowSystemInterfacePrivate::ActivatedWindowEvent(tlw, r); QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } @@ -122,6 +126,14 @@ void QWindowSystemInterface::handleWindowStateChanged(QWindow *tlw, Qt::WindowSt QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } +void QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState newState) +{ + Q_ASSERT(QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ApplicationState)); + QWindowSystemInterfacePrivate::ApplicationStateChangedEvent *e = + new QWindowSystemInterfacePrivate::ApplicationStateChangedEvent(newState); + QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); +} + void QWindowSystemInterface::handleGeometryChange(QWindow *tlw, const QRect &newRect) { QWindowSystemInterfacePrivate::GeometryChangeEvent *e = new QWindowSystemInterfacePrivate::GeometryChangeEvent(tlw,newRect); @@ -505,9 +517,35 @@ void QWindowSystemInterface::handleExposeEvent(QWindow *tlw, const QRegion ®i QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } +void QWindowSystemInterface::deferredFlushWindowSystemEvents() +{ + Q_ASSERT(QThread::currentThread() == QGuiApplication::instance()->thread()); + + QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex); + flushWindowSystemEvents(); + QWindowSystemInterfacePrivate::eventsFlushed.wakeOne(); +} + void QWindowSystemInterface::flushWindowSystemEvents() { - sendWindowSystemEventsImplementation(QEventLoop::AllEvents); + const int count = QWindowSystemInterfacePrivate::windowSystemEventQueue.count(); + if (!count) + return; + if (!QGuiApplication::instance()) { + qWarning().nospace() + << "QWindowSystemInterface::flushWindowSystemEvents() invoked after " + "QGuiApplication destruction, discarding " << count << " events."; + QWindowSystemInterfacePrivate::windowSystemEventQueue.clear(); + return; + } + if (QThread::currentThread() != QGuiApplication::instance()->thread()) { + QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex); + QWindowSystemInterfacePrivate::FlushEventsEvent *e = new QWindowSystemInterfacePrivate::FlushEventsEvent(); + QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); + QWindowSystemInterfacePrivate::eventsFlushed.wait(&QWindowSystemInterfacePrivate::flushEventMutex); + } else { + sendWindowSystemEventsImplementation(QEventLoop::AllEvents); + } } bool QWindowSystemInterface::sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags) @@ -575,6 +613,12 @@ void QWindowSystemInterface::handleFileOpenEvent(const QString& fileName) QGuiApplicationPrivate::processWindowSystemEvent(&e); } +void QWindowSystemInterface::handleFileOpenEvent(const QUrl &url) +{ + QWindowSystemInterfacePrivate::FileOpenEvent e(url); + QGuiApplicationPrivate::processWindowSystemEvent(&e); +} + void QWindowSystemInterface::handleTabletEvent(QWindow *w, ulong timestamp, bool down, const QPointF &local, const QPointF &global, int device, int pointerType, qreal pressure, int xTilt, int yTilt, qreal tangentialPressure, qreal rotation, int z, qint64 uid, @@ -641,6 +685,13 @@ void QWindowSystemInterface::handleContextMenuEvent(QWindow *w, bool mouseTrigge } #endif +#ifndef QT_NO_DEBUG_STREAM +Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QWindowSystemInterface::TouchPoint &p) { + dbg.nospace() << "TouchPoint(" << p.id << " @" << p.normalPosition << " press " << p.pressure << " vel " << p.velocity << " state " << (int)p.state; + return dbg.space(); +} +#endif + Q_GUI_EXPORT void qt_handleMouseEvent(QWindow *w, const QPointF & local, const QPointF & global, Qt::MouseButtons b, Qt::KeyboardModifiers mods = Qt::NoModifier) { QWindowSystemInterface::handleMouseEvent(w, local, global, b, mods); } |