From d9fb6b5ca23657d86bca5b7878e662f94880c600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Thu, 7 May 2020 16:44:04 +0200 Subject: [PATCH] wayland/surface: Connect to "output-destroyed" in surface_entered_output Since we're now connecting to one more signal of MetaWaylandOutput, keep signal connections in one place and move connecting the "output-destroyed" signal to surface_entered_output() and disconnecting it to surface_left_output(). This also allows us to use the "outputs_to_destroy_notify_id" as a simple set and rename it to "outputs". While at it, also use g_hash_table_destroy() instead of g_hash_table_unref() since destroy is more clear than unref and does the same thing in this case. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1230 --- src/wayland/meta-wayland-surface.c | 62 +++++++++++++++--------------- src/wayland/meta-wayland-surface.h | 2 +- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index 5ea64b12e..6071afc53 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -120,6 +120,11 @@ meta_wayland_surface_role_is_on_logical_monitor (MetaWaylandSurfaceRole *surface static MetaWaylandSurface * meta_wayland_surface_role_get_toplevel (MetaWaylandSurfaceRole *surface_role); +static void +set_surface_is_on_output (MetaWaylandSurface *surface, + MetaWaylandOutput *wayland_output, + gboolean is_on_output); + static MetaWaylandBufferRef * meta_wayland_buffer_ref_new (void) { @@ -1162,6 +1167,13 @@ static const struct wl_surface_interface meta_wayland_wl_surface_interface = { wl_surface_damage_buffer, }; +static void +handle_output_destroyed (MetaWaylandOutput *wayland_output, + MetaWaylandSurface *surface) +{ + set_surface_is_on_output (surface, wayland_output, FALSE); +} + static void handle_output_bound (MetaWaylandOutput *wayland_output, struct wl_resource *output_resource, @@ -1179,6 +1191,10 @@ surface_entered_output (MetaWaylandSurface *surface, GList *iter; struct wl_resource *resource; + g_signal_connect (wayland_output, "output-destroyed", + G_CALLBACK (handle_output_destroyed), + surface); + for (iter = wayland_output->resources; iter != NULL; iter = iter->next) { resource = iter->data; @@ -1202,6 +1218,10 @@ surface_left_output (MetaWaylandSurface *surface, GList *iter; struct wl_resource *resource; + g_signal_handlers_disconnect_by_func (wayland_output, + G_CALLBACK (handle_output_destroyed), + surface); + g_signal_handlers_disconnect_by_func (wayland_output, G_CALLBACK (handle_output_bound), surface); @@ -1218,43 +1238,23 @@ surface_left_output (MetaWaylandSurface *surface, } } -static void -set_surface_is_on_output (MetaWaylandSurface *surface, - MetaWaylandOutput *wayland_output, - gboolean is_on_output); - -static void -surface_handle_output_destroy (MetaWaylandOutput *wayland_output, - MetaWaylandSurface *surface) -{ - set_surface_is_on_output (surface, wayland_output, FALSE); -} - static void set_surface_is_on_output (MetaWaylandSurface *surface, MetaWaylandOutput *wayland_output, gboolean is_on_output) { - gpointer orig_id; - gboolean was_on_output = g_hash_table_lookup_extended (surface->outputs_to_destroy_notify_id, - wayland_output, - NULL, &orig_id); + gboolean was_on_output; + + was_on_output = g_hash_table_contains (surface->outputs, wayland_output); if (!was_on_output && is_on_output) { - gulong id; - - id = g_signal_connect (wayland_output, "output-destroyed", - G_CALLBACK (surface_handle_output_destroy), - surface); - g_hash_table_insert (surface->outputs_to_destroy_notify_id, wayland_output, - GSIZE_TO_POINTER ((gsize)id)); + g_hash_table_add (surface->outputs, wayland_output); surface_entered_output (surface, wayland_output); } else if (was_on_output && !is_on_output) { - g_hash_table_remove (surface->outputs_to_destroy_notify_id, wayland_output); - g_signal_handler_disconnect (wayland_output, (gulong) GPOINTER_TO_SIZE (orig_id)); + g_hash_table_remove (surface->outputs, wayland_output); surface_left_output (surface, wayland_output); } } @@ -1290,8 +1290,10 @@ surface_output_disconnect_signals (gpointer key, MetaWaylandOutput *wayland_output = key; MetaWaylandSurface *surface = user_data; - g_signal_handler_disconnect (wayland_output, - (gulong) GPOINTER_TO_SIZE (value)); + g_signal_handlers_disconnect_by_func (wayland_output, + G_CALLBACK (handle_output_destroyed), + surface); + g_signal_handlers_disconnect_by_func (wayland_output, G_CALLBACK (handle_output_bound), surface); @@ -1364,10 +1366,10 @@ wl_surface_destructor (struct wl_resource *resource) meta_wayland_compositor_destroy_frame_callbacks (compositor, surface); - g_hash_table_foreach (surface->outputs_to_destroy_notify_id, + g_hash_table_foreach (surface->outputs, surface_output_disconnect_signals, surface); - g_hash_table_unref (surface->outputs_to_destroy_notify_id); + g_hash_table_destroy (surface->outputs); wl_list_for_each_safe (cb, next, &surface->pending_frame_callback_list, link) wl_resource_destroy (cb->resource); @@ -1418,7 +1420,7 @@ meta_wayland_surface_create (MetaWaylandCompositor *compositor, wl_list_init (&surface->pending_frame_callback_list); - surface->outputs_to_destroy_notify_id = g_hash_table_new (NULL, NULL); + surface->outputs = g_hash_table_new (NULL, NULL); surface->shortcut_inhibited_seats = g_hash_table_new (NULL, NULL); meta_wayland_compositor_notify_surface_id (compositor, id, surface); diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h index 50736758a..1effaa475 100644 --- a/src/wayland/meta-wayland-surface.h +++ b/src/wayland/meta-wayland-surface.h @@ -157,7 +157,7 @@ struct _MetaWaylandSurface int32_t offset_x, offset_y; GNode *subsurface_branch_node; GNode *subsurface_leaf_node; - GHashTable *outputs_to_destroy_notify_id; + GHashTable *outputs; MetaMonitorTransform buffer_transform; CoglTexture *texture;