summaryrefslogtreecommitdiff
path: root/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2013-09-06 15:30:15 +0200
committerAndy Nichols <andy.nichols@digia.com>2013-09-20 18:28:03 +0200
commit1a40ec4f8dd333386250fa1ba01826ce83c8e1a0 (patch)
tree6940c7f86f0d5895cb3017e21ca8e79eb75afe50 /src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
parent4a789f67dcc397125b4b13949a0f6c05a5ac840a (diff)
downloadqtwayland-1a40ec4f8dd333386250fa1ba01826ce83c8e1a0.tar.gz
Support application internal mouse grabbing for popup windows
Mouse grabbing is used to close a popup window when the user clicks on another window. Wayland doesn't support mouse grabbing by design and sends an event when the user clicks on a window of another application. This patch fakes mouse grabbing for the windows of the application the popup belongs to, so that it closes when the user clicks on a window of the same application. Change-Id: Iac210bed0ca0fc6d3ffdbdb76d069886de51cf04 Reviewed-by: Jan Arne Petersen <jan.petersen@kdab.com> Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> Reviewed-by: Andrew Knight <andrew.knight@digia.com> Reviewed-by: Andy Nichols <andy.nichols@digia.com>
Diffstat (limited to 'src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp')
-rw-r--r--src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
index e081601d..3fe6ca30 100644
--- a/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
+++ b/src/plugins/platforms/wayland_common/qwaylandinputdevice.cpp
@@ -223,8 +223,11 @@ void QWaylandInputDevice::pointer_enter(uint32_t serial, struct wl_surface *surf
mSerial = serial;
mEnterSerial = serial;
- window->handleMouseEnter(this);
- window->handleMouse(this, mTime, mSurfacePos, mGlobalPos, mButtons, Qt::NoModifier);
+ QWaylandWindow *grab = QWaylandWindow::mouseGrab();
+ if (!grab) {
+ window->handleMouseEnter(this);
+ window->handleMouse(this, mTime, mSurfacePos, mGlobalPos, mButtons, Qt::NoModifier);
+ }
}
void QWaylandInputDevice::pointer_leave(uint32_t time, struct wl_surface *surface)
@@ -234,8 +237,10 @@ void QWaylandInputDevice::pointer_leave(uint32_t time, struct wl_surface *surfac
if (!surface)
return;
- QWaylandWindow *window = QWaylandWindow::fromWlSurface(surface);
- window->handleMouseLeave(this);
+ if (!QWaylandWindow::mouseGrab()) {
+ QWaylandWindow *window = QWaylandWindow::fromWlSurface(surface);
+ window->handleMouseLeave(this);
+ }
mPointerFocus = 0;
mButtons = Qt::NoButton;
@@ -264,7 +269,15 @@ void QWaylandInputDevice::pointer_motion(uint32_t time, wl_fixed_t surface_x, wl
mGlobalPos = global;
mTime = time;
- window->handleMouse(this, time, mSurfacePos, mGlobalPos, mButtons, Qt::NoModifier);
+ QWaylandWindow *grab = QWaylandWindow::mouseGrab();
+ if (grab && grab != window) {
+ // We can't know the true position since we're getting events for another surface,
+ // so we just set it outside of the window boundaries.
+ pos = QPointF(-1, -1);
+ global = grab->window()->mapToGlobal(pos.toPoint());
+ grab->handleMouse(this, time, pos, global, mButtons, Qt::NoModifier);
+ } else
+ window->handleMouse(this, time, mSurfacePos, mGlobalPos, mButtons, Qt::NoModifier);
}
void QWaylandInputDevice::pointer_button(uint32_t serial, uint32_t time,
@@ -304,7 +317,12 @@ void QWaylandInputDevice::pointer_button(uint32_t serial, uint32_t time,
mTime = time;
mSerial = serial;
- if (window)
+ QWaylandWindow *grab = QWaylandWindow::mouseGrab();
+ if (grab && grab != mPointerFocus) {
+ QPointF pos = QPointF(-1, -1);
+ QPointF global = grab->window()->mapToGlobal(pos.toPoint());
+ grab->handleMouse(this, time, pos, global, mButtons, Qt::NoModifier);
+ } else if (window)
window->handleMouse(this, time, mSurfacePos, mGlobalPos, mButtons, Qt::NoModifier);
}