mirror of
https://repo.dec05eba.com/gpu-screen-recorder-ui
synced 2026-03-31 09:17:04 +09:00
GlobalSettings: Add notification speed setting, change recording start notification speed
This commit is contained in:
@@ -68,6 +68,7 @@ namespace gsr {
|
|||||||
std::string hotkeys_enable_option = "enable_hotkeys";
|
std::string hotkeys_enable_option = "enable_hotkeys";
|
||||||
std::string joystick_hotkeys_enable_option = "disable_hotkeys";
|
std::string joystick_hotkeys_enable_option = "disable_hotkeys";
|
||||||
std::string tint_color;
|
std::string tint_color;
|
||||||
|
std::string notification_speed = "normal";
|
||||||
ConfigHotkey show_hide_hotkey;
|
ConfigHotkey show_hide_hotkey;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,11 @@ namespace gsr {
|
|||||||
WINDOW
|
WINDOW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class NotificationSpeed {
|
||||||
|
NORMAL,
|
||||||
|
FAST
|
||||||
|
};
|
||||||
|
|
||||||
class Overlay {
|
class Overlay {
|
||||||
public:
|
public:
|
||||||
Overlay(std::string resources_path, GsrInfo gsr_info, SupportedCaptureOptions capture_options, egl_functions egl_funcs);
|
Overlay(std::string resources_path, GsrInfo gsr_info, SupportedCaptureOptions capture_options, egl_functions egl_funcs);
|
||||||
@@ -81,6 +86,8 @@ namespace gsr {
|
|||||||
|
|
||||||
void unbind_all_keyboard_hotkeys();
|
void unbind_all_keyboard_hotkeys();
|
||||||
void rebind_all_keyboard_hotkeys();
|
void rebind_all_keyboard_hotkeys();
|
||||||
|
|
||||||
|
void set_notification_speed(NotificationSpeed notification_speed);
|
||||||
private:
|
private:
|
||||||
void handle_keyboard_mapping_event();
|
void handle_keyboard_mapping_event();
|
||||||
void on_event(mgl::Event &event);
|
void on_event(mgl::Event &event);
|
||||||
@@ -245,5 +252,6 @@ namespace gsr {
|
|||||||
mgl::Clock cursor_tracker_update_clock;
|
mgl::Clock cursor_tracker_update_clock;
|
||||||
|
|
||||||
bool hide_ui = false;
|
bool hide_ui = false;
|
||||||
|
double notification_duration_multiplier = 1.0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -70,6 +70,7 @@ namespace gsr {
|
|||||||
std::unique_ptr<Subsection> create_controller_hotkey_subsection(ScrollablePage *parent_page);
|
std::unique_ptr<Subsection> create_controller_hotkey_subsection(ScrollablePage *parent_page);
|
||||||
std::unique_ptr<Button> create_exit_program_button();
|
std::unique_ptr<Button> create_exit_program_button();
|
||||||
std::unique_ptr<Button> create_go_back_to_old_ui_button();
|
std::unique_ptr<Button> create_go_back_to_old_ui_button();
|
||||||
|
std::unique_ptr<List> create_notification_speed();
|
||||||
std::unique_ptr<Subsection> create_application_options_subsection(ScrollablePage *parent_page);
|
std::unique_ptr<Subsection> create_application_options_subsection(ScrollablePage *parent_page);
|
||||||
std::unique_ptr<Subsection> create_application_info_subsection(ScrollablePage *parent_page);
|
std::unique_ptr<Subsection> create_application_info_subsection(ScrollablePage *parent_page);
|
||||||
void add_widgets();
|
void add_widgets();
|
||||||
@@ -103,6 +104,7 @@ namespace gsr {
|
|||||||
Button *take_screenshot_region_button_ptr = nullptr;
|
Button *take_screenshot_region_button_ptr = nullptr;
|
||||||
Button *take_screenshot_window_button_ptr = nullptr;
|
Button *take_screenshot_window_button_ptr = nullptr;
|
||||||
Button *show_hide_button_ptr = nullptr;
|
Button *show_hide_button_ptr = nullptr;
|
||||||
|
RadioButton *notification_speed_button_ptr = nullptr;
|
||||||
|
|
||||||
ConfigHotkey configure_config_hotkey;
|
ConfigHotkey configure_config_hotkey;
|
||||||
ConfigureHotkeyType configure_hotkey_type = ConfigureHotkeyType::NONE;
|
ConfigureHotkeyType configure_hotkey_type = ConfigureHotkeyType::NONE;
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ namespace gsr {
|
|||||||
{"main.hotkeys_enable_option", &config.main_config.hotkeys_enable_option},
|
{"main.hotkeys_enable_option", &config.main_config.hotkeys_enable_option},
|
||||||
{"main.joystick_hotkeys_enable_option", &config.main_config.joystick_hotkeys_enable_option},
|
{"main.joystick_hotkeys_enable_option", &config.main_config.joystick_hotkeys_enable_option},
|
||||||
{"main.tint_color", &config.main_config.tint_color},
|
{"main.tint_color", &config.main_config.tint_color},
|
||||||
|
{"main.notification_speed", &config.main_config.notification_speed},
|
||||||
{"main.show_hide_hotkey", &config.main_config.show_hide_hotkey},
|
{"main.show_hide_hotkey", &config.main_config.show_hide_hotkey},
|
||||||
|
|
||||||
{"streaming.record_options.record_area_option", &config.streaming_config.record_options.record_area_option},
|
{"streaming.record_options.record_area_option", &config.streaming_config.record_options.record_area_option},
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ namespace gsr {
|
|||||||
static const double force_window_on_top_timeout_seconds = 1.0;
|
static const double force_window_on_top_timeout_seconds = 1.0;
|
||||||
static const double replay_status_update_check_timeout_seconds = 1.5;
|
static const double replay_status_update_check_timeout_seconds = 1.5;
|
||||||
static const double replay_saving_notification_timeout_seconds = 0.5;
|
static const double replay_saving_notification_timeout_seconds = 0.5;
|
||||||
|
static const double short_notification_timeout_seconds = 2.0;
|
||||||
static const double notification_timeout_seconds = 3.0;
|
static const double notification_timeout_seconds = 3.0;
|
||||||
static const double notification_error_timeout_seconds = 5.0;
|
static const double notification_error_timeout_seconds = 5.0;
|
||||||
static const double cursor_tracker_update_timeout_sec = 0.1;
|
static const double cursor_tracker_update_timeout_sec = 0.1;
|
||||||
@@ -446,6 +447,17 @@ namespace gsr {
|
|||||||
return global_hotkeys_js;
|
return global_hotkeys_js;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NotificationSpeed to_notification_speed(const std::string ¬ification_speed_str) {
|
||||||
|
if(notification_speed_str == "normal")
|
||||||
|
return NotificationSpeed::NORMAL;
|
||||||
|
else if(notification_speed_str == "fast")
|
||||||
|
return NotificationSpeed::FAST;
|
||||||
|
else {
|
||||||
|
assert(false);
|
||||||
|
return NotificationSpeed::NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Overlay::Overlay(std::string resources_path, GsrInfo gsr_info, SupportedCaptureOptions capture_options, egl_functions egl_funcs) :
|
Overlay::Overlay(std::string resources_path, GsrInfo gsr_info, SupportedCaptureOptions capture_options, egl_functions egl_funcs) :
|
||||||
resources_path(std::move(resources_path)),
|
resources_path(std::move(resources_path)),
|
||||||
gsr_info(std::move(gsr_info)),
|
gsr_info(std::move(gsr_info)),
|
||||||
@@ -474,6 +486,7 @@ namespace gsr {
|
|||||||
|
|
||||||
power_supply_online_filepath = get_power_supply_online_filepath();
|
power_supply_online_filepath = get_power_supply_online_filepath();
|
||||||
replay_startup_mode = replay_startup_string_to_type(config.replay_config.turn_on_replay_automatically_mode.c_str());
|
replay_startup_mode = replay_startup_string_to_type(config.replay_config.turn_on_replay_automatically_mode.c_str());
|
||||||
|
set_notification_speed(to_notification_speed(config.main_config.notification_speed));
|
||||||
|
|
||||||
if(config.main_config.hotkeys_enable_option == "enable_hotkeys")
|
if(config.main_config.hotkeys_enable_option == "enable_hotkeys")
|
||||||
global_hotkeys = register_linux_hotkeys(this, GlobalHotkeysLinux::GrabType::ALL);
|
global_hotkeys = register_linux_hotkeys(this, GlobalHotkeysLinux::GrabType::ALL);
|
||||||
@@ -1645,6 +1658,8 @@ namespace gsr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Overlay::show_notification(const char *str, double timeout_seconds, mgl::Color icon_color, mgl::Color bg_color, NotificationType notification_type, const char *capture_target) {
|
void Overlay::show_notification(const char *str, double timeout_seconds, mgl::Color icon_color, mgl::Color bg_color, NotificationType notification_type, const char *capture_target) {
|
||||||
|
timeout_seconds *= notification_duration_multiplier;
|
||||||
|
|
||||||
char timeout_seconds_str[32];
|
char timeout_seconds_str[32];
|
||||||
snprintf(timeout_seconds_str, sizeof(timeout_seconds_str), "%f", timeout_seconds);
|
snprintf(timeout_seconds_str, sizeof(timeout_seconds_str), "%f", timeout_seconds);
|
||||||
|
|
||||||
@@ -1737,6 +1752,17 @@ namespace gsr {
|
|||||||
bind_linux_hotkeys(static_cast<GlobalHotkeysLinux*>(global_hotkeys.get()), this);
|
bind_linux_hotkeys(static_cast<GlobalHotkeysLinux*>(global_hotkeys.get()), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Overlay::set_notification_speed(NotificationSpeed notification_speed) {
|
||||||
|
switch(notification_speed) {
|
||||||
|
case NotificationSpeed::NORMAL:
|
||||||
|
notification_duration_multiplier = 1.0;
|
||||||
|
break;
|
||||||
|
case NotificationSpeed::FAST:
|
||||||
|
notification_duration_multiplier = 0.3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Overlay::update_notification_process_status() {
|
void Overlay::update_notification_process_status() {
|
||||||
if(notification_process <= 0)
|
if(notification_process <= 0)
|
||||||
return;
|
return;
|
||||||
@@ -1966,7 +1992,9 @@ namespace gsr {
|
|||||||
const char *prefix = "";
|
const char *prefix = "";
|
||||||
switch(notification_type) {
|
switch(notification_type) {
|
||||||
case NotificationType::NONE:
|
case NotificationType::NONE:
|
||||||
|
break;
|
||||||
case NotificationType::SCREENSHOT:
|
case NotificationType::SCREENSHOT:
|
||||||
|
prefix = "Failed to take a screenshot";
|
||||||
break;
|
break;
|
||||||
case NotificationType::RECORD:
|
case NotificationType::RECORD:
|
||||||
prefix = "Failed to start/save recording";
|
prefix = "Failed to start/save recording";
|
||||||
@@ -2009,7 +2037,7 @@ namespace gsr {
|
|||||||
update_ui_replay_stopped();
|
update_ui_replay_stopped();
|
||||||
if(exit_code == 0) {
|
if(exit_code == 0) {
|
||||||
if(config.replay_config.show_replay_stopped_notifications)
|
if(config.replay_config.show_replay_stopped_notifications)
|
||||||
show_notification("Replay stopped", notification_timeout_seconds, mgl::Color(255, 255, 255), get_color_theme().tint_color, NotificationType::REPLAY);
|
show_notification("Replay stopped", short_notification_timeout_seconds, mgl::Color(255, 255, 255), get_color_theme().tint_color, NotificationType::REPLAY);
|
||||||
} else {
|
} else {
|
||||||
on_gsr_process_error(exit_code, NotificationType::REPLAY);
|
on_gsr_process_error(exit_code, NotificationType::REPLAY);
|
||||||
}
|
}
|
||||||
@@ -2024,7 +2052,7 @@ namespace gsr {
|
|||||||
update_ui_streaming_stopped();
|
update_ui_streaming_stopped();
|
||||||
if(exit_code == 0) {
|
if(exit_code == 0) {
|
||||||
if(config.streaming_config.show_streaming_stopped_notifications)
|
if(config.streaming_config.show_streaming_stopped_notifications)
|
||||||
show_notification("Streaming has stopped", notification_timeout_seconds, mgl::Color(255, 255, 255), get_color_theme().tint_color, NotificationType::STREAM);
|
show_notification("Streaming has stopped", short_notification_timeout_seconds, mgl::Color(255, 255, 255), get_color_theme().tint_color, NotificationType::STREAM);
|
||||||
} else {
|
} else {
|
||||||
on_gsr_process_error(exit_code, NotificationType::STREAM);
|
on_gsr_process_error(exit_code, NotificationType::STREAM);
|
||||||
}
|
}
|
||||||
@@ -2665,7 +2693,7 @@ namespace gsr {
|
|||||||
if(!disable_notification && config.replay_config.show_replay_started_notifications) {
|
if(!disable_notification && config.replay_config.show_replay_started_notifications) {
|
||||||
char msg[256];
|
char msg[256];
|
||||||
snprintf(msg, sizeof(msg), "Started replaying %s", capture_target_get_notification_name(recording_capture_target.c_str(), false).c_str());
|
snprintf(msg, sizeof(msg), "Started replaying %s", capture_target_get_notification_name(recording_capture_target.c_str(), false).c_str());
|
||||||
show_notification(msg, notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::REPLAY, recording_capture_target.c_str());
|
show_notification(msg, short_notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::REPLAY, recording_capture_target.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(config.replay_config.record_options.record_area_option == "portal")
|
if(config.replay_config.record_options.record_area_option == "portal")
|
||||||
@@ -2693,7 +2721,7 @@ namespace gsr {
|
|||||||
if(gsr_info.system_info.gsr_version >= GsrVersion{5, 4, 0}) {
|
if(gsr_info.system_info.gsr_version >= GsrVersion{5, 4, 0}) {
|
||||||
if(!replay_recording) {
|
if(!replay_recording) {
|
||||||
if(config.record_config.show_recording_started_notifications)
|
if(config.record_config.show_recording_started_notifications)
|
||||||
show_notification("Started recording in the replay session", notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD);
|
show_notification("Started recording in the replay session", short_notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD);
|
||||||
update_ui_recording_started();
|
update_ui_recording_started();
|
||||||
|
|
||||||
// TODO: This will be incorrect if the user uses portal capture, as capture wont start until the user has
|
// TODO: This will be incorrect if the user uses portal capture, as capture wont start until the user has
|
||||||
@@ -2714,7 +2742,7 @@ namespace gsr {
|
|||||||
if(gsr_info.system_info.gsr_version >= GsrVersion{5, 4, 0}) {
|
if(gsr_info.system_info.gsr_version >= GsrVersion{5, 4, 0}) {
|
||||||
if(!replay_recording) {
|
if(!replay_recording) {
|
||||||
if(config.record_config.show_recording_started_notifications)
|
if(config.record_config.show_recording_started_notifications)
|
||||||
show_notification("Started recording in the streaming session", notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD);
|
show_notification("Started recording in the streaming session", short_notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD);
|
||||||
update_ui_recording_started();
|
update_ui_recording_started();
|
||||||
|
|
||||||
// TODO: This will be incorrect if the user uses portal capture, as capture wont start until the user has
|
// TODO: This will be incorrect if the user uses portal capture, as capture wont start until the user has
|
||||||
@@ -2840,7 +2868,7 @@ namespace gsr {
|
|||||||
if(config.record_config.show_recording_started_notifications) {
|
if(config.record_config.show_recording_started_notifications) {
|
||||||
char msg[256];
|
char msg[256];
|
||||||
snprintf(msg, sizeof(msg), "Started recording %s", capture_target_get_notification_name(recording_capture_target.c_str(), false).c_str());
|
snprintf(msg, sizeof(msg), "Started recording %s", capture_target_get_notification_name(recording_capture_target.c_str(), false).c_str());
|
||||||
show_notification(msg, notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD, recording_capture_target.c_str());
|
show_notification(msg, short_notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD, recording_capture_target.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(config.record_config.record_options.record_area_option == "portal")
|
if(config.record_config.record_options.record_area_option == "portal")
|
||||||
@@ -3026,7 +3054,7 @@ namespace gsr {
|
|||||||
if(config.streaming_config.show_streaming_started_notifications) {
|
if(config.streaming_config.show_streaming_started_notifications) {
|
||||||
char msg[256];
|
char msg[256];
|
||||||
snprintf(msg, sizeof(msg), "Started streaming %s", capture_target_get_notification_name(recording_capture_target.c_str(), false).c_str());
|
snprintf(msg, sizeof(msg), "Started streaming %s", capture_target_get_notification_name(recording_capture_target.c_str(), false).c_str());
|
||||||
show_notification(msg, notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::STREAM, recording_capture_target.c_str());
|
show_notification(msg, short_notification_timeout_seconds, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::STREAM, recording_capture_target.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(config.streaming_config.record_options.record_area_option == "portal")
|
if(config.streaming_config.record_options.record_area_option == "portal")
|
||||||
|
|||||||
@@ -467,13 +467,42 @@ namespace gsr {
|
|||||||
return exit_program_button;
|
return exit_program_button;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<List> GlobalSettingsPage::create_notification_speed() {
|
||||||
|
auto list = std::make_unique<List>(List::Orientation::VERTICAL);
|
||||||
|
list->add_widget(std::make_unique<Label>(&get_theme().body_font, "Notification speed", get_color_theme().text_color));
|
||||||
|
|
||||||
|
auto radio_button = std::make_unique<RadioButton>(&get_theme().body_font, RadioButton::Orientation::HORIZONTAL);
|
||||||
|
notification_speed_button_ptr = radio_button.get();
|
||||||
|
radio_button->add_item("Normal", "normal");
|
||||||
|
radio_button->add_item("Fast", "fast");
|
||||||
|
radio_button->on_selection_changed = [this](const std::string&, const std::string &id) {
|
||||||
|
if(id == "normal")
|
||||||
|
overlay->set_notification_speed(NotificationSpeed::NORMAL);
|
||||||
|
else if(id == "fast")
|
||||||
|
overlay->set_notification_speed(NotificationSpeed::FAST);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
list->add_widget(std::move(radio_button));
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<Subsection> GlobalSettingsPage::create_application_options_subsection(ScrollablePage *parent_page) {
|
std::unique_ptr<Subsection> GlobalSettingsPage::create_application_options_subsection(ScrollablePage *parent_page) {
|
||||||
|
auto list = std::make_unique<List>(List::Orientation::VERTICAL);
|
||||||
|
List *list_ptr = list.get();
|
||||||
|
auto subsection = std::make_unique<Subsection>("Application options", std::move(list), mgl::vec2f(parent_page->get_inner_size().x, 0.0f));
|
||||||
|
|
||||||
|
list_ptr->add_widget(create_notification_speed());
|
||||||
|
list_ptr->add_widget(std::make_unique<LineSeparator>(LineSeparator::Orientation::HORIZONTAL, subsection->get_inner_size().x));
|
||||||
|
|
||||||
const bool inside_flatpak = getenv("FLATPAK_ID") != NULL;
|
const bool inside_flatpak = getenv("FLATPAK_ID") != NULL;
|
||||||
auto list = std::make_unique<List>(List::Orientation::HORIZONTAL);
|
auto navigate_list = std::make_unique<List>(List::Orientation::HORIZONTAL);
|
||||||
list->add_widget(create_exit_program_button());
|
navigate_list->add_widget(create_exit_program_button());
|
||||||
if(inside_flatpak)
|
if(inside_flatpak)
|
||||||
list->add_widget(create_go_back_to_old_ui_button());
|
navigate_list->add_widget(create_go_back_to_old_ui_button());
|
||||||
return std::make_unique<Subsection>("Application options", std::move(list), mgl::vec2f(parent_page->get_inner_size().x, 0.0f));
|
list_ptr->add_widget(std::move(navigate_list));
|
||||||
|
|
||||||
|
return subsection;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Subsection> GlobalSettingsPage::create_application_info_subsection(ScrollablePage *parent_page) {
|
std::unique_ptr<Subsection> GlobalSettingsPage::create_application_info_subsection(ScrollablePage *parent_page) {
|
||||||
@@ -535,6 +564,8 @@ namespace gsr {
|
|||||||
enable_keyboard_hotkeys_radio_button_ptr->set_selected_item(config.main_config.hotkeys_enable_option, false, false);
|
enable_keyboard_hotkeys_radio_button_ptr->set_selected_item(config.main_config.hotkeys_enable_option, false, false);
|
||||||
enable_joystick_hotkeys_radio_button_ptr->set_selected_item(config.main_config.joystick_hotkeys_enable_option, false, false);
|
enable_joystick_hotkeys_radio_button_ptr->set_selected_item(config.main_config.joystick_hotkeys_enable_option, false, false);
|
||||||
|
|
||||||
|
notification_speed_button_ptr->set_selected_item(config.main_config.notification_speed);
|
||||||
|
|
||||||
load_hotkeys();
|
load_hotkeys();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -561,6 +592,7 @@ namespace gsr {
|
|||||||
config.main_config.tint_color = tint_color_radio_button_ptr->get_selected_id();
|
config.main_config.tint_color = tint_color_radio_button_ptr->get_selected_id();
|
||||||
config.main_config.hotkeys_enable_option = enable_keyboard_hotkeys_radio_button_ptr->get_selected_id();
|
config.main_config.hotkeys_enable_option = enable_keyboard_hotkeys_radio_button_ptr->get_selected_id();
|
||||||
config.main_config.joystick_hotkeys_enable_option = enable_joystick_hotkeys_radio_button_ptr->get_selected_id();
|
config.main_config.joystick_hotkeys_enable_option = enable_joystick_hotkeys_radio_button_ptr->get_selected_id();
|
||||||
|
config.main_config.notification_speed = notification_speed_button_ptr->get_selected_id();
|
||||||
save_config(config);
|
save_config(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user