[mutter] screen-cast/monitor-stream: Don't fall apart when monitor changes
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] screen-cast/monitor-stream: Don't fall apart when monitor changes
- Date: Fri, 29 Jan 2021 08:57:11 +0000 (UTC)
commit e877b06fdde60a9fc391628c83258e4ee3b42297
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Wed Jan 27 23:25:51 2021 +0100
screen-cast/monitor-stream: Don't fall apart when monitor changes
If the monitor configuration changed, even though the streamed monitor
didn't change, we'd still fail to continue streaming, as we failed to
update the stage watchers, meaning we wouldn't be notified about when
the stage views were painted.
Fix this by reattaching the stage watches, i.e. update the painted
signalling listeners to listen to the right views, when monitor changes
happens.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1691>
src/backends/meta-screen-cast-monitor-stream-src.c | 63 +++++++++++++++++-----
1 file changed, 50 insertions(+), 13 deletions(-)
---
diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c
b/src/backends/meta-screen-cast-monitor-stream-src.c
index e227182668..2fa7ebdef2 100644
--- a/src/backends/meta-screen-cast-monitor-stream-src.c
+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
@@ -323,18 +323,59 @@ add_view_watches (MetaScreenCastMonitorStreamSrc *monitor_src,
}
}
+static void
+reattach_watches (MetaScreenCastMonitorStreamSrc *monitor_src)
+{
+ MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
+ MetaScreenCastStream *stream;
+ ClutterStage *stage;
+ GList *l;
+
+ stream = meta_screen_cast_stream_src_get_stream (src);
+ stage = get_stage (monitor_src);
+
+ for (l = monitor_src->watches; l; l = l->next)
+ meta_stage_remove_watch (META_STAGE (stage), l->data);
+ g_clear_pointer (&monitor_src->watches, g_list_free);
+
+ switch (meta_screen_cast_stream_get_cursor_mode (stream))
+ {
+ case META_SCREEN_CAST_CURSOR_MODE_METADATA:
+ case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
+ add_view_watches (monitor_src,
+ META_STAGE_WATCH_BEFORE_PAINT,
+ before_stage_painted);
+ add_view_watches (monitor_src,
+ META_STAGE_WATCH_AFTER_ACTOR_PAINT,
+ stage_painted);
+ break;
+ case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
+ add_view_watches (monitor_src,
+ META_STAGE_WATCH_AFTER_PAINT,
+ stage_painted);
+ break;
+ }
+}
+
+static void
+on_monitors_changed (MetaMonitorManager *monitor_manager,
+ MetaScreenCastMonitorStreamSrc *monitor_src)
+{
+ reattach_watches (monitor_src);
+}
+
static void
meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
{
MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
MetaBackend *backend = get_backend (monitor_src);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
- ClutterStage *stage;
MetaScreenCastStream *stream;
stream = meta_screen_cast_stream_src_get_stream (src);
- stage = get_stage (monitor_src);
switch (meta_screen_cast_stream_get_cursor_mode (stream))
{
@@ -348,25 +389,21 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
G_CALLBACK (cursor_changed),
monitor_src);
meta_cursor_tracker_track_position (cursor_tracker);
- G_GNUC_FALLTHROUGH;
+ break;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
- add_view_watches (monitor_src,
- META_STAGE_WATCH_BEFORE_PAINT,
- before_stage_painted);
- add_view_watches (monitor_src,
- META_STAGE_WATCH_AFTER_ACTOR_PAINT,
- stage_painted);
break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
inhibit_hw_cursor (monitor_src);
meta_cursor_tracker_track_position (cursor_tracker);
- add_view_watches (monitor_src,
- META_STAGE_WATCH_AFTER_PAINT,
- stage_painted);
break;
}
- clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
+ reattach_watches (monitor_src);
+ g_signal_connect_object (monitor_manager, "monitors-changed-internal",
+ G_CALLBACK (on_monitors_changed),
+ monitor_src, 0);
+
+ clutter_actor_queue_redraw (CLUTTER_ACTOR (get_stage (monitor_src)));
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]