From 90a00dae9938c092d9ef520dabcc2d35dbda0dc6 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 16 Aug 2023 13:46:05 +0200 Subject: [PATCH] compositor: Handle grab state through ClutterStage::is-grabbed handler This is something the compositor could now track by itself, instead of being pushed through events. It also makes more sense to do this directly when the grabbing conditions change, as opposed to the next event. Part-of: --- src/compositor/compositor.c | 18 ++++++++++++++++++ src/core/display-private.h | 1 - src/core/events.c | 14 -------------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 6b45ee91b..69cc2b782 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -115,6 +115,7 @@ typedef struct _MetaCompositorPrivate gulong after_paint_handler_id; gulong window_visibility_updated_id; gulong monitors_changed_internal_id; + gulong grabbed_notify_handler_id; int64_t server_time_query_time; int64_t server_time_offset; @@ -1179,6 +1180,17 @@ on_monitors_changed_internal (MetaMonitorManager *monitor_manager, meta_compositor_ensure_compositor_views (compositor); } +static void +on_is_grabbed_changed_cb (ClutterStage *stage, + GParamSpec *pspec, + MetaCompositor *compositor) +{ + if (clutter_stage_get_grab_actor (stage) != NULL) + meta_compositor_grab_begin (compositor); + else + meta_compositor_grab_end (compositor); +} + static void meta_compositor_set_property (GObject *object, guint prop_id, @@ -1255,6 +1267,11 @@ meta_compositor_constructed (GObject *object) "after-paint", G_CALLBACK (on_after_paint), compositor); + priv->grabbed_notify_handler_id = + g_signal_connect (stage, + "notify::is-grabbed", + G_CALLBACK (on_is_grabbed_changed_cb), + compositor); priv->window_visibility_updated_id = g_signal_connect (priv->display, @@ -1288,6 +1305,7 @@ meta_compositor_dispose (GObject *object) g_clear_signal_handler (&priv->stage_presented_id, stage); g_clear_signal_handler (&priv->before_paint_handler_id, stage); g_clear_signal_handler (&priv->after_paint_handler_id, stage); + g_clear_signal_handler (&priv->grabbed_notify_handler_id, stage); g_clear_signal_handler (&priv->window_visibility_updated_id, priv->display); g_clear_pointer (&priv->windows, g_list_free); diff --git a/src/core/display-private.h b/src/core/display-private.h index 4afd0d5df..e847e40e6 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -120,7 +120,6 @@ struct _MetaDisplay /* Opening the display */ unsigned int display_opening : 1; - unsigned int grabbed_in_clutter : 1; /* Closing down the display */ int closing; diff --git a/src/core/events.c b/src/core/events.c index 3a60ee015..7ee03cf37 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -257,20 +257,6 @@ meta_display_handle_event (MetaDisplay *display, has_grab = stage_has_grab (display); - if (display->grabbed_in_clutter != has_grab) - { - if (!display->grabbed_in_clutter && has_grab) - { - display->grabbed_in_clutter = TRUE; - meta_compositor_grab_begin (compositor); - } - else if (display->grabbed_in_clutter && !has_grab) - { - display->grabbed_in_clutter = FALSE; - meta_compositor_grab_end (compositor); - } - } - sequence = clutter_event_get_event_sequence (event); event_type = clutter_event_type (event); time_ms = clutter_event_get_time (event);