aboutsummaryrefslogtreecommitdiff
path: root/include/dbus.h
blob: 697863468aec6481a26fbec50fb5a4c97aed2ad6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef GSR_DBUS_H
#define GSR_DBUS_H

#include <stdbool.h>
#include <stdint.h>
#include <dbus/dbus.h>

#define DBUS_RANDOM_STR_SIZE 16

typedef struct {
    DBusConnection *con;
    DBusError err;
    char random_str[DBUS_RANDOM_STR_SIZE + 1];
    unsigned int handle_counter;
    bool desktop_portal_rule_added;
    uint32_t screencast_version;
    char *screencast_restore_token;
} gsr_dbus;

typedef enum {
    GSR_PORTAL_CAPTURE_TYPE_MONITOR = 1 << 0,
    GSR_PORTAL_CAPTURE_TYPE_WINDOW  = 1 << 1,
    GSR_PORTAL_CAPTURE_TYPE_VIRTUAL = 1 << 2,
    GSR_PORTAL_CAPTURE_TYPE_ALL = GSR_PORTAL_CAPTURE_TYPE_MONITOR | GSR_PORTAL_CAPTURE_TYPE_WINDOW | GSR_PORTAL_CAPTURE_TYPE_VIRTUAL
} gsr_portal_capture_type;

typedef enum {
    GSR_PORTAL_CURSOR_MODE_HIDDEN   = 1 << 0,
    GSR_PORTAL_CURSOR_MODE_EMBEDDED = 1 << 1,
    GSR_PORTAL_CURSOR_MODE_METADATA = 1 << 2
} gsr_portal_cursor_mode;

/* Blocking. TODO: Make non-blocking */
bool gsr_dbus_init(gsr_dbus *self, const char *screencast_restore_token);
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);
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);

#endif /* GSR_DBUS_H */