From: Sergio Martins Date: Tue, 25 Sep 2012 15:46:56 +0000 (+0100) Subject: Introducing the PlatformPanel event type. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9695df4d44b228e7e778ff17d5cccac30967b1fd;p=profile%2Fivi%2Fqtbase.git 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 --- diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index 8c4fa01..231e7f3 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -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. diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index 72733b3..98dde37 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -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 diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 46e7334..7e7997d 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 be5435c..0c81d78 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 e74a746..5ae55d6 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 d3fc473..fb85600 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 b99ac71..87dbeb2 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; diff --git a/src/plugins/platforms/qnx/qqnxnavigatoreventhandler.cpp b/src/plugins/platforms/qnx/qqnxnavigatoreventhandler.cpp index b427516..19fa9c5 100644 --- a/src/plugins/platforms/qnx/qqnxnavigatoreventhandler.cpp +++ b/src/plugins/platforms/qnx/qqnxnavigatoreventhandler.cpp @@ -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()