diff options
author | Dor Askayo <dor.askayo@gmail.com> | 2022-07-02 22:51:13 +0300 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2022-08-01 21:05:04 +0000 |
commit | 85b8632cd65aecc4c3cb3de70772dcd7f01875e7 (patch) | |
tree | 4159833bfbcc2306bbbbdf927579bcf1a31eee0c /src/compositor/meta-window-actor.c | |
parent | 2ead3874f5d6fd5b5cbf85d71271b0fa8b5897f6 (diff) | |
download | mutter-85b8632cd65aecc4c3cb3de70772dcd7f01875e7.tar.gz |
compositor: Keep track of the top window actor on each view
First, add logic in MetaCompositorView to find topmost visible
MetaWindowActor on its view, and expose it through a new API.
Then, queue an update to find the top MetaWindowActor of each
MetaCompositorView in the following cases:
1. The MetaCompositor is in its initial state.
2. The window stack order has changed.
3. A window has changed its visibility.
4. A "stage-views-changed" signal was emitted for a MetaWindowActor.
Finally, perform the queued update in meta_compositor_before_paint (),
and assert that an update isn't queued during painting. This ensures
that the top window actor in the MetaCompositorView remains up-to-date
and available to child classes of MetaCompositor throughout the entire
paint stage.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2526>
Diffstat (limited to 'src/compositor/meta-window-actor.c')
-rw-r--r-- | src/compositor/meta-window-actor.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index ae1fa4d90..9fd9f758c 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -53,6 +53,8 @@ typedef struct _MetaWindowActorPrivate MetaWindow *window; MetaCompositor *compositor; + gulong stage_views_changed_id; + MetaSurfaceActor *surface; int geometry_scale; @@ -403,6 +405,15 @@ init_surface_actor (MetaWindowActor *self) } static void +on_stage_views_changed (MetaWindowActor *self) +{ + MetaWindowActorPrivate *priv = + meta_window_actor_get_instance_private (self); + + meta_compositor_window_actor_stage_views_changed (priv->compositor); +} + +static void meta_window_actor_constructed (GObject *object) { MetaWindowActor *self = META_WINDOW_ACTOR (object); @@ -412,6 +423,12 @@ meta_window_actor_constructed (GObject *object) priv->compositor = window->display->compositor; + priv->stage_views_changed_id = + g_signal_connect (self, + "stage-views-changed", + G_CALLBACK (on_stage_views_changed), + NULL); + /* Hang our compositor window state off the MetaWindow for fast retrieval */ meta_window_set_compositor_private (window, object); @@ -445,6 +462,8 @@ meta_window_actor_dispose (GObject *object) priv->disposed = TRUE; + g_clear_signal_handler (&priv->stage_views_changed_id, self); + meta_compositor_remove_window_actor (compositor, self); g_clear_object (&priv->window); |