summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Mader <robert.mader@collabora.com>2023-02-11 07:03:27 +0100
committerFlorian Müllner <fmuellner@gnome.org>2023-04-25 14:21:58 +0000
commit9049383f3982caa0247a650480d2f06e01715ab9 (patch)
tree79ccbb9dcb5937a633c9195092e4d5b09063bac8
parent208ee8f87ad5b39b4739b648892e42605ab56904 (diff)
downloadmutter-9049383f3982caa0247a650480d2f06e01715ab9.tar.gz
screen-cast/window: Add API to check if stream-cast is active
Screen-casted windows need to be considered visible in various situations but existing APIs such as `clutter_actor_is_effectively_on_stage_view()` don't do so. Add new API that allows checking if a surface belongs to a screen-casted window for the respective cases. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2789> (cherry picked from commit 2d5dd06a507b95c0d9f580be76f79cb5f52ab6e6)
-rw-r--r--src/backends/meta-screen-cast-window-stream.c14
-rw-r--r--src/backends/meta-screen-cast-window.c12
-rw-r--r--src/backends/meta-screen-cast-window.h6
-rw-r--r--src/compositor/meta-window-actor-private.h2
-rw-r--r--src/compositor/meta-window-actor.c32
5 files changed, 66 insertions, 0 deletions
diff --git a/src/backends/meta-screen-cast-window-stream.c b/src/backends/meta-screen-cast-window-stream.c
index 6f42a446e..d678d4f61 100644
--- a/src/backends/meta-screen-cast-window-stream.c
+++ b/src/backends/meta-screen-cast-window-stream.c
@@ -197,6 +197,16 @@ meta_screen_cast_window_stream_finalize (GObject *object)
{
MetaScreenCastWindowStream *window_stream =
META_SCREEN_CAST_WINDOW_STREAM (object);
+ MetaWindowActor *window_actor;
+
+ window_actor = meta_window_actor_from_window (window_stream->window);
+ if (window_actor)
+ {
+ MetaScreenCastWindow *screen_cast_window;
+
+ screen_cast_window = META_SCREEN_CAST_WINDOW (window_actor);
+ meta_screen_cast_window_dec_usage (screen_cast_window);
+ }
g_clear_signal_handler (&window_stream->window_unmanaged_handler_id,
window_stream->window);
@@ -212,6 +222,8 @@ meta_screen_cast_window_stream_initable_init (GInitable *initable,
MetaScreenCastWindowStream *window_stream =
META_SCREEN_CAST_WINDOW_STREAM (initable);
MetaWindow *window = window_stream->window;
+ MetaScreenCastWindow *screen_cast_window =
+ META_SCREEN_CAST_WINDOW (meta_window_actor_from_window (window));
MetaLogicalMonitor *logical_monitor;
int scale;
@@ -242,6 +254,8 @@ meta_screen_cast_window_stream_initable_init (GInitable *initable,
window_stream->stream_width = logical_monitor->rect.width * scale;
window_stream->stream_height = logical_monitor->rect.height * scale;
+ meta_screen_cast_window_inc_usage (screen_cast_window);
+
return initable_parent_iface->init (initable, cancellable, error);
}
diff --git a/src/backends/meta-screen-cast-window.c b/src/backends/meta-screen-cast-window.c
index b9c0df867..b36f9e16f 100644
--- a/src/backends/meta-screen-cast-window.c
+++ b/src/backends/meta-screen-cast-window.c
@@ -99,3 +99,15 @@ meta_screen_cast_window_has_damage (MetaScreenCastWindow *screen_cast_window)
return iface->has_damage (screen_cast_window);
}
+
+void
+meta_screen_cast_window_inc_usage (MetaScreenCastWindow *screen_cast_window)
+{
+ META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->inc_usage (screen_cast_window);
+}
+
+void
+meta_screen_cast_window_dec_usage (MetaScreenCastWindow *screen_cast_window)
+{
+ META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->dec_usage (screen_cast_window);
+}
diff --git a/src/backends/meta-screen-cast-window.h b/src/backends/meta-screen-cast-window.h
index d170d92ae..a2cc4cd40 100644
--- a/src/backends/meta-screen-cast-window.h
+++ b/src/backends/meta-screen-cast-window.h
@@ -62,6 +62,9 @@ struct _MetaScreenCastWindowInterface
CoglFramebuffer *framebuffer);
gboolean (*has_damage) (MetaScreenCastWindow *screen_cast_window);
+
+ void (*inc_usage) (MetaScreenCastWindow *screen_cast_window);
+ void (*dec_usage) (MetaScreenCastWindow *screen_cast_window);
};
void meta_screen_cast_window_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
@@ -90,6 +93,9 @@ gboolean meta_screen_cast_window_blit_to_framebuffer (MetaScreenCastWindow *scre
gboolean meta_screen_cast_window_has_damage (MetaScreenCastWindow *screen_cast_window);
+void meta_screen_cast_window_inc_usage (MetaScreenCastWindow *screen_cast_window);
+void meta_screen_cast_window_dec_usage (MetaScreenCastWindow *screen_cast_window);
+
G_END_DECLS
#endif /* META_SCREEN_CAST_WINDOW_H */
diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h
index 477d0b3a5..c1f46d590 100644
--- a/src/compositor/meta-window-actor-private.h
+++ b/src/compositor/meta-window-actor-private.h
@@ -101,6 +101,8 @@ void meta_window_actor_set_geometry_scale (MetaWindowActor *window_actor,
int meta_window_actor_get_geometry_scale (MetaWindowActor *window_actor);
+gboolean meta_window_actor_is_streaming (MetaWindowActor *window_actor);
+
void meta_window_actor_notify_damaged (MetaWindowActor *window_actor);
gboolean meta_window_actor_is_frozen (MetaWindowActor *self);
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 02e81f0aa..943343c14 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -70,6 +70,7 @@ typedef struct _MetaWindowActorPrivate
gint destroy_in_progress;
guint freeze_count;
+ guint screen_cast_usage_count;
guint visible : 1;
guint disposed : 1;
@@ -1393,6 +1394,26 @@ meta_window_actor_has_damage (MetaScreenCastWindow *screen_cast_window)
}
static void
+meta_window_actor_inc_screen_cast_usage (MetaScreenCastWindow *screen_cast_window)
+{
+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
+ MetaWindowActorPrivate *priv =
+ meta_window_actor_get_instance_private (window_actor);
+
+ priv->screen_cast_usage_count++;
+}
+
+static void
+meta_window_actor_dec_screen_cast_usage (MetaScreenCastWindow *screen_cast_window)
+{
+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
+ MetaWindowActorPrivate *priv =
+ meta_window_actor_get_instance_private (window_actor);
+
+ priv->screen_cast_usage_count--;
+}
+
+static void
screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
{
iface->get_buffer_bounds = meta_window_actor_get_buffer_bounds;
@@ -1401,6 +1422,17 @@ screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
iface->capture_into = meta_window_actor_capture_into;
iface->blit_to_framebuffer = meta_window_actor_blit_to_framebuffer;
iface->has_damage = meta_window_actor_has_damage;
+ iface->inc_usage = meta_window_actor_inc_screen_cast_usage;
+ iface->dec_usage = meta_window_actor_dec_screen_cast_usage;
+}
+
+gboolean
+meta_window_actor_is_streaming (MetaWindowActor *window_actor)
+{
+ MetaWindowActorPrivate *priv =
+ meta_window_actor_get_instance_private (window_actor);
+
+ return priv->screen_cast_usage_count > 0;
}
MetaWindowActor *