wayland/pointer: Use glib signals tracking focus surface

Use the "destroy" MetaWaylandSurface signal instead of the wl_resource
destroy signal for tracking the lifetime of the surface with pointer
focus.

As unsetting the focus may have side effects due to handlers of the
"focus-surface-changed" signal, connect the signal after the default
handler to make sure other clean up facilities have the chance deal with
the surface destruction before we try to unset the focus.

https://bugzilla.gnome.org/show_bug.cgi?id=783113
This commit is contained in:
Jonas Ådahl 2017-05-31 17:24:07 +08:00
parent 8699aca7d7
commit bbed0d8045
2 changed files with 16 additions and 14 deletions

View File

@ -246,14 +246,6 @@ sync_focus_surface (MetaWaylandPointer *pointer)
} }
static void
pointer_handle_focus_surface_destroy (struct wl_listener *listener, void *data)
{
MetaWaylandPointer *pointer = wl_container_of (listener, pointer, focus_surface_listener);
meta_wayland_pointer_set_focus (pointer, NULL);
}
static void static void
meta_wayland_pointer_send_frame (MetaWaylandPointer *pointer, meta_wayland_pointer_send_frame (MetaWaylandPointer *pointer,
struct wl_resource *resource) struct wl_resource *resource)
@ -488,8 +480,6 @@ meta_wayland_pointer_enable (MetaWaylandPointer *pointer)
g_hash_table_new_full (NULL, NULL, NULL, g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) meta_wayland_pointer_client_free); (GDestroyNotify) meta_wayland_pointer_client_free);
pointer->focus_surface_listener.notify = pointer_handle_focus_surface_destroy;
pointer->cursor_surface = NULL; pointer->cursor_surface = NULL;
manager = clutter_device_manager_get_default (); manager = clutter_device_manager_get_default ();
@ -815,6 +805,13 @@ meta_wayland_pointer_broadcast_leave (MetaWaylandPointer *pointer,
meta_wayland_pointer_broadcast_frame (pointer); meta_wayland_pointer_broadcast_frame (pointer);
} }
static void
focus_surface_destroyed (MetaWaylandSurface *surface,
MetaWaylandPointer *pointer)
{
meta_wayland_pointer_set_focus (pointer, NULL);
}
void void
meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer, meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
MetaWaylandSurface *surface) MetaWaylandSurface *surface)
@ -838,7 +835,9 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
pointer->focus_client = NULL; pointer->focus_client = NULL;
} }
wl_list_remove (&pointer->focus_surface_listener.link); g_signal_handler_disconnect (pointer->focus_surface,
pointer->focus_surface_destroyed_handler_id);
pointer->focus_surface_destroyed_handler_id = 0;
pointer->focus_surface = NULL; pointer->focus_surface = NULL;
} }
@ -848,8 +847,11 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
ClutterPoint pos; ClutterPoint pos;
pointer->focus_surface = surface; pointer->focus_surface = surface;
wl_resource_add_destroy_listener (pointer->focus_surface->resource,
&pointer->focus_surface_listener); pointer->focus_surface_destroyed_handler_id =
g_signal_connect_after (pointer->focus_surface, "destroy",
G_CALLBACK (focus_surface_destroyed),
pointer);
clutter_input_device_get_coords (pointer->device, NULL, &pos); clutter_input_device_get_coords (pointer->device, NULL, &pos);

View File

@ -71,7 +71,7 @@ struct _MetaWaylandPointer
GHashTable *pointer_clients; GHashTable *pointer_clients;
MetaWaylandSurface *focus_surface; MetaWaylandSurface *focus_surface;
struct wl_listener focus_surface_listener; gulong focus_surface_destroyed_handler_id;
guint32 focus_serial; guint32 focus_serial;
guint32 click_serial; guint32 click_serial;