From d4559a9ca46cfe4acb03a77601952de79816a519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 29 Aug 2023 20:34:05 +0200 Subject: [PATCH] screen-cast: Implement MetaEisViewport in all stream types This will be used to describe a eis_region in a eis_device. Part-of: --- src/backends/meta-screen-cast-area-stream.c | 93 ++++++++++++++- .../meta-screen-cast-monitor-stream.c | 86 +++++++++++++- src/backends/meta-screen-cast-stream.c | 28 +++++ src/backends/meta-screen-cast-stream.h | 1 + .../meta-screen-cast-virtual-stream-src.c | 12 ++ .../meta-screen-cast-virtual-stream-src.h | 2 + .../meta-screen-cast-virtual-stream.c | 106 +++++++++++++++++- src/backends/meta-screen-cast-window-stream.c | 78 ++++++++++++- 8 files changed, 393 insertions(+), 13 deletions(-) diff --git a/src/backends/meta-screen-cast-area-stream.c b/src/backends/meta-screen-cast-area-stream.c index 266f894f6..ed06a5e74 100644 --- a/src/backends/meta-screen-cast-area-stream.c +++ b/src/backends/meta-screen-cast-area-stream.c @@ -20,6 +20,7 @@ #include "backends/meta-screen-cast-area-stream.h" +#include "backends/meta-eis.h" #include "backends/meta-screen-cast-area-stream-src.h" struct _MetaScreenCastAreaStream @@ -32,9 +33,13 @@ struct _MetaScreenCastAreaStream float scale; }; -G_DEFINE_TYPE (MetaScreenCastAreaStream, - meta_screen_cast_area_stream, - META_TYPE_SCREEN_CAST_STREAM) +static void meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface); + +G_DEFINE_TYPE_WITH_CODE (MetaScreenCastAreaStream, + meta_screen_cast_area_stream, + META_TYPE_SCREEN_CAST_STREAM, + G_IMPLEMENT_INTERFACE (META_TYPE_EIS_VIEWPORT, + meta_eis_viewport_iface_init)) ClutterStage * meta_screen_cast_area_stream_get_stage (MetaScreenCastAreaStream *area_stream) @@ -116,6 +121,85 @@ meta_screen_cast_area_stream_new (MetaScreenCastSession *session, return area_stream; } +static gboolean +meta_screen_cast_area_stream_is_standalone (MetaEisViewport *viewport) +{ + return TRUE; +} + +static const char * +meta_screen_cast_area_stream_get_mapping_id (MetaEisViewport *viewport) +{ + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (viewport); + + return meta_screen_cast_stream_get_mapping_id (stream); +} + +static gboolean +meta_screen_cast_area_stream_get_position (MetaEisViewport *viewport, + int *out_x, + int *out_y) +{ + return FALSE; +} + +static void +meta_screen_cast_area_stream_get_size (MetaEisViewport *viewport, + int *out_width, + int *out_height) +{ + MetaScreenCastAreaStream *area_stream = + META_SCREEN_CAST_AREA_STREAM (viewport); + + *out_width = (int) roundf (area_stream->area.width * area_stream->scale); + *out_height = (int) roundf (area_stream->area.height * area_stream->scale); +} + +static double +meta_screen_cast_area_stream_get_physical_scale (MetaEisViewport *viewport) +{ + MetaScreenCastAreaStream *area_stream = + META_SCREEN_CAST_AREA_STREAM (viewport); + + return area_stream->scale; +} + +static void +transform_position (MetaScreenCastAreaStream *area_stream, + double x, + double y, + double *out_x, + double *out_y) +{ + *out_x = area_stream->area.x + (int) roundf (x / area_stream->scale); + *out_y = area_stream->area.y + (int) roundf (y / area_stream->scale); +} + +static gboolean +meta_screen_cast_area_stream_transform_coordinate (MetaEisViewport *viewport, + double x, + double y, + double *out_x, + double *out_y) +{ + MetaScreenCastAreaStream *area_stream = + META_SCREEN_CAST_AREA_STREAM (viewport); + + transform_position (area_stream, x, y, out_x, out_y); + return TRUE; +} + +static void +meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface) +{ + eis_viewport_iface->is_standalone = meta_screen_cast_area_stream_is_standalone; + eis_viewport_iface->get_mapping_id = meta_screen_cast_area_stream_get_mapping_id; + eis_viewport_iface->get_position = meta_screen_cast_area_stream_get_position; + eis_viewport_iface->get_size = meta_screen_cast_area_stream_get_size; + eis_viewport_iface->get_physical_scale = meta_screen_cast_area_stream_get_physical_scale; + eis_viewport_iface->transform_coordinate = meta_screen_cast_area_stream_transform_coordinate; +} + static MetaScreenCastStreamSrc * meta_screen_cast_area_stream_create_src (MetaScreenCastStream *stream, GError **error) @@ -156,8 +240,7 @@ meta_screen_cast_area_stream_transform_position (MetaScreenCastStream *stream, MetaScreenCastAreaStream *area_stream = META_SCREEN_CAST_AREA_STREAM (stream); - *x = area_stream->area.x + (int) roundf (stream_x / area_stream->scale); - *y = area_stream->area.y + (int) roundf (stream_y / area_stream->scale); + transform_position (area_stream, stream_x, stream_y, x, y); return TRUE; } diff --git a/src/backends/meta-screen-cast-monitor-stream.c b/src/backends/meta-screen-cast-monitor-stream.c index a94955b59..47bdcf3bc 100644 --- a/src/backends/meta-screen-cast-monitor-stream.c +++ b/src/backends/meta-screen-cast-monitor-stream.c @@ -22,6 +22,7 @@ #include "backends/meta-screen-cast-monitor-stream.h" +#include "backends/meta-eis.h" #include "backends/meta-logical-monitor.h" #include "backends/meta-screen-cast-monitor-stream-src.h" @@ -42,9 +43,13 @@ struct _MetaScreenCastMonitorStream MetaLogicalMonitor *logical_monitor; }; -G_DEFINE_TYPE (MetaScreenCastMonitorStream, - meta_screen_cast_monitor_stream, - META_TYPE_SCREEN_CAST_STREAM) +static void meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface); + +G_DEFINE_TYPE_WITH_CODE (MetaScreenCastMonitorStream, + meta_screen_cast_monitor_stream, + META_TYPE_SCREEN_CAST_STREAM, + G_IMPLEMENT_INTERFACE (META_TYPE_EIS_VIEWPORT, + meta_eis_viewport_iface_init)) static gboolean update_monitor (MetaScreenCastMonitorStream *monitor_stream, @@ -214,6 +219,81 @@ meta_screen_cast_monitor_stream_transform_position (MetaScreenCastStream *stream return TRUE; } +static gboolean +meta_screen_cast_monitor_stream_is_standalone (MetaEisViewport *viewport) +{ + return FALSE; +} + +static const char * +meta_screen_cast_monitor_stream_get_mapping_id (MetaEisViewport *viewport) +{ + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (viewport); + + return meta_screen_cast_stream_get_mapping_id (stream); +} + +static gboolean +meta_screen_cast_monitor_stream_get_position (MetaEisViewport *viewport, + int *out_x, + int *out_y) +{ + MetaScreenCastMonitorStream *monitor_stream = + META_SCREEN_CAST_MONITOR_STREAM (viewport); + MtkRectangle layout; + + layout = meta_logical_monitor_get_layout (monitor_stream->logical_monitor); + *out_x = layout.x; + *out_y = layout.y; + return TRUE; +} + +static void +meta_screen_cast_monitor_stream_get_size (MetaEisViewport *viewport, + int *out_width, + int *out_height) +{ + MetaScreenCastMonitorStream *monitor_stream = + META_SCREEN_CAST_MONITOR_STREAM (viewport); + MtkRectangle layout; + + layout = meta_logical_monitor_get_layout (monitor_stream->logical_monitor); + *out_width = layout.width; + *out_height = layout.height; +} + +static double +meta_screen_cast_monitor_stream_get_physical_scale (MetaEisViewport *viewport) +{ + MetaScreenCastMonitorStream *monitor_stream = + META_SCREEN_CAST_MONITOR_STREAM (viewport); + + return meta_logical_monitor_get_scale (monitor_stream->logical_monitor); +} + +static gboolean +meta_screen_cast_monitor_stream_transform_coordinate (MetaEisViewport *viewport, + double x, + double y, + double *out_x, + double *out_y) +{ + *out_x = x; + *out_y = y; + return TRUE; +} + +static void +meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface) +{ + eis_viewport_iface->is_standalone = meta_screen_cast_monitor_stream_is_standalone; + eis_viewport_iface->get_mapping_id = meta_screen_cast_monitor_stream_get_mapping_id; + eis_viewport_iface->get_position = meta_screen_cast_monitor_stream_get_position; + eis_viewport_iface->get_size = meta_screen_cast_monitor_stream_get_size; + eis_viewport_iface->get_physical_scale = meta_screen_cast_monitor_stream_get_physical_scale; + eis_viewport_iface->transform_coordinate = meta_screen_cast_monitor_stream_transform_coordinate; +} + static void meta_screen_cast_monitor_stream_set_property (GObject *object, guint prop_id, diff --git a/src/backends/meta-screen-cast-stream.c b/src/backends/meta-screen-cast-stream.c index 7417fcc69..3176e5ae1 100644 --- a/src/backends/meta-screen-cast-stream.c +++ b/src/backends/meta-screen-cast-stream.c @@ -22,6 +22,7 @@ #include "backends/meta-screen-cast-stream.h" +#include "backends/meta-remote-desktop-session.h" #include "backends/meta-screen-cast-session.h" #include "meta-private-enum-types.h" @@ -59,6 +60,8 @@ typedef struct _MetaScreenCastStreamPrivate MetaScreenCastFlag flags; MetaScreenCastStreamSrc *src; + + char *mapping_id; } MetaScreenCastStreamPrivate; static void @@ -217,6 +220,15 @@ meta_screen_cast_stream_get_flags (MetaScreenCastStream *stream) return priv->flags; } +const char * +meta_screen_cast_stream_get_mapping_id (MetaScreenCastStream *stream) +{ + MetaScreenCastStreamPrivate *priv = + meta_screen_cast_stream_get_instance_private (stream); + + return priv->mapping_id; +} + static void meta_screen_cast_stream_set_property (GObject *object, guint prop_id, @@ -286,6 +298,7 @@ meta_screen_cast_stream_finalize (GObject *object) meta_screen_cast_stream_close (stream); g_clear_pointer (&priv->object_path, g_free); + g_clear_pointer (&priv->mapping_id, g_free); G_OBJECT_CLASS (meta_screen_cast_stream_parent_class)->finalize (object); } @@ -358,6 +371,7 @@ meta_screen_cast_stream_initable_init (GInitable *initable, MetaDBusScreenCastStream *skeleton = META_DBUS_SCREEN_CAST_STREAM (stream); MetaScreenCastStreamPrivate *priv = meta_screen_cast_stream_get_instance_private (stream); + MetaRemoteDesktopSession *remote_desktop_session; GVariantBuilder parameters_builder; GVariant *parameters_variant; static unsigned int global_stream_number = 0; @@ -365,6 +379,20 @@ meta_screen_cast_stream_initable_init (GInitable *initable, g_variant_builder_init (¶meters_builder, G_VARIANT_TYPE_VARDICT); meta_screen_cast_stream_set_parameters (stream, ¶meters_builder); + remote_desktop_session = + meta_screen_cast_session_get_remote_desktop_session (priv->session); + if (remote_desktop_session) + { + const char *mapping_id; + + mapping_id = + meta_remote_desktop_session_acquire_mapping_id (remote_desktop_session); + priv->mapping_id = g_strdup (mapping_id); + g_variant_builder_add (¶meters_builder, "{sv}", + "mapping-id", + g_variant_new ("s", priv->mapping_id)); + } + parameters_variant = g_variant_builder_end (¶meters_builder); meta_dbus_screen_cast_stream_set_parameters (skeleton, parameters_variant); diff --git a/src/backends/meta-screen-cast-stream.h b/src/backends/meta-screen-cast-stream.h index 7e966c996..dd85b069f 100644 --- a/src/backends/meta-screen-cast-stream.h +++ b/src/backends/meta-screen-cast-stream.h @@ -68,3 +68,4 @@ MetaScreenCastCursorMode meta_screen_cast_stream_get_cursor_mode (MetaScreenCast MetaScreenCastFlag meta_screen_cast_stream_get_flags (MetaScreenCastStream *stream); +const char * meta_screen_cast_stream_get_mapping_id (MetaScreenCastStream *stream); diff --git a/src/backends/meta-screen-cast-virtual-stream-src.c b/src/backends/meta-screen-cast-virtual-stream-src.c index 1890ee71b..b98436a5f 100644 --- a/src/backends/meta-screen-cast-virtual-stream-src.c +++ b/src/backends/meta-screen-cast-virtual-stream-src.c @@ -22,6 +22,8 @@ #include "backends/meta-crtc-mode.h" #include "backends/meta-cursor-tracker-private.h" +#include "backends/meta-monitor.h" +#include "backends/meta-output.h" #include "backends/meta-screen-cast-session.h" #include "backends/meta-stage-private.h" #include "backends/meta-virtual-monitor.h" @@ -108,6 +110,16 @@ meta_screen_cast_virtual_stream_src_get_view (MetaScreenCastVirtualStreamSrc *vi return view_from_src (META_SCREEN_CAST_STREAM_SRC (virtual_src)); } +MetaLogicalMonitor * +meta_screen_cast_virtual_stream_src_logical_monitor (MetaScreenCastVirtualStreamSrc *virtual_src) +{ + MetaVirtualMonitor *virtual_monitor = virtual_src->virtual_monitor; + MetaOutput *output = meta_virtual_monitor_get_output (virtual_monitor); + MetaMonitor *monitor = meta_output_get_monitor (output); + + return meta_monitor_get_logical_monitor (monitor); +} + static void sync_cursor_state (MetaScreenCastVirtualStreamSrc *virtual_src) { diff --git a/src/backends/meta-screen-cast-virtual-stream-src.h b/src/backends/meta-screen-cast-virtual-stream-src.h index d46f8bafa..075d727e4 100644 --- a/src/backends/meta-screen-cast-virtual-stream-src.h +++ b/src/backends/meta-screen-cast-virtual-stream-src.h @@ -31,3 +31,5 @@ MetaScreenCastVirtualStreamSrc * meta_screen_cast_virtual_stream_src_new (MetaSc GError **error); ClutterStageView * meta_screen_cast_virtual_stream_src_get_view (MetaScreenCastVirtualStreamSrc *virtual_src); + +MetaLogicalMonitor * meta_screen_cast_virtual_stream_src_logical_monitor (MetaScreenCastVirtualStreamSrc *virtual_src); diff --git a/src/backends/meta-screen-cast-virtual-stream.c b/src/backends/meta-screen-cast-virtual-stream.c index 7acb12781..1ea41d09e 100644 --- a/src/backends/meta-screen-cast-virtual-stream.c +++ b/src/backends/meta-screen-cast-virtual-stream.c @@ -20,18 +20,23 @@ #include "backends/meta-screen-cast-virtual-stream.h" +#include "backends/meta-eis.h" +#include "backends/meta-logical-monitor.h" #include "backends/meta-screen-cast-virtual-stream-src.h" #include "backends/meta-virtual-monitor.h" - struct _MetaScreenCastVirtualStream { MetaScreenCastStream parent; }; -G_DEFINE_TYPE (MetaScreenCastVirtualStream, - meta_screen_cast_virtual_stream, - META_TYPE_SCREEN_CAST_STREAM) +static void meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface); + +G_DEFINE_TYPE_WITH_CODE (MetaScreenCastVirtualStream, + meta_screen_cast_virtual_stream, + META_TYPE_SCREEN_CAST_STREAM, + G_IMPLEMENT_INTERFACE (META_TYPE_EIS_VIEWPORT, + meta_eis_viewport_iface_init)) MetaScreenCastVirtualStream * meta_screen_cast_virtual_stream_new (MetaScreenCastSession *session, @@ -56,6 +61,99 @@ meta_screen_cast_virtual_stream_new (MetaScreenCastSession *session, return virtual_stream; } +static gboolean +meta_screen_cast_virtual_stream_is_standalone (MetaEisViewport *viewport) +{ + return FALSE; +} + +static const char * +meta_screen_cast_virtual_stream_get_mapping_id (MetaEisViewport *viewport) +{ + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (viewport); + + return meta_screen_cast_stream_get_mapping_id (stream); +} + +static gboolean +meta_screen_cast_virtual_stream_get_position (MetaEisViewport *viewport, + int *out_x, + int *out_y) +{ + MetaScreenCastVirtualStream *virtual_stream = + META_SCREEN_CAST_VIRTUAL_STREAM (viewport); + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (virtual_stream); + MetaScreenCastStreamSrc *src = meta_screen_cast_stream_get_src (stream); + MetaScreenCastVirtualStreamSrc *virtual_src = + META_SCREEN_CAST_VIRTUAL_STREAM_SRC (src); + MetaLogicalMonitor *logical_monitor = + meta_screen_cast_virtual_stream_src_logical_monitor (virtual_src); + MtkRectangle layout; + + layout = meta_logical_monitor_get_layout (logical_monitor); + *out_x = layout.x; + *out_y = layout.y; + return TRUE; +} + +static void +meta_screen_cast_virtual_stream_get_size (MetaEisViewport *viewport, + int *out_width, + int *out_height) +{ + MetaScreenCastVirtualStream *virtual_stream = + META_SCREEN_CAST_VIRTUAL_STREAM (viewport); + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (virtual_stream); + MetaScreenCastStreamSrc *src = meta_screen_cast_stream_get_src (stream); + MetaScreenCastVirtualStreamSrc *virtual_src = + META_SCREEN_CAST_VIRTUAL_STREAM_SRC (src); + MetaLogicalMonitor *logical_monitor = + meta_screen_cast_virtual_stream_src_logical_monitor (virtual_src); + MtkRectangle layout; + + layout = meta_logical_monitor_get_layout (logical_monitor); + *out_width = layout.width; + *out_height = layout.height; +} + +static double +meta_screen_cast_virtual_stream_get_physical_scale (MetaEisViewport *viewport) +{ + MetaScreenCastVirtualStream *virtual_stream = + META_SCREEN_CAST_VIRTUAL_STREAM (viewport); + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (virtual_stream); + MetaScreenCastStreamSrc *src = meta_screen_cast_stream_get_src (stream); + MetaScreenCastVirtualStreamSrc *virtual_src = + META_SCREEN_CAST_VIRTUAL_STREAM_SRC (src); + MetaLogicalMonitor *logical_monitor = + meta_screen_cast_virtual_stream_src_logical_monitor (virtual_src); + + return meta_logical_monitor_get_scale (logical_monitor); +} + +static gboolean +meta_screen_cast_virtual_stream_transform_coordinate (MetaEisViewport *viewport, + double x, + double y, + double *out_x, + double *out_y) +{ + *out_x = x; + *out_y = y; + return TRUE; +} + +static void +meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface) +{ + eis_viewport_iface->is_standalone = meta_screen_cast_virtual_stream_is_standalone; + eis_viewport_iface->get_mapping_id = meta_screen_cast_virtual_stream_get_mapping_id; + eis_viewport_iface->get_position = meta_screen_cast_virtual_stream_get_position; + eis_viewport_iface->get_size = meta_screen_cast_virtual_stream_get_size; + eis_viewport_iface->get_physical_scale = meta_screen_cast_virtual_stream_get_physical_scale; + eis_viewport_iface->transform_coordinate = meta_screen_cast_virtual_stream_transform_coordinate; +} + static MetaScreenCastStreamSrc * meta_screen_cast_virtual_stream_create_src (MetaScreenCastStream *stream, GError **error) diff --git a/src/backends/meta-screen-cast-window-stream.c b/src/backends/meta-screen-cast-window-stream.c index 8cde03914..1c5349714 100644 --- a/src/backends/meta-screen-cast-window-stream.c +++ b/src/backends/meta-screen-cast-window-stream.c @@ -20,6 +20,7 @@ #include "backends/meta-screen-cast-window-stream.h" +#include "backends/meta-eis.h" #include "backends/meta-logical-monitor.h" #include "backends/meta-monitor-manager-private.h" #include "backends/meta-screen-cast-session.h" @@ -54,11 +55,15 @@ static GInitableIface *initable_parent_iface; static void meta_screen_cast_window_stream_init_initable_iface (GInitableIface *iface); +static void meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface); + G_DEFINE_TYPE_WITH_CODE (MetaScreenCastWindowStream, meta_screen_cast_window_stream, META_TYPE_SCREEN_CAST_STREAM, G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, - meta_screen_cast_window_stream_init_initable_iface)) + meta_screen_cast_window_stream_init_initable_iface) + G_IMPLEMENT_INTERFACE (META_TYPE_EIS_VIEWPORT, + meta_eis_viewport_iface_init)) MetaWindow * meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream) @@ -271,6 +276,77 @@ meta_screen_cast_window_stream_init_initable_iface (GInitableIface *iface) iface->init = meta_screen_cast_window_stream_initable_init; } +static gboolean +meta_screen_cast_window_stream_is_standalone (MetaEisViewport *viewport) +{ + return TRUE; +} + +static const char * +meta_screen_cast_window_stream_get_mapping_id (MetaEisViewport *viewport) +{ + MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (viewport); + + return meta_screen_cast_stream_get_mapping_id (stream); +} + +static gboolean +meta_screen_cast_window_stream_get_position (MetaEisViewport *viewport, + int *out_x, + int *out_y) +{ + return FALSE; +} + +static void +meta_screen_cast_window_stream_get_size (MetaEisViewport *viewport, + int *out_width, + int *out_height) +{ + MetaScreenCastWindowStream *window_stream = + META_SCREEN_CAST_WINDOW_STREAM (viewport); + + *out_width = window_stream->stream_width; + *out_height = window_stream->stream_height; +} + +static double +meta_screen_cast_window_stream_get_physical_scale (MetaEisViewport *viewport) +{ + return 1.0; +} + +static gboolean +meta_screen_cast_window_stream_transform_coordinate (MetaEisViewport *viewport, + double x, + double y, + double *out_x, + double *out_y) +{ + MetaScreenCastWindowStream *window_stream = + META_SCREEN_CAST_WINDOW_STREAM (viewport); + MetaScreenCastWindow *screen_cast_window = + META_SCREEN_CAST_WINDOW (meta_window_actor_from_window (window_stream->window)); + + meta_screen_cast_window_transform_relative_position (screen_cast_window, + x, + y, + out_x, + out_y); + return TRUE; +} + +static void +meta_eis_viewport_iface_init (MetaEisViewportInterface *eis_viewport_iface) +{ + eis_viewport_iface->is_standalone = meta_screen_cast_window_stream_is_standalone; + eis_viewport_iface->get_mapping_id = meta_screen_cast_window_stream_get_mapping_id; + eis_viewport_iface->get_position = meta_screen_cast_window_stream_get_position; + eis_viewport_iface->get_size = meta_screen_cast_window_stream_get_size; + eis_viewport_iface->get_physical_scale = meta_screen_cast_window_stream_get_physical_scale; + eis_viewport_iface->transform_coordinate = meta_screen_cast_window_stream_transform_coordinate; +} + static void meta_screen_cast_window_stream_init (MetaScreenCastWindowStream *window_stream) {