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 <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>
bb10
Sergio Martins 2012-09-25 16:46:56 +01:00 committed by The Qt Project
parent c79f0f0fba
commit 9695df4d44
8 changed files with 48 additions and 4 deletions

View 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.

View 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

View 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;

View 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);

View 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);
}

View 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);

View 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;

View 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()