summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2020-08-29 15:41:57 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2020-09-01 13:05:29 -0300
commite6a13e5d577462550a6a9a1415afaeba291d4389 (patch)
treed0b785e9ec5292ffa71e3fd78bfed277312a7559
parentaed286aa462471a1cb0f91a4a45d0027a25ea7c2 (diff)
downloadmutter-e6a13e5d577462550a6a9a1415afaeba291d4389.tar.gz
monitor-stream-src: Add before-paint watch to catch scanouts
Scanouts are taken away after painting. However, when we're streaming, what we actually want is to capture whatever is going to end up on screen - and that includes the scanout if there's any. Add a before-paint watch that only records new frames if a scanout is set. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1421
-rw-r--r--src/backends/meta-screen-cast-monitor-stream-src.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
index 0f086cab9..b0b3b3763 100644
--- a/src/backends/meta-screen-cast-monitor-stream-src.c
+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
@@ -127,6 +127,25 @@ stage_painted (MetaStage *stage,
meta_screen_cast_stream_src_maybe_record_frame (src, flags);
}
+static void
+before_stage_painted (MetaStage *stage,
+ ClutterStageView *view,
+ ClutterPaintContext *paint_context,
+ gpointer user_data)
+{
+ MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (user_data);
+ CoglScanout *scanout;
+
+ scanout = clutter_stage_view_peek_scanout (view);
+ if (scanout)
+ {
+ MetaScreenCastRecordFlag flags;
+
+ flags = META_SCREEN_CAST_RECORD_FLAG_NONE;
+ meta_screen_cast_stream_src_maybe_record_frame (src, flags);
+ }
+}
+
static MetaBackend *
get_backend (MetaScreenCastMonitorStreamSrc *monitor_src)
{
@@ -345,6 +364,9 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
G_GNUC_FALLTHROUGH;
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;