screen-cast-stream-src/virtual: Reorganize hooking things up
There were things hooked up (connecting signals, adding stage watches), but it was a bit disorganized, with "adding watches" doing more, and "init callbacks" being a bit vague. Split things up to * setup view - hook up things that need to listen on a stage view * setup cursor tracking - track cursor positions, sprite changes * the rest - monitor changes etc This also properly handles a race condition when we'll enable before the idle callback creating the view from the virtual monitors is run. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4066>
This commit is contained in:
parent
7ff5334a3b
commit
ca47be6ee9
@ -94,7 +94,7 @@ view_from_src (MetaScreenCastStreamSrc *src)
|
|||||||
MetaRenderer *renderer = meta_backend_get_renderer (backend_from_src (src));
|
MetaRenderer *renderer = meta_backend_get_renderer (backend_from_src (src));
|
||||||
MetaRendererView *view = meta_renderer_get_view_for_crtc (renderer, crtc);
|
MetaRendererView *view = meta_renderer_get_view_for_crtc (renderer, crtc);
|
||||||
|
|
||||||
return CLUTTER_STAGE_VIEW (view);
|
return view ? CLUTTER_STAGE_VIEW (view) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterStage *
|
static ClutterStage *
|
||||||
@ -193,12 +193,12 @@ on_after_paint (MetaStage *stage,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_watch (MetaScreenCastVirtualStreamSrc *virtual_src)
|
setup_view (MetaScreenCastVirtualStreamSrc *virtual_src,
|
||||||
|
ClutterStageView *view)
|
||||||
{
|
{
|
||||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (virtual_src);
|
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (virtual_src);
|
||||||
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
||||||
MetaStage *meta_stage = META_STAGE (stage_from_src (src));
|
MetaStage *meta_stage = META_STAGE (stage_from_src (src));
|
||||||
ClutterStageView *view = view_from_src (src);
|
|
||||||
|
|
||||||
g_return_if_fail (!virtual_src->watch);
|
g_return_if_fail (!virtual_src->watch);
|
||||||
|
|
||||||
@ -227,22 +227,23 @@ on_monitors_changed (MetaMonitorManager *monitor_manager,
|
|||||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (virtual_src);
|
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (virtual_src);
|
||||||
MetaStage *stage = META_STAGE (stage_from_src (src));
|
MetaStage *stage = META_STAGE (stage_from_src (src));
|
||||||
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
||||||
|
ClutterStageView *view;
|
||||||
|
|
||||||
meta_stage_remove_watch (stage, virtual_src->watch);
|
meta_stage_remove_watch (stage, virtual_src->watch);
|
||||||
virtual_src->watch = NULL;
|
virtual_src->watch = NULL;
|
||||||
add_watch (virtual_src);
|
|
||||||
|
view = view_from_src (src);
|
||||||
|
setup_view (virtual_src, view);
|
||||||
|
|
||||||
meta_eis_viewport_notify_changed (META_EIS_VIEWPORT (stream));
|
meta_eis_viewport_notify_changed (META_EIS_VIEWPORT (stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_record_callbacks (MetaScreenCastVirtualStreamSrc *virtual_src)
|
setup_cursor_handling (MetaScreenCastVirtualStreamSrc *virtual_src)
|
||||||
{
|
{
|
||||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (virtual_src);
|
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (virtual_src);
|
||||||
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
||||||
MetaBackend *backend = backend_from_src (src);
|
MetaBackend *backend = backend_from_src (src);
|
||||||
MetaMonitorManager *monitor_manager =
|
|
||||||
meta_backend_get_monitor_manager (backend);
|
|
||||||
MetaCursorTracker *cursor_tracker =
|
MetaCursorTracker *cursor_tracker =
|
||||||
meta_backend_get_cursor_tracker (backend);
|
meta_backend_get_cursor_tracker (backend);
|
||||||
ClutterStage *stage = stage_from_src (src);
|
ClutterStage *stage = stage_from_src (src);
|
||||||
@ -250,6 +251,7 @@ init_record_callbacks (MetaScreenCastVirtualStreamSrc *virtual_src)
|
|||||||
switch (meta_screen_cast_stream_get_cursor_mode (stream))
|
switch (meta_screen_cast_stream_get_cursor_mode (stream))
|
||||||
{
|
{
|
||||||
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
|
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
|
||||||
|
meta_cursor_tracker_track_position (cursor_tracker);
|
||||||
virtual_src->position_invalidated_handler_id =
|
virtual_src->position_invalidated_handler_id =
|
||||||
g_signal_connect_after (cursor_tracker, "position-invalidated",
|
g_signal_connect_after (cursor_tracker, "position-invalidated",
|
||||||
G_CALLBACK (pointer_position_invalidated),
|
G_CALLBACK (pointer_position_invalidated),
|
||||||
@ -262,19 +264,13 @@ init_record_callbacks (MetaScreenCastVirtualStreamSrc *virtual_src)
|
|||||||
g_signal_connect_after (stage, "prepare-frame",
|
g_signal_connect_after (stage, "prepare-frame",
|
||||||
G_CALLBACK (on_prepare_frame),
|
G_CALLBACK (on_prepare_frame),
|
||||||
virtual_src);
|
virtual_src);
|
||||||
G_GNUC_FALLTHROUGH;
|
break;
|
||||||
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
||||||
|
meta_cursor_tracker_track_position (cursor_tracker);
|
||||||
|
break;
|
||||||
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
||||||
add_watch (virtual_src);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_screen_cast_stream_notify_is_configured (stream);
|
|
||||||
|
|
||||||
virtual_src->monitors_changed_handler_id =
|
|
||||||
g_signal_connect (monitor_manager, "monitors-changed-internal",
|
|
||||||
G_CALLBACK (on_monitors_changed),
|
|
||||||
virtual_src);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -284,19 +280,23 @@ meta_screen_cast_virtual_stream_src_enable (MetaScreenCastStreamSrc *src)
|
|||||||
META_SCREEN_CAST_VIRTUAL_STREAM_SRC (src);
|
META_SCREEN_CAST_VIRTUAL_STREAM_SRC (src);
|
||||||
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
||||||
MetaBackend *backend = backend_from_src (src);
|
MetaBackend *backend = backend_from_src (src);
|
||||||
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
|
MetaMonitorManager *monitor_manager =
|
||||||
|
meta_backend_get_monitor_manager (backend);
|
||||||
|
ClutterStageView *view;
|
||||||
|
|
||||||
switch (meta_screen_cast_stream_get_cursor_mode (stream))
|
view = view_from_src (src);
|
||||||
{
|
if (view)
|
||||||
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
|
setup_view (virtual_src, view);
|
||||||
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
|
||||||
meta_cursor_tracker_track_position (cursor_tracker);
|
setup_cursor_handling (virtual_src);
|
||||||
break;
|
|
||||||
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
meta_screen_cast_stream_notify_is_configured (stream);
|
||||||
break;
|
|
||||||
}
|
virtual_src->monitors_changed_handler_id =
|
||||||
|
g_signal_connect (monitor_manager, "monitors-changed-internal",
|
||||||
|
G_CALLBACK (on_monitors_changed),
|
||||||
|
virtual_src);
|
||||||
|
|
||||||
init_record_callbacks (virtual_src);
|
|
||||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage_from_src (src)),
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage_from_src (src)),
|
||||||
NULL);
|
NULL);
|
||||||
clutter_stage_schedule_update (stage_from_src (src));
|
clutter_stage_schedule_update (stage_from_src (src));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user