summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2012-05-19 20:31:10 +0300
committerJørgen Lind <jorgen.lind@nokia.com>2012-05-21 08:40:08 +0200
commit0865b32ead803234158fac199f875d348e209104 (patch)
tree896022a06ffad71270d5dc16e61b9daf3b11b425 /examples
parent91982e550684777a2036ff0964d410d0dc9f2f9b (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.cpp16
-rw-r--r--examples/qwindow-compositor/qwindowcompositor.h1
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