diff options
author | Laszlo Agocs <laszlo.p.agocs@nokia.com> | 2012-05-19 20:31:10 +0300 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@nokia.com> | 2012-05-21 08:40:08 +0200 |
commit | 0865b32ead803234158fac199f875d348e209104 (patch) | |
tree | 896022a06ffad71270d5dc16e61b9daf3b11b425 /examples | |
parent | 91982e550684777a2036ff0964d410d0dc9f2f9b (diff) |
qwindow-compositor: Avoid stuck alt when running non-fullscreen
Change-Id: I9d2129e2e746704f1fc0e8f6243fe3b8b7224456
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/qwindow-compositor/qwindowcompositor.cpp | 16 | ||||
-rw-r--r-- | examples/qwindow-compositor/qwindowcompositor.h | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/examples/qwindow-compositor/qwindowcompositor.cpp b/examples/qwindow-compositor/qwindowcompositor.cpp index 7162e2b92..831f2bd4e 100644 --- a/examples/qwindow-compositor/qwindowcompositor.cpp +++ b/examples/qwindow-compositor/qwindowcompositor.cpp @@ -58,6 +58,7 @@ QWindowCompositor::QWindowCompositor(QOpenGLWindow *window) , m_renderScheduler(this) , m_draggingWindow(0) , m_dragKeyIsPressed(false) + , m_modifiers(Qt::NoModifier) { enableSubSurfaceExtension(); m_window->makeCurrent(); @@ -257,6 +258,19 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) switch (event->type()) { case QEvent::Expose: m_renderScheduler.start(0); + if (m_window->isExposed()) { + // Alt-tabbing away normally results in the alt remaining in + // pressed state in the clients xkb state. Prevent this by sending + // a release. This is not an issue in a "real" compositor but + // is very annoying when running in a regular window on xcb. + Qt::KeyboardModifiers mods = QGuiApplication::queryKeyboardModifiers(); + if (m_modifiers != mods && input->keyboardFocus()) { + Qt::KeyboardModifiers stuckMods = m_modifiers ^ mods; + if (stuckMods & Qt::AltModifier) + input->sendKeyReleaseEvent(64); // native scancode for left alt + m_modifiers = mods; + } + } break; case QEvent::MouseButtonPress: { QPointF local; @@ -312,6 +326,7 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) if (ke->key() == Qt::Key_Meta || ke->key() == Qt::Key_Super_L) { m_dragKeyIsPressed = true; } + m_modifiers = ke->modifiers(); WaylandSurface *targetSurface = input->keyboardFocus(); if (targetSurface) input->sendKeyPressEvent(ke->nativeScanCode()); @@ -322,6 +337,7 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) if (ke->key() == Qt::Key_Meta || ke->key() == Qt::Key_Super_L) { m_dragKeyIsPressed = false; } + m_modifiers = ke->modifiers(); WaylandSurface *targetSurface = input->keyboardFocus(); if (targetSurface) input->sendKeyReleaseEvent(ke->nativeScanCode()); diff --git a/examples/qwindow-compositor/qwindowcompositor.h b/examples/qwindow-compositor/qwindowcompositor.h index 78bab6999..c41133241 100644 --- a/examples/qwindow-compositor/qwindowcompositor.h +++ b/examples/qwindow-compositor/qwindowcompositor.h @@ -96,6 +96,7 @@ private: bool m_dragKeyIsPressed; QPointF m_drag_diff; + Qt::KeyboardModifiers m_modifiers; }; #endif // QWINDOWCOMPOSITOR_H |