[mutter] screen-cast/area-src: Handle monitors changes here too



commit 893c0cd2f93a0d10a211af32d26be167e9656cd7
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Thu Jan 28 23:21:12 2021 +0100

    screen-cast/area-src: Handle monitors changes here too
    
    Like with the monitor source, we need to reattach to the new views after
    monitor changes, otherwise the screen cast will get stuck.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1691>

 src/backends/meta-screen-cast-area-stream-src.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
---
diff --git a/src/backends/meta-screen-cast-area-stream-src.c b/src/backends/meta-screen-cast-area-stream-src.c
index 1b0da7be2e..7f88d80d11 100644
--- a/src/backends/meta-screen-cast-area-stream-src.c
+++ b/src/backends/meta-screen-cast-area-stream-src.c
@@ -303,12 +303,29 @@ add_view_painted_watches (MetaScreenCastAreaStreamSrc *area_src,
     }
 }
 
+static void
+on_monitors_changed (MetaMonitorManager          *monitor_manager,
+                     MetaScreenCastAreaStreamSrc *area_src)
+{
+  MetaStage *stage = META_STAGE (get_stage (area_src));
+  GList *l;
+
+  for (l = area_src->watches; l; l = l->next)
+    meta_stage_remove_watch (stage, l->data);
+  g_clear_pointer (&area_src->watches, g_list_free);
+
+  add_view_painted_watches (area_src,
+                            META_STAGE_WATCH_AFTER_ACTOR_PAINT);
+}
+
 static void
 meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
 {
   MetaScreenCastAreaStreamSrc *area_src =
     META_SCREEN_CAST_AREA_STREAM_SRC (src);
   MetaBackend *backend = get_backend (area_src);
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
   MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
   ClutterStage *stage;
   MetaScreenCastStream *stream;
@@ -341,6 +358,10 @@ meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
       break;
     }
 
+  g_signal_connect_object (monitor_manager, "monitors-changed-internal",
+                           G_CALLBACK (on_monitors_changed),
+                           area_src, 0);
+
   clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]