diff options
author | Jørgen Lind <jorgen.lind@nokia.com> | 2012-01-04 08:16:27 +0100 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@nokia.com> | 2012-01-04 10:35:00 +0100 |
commit | 4828776fa1e7f8777482fc514c3a65f9cfbf3b8b (patch) | |
tree | 75e9a7207f5b78f4efba1c3669f86d1e3909bb59 /examples | |
parent | d5ea033df8cf0a2dec49fce639d84e7dd0a2fced (diff) |
Make it possible to drag windows around
while holding the windows key down.
Change-Id: I1b5cd7fb39b5ec0ead6a4c312b4bb653a0191a00
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/qwindow-compositor/qwindowcompositor.cpp | 47 | ||||
-rw-r--r-- | examples/qwindow-compositor/qwindowcompositor.h | 6 |
2 files changed, 42 insertions, 11 deletions
diff --git a/examples/qwindow-compositor/qwindowcompositor.cpp b/examples/qwindow-compositor/qwindowcompositor.cpp index d194a4832..b6ad9ca33 100644 --- a/examples/qwindow-compositor/qwindowcompositor.cpp +++ b/examples/qwindow-compositor/qwindowcompositor.cpp @@ -8,6 +8,8 @@ QWindowCompositor::QWindowCompositor(QOpenGLWindow *window) , m_window(window) , m_textureBlitter(0) , m_renderScheduler(this) + , m_draggingWindow(0) + , m_dragKeyIsPressed(false) { enableSubSurfaceExtension(); m_window->makeCurrent(); @@ -182,19 +184,27 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) QMouseEvent *me = static_cast<QMouseEvent *>(event); WaylandSurface *targetSurface = surfaceAt(me->pos(), &local); if (targetSurface) { - if (inputFocus() != targetSurface) { - setInputFocus(targetSurface); - m_surfaces.removeOne(targetSurface); - m_surfaces.append(targetSurface); - m_renderScheduler.start(0); + if (m_dragKeyIsPressed) { + m_draggingWindow = targetSurface; + m_drag_diff = local; + } else { + if (inputFocus() != targetSurface) { + setInputFocus(targetSurface); + m_surfaces.removeOne(targetSurface); + m_surfaces.append(targetSurface); + m_renderScheduler.start(0); + } + targetSurface->sendMousePressEvent(local, me->button()); } - targetSurface->sendMousePressEvent(local, me->button()); } break; } case QEvent::MouseButtonRelease: { WaylandSurface *targetSurface = inputFocus(); - if (targetSurface) { + if (m_draggingWindow) { + m_draggingWindow = 0; + m_drag_diff = QPoint(); + } else if (targetSurface) { QMouseEvent *me = static_cast<QMouseEvent *>(event); targetSurface->sendMouseReleaseEvent(toSurface(targetSurface, me->pos()).toPoint(), me->button()); } @@ -202,13 +212,25 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) } case QEvent::MouseMove: { QMouseEvent *me = static_cast<QMouseEvent *>(event); - QPoint local; - WaylandSurface *targetSurface = surfaceAt(me->pos(), &local); - if (targetSurface) - targetSurface->sendMouseMoveEvent(local); + if (m_draggingWindow) { + QRect geo = m_draggingWindow->geometry(); + geo.moveTopLeft(me->pos() - m_drag_diff); + m_draggingWindow->setGeometry(geo); + m_renderScheduler.start(0); + } else { + QPoint local; + WaylandSurface *targetSurface = surfaceAt(me->pos(), &local); + if (targetSurface) { + targetSurface->sendMouseMoveEvent(local); + } + } } case QEvent::KeyPress: { QKeyEvent *ke = static_cast<QKeyEvent *>(event); + qDebug() << ke->key(); + if (ke->key() == Qt::Key_Meta || ke->key() == Qt::Key_Super_L) { + m_dragKeyIsPressed = true; + } WaylandSurface *targetSurface = inputFocus(); if (targetSurface) targetSurface->sendKeyPressEvent(ke->nativeScanCode()); @@ -216,6 +238,9 @@ bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event) } case QEvent::KeyRelease: { QKeyEvent *ke = static_cast<QKeyEvent *>(event); + if (ke->key() == Qt::Key_Meta || ke->key() == Qt::Key_Super_L) { + m_dragKeyIsPressed = false; + } WaylandSurface *targetSurface = inputFocus(); if (targetSurface) targetSurface->sendKeyReleaseEvent(ke->nativeScanCode()); diff --git a/examples/qwindow-compositor/qwindowcompositor.h b/examples/qwindow-compositor/qwindowcompositor.h index 558451eb9..a061ea880 100644 --- a/examples/qwindow-compositor/qwindowcompositor.h +++ b/examples/qwindow-compositor/qwindowcompositor.h @@ -43,6 +43,12 @@ private: QOpenGLTextureCache *m_textureCache; GLuint m_surface_fbo; QTimer m_renderScheduler; + + //Dragging windows around + WaylandSurface *m_draggingWindow; + bool m_dragKeyIsPressed; + QPoint m_drag_diff; + }; #endif // QWINDOWCOMPOSITOR_H |