screen-cast-stream: Add stream parameters

For monitor streams, add position and size (in compositor coordinate
space) parameters.

https://bugzilla.gnome.org/show_bug.cgi?id=787715
This commit is contained in:
Jonas Ådahl 2017-09-12 09:19:51 +08:00
parent ab541e3e0f
commit a35274ddb7
4 changed files with 118 additions and 5 deletions

View File

@ -27,6 +27,13 @@
#include "backends/meta-logical-monitor.h" #include "backends/meta-logical-monitor.h"
#include "backends/meta-screen-cast-monitor-stream-src.h" #include "backends/meta-screen-cast-monitor-stream-src.h"
enum
{
PROP_0,
PROP_MONITOR,
};
struct _MetaScreenCastMonitorStream struct _MetaScreenCastMonitorStream
{ {
MetaScreenCastStream parent; MetaScreenCastStream parent;
@ -105,10 +112,8 @@ meta_screen_cast_monitor_stream_new (GDBusConnection *connection,
GError **error) GError **error)
{ {
MetaScreenCastMonitorStream *monitor_stream; MetaScreenCastMonitorStream *monitor_stream;
MetaLogicalMonitor *logical_monitor;
logical_monitor = meta_monitor_get_logical_monitor (monitor); if (!meta_monitor_is_active (monitor))
if (!logical_monitor)
{ {
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Monitor not active"); g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Monitor not active");
return NULL; return NULL;
@ -118,12 +123,11 @@ meta_screen_cast_monitor_stream_new (GDBusConnection *connection,
NULL, NULL,
error, error,
"connection", connection, "connection", connection,
"monitor", monitor,
NULL); NULL);
if (!monitor_stream) if (!monitor_stream)
return NULL; return NULL;
g_set_object (&monitor_stream->monitor, monitor);
g_set_object (&monitor_stream->logical_monitor, logical_monitor);
monitor_stream->stage = stage; monitor_stream->stage = stage;
g_signal_connect_object (monitor_manager, "monitors-changed", g_signal_connect_object (monitor_manager, "monitors-changed",
@ -149,6 +153,70 @@ meta_screen_cast_monitor_stream_create_src (MetaScreenCastStream *stream,
return META_SCREEN_CAST_STREAM_SRC (monitor_stream_src); return META_SCREEN_CAST_STREAM_SRC (monitor_stream_src);
} }
static void
meta_screen_cast_monitor_stream_set_parameters (MetaScreenCastStream *stream,
GVariantBuilder *parameters_builder)
{
MetaScreenCastMonitorStream *monitor_stream =
META_SCREEN_CAST_MONITOR_STREAM (stream);
MetaRectangle logical_monitor_layout;
logical_monitor_layout =
meta_logical_monitor_get_layout (monitor_stream->logical_monitor);
g_variant_builder_add (parameters_builder, "{sv}",
"position",
g_variant_new ("(ii)",
logical_monitor_layout.x,
logical_monitor_layout.y));
g_variant_builder_add (parameters_builder, "{sv}",
"size",
g_variant_new ("(ii)",
logical_monitor_layout.width,
logical_monitor_layout.height));
}
static void
meta_screen_cast_monitor_stream_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MetaScreenCastMonitorStream *monitor_stream =
META_SCREEN_CAST_MONITOR_STREAM (object);
MetaLogicalMonitor *logical_monitor;
switch (prop_id)
{
case PROP_MONITOR:
g_set_object (&monitor_stream->monitor, g_value_get_object (value));
logical_monitor = meta_monitor_get_logical_monitor (monitor_stream->monitor);
g_set_object (&monitor_stream->logical_monitor, logical_monitor);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
meta_screen_cast_monitor_stream_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
MetaScreenCastMonitorStream *monitor_stream =
META_SCREEN_CAST_MONITOR_STREAM (object);
switch (prop_id)
{
case PROP_MONITOR:
g_value_set_object (value, monitor_stream->monitor);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void static void
meta_screen_cast_monitor_stream_finalize (GObject *object) meta_screen_cast_monitor_stream_finalize (GObject *object)
{ {
@ -173,7 +241,20 @@ meta_screen_cast_monitor_stream_class_init (MetaScreenCastMonitorStreamClass *kl
MetaScreenCastStreamClass *stream_class = MetaScreenCastStreamClass *stream_class =
META_SCREEN_CAST_STREAM_CLASS (klass); META_SCREEN_CAST_STREAM_CLASS (klass);
object_class->set_property = meta_screen_cast_monitor_stream_set_property;
object_class->get_property = meta_screen_cast_monitor_stream_get_property;
object_class->finalize = meta_screen_cast_monitor_stream_finalize; object_class->finalize = meta_screen_cast_monitor_stream_finalize;
stream_class->create_src = meta_screen_cast_monitor_stream_create_src; stream_class->create_src = meta_screen_cast_monitor_stream_create_src;
stream_class->set_parameters = meta_screen_cast_monitor_stream_set_parameters;
g_object_class_install_property (object_class,
PROP_MONITOR,
g_param_spec_object ("monitor",
"monitor",
"MetaMonitor",
META_TYPE_MONITOR,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
} }

View File

@ -68,6 +68,14 @@ meta_screen_cast_stream_create_src (MetaScreenCastStream *stream,
error); error);
} }
static void
meta_screen_cast_stream_set_parameters (MetaScreenCastStream *stream,
GVariantBuilder *parameters_builder)
{
META_SCREEN_CAST_STREAM_GET_CLASS (stream)->set_parameters (stream,
parameters_builder);
}
static void static void
on_stream_src_closed (MetaScreenCastStreamSrc *src, on_stream_src_closed (MetaScreenCastStreamSrc *src,
MetaScreenCastStream *stream) MetaScreenCastStream *stream)
@ -189,10 +197,19 @@ meta_screen_cast_stream_initable_init (GInitable *initable,
GError **error) GError **error)
{ {
MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (initable); MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (initable);
MetaDBusScreenCastStream *skeleton = META_DBUS_SCREEN_CAST_STREAM (stream);
MetaScreenCastStreamPrivate *priv = MetaScreenCastStreamPrivate *priv =
meta_screen_cast_stream_get_instance_private (stream); meta_screen_cast_stream_get_instance_private (stream);
GVariantBuilder parameters_builder;
GVariant *parameters_variant;
static unsigned int global_stream_number = 0; static unsigned int global_stream_number = 0;
g_variant_builder_init (&parameters_builder, G_VARIANT_TYPE_VARDICT);
meta_screen_cast_stream_set_parameters (stream, &parameters_builder);
parameters_variant = g_variant_builder_end (&parameters_builder);
meta_dbus_screen_cast_stream_set_parameters (skeleton, parameters_variant);
priv->object_path = priv->object_path =
g_strdup_printf (META_SCREEN_CAST_STREAM_DBUS_PATH "/u%u", g_strdup_printf (META_SCREEN_CAST_STREAM_DBUS_PATH "/u%u",
++global_stream_number); ++global_stream_number);

View File

@ -39,6 +39,8 @@ struct _MetaScreenCastStreamClass
MetaScreenCastStreamSrc * (* create_src) (MetaScreenCastStream *stream, MetaScreenCastStreamSrc * (* create_src) (MetaScreenCastStream *stream,
GError **error); GError **error);
void (* set_parameters) (MetaScreenCastStream *stream,
GVariantBuilder *parameters_builder);
}; };
gboolean meta_screen_cast_stream_start (MetaScreenCastStream *stream, gboolean meta_screen_cast_stream_start (MetaScreenCastStream *stream,

View File

@ -102,6 +102,19 @@
<arg name="node_id" type="u" direction="out" /> <arg name="node_id" type="u" direction="out" />
</signal> </signal>
<!--
Parameters:
@short_description: Optional stream parameters
Available parameters include:
* "position" (ii): Position of the source of the stream in the
compositor coordinate space.
* "size" (ii): Size of the source of the stream in the compositor
coordinate space.
-->
<property name="Parameters" type="a{sv}" access="read" />
</interface> </interface>
</node> </node>