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
This commit is contained in:
Jonas Dreßler 2020-05-07 16:44:04 +02:00 committed by verdre
parent 696b534570
commit d9fb6b5ca2
2 changed files with 33 additions and 31 deletions

View File

@ -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);

View File

@ -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;