[mutter] wayland/surface: Connect to "output-destroyed" in surface_entered_output
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland/surface: Connect to "output-destroyed" in surface_entered_output
- Date: Mon, 11 May 2020 18:40:42 +0000 (UTC)
commit d9fb6b5ca23657d86bca5b7878e662f94880c600
Author: Jonas Dreßler <verdre v0yd nl>
Date: Thu May 7 16:44:04 2020 +0200
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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]