screen-cast-monitor-stream-src: Watch monitors using MetaStageWatch

This uses the API introduced by the previous commit. By watching specific
monitors directly, and not whole stage views, we avoid showing artifacts
on multi-monitor setups.

Fixes https://gitlab.gnome.org/GNOME/mutter/issues/424

https://gitlab.gnome.org/GNOME/mutter/merge_requests/623
This commit is contained in:
Georges Basile Stavracas Neto 2019-06-17 21:49:45 -03:00
parent 9b5d9f3cb3
commit 2464f00902
No known key found for this signature in database
GPG Key ID: 886C17EE170D1385

View File

@ -32,6 +32,7 @@
#include "backends/meta-monitor.h" #include "backends/meta-monitor.h"
#include "backends/meta-screen-cast-monitor-stream.h" #include "backends/meta-screen-cast-monitor-stream.h"
#include "backends/meta-screen-cast-session.h" #include "backends/meta-screen-cast-session.h"
#include "backends/meta-stage-private.h"
#include "clutter/clutter.h" #include "clutter/clutter.h"
#include "clutter/clutter-mutter.h" #include "clutter/clutter-mutter.h"
#include "core/boxes-private.h" #include "core/boxes-private.h"
@ -42,8 +43,9 @@ struct _MetaScreenCastMonitorStreamSrc
gboolean cursor_bitmap_invalid; gboolean cursor_bitmap_invalid;
gulong actors_painted_handler_id; MetaStageWatch *paint_watch;
gulong paint_handler_id; MetaStageWatch *after_paint_watch;
gulong cursor_moved_handler_id; gulong cursor_moved_handler_id;
gulong cursor_changed_handler_id; gulong cursor_changed_handler_id;
}; };
@ -113,10 +115,11 @@ meta_screen_cast_monitor_stream_src_get_specs (MetaScreenCastStreamSrc *src,
} }
static void static void
stage_painted (ClutterActor *actor, stage_painted (MetaStage *stage,
MetaScreenCastMonitorStreamSrc *monitor_src) ClutterStageView *view,
gpointer user_data)
{ {
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src); MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (user_data);
meta_screen_cast_stream_src_maybe_record_frame (src); meta_screen_cast_stream_src_maybe_record_frame (src);
} }
@ -245,12 +248,28 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
MetaScreenCastMonitorStreamSrc *monitor_src = MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (src); META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
MetaBackend *backend = get_backend (monitor_src); MetaBackend *backend = get_backend (monitor_src);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
MetaRendererView *view;
MetaMonitor *monitor;
MetaLogicalMonitor *logical_monitor;
MetaStage *meta_stage;
ClutterStageView *stage_view;
ClutterStage *stage; ClutterStage *stage;
MetaScreenCastStream *stream; MetaScreenCastStream *stream;
stream = meta_screen_cast_stream_src_get_stream (src); stream = meta_screen_cast_stream_src_get_stream (src);
stage = get_stage (monitor_src); stage = get_stage (monitor_src);
meta_stage = META_STAGE (stage);
monitor = get_monitor (monitor_src);
logical_monitor = meta_monitor_get_logical_monitor (monitor);
view = meta_renderer_get_view_from_logical_monitor (renderer,
logical_monitor);
if (view)
stage_view = CLUTTER_STAGE_VIEW (view);
else
stage_view = NULL;
switch (meta_screen_cast_stream_get_cursor_mode (stream)) switch (meta_screen_cast_stream_get_cursor_mode (stream))
{ {
@ -265,17 +284,21 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
monitor_src); monitor_src);
/* Intentional fall-through */ /* Intentional fall-through */
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN: case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
monitor_src->actors_painted_handler_id = monitor_src->paint_watch =
g_signal_connect (stage, "actors-painted", meta_stage_watch_view (meta_stage,
G_CALLBACK (stage_painted), stage_view,
monitor_src); META_STAGE_WATCH_AFTER_ACTOR_PAINT,
stage_painted,
monitor_src);
break; break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
inhibit_hw_cursor (monitor_src); inhibit_hw_cursor (monitor_src);
monitor_src->paint_handler_id = monitor_src->after_paint_watch =
g_signal_connect_after (stage, "paint", meta_stage_watch_view (meta_stage,
G_CALLBACK (stage_painted), stage_view,
monitor_src); META_STAGE_WATCH_AFTER_PAINT,
stage_painted,
monitor_src);
break; break;
} }
@ -290,21 +313,21 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src)
MetaBackend *backend = get_backend (monitor_src); MetaBackend *backend = get_backend (monitor_src);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterStage *stage; ClutterStage *stage;
MetaStage *meta_stage;
stage = get_stage (monitor_src); stage = get_stage (monitor_src);
meta_stage = META_STAGE (stage);
if (monitor_src->actors_painted_handler_id) if (monitor_src->paint_watch)
{ {
g_signal_handler_disconnect (stage, meta_stage_remove_watch (meta_stage, monitor_src->paint_watch);
monitor_src->actors_painted_handler_id); monitor_src->paint_watch = NULL;
monitor_src->actors_painted_handler_id = 0;
} }
if (monitor_src->paint_handler_id) if (monitor_src->after_paint_watch)
{ {
g_signal_handler_disconnect (stage, meta_stage_remove_watch (meta_stage, monitor_src->after_paint_watch);
monitor_src->paint_handler_id); monitor_src->after_paint_watch = NULL;
monitor_src->paint_handler_id = 0;
uninhibit_hw_cursor (monitor_src); uninhibit_hw_cursor (monitor_src);
} }