From 9695df4d44b228e7e778ff17d5cccac30967b1fd Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Tue, 25 Sep 2012 16:46:56 +0100 Subject: Introducing the PlatformPanel event type. This event can be used by any platform plugin to implement special application panels/overlayed menus. Currently used by QNX only. This replaces sending fake Qt::Key_Menu presses in the QNX plugin. Qt::Key_Menu is already used when invoking context menus with the keyboard. Change-Id: I9c8f1743fd147a07c11883323800017376915ae1 Reviewed-by: Kevin Krammer Reviewed-by: Sean Harmer Reviewed-by: Nicolas Arnaud-Cormos Reviewed-by: Paul Olav Tvete --- src/gui/kernel/qguiapplication.cpp | 18 ++++++++++++++++++ src/gui/kernel/qguiapplication_p.h | 2 ++ src/gui/kernel/qwindowsysteminterface.cpp | 7 +++++++ src/gui/kernel/qwindowsysteminterface.h | 1 + src/gui/kernel/qwindowsysteminterface_p.h | 10 +++++++++- 5 files changed, 37 insertions(+), 1 deletion(-) (limited to 'src/gui') diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 46e7334e37..7e7997d7eb 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1203,6 +1203,10 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv QGuiApplicationPrivate::processTabletLeaveProximityEvent( static_cast(e)); break; + case QWindowSystemInterfacePrivate::PlatformPanel: + QGuiApplicationPrivate::processPlatformPanelEvent( + static_cast(e)); + break; default: qWarning() << "Unknown user input event type:" << e->type; break; @@ -1617,6 +1621,20 @@ void QGuiApplicationPrivate::processTabletLeaveProximityEvent(QWindowSystemInter #endif } +void QGuiApplicationPrivate::processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e) +{ + if (!e->window) + return; + + if (e->window->d_func()->blockedByModalWindow) { + // a modal window is blocking this window, don't allow events through + return; + } + + QEvent ev(QEvent::PlatformPanel); + QGuiApplication::sendSpontaneousEvent(e->window.data(), &ev); +} + Q_GUI_EXPORT uint qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k) { return qHash(k.device) + k.touchPointId; diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index be5435c0bc..0c81d78f86 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -137,6 +137,8 @@ public: static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e); static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e); + static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e); + #ifndef QT_NO_DRAGANDDROP static QPlatformDragQtResponse processDrag(QWindow *w, const QMimeData *dropData, const QPoint &p, Qt::DropActions supportedActions); static QPlatformDropQtResponse processDrop(QWindow *w, const QMimeData *dropData, const QPoint &p, Qt::DropActions supportedActions); diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index e74a7464b1..5ae55d6307 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -604,6 +604,13 @@ void QWindowSystemInterface::handleTabletLeaveProximityEvent(int device, int poi handleTabletLeaveProximityEvent(time, device, pointerType, uid); } +void QWindowSystemInterface::handlePlatformPanelEvent(QWindow *w) +{ + QWindowSystemInterfacePrivate::PlatformPanelEvent *e = + new QWindowSystemInterfacePrivate::PlatformPanelEvent(w); + QWindowSystemInterfacePrivate::queueWindowSystemEvent(e); +} + 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); } diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h index d3fc4734fe..fb856004b4 100644 --- a/src/gui/kernel/qwindowsysteminterface.h +++ b/src/gui/kernel/qwindowsysteminterface.h @@ -176,6 +176,7 @@ public: static void handleTabletLeaveProximityEvent(ulong timestamp, int device, int pointerType, qint64 uid); static void handleTabletLeaveProximityEvent(int device, int pointerType, qint64 uid); + static void handlePlatformPanelEvent(QWindow *w); // For event dispatcher implementations static bool sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags); diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h index b99ac71bb3..87dbeb2a9c 100644 --- a/src/gui/kernel/qwindowsysteminterface_p.h +++ b/src/gui/kernel/qwindowsysteminterface_p.h @@ -76,7 +76,8 @@ public: FileOpen, Tablet, TabletEnterProximity, - TabletLeaveProximity + TabletLeaveProximity, + PlatformPanel }; class WindowSystemEvent { @@ -325,6 +326,13 @@ public: qint64 uid; }; + class PlatformPanelEvent : public WindowSystemEvent { + public: + explicit PlatformPanelEvent(QWindow *w) + : WindowSystemEvent(PlatformPanel), window(w) { } + QPointer window; + }; + class WindowSystemEventList { QList impl; mutable QMutex mutex; -- cgit v1.2.3