Introducing the PlatformPanel event type.
authorSergio Martins <sergio.martins.qnx@kdab.com>
Tue, 25 Sep 2012 15:46:56 +0000 (16:46 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 3 Oct 2012 11:51:43 +0000 (13:51 +0200)
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 <kevin.krammer@kdab.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Nicolas Arnaud-Cormos <nicolas@kdab.com>
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
src/corelib/kernel/qcoreevent.cpp
src/corelib/kernel/qcoreevent.h
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qguiapplication_p.h
src/gui/kernel/qwindowsysteminterface.cpp
src/gui/kernel/qwindowsysteminterface.h
src/gui/kernel/qwindowsysteminterface_p.h
src/plugins/platforms/qnx/qqnxnavigatoreventhandler.cpp

index 8c4fa01..231e7f3 100644 (file)
@@ -187,6 +187,7 @@ QT_BEGIN_NAMESPACE
     \value PaletteChange                    Palette of the widget changed.
     \value ParentAboutToChange              The widget parent is about to change.
     \value ParentChange                     The widget parent has changed.
+    \value PlatformPanel                    A platform specific panel has been requested.
     \value Polish                           The widget is polished.
     \value PolishRequest                    The widget should be polished.
     \value QueryWhatsThis                   The widget should accept the event if it has "What's This?" help.
index 72733b3..98dde37 100644 (file)
@@ -277,6 +277,8 @@ public:
 
         SockClose = 211,                        // socket closed
 
+        PlatformPanel = 212,
+
         // 512 reserved for Qt Jambi's MetaCall event
         // 513 reserved for Qt Jambi's DeleteOnMainThread event
 
index 46e7334..7e7997d 100644 (file)
@@ -1203,6 +1203,10 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv
         QGuiApplicationPrivate::processTabletLeaveProximityEvent(
                     static_cast<QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *>(e));
         break;
+    case QWindowSystemInterfacePrivate::PlatformPanel:
+        QGuiApplicationPrivate::processPlatformPanelEvent(
+                    static_cast<QWindowSystemInterfacePrivate::PlatformPanelEvent *>(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;
index be5435c..0c81d78 100644 (file)
@@ -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);
index e74a746..5ae55d6 100644 (file)
@@ -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);
 }
index d3fc473..fb85600 100644 (file)
@@ -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);
index b99ac71..87dbeb2 100644 (file)
@@ -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<QWindow> window;
+    };
+
     class WindowSystemEventList {
         QList<WindowSystemEvent *> impl;
         mutable QMutex mutex;
index b427516..19fa9c5 100644 (file)
@@ -75,11 +75,16 @@ void QQnxNavigatorEventHandler::handleOrientationChange(int angle)
 
 void QQnxNavigatorEventHandler::handleSwipeDown()
 {
-    // simulate menu key press
     qNavigatorEventHandlerDebug() << Q_FUNC_INFO;
     QWindow *w = QGuiApplication::focusWindow();
-    QWindowSystemInterface::handleKeyEvent(w, QEvent::KeyPress, Qt::Key_Menu, Qt::NoModifier);
-    QWindowSystemInterface::handleKeyEvent(w, QEvent::KeyRelease, Qt::Key_Menu, Qt::NoModifier);
+
+    if (w) {
+        // Get the top level window that is ancestor of the focus window
+        while (QWindow *parent = w->parent())
+            w = parent;
+
+        QWindowSystemInterface::handlePlatformPanelEvent(w);
+    }
 }
 
 void QQnxNavigatorEventHandler::handleExit()