From 7333d506de325cebfa485393bae0141dca15cb06 Mon Sep 17 00:00:00 2001 From: Jan Arne Petersen Date: Fri, 1 Nov 2013 11:50:54 +0100 Subject: Improve grab support for QtWayland::Pointer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Track time and serial for press/release events which could result in a grab. Change-Id: I0d56e66ad02ecc9bd5ed234db646e9e96ccae399 Reviewed-by: Jørgen Lind --- src/compositor/wayland_wrapper/qwlpointer.cpp | 56 +++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) (limited to 'src/compositor/wayland_wrapper/qwlpointer.cpp') diff --git a/src/compositor/wayland_wrapper/qwlpointer.cpp b/src/compositor/wayland_wrapper/qwlpointer.cpp index e1e1305e..b459472a 100644 --- a/src/compositor/wayland_wrapper/qwlpointer.cpp +++ b/src/compositor/wayland_wrapper/qwlpointer.cpp @@ -86,6 +86,9 @@ Pointer::Pointer(Compositor *compositor, InputDevice *seat) , m_compositor(compositor) , m_seat(seat) , m_grab(this) + , m_grabButton() + , m_grabTime() + , m_grabSerial() , m_position(100, 100) , m_focus() , m_focusResource() @@ -146,6 +149,26 @@ bool Pointer::buttonPressed() const return m_buttonCount > 0; } +PointerGrabber *Pointer::currentGrab() const +{ + return m_grab; +} + +Qt::MouseButton Pointer::grabButton() const +{ + return m_grabButton; +} + +uint32_t Pointer::grabTime() const +{ + return m_grabTime; +} + +uint32_t Pointer::grabSerial() const +{ + return m_grabSerial; +} + Surface *Pointer::focusSurface() const { return m_focus; @@ -161,6 +184,16 @@ QPointF Pointer::position() const return m_position; } +QPointF Pointer::currentPosition() const +{ + return m_currentPoint; +} + +QtWaylandServer::wl_pointer::Resource *Pointer::focusResource() const +{ + return m_focusResource; +} + void Pointer::pointer_destroy_resource(wl_pointer::Resource *resource) { if (m_focusResource == resource) @@ -177,20 +210,36 @@ void Pointer::setMouseFocus(Surface *surface, const QPointF &localPos, const QPo m_grab->focus(); } +void Pointer::sendButton(uint32_t time, Qt::MouseButton button, uint32_t state) +{ + uint32_t serial = wl_display_next_serial(m_compositor->wl_display()); + send_button(m_focusResource->handle, serial, time, toWaylandButton(button), state); +} + void Pointer::sendMousePressEvent(Qt::MouseButton button, const QPointF &localPos, const QPointF &globalPos) { sendMouseMoveEvent(localPos, globalPos); - m_buttonCount++; uint32_t time = m_compositor->currentTimeMsecs(); + if (m_buttonCount == 0) { + m_grabButton = button; + m_grabTime = time; + } + m_buttonCount++; m_grab->button(time, button, WL_POINTER_BUTTON_STATE_PRESSED); + + if (m_buttonCount == 1) + m_grabSerial = wl_display_get_serial(m_compositor->wl_display()); } void Pointer::sendMouseReleaseEvent(Qt::MouseButton button, const QPointF &localPos, const QPointF &globalPos) { sendMouseMoveEvent(localPos, globalPos); - m_buttonCount--; uint32_t time = m_compositor->currentTimeMsecs(); + m_buttonCount--; m_grab->button(time, button, WL_POINTER_BUTTON_STATE_RELEASED); + + if (m_buttonCount == 1) + m_grabSerial = wl_display_get_serial(m_compositor->wl_display()); } void Pointer::sendMouseMoveEvent(const QPointF &localPos, const QPointF &globalPos) @@ -234,8 +283,7 @@ void Pointer::motion(uint32_t time) void Pointer::button(uint32_t time, Qt::MouseButton button, uint32_t state) { if (m_focusResource) { - uint32_t serial = wl_display_next_serial(m_compositor->wl_display()); - send_button(m_focusResource->handle, serial, time, toWaylandButton(button), state); + sendButton(time, button, state); } if (!buttonPressed() && state == WL_POINTER_BUTTON_STATE_RELEASED) -- cgit v1.2.1