summaryrefslogtreecommitdiff
path: root/src/compositor/meta-window-actor.c
diff options
context:
space:
mode:
authorDor Askayo <dor.askayo@gmail.com>2022-07-02 22:51:13 +0300
committerMarge Bot <marge-bot@gnome.org>2022-08-01 21:05:04 +0000
commit85b8632cd65aecc4c3cb3de70772dcd7f01875e7 (patch)
tree4159833bfbcc2306bbbbdf927579bcf1a31eee0c /src/compositor/meta-window-actor.c
parent2ead3874f5d6fd5b5cbf85d71271b0fa8b5897f6 (diff)
downloadmutter-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.c19
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);