diff options
author | dec05eba <dec05eba@protonmail.com> | 2025-03-03 12:36:44 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2025-03-03 12:36:44 +0100 |
commit | 6024a54551a4b4a8495b34aa2026ae4ea00c3545 (patch) | |
tree | 6323dfcccb58ab6e8adb517883311e0533d0501a | |
parent | 23122ce9b08f46ecc3118df8af17c0dc9d74f4c5 (diff) |
Fix portal capture on sway and hyprland: unset capture types/cursor modes that are not supported by the desktop portal
-rw-r--r-- | include/dbus.h | 6 | ||||
-rw-r--r-- | src/dbus.c | 34 | ||||
-rw-r--r-- | src/pipewire_audio.c | 2 |
3 files changed, 39 insertions, 3 deletions
diff --git a/include/dbus.h b/include/dbus.h index 6978634..58edf3c 100644 --- a/include/dbus.h +++ b/include/dbus.h @@ -37,7 +37,11 @@ void gsr_dbus_deinit(gsr_dbus *self); /* The follow functions should be called in order to setup ScreenCast properly */ /* These functions that return an int return the response status code */ int gsr_dbus_screencast_create_session(gsr_dbus *self, char **session_handle); -int gsr_dbus_screencast_select_sources(gsr_dbus *self, const char *session_handle, gsr_portal_capture_type capture_type, gsr_portal_cursor_mode cursor_mode); +/* + |capture_type| is a bitmask of gsr_portal_capture_type values. gsr_portal_capture_type values that are not supported by the desktop portal will be ignored. + |gsr_portal_cursor_mode| is a bitmask of gsr_portal_cursor_mode values. gsr_portal_cursor_mode values that are not supported will be ignored. +*/ +int gsr_dbus_screencast_select_sources(gsr_dbus *self, const char *session_handle, uint32_t capture_type, uint32_t cursor_mode); int gsr_dbus_screencast_start(gsr_dbus *self, const char *session_handle, uint32_t *pipewire_node); bool gsr_dbus_screencast_open_pipewire_remote(gsr_dbus *self, const char *session_handle, int *pipewire_fd); const char* gsr_dbus_screencast_get_restore_token(gsr_dbus *self); @@ -614,9 +614,41 @@ int gsr_dbus_screencast_create_session(gsr_dbus *self, char **session_handle) { return 0; } -int gsr_dbus_screencast_select_sources(gsr_dbus *self, const char *session_handle, gsr_portal_capture_type capture_type, gsr_portal_cursor_mode cursor_mode) { +static uint32_t unset_unsupported_capture_types(uint32_t requested_capture_types, uint32_t available_capture_types) { + if(!(available_capture_types & GSR_PORTAL_CAPTURE_TYPE_MONITOR)) + requested_capture_types &= ~GSR_PORTAL_CAPTURE_TYPE_MONITOR; + if(!(available_capture_types & GSR_PORTAL_CAPTURE_TYPE_WINDOW)) + requested_capture_types &= ~GSR_PORTAL_CAPTURE_TYPE_WINDOW; + if(!(available_capture_types & GSR_PORTAL_CAPTURE_TYPE_VIRTUAL)) + requested_capture_types &= ~GSR_PORTAL_CAPTURE_TYPE_VIRTUAL; + return requested_capture_types; +} + +static uint32_t unset_unsupported_cursor_modes(uint32_t requested_cursor_modes, uint32_t available_cursor_modes) { + if(!(available_cursor_modes & GSR_PORTAL_CURSOR_MODE_HIDDEN)) + requested_cursor_modes &= ~GSR_PORTAL_CURSOR_MODE_HIDDEN; + if(!(available_cursor_modes & GSR_PORTAL_CURSOR_MODE_EMBEDDED)) + requested_cursor_modes &= ~GSR_PORTAL_CURSOR_MODE_EMBEDDED; + if(!(available_cursor_modes & GSR_PORTAL_CURSOR_MODE_METADATA)) + requested_cursor_modes &= ~GSR_PORTAL_CURSOR_MODE_METADATA; + return requested_cursor_modes; +} + +int gsr_dbus_screencast_select_sources(gsr_dbus *self, const char *session_handle, uint32_t capture_type, uint32_t cursor_mode) { assert(session_handle); + uint32_t available_source_types = 0; + gsr_dbus_desktop_portal_get_property(self, "org.freedesktop.portal.ScreenCast", "AvailableSourceTypes", &available_source_types); + if(available_source_types == 0) + fprintf(stderr, "gsr error: gsr_dbus_screencast_select_sources: no source types are available\n"); + capture_type = unset_unsupported_capture_types(capture_type, available_source_types); + + uint32_t available_cursor_modes = 0; + gsr_dbus_desktop_portal_get_property(self, "org.freedesktop.portal.ScreenCast", "AvailableCursorModes", &available_cursor_modes); + if(available_cursor_modes == 0) + fprintf(stderr, "gsr error: gsr_dbus_screencast_select_sources: no cursors modes are available\n"); + cursor_mode = unset_unsupported_cursor_modes(cursor_mode, available_cursor_modes); + char handle_token[64]; gsr_dbus_portal_get_unique_handle_token(self, handle_token, sizeof(handle_token)); diff --git a/src/pipewire_audio.c b/src/pipewire_audio.c index be91e76..1ab9681 100644 --- a/src/pipewire_audio.c +++ b/src/pipewire_audio.c @@ -366,7 +366,7 @@ static bool gsr_pipewire_audio_listen_on_metadata(gsr_pipewire_audio *self, uint } // TODO: - pw_proxy_add_object_listener(self->metadata_proxy, &self->metadata_listener, &metadata_events, self); + pw_metadata_add_listener((struct pw_metadata*)self->metadata_proxy, &self->metadata_listener, &metadata_events, self); //struct spa_hook proxy_listener; //pw_proxy_add_listener(self->metadata_proxy, &proxy_listener, &metadata_proxy_events, self); |