summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@nokia.com>2012-01-04 08:16:27 +0100
committerJørgen Lind <jorgen.lind@nokia.com>2012-01-04 10:35:00 +0100
commit4828776fa1e7f8777482fc514c3a65f9cfbf3b8b (patch)
tree75e9a7207f5b78f4efba1c3669f86d1e3909bb59 /examples
parentd5ea033df8cf0a2dec49fce639d84e7dd0a2fced (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.cpp47
-rw-r--r--examples/qwindow-compositor/qwindowcompositor.h6
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