linux-pipewire: Shuffle screencast D-Bus proxy around

Move the screencast D-Bus proxy, and related functions, to where
they fit in now: screencast-portal.c.
master
Georges Basile Stavracas Neto 2022-06-22 13:50:16 -03:00
parent 6f1521e944
commit f740033c93
3 changed files with 108 additions and 105 deletions

View File

@ -27,9 +27,8 @@
#define SESSION_PATH "/org/freedesktop/portal/desktop/session/%s/obs%u"
static GDBusConnection *connection = NULL;
static GDBusProxy *proxy = NULL;
static void ensure_proxy(void)
static void ensure_connection(void)
{
g_autoptr(GError) error = NULL;
if (!connection) {
@ -42,21 +41,6 @@ static void ensure_proxy(void)
return;
}
}
if (!proxy) {
proxy = g_dbus_proxy_new_sync(
connection, G_DBUS_PROXY_FLAGS_NONE, NULL,
"org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
"org.freedesktop.portal.ScreenCast", NULL, &error);
if (error) {
blog(LOG_WARNING,
"[portals] Error retrieving D-Bus proxy: %s",
error->message);
return;
}
}
}
char *get_sender_name(void)
@ -64,7 +48,7 @@ char *get_sender_name(void)
char *sender_name;
char *aux;
ensure_proxy();
ensure_connection();
sender_name =
bstrdup(g_dbus_connection_get_unique_name(connection) + 1);
@ -76,72 +60,12 @@ char *get_sender_name(void)
return sender_name;
}
uint32_t portal_get_available_capture_types(void)
{
g_autoptr(GVariant) cached_source_types = NULL;
uint32_t available_source_types;
ensure_proxy();
if (!proxy)
return 0;
cached_source_types =
g_dbus_proxy_get_cached_property(proxy, "AvailableSourceTypes");
available_source_types =
cached_source_types ? g_variant_get_uint32(cached_source_types)
: 0;
return available_source_types;
}
uint32_t portal_get_available_cursor_modes(void)
{
g_autoptr(GVariant) cached_cursor_modes = NULL;
uint32_t available_cursor_modes;
ensure_proxy();
if (!proxy)
return 0;
cached_cursor_modes =
g_dbus_proxy_get_cached_property(proxy, "AvailableCursorModes");
available_cursor_modes =
cached_cursor_modes ? g_variant_get_uint32(cached_cursor_modes)
: 0;
return available_cursor_modes;
}
uint32_t portal_get_screencast_version(void)
{
g_autoptr(GVariant) cached_version = NULL;
uint32_t version;
ensure_proxy();
if (!proxy)
return 0;
cached_version = g_dbus_proxy_get_cached_property(proxy, "version");
version = cached_version ? g_variant_get_uint32(cached_version) : 0;
return version;
}
GDBusConnection *portal_get_dbus_connection(void)
{
ensure_proxy();
ensure_connection();
return connection;
}
GDBusProxy *portal_get_dbus_proxy(void)
{
ensure_proxy();
return proxy;
}
void portal_create_request_path(char **out_path, char **out_token)
{
static uint32_t request_token_count = 0;

View File

@ -23,24 +23,7 @@
#include <stdint.h>
#include <gio/gio.h>
enum portal_capture_type {
PORTAL_CAPTURE_TYPE_MONITOR = 1 << 0,
PORTAL_CAPTURE_TYPE_WINDOW = 1 << 1,
PORTAL_CAPTURE_TYPE_VIRTUAL = 1 << 2,
};
enum portal_cursor_mode {
PORTAL_CURSOR_MODE_HIDDEN = 1 << 0,
PORTAL_CURSOR_MODE_EMBEDDED = 1 << 1,
PORTAL_CURSOR_MODE_METADATA = 1 << 2,
};
uint32_t portal_get_available_capture_types(void);
uint32_t portal_get_available_cursor_modes(void);
uint32_t portal_get_screencast_version(void);
GDBusConnection *portal_get_dbus_connection(void);
GDBusProxy *portal_get_dbus_proxy(void);
void portal_create_request_path(char **out_path, char **out_token);
void portal_create_session_path(char **out_path, char **out_token);

View File

@ -23,6 +23,18 @@
#include <gio/gunixfdlist.h>
enum portal_capture_type {
PORTAL_CAPTURE_TYPE_MONITOR = 1 << 0,
PORTAL_CAPTURE_TYPE_WINDOW = 1 << 1,
PORTAL_CAPTURE_TYPE_VIRTUAL = 1 << 2,
};
enum portal_cursor_mode {
PORTAL_CURSOR_MODE_HIDDEN = 1 << 0,
PORTAL_CURSOR_MODE_EMBEDDED = 1 << 1,
PORTAL_CURSOR_MODE_METADATA = 1 << 2,
};
struct screencast_portal_capture {
enum portal_capture_type capture_type;
@ -42,6 +54,90 @@ struct screencast_portal_capture {
/* ------------------------------------------------- */
static GDBusProxy *screencast_proxy = NULL;
static void ensure_screencast_portal_proxy(void)
{
g_autoptr(GError) error = NULL;
if (!screencast_proxy) {
screencast_proxy = g_dbus_proxy_new_sync(
portal_get_dbus_connection(), G_DBUS_PROXY_FLAGS_NONE,
NULL, "org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
"org.freedesktop.portal.ScreenCast", NULL, &error);
if (error) {
blog(LOG_WARNING,
"[portals] Error retrieving D-Bus proxy: %s",
error->message);
return;
}
}
}
static GDBusProxy *get_screencast_portal_proxy(void)
{
ensure_screencast_portal_proxy();
return screencast_proxy;
}
static uint32_t get_available_capture_types(void)
{
g_autoptr(GVariant) cached_source_types = NULL;
uint32_t available_source_types;
ensure_screencast_portal_proxy();
if (!screencast_proxy)
return 0;
cached_source_types = g_dbus_proxy_get_cached_property(
screencast_proxy, "AvailableSourceTypes");
available_source_types =
cached_source_types ? g_variant_get_uint32(cached_source_types)
: 0;
return available_source_types;
}
static uint32_t get_available_cursor_modes(void)
{
g_autoptr(GVariant) cached_cursor_modes = NULL;
uint32_t available_cursor_modes;
ensure_screencast_portal_proxy();
if (!screencast_proxy)
return 0;
cached_cursor_modes = g_dbus_proxy_get_cached_property(
screencast_proxy, "AvailableCursorModes");
available_cursor_modes =
cached_cursor_modes ? g_variant_get_uint32(cached_cursor_modes)
: 0;
return available_cursor_modes;
}
static uint32_t get_screencast_version(void)
{
g_autoptr(GVariant) cached_version = NULL;
uint32_t version;
ensure_screencast_portal_proxy();
if (!screencast_proxy)
return 0;
cached_version =
g_dbus_proxy_get_cached_property(screencast_proxy, "version");
version = cached_version ? g_variant_get_uint32(cached_version) : 0;
return version;
}
/* ------------------------------------------------- */
struct dbus_call_data {
struct screencast_portal_capture *capture;
char *request_path;
@ -162,7 +258,7 @@ static void open_pipewire_remote(struct screencast_portal_capture *capture)
g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
g_dbus_proxy_call_with_unix_fd_list(
portal_get_dbus_proxy(), "OpenPipeWireRemote",
get_screencast_portal_proxy(), "OpenPipeWireRemote",
g_variant_new("(oa{sv})", capture->session_handle, &builder),
G_DBUS_CALL_FLAGS_NONE, -1, NULL, capture->cancellable,
on_pipewire_remote_opened_cb, capture);
@ -232,7 +328,7 @@ static void on_start_response_received_cb(GDBusConnection *connection,
g_variant_iter_loop(&iter, "(u@a{sv})", &capture->pipewire_node,
&stream_properties);
if (portal_get_screencast_version() >= 4) {
if (get_screencast_version() >= 4) {
g_autoptr(GVariant) restore_token = NULL;
g_clear_pointer(&capture->restore_token, bfree);
@ -288,7 +384,7 @@ static void start(struct screencast_portal_capture *capture)
g_variant_builder_add(&builder, "{sv}", "handle_token",
g_variant_new_string(request_token));
g_dbus_proxy_call(portal_get_dbus_proxy(), "Start",
g_dbus_proxy_call(get_screencast_portal_proxy(), "Start",
g_variant_new("(osa{sv})", capture->session_handle,
"", &builder),
G_DBUS_CALL_FLAGS_NONE, -1, capture->cancellable,
@ -372,7 +468,7 @@ static void select_source(struct screencast_portal_capture *capture)
g_variant_builder_add(&builder, "{sv}", "handle_token",
g_variant_new_string(request_token));
available_cursor_modes = portal_get_available_cursor_modes();
available_cursor_modes = get_available_cursor_modes();
if (available_cursor_modes & PORTAL_CURSOR_MODE_METADATA)
g_variant_builder_add(
@ -388,7 +484,7 @@ static void select_source(struct screencast_portal_capture *capture)
&builder, "{sv}", "cursor_mode",
g_variant_new_uint32(PORTAL_CURSOR_MODE_HIDDEN));
if (portal_get_screencast_version() >= 4) {
if (get_screencast_version() >= 4) {
g_variant_builder_add(&builder, "{sv}", "persist_mode",
g_variant_new_uint32(2));
if (capture->restore_token && *capture->restore_token) {
@ -398,7 +494,7 @@ static void select_source(struct screencast_portal_capture *capture)
}
}
g_dbus_proxy_call(portal_get_dbus_proxy(), "SelectSources",
g_dbus_proxy_call(get_screencast_portal_proxy(), "SelectSources",
g_variant_new("(oa{sv})", capture->session_handle,
&builder),
G_DBUS_CALL_FLAGS_NONE, -1, capture->cancellable,
@ -487,7 +583,7 @@ static void create_session(struct screencast_portal_capture *capture)
g_variant_builder_add(&builder, "{sv}", "session_handle_token",
g_variant_new_string(session_token));
g_dbus_proxy_call(portal_get_dbus_proxy(), "CreateSession",
g_dbus_proxy_call(get_screencast_portal_proxy(), "CreateSession",
g_variant_new("(a{sv})", &builder),
G_DBUS_CALL_FLAGS_NONE, -1, capture->cancellable,
on_session_created_cb, call);
@ -510,7 +606,7 @@ init_screencast_capture(struct screencast_portal_capture *capture)
connection = portal_get_dbus_connection();
if (!connection)
return FALSE;
proxy = portal_get_dbus_proxy();
proxy = get_screencast_portal_proxy();
if (!proxy)
return FALSE;
@ -710,7 +806,7 @@ static void screencast_portal_capture_video_render(void *data,
void screencast_portal_load(void)
{
uint32_t available_capture_types = portal_get_available_capture_types();
uint32_t available_capture_types = get_available_capture_types();
bool desktop_capture_available =
(available_capture_types & PORTAL_CAPTURE_TYPE_MONITOR) != 0;
bool window_capture_available =