mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-04-18 16:05:49 +09:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0129ab140d | ||
|
|
0fff47cc58 | ||
|
|
902556b143 | ||
|
|
6024a54551 | ||
|
|
23122ce9b0 | ||
|
|
f071d8c373 |
@@ -68,7 +68,8 @@ Here are some known unofficial packages:
|
|||||||
* Nix: [NixOS wiki](https://wiki.nixos.org/wiki/Gpu-screen-recorder)
|
* Nix: [NixOS wiki](https://wiki.nixos.org/wiki/Gpu-screen-recorder)
|
||||||
* openSUSE: [openSUSE software repository](https://software.opensuse.org/package/gpu-screen-recorder)
|
* openSUSE: [openSUSE software repository](https://software.opensuse.org/package/gpu-screen-recorder)
|
||||||
* Fedora: [Copr](https://copr.fedorainfracloud.org/coprs/brycensranch/gpu-screen-recorder-git/)
|
* Fedora: [Copr](https://copr.fedorainfracloud.org/coprs/brycensranch/gpu-screen-recorder-git/)
|
||||||
* OpenMandriva: [gpu-screen-recorder](https://github.com/OpenMandrivaAssociation/gpu-screen-recorder/tree/master)
|
* OpenMandriva: [gpu-screen-recorder](https://github.com/OpenMandrivaAssociation/gpu-screen-recorder)
|
||||||
|
* Solus: [gpu-screen-recorder](https://github.com/getsolus/packages/tree/main/packages/g/gpu-screen-recorder)
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
GPU Screen Recorder uses meson build system so you need to install `meson` to build GPU Screen Recorder.
|
GPU Screen Recorder uses meson build system so you need to install `meson` to build GPU Screen Recorder.
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ void gsr_dbus_deinit(gsr_dbus *self);
|
|||||||
/* The follow functions should be called in order to setup ScreenCast properly */
|
/* The follow functions should be called in order to setup ScreenCast properly */
|
||||||
/* These functions that return an int return the response status code */
|
/* 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_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);
|
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);
|
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);
|
const char* gsr_dbus_screencast_get_restore_token(gsr_dbus *self);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
project('gpu-screen-recorder', ['c', 'cpp'], version : '5.2.0', default_options : ['warning_level=2'])
|
project('gpu-screen-recorder', ['c', 'cpp'], version : '5.2.1', default_options : ['warning_level=2'])
|
||||||
|
|
||||||
add_project_arguments('-Wshadow', language : ['c', 'cpp'])
|
add_project_arguments('-Wshadow', language : ['c', 'cpp'])
|
||||||
if get_option('buildtype') == 'debug'
|
if get_option('buildtype') == 'debug'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "gpu-screen-recorder"
|
name = "gpu-screen-recorder"
|
||||||
type = "executable"
|
type = "executable"
|
||||||
version = "5.2.0"
|
version = "5.2.1"
|
||||||
platforms = ["posix"]
|
platforms = ["posix"]
|
||||||
|
|
||||||
[config]
|
[config]
|
||||||
|
|||||||
34
src/dbus.c
34
src/dbus.c
@@ -614,9 +614,41 @@ int gsr_dbus_screencast_create_session(gsr_dbus *self, char **session_handle) {
|
|||||||
return 0;
|
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);
|
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];
|
char handle_token[64];
|
||||||
gsr_dbus_portal_get_unique_handle_token(self, handle_token, sizeof(handle_token));
|
gsr_dbus_portal_get_unique_handle_token(self, handle_token, sizeof(handle_token));
|
||||||
|
|
||||||
|
|||||||
@@ -366,7 +366,7 @@ static bool gsr_pipewire_audio_listen_on_metadata(gsr_pipewire_audio *self, uint
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO:
|
// 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;
|
//struct spa_hook proxy_listener;
|
||||||
//pw_proxy_add_listener(self->metadata_proxy, &proxy_listener, &metadata_proxy_events, self);
|
//pw_proxy_add_listener(self->metadata_proxy, &proxy_listener, &metadata_proxy_events, self);
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ static void subscribe_update_default_devices(pa_context*, const pa_server_info *
|
|||||||
if(server_info->default_sink_name) {
|
if(server_info->default_sink_name) {
|
||||||
// TODO: Size check
|
// TODO: Size check
|
||||||
snprintf(handle->default_output_device_name, sizeof(handle->default_output_device_name), "%s.monitor", server_info->default_sink_name);
|
snprintf(handle->default_output_device_name, sizeof(handle->default_output_device_name), "%s.monitor", server_info->default_sink_name);
|
||||||
if(handle->device_type == DeviceType::DEFAULT_OUTPUT && strcmp(handle->device_name, server_info->default_sink_name) != 0) {
|
if(handle->device_type == DeviceType::DEFAULT_OUTPUT && strcmp(handle->device_name, handle->default_output_device_name) != 0) {
|
||||||
handle->reconnect = true;
|
handle->reconnect = true;
|
||||||
handle->reconnect_last_tried_seconds = clock_get_monotonic_seconds();
|
handle->reconnect_last_tried_seconds = clock_get_monotonic_seconds();
|
||||||
// TODO: Size check
|
// TODO: Size check
|
||||||
@@ -112,7 +112,7 @@ static void subscribe_update_default_devices(pa_context*, const pa_server_info *
|
|||||||
if(server_info->default_source_name) {
|
if(server_info->default_source_name) {
|
||||||
// TODO: Size check
|
// TODO: Size check
|
||||||
snprintf(handle->default_input_device_name, sizeof(handle->default_input_device_name), "%s", server_info->default_source_name);
|
snprintf(handle->default_input_device_name, sizeof(handle->default_input_device_name), "%s", server_info->default_source_name);
|
||||||
if(handle->device_type == DeviceType::DEFAULT_INPUT && strcmp(handle->device_name, server_info->default_sink_name) != 0) {
|
if(handle->device_type == DeviceType::DEFAULT_INPUT && strcmp(handle->device_name, handle->default_input_device_name) != 0) {
|
||||||
handle->reconnect = true;
|
handle->reconnect = true;
|
||||||
handle->reconnect_last_tried_seconds = clock_get_monotonic_seconds();
|
handle->reconnect_last_tried_seconds = clock_get_monotonic_seconds();
|
||||||
// TODO: Size check
|
// TODO: Size check
|
||||||
|
|||||||
Reference in New Issue
Block a user