screen-cast: Implement MetaEisViewport in all stream types

This will be used to describe a eis_region in a eis_device.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3228>
This commit is contained in:
Jonas Ådahl
2023-08-29 20:34:05 +02:00
committed by Robert Mader
parent 7faac2aef4
commit d4559a9ca4
8 changed files with 393 additions and 13 deletions

View File

@ -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)
{