tests/screen-cast: Also make it a remote desktop session

This will allow emitting input events / remote control too.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2270>
This commit is contained in:
Jonas Ådahl 2022-02-14 18:06:41 +01:00 committed by Marge Bot
parent 88cfd31f18
commit d649445bb7
2 changed files with 111 additions and 33 deletions

View File

@ -191,6 +191,7 @@ if have_native_tests
screen_cast_client = executable('mutter-screen-cast-client', screen_cast_client = executable('mutter-screen-cast-client',
sources: [ sources: [
'screen-cast-client.c', 'screen-cast-client.c',
dbus_remote_desktop_built_sources,
dbus_screen_cast_built_sources, dbus_screen_cast_built_sources,
], ],
include_directories: tests_includes, include_directories: tests_includes,

View File

@ -28,6 +28,7 @@
#include <stdint.h> #include <stdint.h>
#include <sys/mman.h> #include <sys/mman.h>
#include "meta-dbus-remote-desktop.h"
#include "meta-dbus-screen-cast.h" #include "meta-dbus-screen-cast.h"
typedef struct _Stream typedef struct _Stream
@ -46,9 +47,15 @@ typedef struct _Stream
typedef struct _Session typedef struct _Session
{ {
MetaDBusScreenCastSession *proxy; MetaDBusScreenCastSession *screen_cast_session_proxy;
MetaDBusRemoteDesktopSession *remote_desktop_session_proxy;
} Session; } Session;
typedef struct _RemoteDesktop
{
MetaDBusRemoteDesktop *proxy;
} RemoteDesktop;
typedef struct _ScreenCast typedef struct _ScreenCast
{ {
MetaDBusScreenCast *proxy; MetaDBusScreenCast *proxy;
@ -453,9 +460,10 @@ session_start (Session *session)
{ {
GError *error = NULL; GError *error = NULL;
if (!meta_dbus_screen_cast_session_call_start_sync (session->proxy, if (!meta_dbus_remote_desktop_session_call_start_sync (
NULL, session->remote_desktop_session_proxy,
&error)) NULL,
&error))
g_error ("Failed to start session: %s", error->message); g_error ("Failed to start session: %s", error->message);
} }
@ -464,9 +472,10 @@ session_stop (Session *session)
{ {
GError *error = NULL; GError *error = NULL;
if (!meta_dbus_screen_cast_session_call_stop_sync (session->proxy, if (!meta_dbus_remote_desktop_session_call_stop_sync (
NULL, session->remote_desktop_session_proxy,
&error)) NULL,
&error))
g_error ("Failed to stop session: %s", error->message); g_error ("Failed to stop session: %s", error->message);
} }
@ -485,7 +494,7 @@ session_record_virtual (Session *session,
properties_variant = g_variant_builder_end (&properties_builder); properties_variant = g_variant_builder_end (&properties_builder);
if (!meta_dbus_screen_cast_session_call_record_virtual_sync ( if (!meta_dbus_screen_cast_session_call_record_virtual_sync (
session->proxy, session->screen_cast_session_proxy,
properties_variant, properties_variant,
&stream_path, &stream_path,
NULL, NULL,
@ -498,21 +507,14 @@ session_record_virtual (Session *session,
} }
static Session * static Session *
session_new (const char *path) session_new (MetaDBusRemoteDesktopSession *remote_desktop_session_proxy,
MetaDBusScreenCastSession *screen_cast_session_proxy)
{ {
Session *session; Session *session;
GError *error = NULL;
session = g_new0 (Session, 1); session = g_new0 (Session, 1);
session->proxy = meta_dbus_screen_cast_session_proxy_new_for_bus_sync ( session->remote_desktop_session_proxy = remote_desktop_session_proxy;
G_BUS_TYPE_SESSION, session->screen_cast_session_proxy = screen_cast_session_proxy;
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
"org.gnome.Mutter.ScreenCast",
path,
NULL,
&error);
if (!session->proxy)
g_error ("Failed to acquire proxy: %s", error->message);
return session; return session;
} }
@ -520,34 +522,103 @@ session_new (const char *path)
static void static void
session_free (Session *session) session_free (Session *session)
{ {
g_clear_object (&session->proxy); g_clear_object (&session->screen_cast_session_proxy);
g_clear_object (&session->remote_desktop_session_proxy);
g_free (session); g_free (session);
} }
static Session * static Session *
screen_cast_create_session (ScreenCast *screen_cast) screen_cast_create_session (RemoteDesktop *remote_desktop,
ScreenCast *screen_cast)
{ {
GVariantBuilder properties_builder; GVariantBuilder properties_builder;
GVariant *properties_variant;
GError *error = NULL; GError *error = NULL;
g_autofree char *session_path = NULL; g_autofree char *remote_desktop_session_path = NULL;
MetaDBusRemoteDesktopSession *remote_desktop_session_proxy;
g_autofree char *screen_cast_session_path = NULL;
MetaDBusScreenCastSession *screen_cast_session_proxy;
const char *session_id;
Session *session; Session *session;
g_variant_builder_init (&properties_builder, G_VARIANT_TYPE ("a{sv}")); if (!meta_dbus_remote_desktop_call_create_session_sync (
properties_variant = g_variant_builder_end (&properties_builder); remote_desktop->proxy,
&remote_desktop_session_path,
if (!meta_dbus_screen_cast_call_create_session_sync (screen_cast->proxy, NULL,
properties_variant, &error))
&session_path,
NULL,
&error))
g_error ("Failed to create session: %s", error->message); g_error ("Failed to create session: %s", error->message);
session = session_new (session_path); remote_desktop_session_proxy =
meta_dbus_remote_desktop_session_proxy_new_for_bus_sync (
G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
"org.gnome.Mutter.RemoteDesktop",
remote_desktop_session_path,
NULL,
&error);
if (!remote_desktop_session_proxy)
g_error ("Failed to acquire proxy: %s", error->message);
session_id =
meta_dbus_remote_desktop_session_get_session_id (
remote_desktop_session_proxy);
g_variant_builder_init (&properties_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&properties_builder, "{sv}",
"remote-desktop-session-id",
g_variant_new_string (session_id));
if (!meta_dbus_screen_cast_call_create_session_sync (
screen_cast->proxy,
g_variant_builder_end (&properties_builder),
&screen_cast_session_path,
NULL,
&error))
g_error ("Failed to create session: %s", error->message);
screen_cast_session_proxy =
meta_dbus_screen_cast_session_proxy_new_for_bus_sync (
G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
"org.gnome.Mutter.ScreenCast",
screen_cast_session_path,
NULL,
&error);
if (!screen_cast_session_proxy)
g_error ("Failed to acquire proxy: %s", error->message);
session = session_new (remote_desktop_session_proxy,
screen_cast_session_proxy);
g_assert_nonnull (session); g_assert_nonnull (session);
return session; return session;
} }
static RemoteDesktop *
remote_desktop_new (void)
{
RemoteDesktop *remote_desktop;
GError *error = NULL;
remote_desktop = g_new0 (RemoteDesktop, 1);
remote_desktop->proxy = meta_dbus_remote_desktop_proxy_new_for_bus_sync (
G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
"org.gnome.Mutter.RemoteDesktop",
"/org/gnome/Mutter/RemoteDesktop",
NULL,
&error);
if (!remote_desktop->proxy)
g_error ("Failed to acquire proxy: %s", error->message);
return remote_desktop;
}
static void
remote_desktop_free (RemoteDesktop *remote_desktop)
{
g_clear_object (&remote_desktop->proxy);
g_free (remote_desktop);
}
static ScreenCast * static ScreenCast *
screen_cast_new (void) screen_cast_new (void)
{ {
@ -579,14 +650,16 @@ int
main (int argc, main (int argc,
char **argv) char **argv)
{ {
RemoteDesktop *remote_desktop;
ScreenCast *screen_cast; ScreenCast *screen_cast;
Session *session; Session *session;
Stream *stream; Stream *stream;
init_pipewire (); init_pipewire ();
remote_desktop = remote_desktop_new ();
screen_cast = screen_cast_new (); screen_cast = screen_cast_new ();
session = screen_cast_create_session (screen_cast); session = screen_cast_create_session (remote_desktop, screen_cast);
stream = session_record_virtual (session, 50, 40); stream = session_record_virtual (session, 50, 40);
session_start (session); session_start (session);
@ -613,11 +686,15 @@ main (int argc,
g_assert_cmpint (stream->spa_format.size.height, ==, 40); g_assert_cmpint (stream->spa_format.size.height, ==, 40);
} }
/* Check that resizing works */
stream_resize (stream, 60, 60);
session_stop (session); session_stop (session);
stream_free (stream); stream_free (stream);
session_free (session); session_free (session);
screen_cast_free (screen_cast); screen_cast_free (screen_cast);
remote_desktop_free (remote_desktop);
release_pipewire (); release_pipewire ();