aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gsr-config.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gsr-config.h')
-rw-r--r--src/gsr-config.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/src/gsr-config.h b/src/gsr-config.h
new file mode 100644
index 0000000..3ed0525
--- /dev/null
+++ b/src/gsr-config.h
@@ -0,0 +1,175 @@
+#pragma once
+
+#include <glib.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+G_BEGIN_DECLS
+
+/* ── Hotkey ──────────────────────────────────────────────────────── */
+
+typedef struct {
+ int64_t keysym;
+ uint32_t modifiers;
+} GsrConfigHotkey;
+
+/* ── Config struct ───────────────────────────────────────────────── */
+
+typedef struct {
+ /* Capture target */
+ char *record_area_option; /* "window", "focused", "portal", or monitor name */
+ int32_t record_area_width;
+ int32_t record_area_height;
+ int32_t video_width;
+ int32_t video_height;
+
+ /* Video */
+ int32_t fps;
+ int32_t video_bitrate;
+ char *color_range; /* "limited", "full" */
+ char *quality; /* "custom", "medium", "high", "very_high", "ultra" */
+ char *codec; /* "auto", "h264", "hevc", etc. */
+ char *audio_codec; /* "opus", "aac" */
+ char *framerate_mode; /* "auto", "cfr", "vfr" */
+ bool overclock;
+ bool record_cursor;
+
+ /* Audio */
+ char **audio_input; /* NULL-terminated array, each "device:xxx" / "app:xxx" */
+ int n_audio_input;
+ bool merge_audio_tracks;
+ bool record_app_audio_inverted;
+
+ /* Resolution */
+ bool change_video_resolution;
+
+ /* Notifications */
+ bool show_recording_started_notifications;
+ bool show_recording_stopped_notifications;
+ bool show_recording_saved_notifications;
+
+ /* UI state */
+ bool advanced_view;
+ bool hide_window_when_recording;
+ bool restore_portal_session;
+
+ /* Warning flags (persisted, not shown in UI) */
+ bool software_encoding_warning_shown;
+ bool steam_deck_warning_shown;
+ bool hevc_amd_bug_warning_shown;
+ bool av1_amd_bug_warning_shown;
+
+ /* Misc */
+ bool use_new_ui;
+ int32_t installed_gsr_global_hotkeys_version;
+} GsrMainConfig;
+
+typedef struct {
+ char *streaming_service; /* "twitch", "youtube", "custom" */
+ char *youtube_stream_key;
+ char *twitch_stream_key;
+ char *custom_url;
+ char *custom_container; /* "mp4", "flv", "matroska", etc. */
+
+ GsrConfigHotkey start_stop_hotkey;
+} GsrStreamingConfig;
+
+typedef struct {
+ char *save_directory;
+ char *container;
+
+ GsrConfigHotkey start_stop_hotkey;
+ GsrConfigHotkey pause_unpause_hotkey;
+} GsrRecordConfig;
+
+typedef struct {
+ char *save_directory;
+ char *container;
+ int32_t replay_time;
+
+ GsrConfigHotkey start_stop_hotkey;
+ GsrConfigHotkey save_hotkey;
+} GsrReplayConfig;
+
+typedef struct {
+ GsrMainConfig main_config;
+ GsrStreamingConfig streaming_config;
+ GsrRecordConfig record_config;
+ GsrReplayConfig replay_config;
+} GsrConfig;
+
+/* ── API ─────────────────────────────────────────────────────────── */
+
+/**
+ * Initialize config to default values.
+ * Must be called before gsr_config_read() or manual population.
+ */
+void gsr_config_init_defaults(GsrConfig *config);
+
+/**
+ * Read config from the standard file location.
+ * Returns TRUE on success, FALSE if file not found or error.
+ * On failure, config retains its default values.
+ */
+gboolean gsr_config_read(GsrConfig *config);
+
+/**
+ * Save config to the standard file location.
+ * Creates config directory if needed.
+ */
+void gsr_config_save(const GsrConfig *config);
+
+/**
+ * Free all heap-allocated members (strings, arrays).
+ * Does NOT free the GsrConfig struct itself.
+ */
+void gsr_config_clear(GsrConfig *config);
+
+/**
+ * Get the config directory path (e.g., ~/.config/gpu-screen-recorder).
+ * Returns a newly allocated string; caller must g_free().
+ */
+char *gsr_config_get_dir(void);
+
+/**
+ * Get the default videos directory.
+ * Returns a newly allocated string; caller must g_free().
+ */
+char *gsr_config_get_videos_dir(void);
+
+/* ── Hotkey conversion utilities ─────────────────────────────────── */
+
+/**
+ * Convert a GsrConfigHotkey (custom modifier bitmask + keysym) to a
+ * GTK accelerator string like "<Alt>1".
+ * Returns a newly allocated string, or NULL if the hotkey is empty.
+ */
+char *gsr_config_hotkey_to_accel(const GsrConfigHotkey *hk);
+
+/**
+ * Convert a GTK accelerator string like "<Alt>1" to a GsrConfigHotkey.
+ * Returns TRUE on success, FALSE if the accel string is invalid.
+ * If accel is NULL, the hotkey is cleared (keysym=0, modifiers=0).
+ */
+gboolean gsr_config_hotkey_from_accel(GsrConfigHotkey *hk, const char *accel);
+
+#ifdef HAVE_X11
+/**
+ * Convert a GsrConfigHotkey to an X11 modifier mask suitable for XGrabKey.
+ * The keysym is returned unchanged in *out_keysym.
+ */
+void gsr_config_hotkey_to_x11(const GsrConfigHotkey *hk,
+ unsigned int *out_x11_modifiers,
+ uint64_t *out_keysym);
+#endif /* HAVE_X11 */
+
+/**
+ * Check if a hotkey is empty (no key assigned).
+ */
+static inline gboolean
+gsr_config_hotkey_is_empty(const GsrConfigHotkey *hk)
+{
+ return hk->keysym == 0;
+}
+
+G_END_DECLS