[mutter] wayland/pointer: Add way to cancel current grab
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland/pointer: Add way to cancel current grab
- Date: Wed, 12 Oct 2016 02:50:46 +0000 (UTC)
commit 6e7057426e99c0f40603416c3273393f97865796
Author: Jonas Ådahl <jadahl gmail com>
Date: Wed Sep 21 14:33:47 2016 +0800
wayland/pointer: Add way to cancel current grab
Previously a grab could suddenly end without the grabber knowing
anything about it. Some grabs assume they won't suddenly end without
notice, and can use then new 'cancel' vfunc to be notified.
Currently a grab is cancelled when a new one is started (i.e. in
meta_wayland_pointer_grab_start()), when a non-popup compositor wide
event route is initiated, and when the seat looses the pointer
capability.
https://bugzilla.gnome.org/show_bug.cgi?id=771858
src/wayland/meta-wayland-pointer.c | 15 +++++++++++++++
src/wayland/meta-wayland-pointer.h | 1 +
2 files changed, 16 insertions(+), 0 deletions(-)
---
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 55fcb06..7122d09 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -89,6 +89,9 @@ G_DEFINE_TYPE (MetaWaylandPointer, meta_wayland_pointer,
static void
meta_wayland_pointer_reset_grab (MetaWaylandPointer *pointer);
+static void
+meta_wayland_pointer_cancel_grab (MetaWaylandPointer *pointer);
+
static MetaWaylandPointerClient *
meta_wayland_pointer_client_new (void)
{
@@ -226,6 +229,8 @@ sync_focus_surface (MetaWaylandPointer *pointer)
case META_EVENT_ROUTE_COMPOSITOR_GRAB:
case META_EVENT_ROUTE_FRAME_BUTTON:
/* The compositor has a grab, so remove our focus... */
+ meta_wayland_pointer_cancel_grab (pointer);
+ meta_wayland_pointer_reset_grab (pointer);
meta_wayland_pointer_set_focus (pointer, NULL);
break;
@@ -498,6 +503,7 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
pointer->cursor_surface_destroy_id);
}
+ meta_wayland_pointer_cancel_grab (pointer);
meta_wayland_pointer_reset_grab (pointer);
meta_wayland_pointer_set_focus (pointer, NULL);
@@ -862,6 +868,8 @@ meta_wayland_pointer_start_grab (MetaWaylandPointer *pointer,
{
const MetaWaylandPointerGrabInterface *interface;
+ meta_wayland_pointer_cancel_grab (pointer);
+
pointer->grab = grab;
interface = pointer->grab->interface;
grab->pointer = pointer;
@@ -887,6 +895,13 @@ meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer)
meta_wayland_pointer_update_cursor_surface (pointer);
}
+static void
+meta_wayland_pointer_cancel_grab (MetaWaylandPointer *pointer)
+{
+ if (pointer->grab->interface->cancel)
+ pointer->grab->interface->cancel (pointer->grab);
+}
+
void
meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer)
{
diff --git a/src/wayland/meta-wayland-pointer.h b/src/wayland/meta-wayland-pointer.h
index 1076592..547cd56 100644
--- a/src/wayland/meta-wayland-pointer.h
+++ b/src/wayland/meta-wayland-pointer.h
@@ -46,6 +46,7 @@ struct _MetaWaylandPointerGrabInterface
const ClutterEvent *event);
void (*button) (MetaWaylandPointerGrab *grab,
const ClutterEvent *event);
+ void (*cancel) (MetaWaylandPointerGrab *grab);
};
struct _MetaWaylandPointerGrab
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]