aboutsummaryrefslogtreecommitdiff
path: root/src/dbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus.c')
-rw-r--r--src/dbus.c63
1 files changed, 50 insertions, 13 deletions
diff --git a/src/dbus.c b/src/dbus.c
index 5757b8b..f12891f 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -1,11 +1,12 @@
#include "../include/dbus.h"
+#include <sys/random.h>
+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
-#include <sys/random.h>
/* TODO: Make non-blocking when GPU Screen Recorder is turned into a library */
/* TODO: Make sure responses matches the requests */
@@ -28,19 +29,10 @@ typedef struct {
};
} dict_entry;
-static const char* dict_value_type_to_string(dict_value_type type) {
- switch(type) {
- case DICT_TYPE_STRING: return "string";
- case DICT_TYPE_UINT32: return "uint32";
- case DICT_TYPE_BOOL: return "boolean";
- }
- return "(unknown)";
-}
-
static bool generate_random_characters(char *buffer, int buffer_size, const char *alphabet, size_t alphabet_size) {
/* TODO: Use other functions on other platforms than linux */
if(getrandom(buffer, buffer_size, 0) < buffer_size) {
- fprintf(stderr, "gsr error: generate_random_characters: failed to get random bytes, error: %s\n", strerror(errno));
+ fprintf(stderr, "Failed to get random bytes, error: %s\n", strerror(errno));
return false;
}
@@ -52,12 +44,25 @@ static bool generate_random_characters(char *buffer, int buffer_size, const char
return true;
}
+static bool generate_random_characters_standard_alphabet(char *buffer, int buffer_size) {
+ return generate_random_characters(buffer, buffer_size, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62);
+}
+
+static const char* dict_value_type_to_string(dict_value_type type) {
+ switch(type) {
+ case DICT_TYPE_STRING: return "string";
+ case DICT_TYPE_UINT32: return "uint32";
+ case DICT_TYPE_BOOL: return "boolean";
+ }
+ return "(unknown)";
+}
+
bool gsr_dbus_init(gsr_dbus *self, const char *screencast_restore_token) {
memset(self, 0, sizeof(*self));
dbus_error_init(&self->err);
self->random_str[DBUS_RANDOM_STR_SIZE] = '\0';
- if(!generate_random_characters(self->random_str, DBUS_RANDOM_STR_SIZE, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62)) {
+ if(!generate_random_characters_standard_alphabet(self->random_str, DBUS_RANDOM_STR_SIZE)) {
fprintf(stderr, "gsr error: gsr_dbus_init: failed to generate random string\n");
return false;
}
@@ -629,9 +634,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));