diff options
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 255 |
1 files changed, 172 insertions, 83 deletions
diff --git a/src/main.cpp b/src/main.cpp index 0678b87..75c751f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -124,6 +124,12 @@ static GtkWidget *pause_recording_menu_item; static GtkWidget *start_stop_replay_menu_item; static GtkWidget *save_replay_menu_item; static GtkWidget *hide_window_when_recording_menu_item; +static GtkGrid *recording_hotkeys_grid; +static GtkGrid *replay_hotkeys_grid; +static GtkGrid *streaming_hotkeys_grid; +static GtkWidget *recording_hotkeys_not_supported_label; +static GtkWidget *replay_hotkeys_not_supported_label; +static GtkWidget *streaming_hotkeys_not_supported_label; static double record_start_time_sec = 0.0; static double pause_start_sec = 0.0; @@ -3068,57 +3074,80 @@ static void add_wayland_global_hotkeys_ui(GtkGrid *grid, int &row, int width) { row++; } -static GtkWidget* create_replay_page(GtkApplication *app, GtkStack *stack) { - int row = 0; - const int num_columns = 7; - - std::string video_filepath = get_videos_dir(); - - GtkGrid *grid = GTK_GRID(gtk_grid_new()); - gtk_stack_add_named(stack, GTK_WIDGET(grid), "replay"); - gtk_widget_set_vexpand(GTK_WIDGET(grid), true); - gtk_widget_set_hexpand(GTK_WIDGET(grid), true); - gtk_grid_set_row_spacing(grid, 10); - gtk_grid_set_column_spacing(grid, 10); - gtk_widget_set_margin(GTK_WIDGET(grid), 10, 10, 10, 10); +static void create_replay_hotkey_items(GtkGrid *parent_grid, int row, int num_columns) { + replay_hotkeys_grid = GTK_GRID(gtk_grid_new()); + gtk_grid_set_row_spacing(replay_hotkeys_grid, 10); + gtk_grid_set_column_spacing(replay_hotkeys_grid, 10); + gtk_grid_attach(parent_grid, GTK_WIDGET(replay_hotkeys_grid), 0, row, num_columns, 1); + int hotkeys_row = 0; GtkWidget *hotkey_active_label = NULL; if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) { - add_wayland_global_hotkeys_ui(grid, row, num_columns); + add_wayland_global_hotkeys_ui(replay_hotkeys_grid, hotkeys_row, num_columns); } else { hotkey_active_label = gtk_label_new("Press a key combination to set a new hotkey, backspace to remove the hotkey or esc to cancel"); - gtk_grid_attach(grid, hotkey_active_label, 0, row++, num_columns, 1); + gtk_grid_attach(replay_hotkeys_grid, hotkey_active_label, 0, hotkeys_row++, num_columns, 1); } { - gtk_grid_attach(grid, gtk_label_new("Press"), 0, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, gtk_label_new("Press"), 0, hotkeys_row, 1, 1); replay_start_hotkey_button = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(replay_start_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F1"); g_signal_connect(replay_start_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), replay_start_hotkey_button); - gtk_grid_attach(grid, replay_start_hotkey_button, 1, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, replay_start_hotkey_button, 1, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to start the replay and"), 2, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, gtk_label_new("to start the replay and"), 2, hotkeys_row, 1, 1); replay_stop_hotkey_button = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(replay_stop_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F2"); g_signal_connect(replay_stop_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), replay_stop_hotkey_button); - gtk_grid_attach(grid, replay_stop_hotkey_button, 3, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, replay_stop_hotkey_button, 3, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to stop the replay and"), 4, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, gtk_label_new("to stop the replay and"), 4, hotkeys_row, 1, 1); replay_save_hotkey_button = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(replay_save_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F2"); + gtk_entry_set_text(GTK_ENTRY(replay_save_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F3"); g_signal_connect(replay_save_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), replay_save_hotkey_button); - gtk_grid_attach(grid, replay_save_hotkey_button, 5, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, replay_save_hotkey_button, 5, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to save the replay"), 6, row, 1, 1); + gtk_grid_attach(replay_hotkeys_grid, gtk_label_new("to save the replay"), 6, hotkeys_row, 1, 1); - ++row; + ++hotkeys_row; + } +} + +static GtkWidget* create_replay_page(GtkApplication *app, GtkStack *stack) { + int row = 0; + const int num_columns = 7; + + std::string video_filepath = get_videos_dir(); + + GtkGrid *grid = GTK_GRID(gtk_grid_new()); + gtk_stack_add_named(stack, GTK_WIDGET(grid), "replay"); + gtk_widget_set_vexpand(GTK_WIDGET(grid), true); + gtk_widget_set_hexpand(GTK_WIDGET(grid), true); + gtk_grid_set_row_spacing(grid, 10); + gtk_grid_set_column_spacing(grid, 10); + gtk_widget_set_margin(GTK_WIDGET(grid), 10, 10, 10, 10); + + create_replay_hotkey_items(grid, row, num_columns); + ++row; + + GtkWidget *hotkey_active_label = nullptr; + if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) { + replay_hotkeys_not_supported_label = gtk_label_new("Your Wayland compositor doesn't support global hotkeys. Use X11 or KDE Plasma Wayland."); + gtk_grid_attach(grid, replay_hotkeys_not_supported_label, 0, row++, num_columns, 1); + } else { + hotkey_active_label = gtk_label_new("Press a key combination to set a new hotkey, backspace to remove the hotkey or esc to cancel."); + gtk_grid_attach(grid, hotkey_active_label, 0, row++, num_columns, 1); } gtk_grid_attach(grid, gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), 0, row++, num_columns, 1); + gtk_widget_set_visible(GTK_WIDGET(replay_hotkeys_grid), false); + gtk_widget_set_visible(GTK_WIDGET(replay_hotkeys_not_supported_label), false); + GtkWidget *save_icon = gtk_image_new_from_icon_name("document-save", GTK_ICON_SIZE_BUTTON); GtkGrid *file_chooser_grid = GTK_GRID(gtk_grid_new()); @@ -3234,70 +3263,93 @@ static GtkWidget* create_replay_page(GtkApplication *app, GtkStack *stack) { return GTK_WIDGET(grid); } -static GtkWidget* create_recording_page(GtkApplication *app, GtkStack *stack) { - int row = 0; - const int num_columns = 5; - - std::string video_filepath = get_videos_dir(); - - GtkGrid *grid = GTK_GRID(gtk_grid_new()); - gtk_stack_add_named(stack, GTK_WIDGET(grid), "recording"); - gtk_widget_set_vexpand(GTK_WIDGET(grid), true); - gtk_widget_set_hexpand(GTK_WIDGET(grid), true); - gtk_grid_set_row_spacing(grid, 10); - gtk_grid_set_column_spacing(grid, 10); - gtk_widget_set_margin(GTK_WIDGET(grid), 10, 10, 10, 10); +static void create_recording_hotkey_items(GtkGrid *parent_grid, int row, int num_columns) { + recording_hotkeys_grid = GTK_GRID(gtk_grid_new()); + gtk_grid_set_row_spacing(recording_hotkeys_grid, 10); + gtk_grid_set_column_spacing(recording_hotkeys_grid, 10); + gtk_grid_attach(parent_grid, GTK_WIDGET(recording_hotkeys_grid), 0, row, num_columns, 1); + int hotkeys_row = 0; GtkWidget *hotkey_active_label = NULL; if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) { - add_wayland_global_hotkeys_ui(grid, row, num_columns); + add_wayland_global_hotkeys_ui(recording_hotkeys_grid, hotkeys_row, num_columns); } else { hotkey_active_label = gtk_label_new("Press a key combination to set a new hotkey, backspace to remove the hotkey or esc to cancel"); - gtk_grid_attach(grid, hotkey_active_label, 0, row++, num_columns, 1); + gtk_grid_attach(recording_hotkeys_grid, hotkey_active_label, 0, hotkeys_row++, num_columns, 1); } { - gtk_grid_attach(grid, gtk_label_new("Press"), 0, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, gtk_label_new("Press"), 0, hotkeys_row, 1, 1); record_start_hotkey_button = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(record_start_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F1"); g_signal_connect(record_start_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), record_start_hotkey_button); - gtk_grid_attach(grid, record_start_hotkey_button, 1, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, record_start_hotkey_button, 1, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to start recording and"), 2, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, gtk_label_new("to start recording and"), 2, hotkeys_row, 1, 1); record_stop_hotkey_button = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(record_stop_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F2"); g_signal_connect(record_stop_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), record_stop_hotkey_button); - gtk_grid_attach(grid, record_stop_hotkey_button, 3, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, record_stop_hotkey_button, 3, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to stop recording"), 4, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, gtk_label_new("to stop recording"), 4, hotkeys_row, 1, 1); - ++row; + ++hotkeys_row; } { - gtk_grid_attach(grid, gtk_label_new("Press"), 0, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, gtk_label_new("Press"), 0, hotkeys_row, 1, 1); pause_hotkey_button = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(pause_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F5"); g_signal_connect(pause_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), pause_hotkey_button); - gtk_grid_attach(grid, pause_hotkey_button, 1, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, pause_hotkey_button, 1, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to pause recording and"), 2, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, gtk_label_new("to pause recording and"), 2, hotkeys_row, 1, 1); unpause_hotkey_button = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(unpause_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F6"); g_signal_connect(unpause_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), unpause_hotkey_button); - gtk_grid_attach(grid, unpause_hotkey_button, 3, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, unpause_hotkey_button, 3, hotkeys_row, 1, 1); - gtk_grid_attach(grid, gtk_label_new("to unpause recording"), 4, row, 1, 1); + gtk_grid_attach(recording_hotkeys_grid, gtk_label_new("to unpause recording"), 4, hotkeys_row, 1, 1); - ++row; + ++hotkeys_row; + } +} + +static GtkWidget* create_recording_page(GtkApplication *app, GtkStack *stack) { + int row = 0; + const int num_columns = 5; + + std::string video_filepath = get_videos_dir(); + + GtkGrid *grid = GTK_GRID(gtk_grid_new()); + gtk_stack_add_named(stack, GTK_WIDGET(grid), "recording"); + gtk_widget_set_vexpand(GTK_WIDGET(grid), true); + gtk_widget_set_hexpand(GTK_WIDGET(grid), true); + gtk_grid_set_row_spacing(grid, 10); + gtk_grid_set_column_spacing(grid, 10); + gtk_widget_set_margin(GTK_WIDGET(grid), 10, 10, 10, 10); + + create_recording_hotkey_items(grid, row, num_columns); + ++row; + + GtkWidget *hotkey_active_label = nullptr; + if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) { + recording_hotkeys_not_supported_label = gtk_label_new("Your Wayland compositor doesn't support global hotkeys. Use X11 or KDE Plasma Wayland."); + gtk_grid_attach(grid, recording_hotkeys_not_supported_label, 0, row++, num_columns, 1); + } else { + hotkey_active_label = gtk_label_new("Press a key combination to set a new hotkey, backspace to remove the hotkey or esc to cancel."); + gtk_grid_attach(grid, hotkey_active_label, 0, row++, num_columns, 1); } gtk_grid_attach(grid, gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), 0, row++, num_columns, 1); + gtk_widget_set_visible(GTK_WIDGET(recording_hotkeys_grid), false); + gtk_widget_set_visible(GTK_WIDGET(recording_hotkeys_not_supported_label), false); + GtkWidget *save_icon = gtk_image_new_from_icon_name("document-save", GTK_ICON_SIZE_BUTTON); GtkGrid *file_chooser_grid = GTK_GRID(gtk_grid_new()); @@ -3417,6 +3469,37 @@ static GtkWidget* create_recording_page(GtkApplication *app, GtkStack *stack) { return GTK_WIDGET(grid); } +static void create_streaming_hotkey_items(GtkGrid *parent_grid, int row, int num_columns) { + streaming_hotkeys_grid = GTK_GRID(gtk_grid_new()); + gtk_grid_set_row_spacing(streaming_hotkeys_grid, 10); + gtk_grid_set_column_spacing(streaming_hotkeys_grid, 10); + gtk_grid_attach(parent_grid, GTK_WIDGET(streaming_hotkeys_grid), 0, row, num_columns, 1); + int hotkeys_row = 0; + + if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) + add_wayland_global_hotkeys_ui(streaming_hotkeys_grid, hotkeys_row, num_columns); + + { + gtk_grid_attach(streaming_hotkeys_grid, gtk_label_new("Press"), 0, hotkeys_row, 1, 1); + + streaming_start_hotkey_button = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(streaming_start_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F1"); + g_signal_connect(streaming_start_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), streaming_start_hotkey_button); + gtk_grid_attach(streaming_hotkeys_grid, streaming_start_hotkey_button, 1, hotkeys_row, 1, 1); + + gtk_grid_attach(streaming_hotkeys_grid, gtk_label_new("to start streaming and"), 2, hotkeys_row, 1, 1); + + streaming_stop_hotkey_button = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(streaming_stop_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F2"); + g_signal_connect(streaming_stop_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), streaming_stop_hotkey_button); + gtk_grid_attach(streaming_hotkeys_grid, streaming_stop_hotkey_button, 3, hotkeys_row, 1, 1); + + gtk_grid_attach(streaming_hotkeys_grid, gtk_label_new("to stop streaming"), 4, hotkeys_row, 1, 1); + + ++hotkeys_row; + } +} + static GtkWidget* create_streaming_page(GtkApplication *app, GtkStack *stack) { int row = 0; const int num_columns = 5; @@ -3429,36 +3512,23 @@ static GtkWidget* create_streaming_page(GtkApplication *app, GtkStack *stack) { gtk_grid_set_column_spacing(grid, 10); gtk_widget_set_margin(GTK_WIDGET(grid), 10, 10, 10, 10); - GtkWidget *hotkey_active_label = NULL; + create_streaming_hotkey_items(grid, row, num_columns); + ++row; + + GtkWidget *hotkey_active_label = nullptr; if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) { - add_wayland_global_hotkeys_ui(grid, row, num_columns); + streaming_hotkeys_not_supported_label = gtk_label_new("Your Wayland compositor doesn't support global hotkeys. Use X11 or KDE Plasma Wayland."); + gtk_grid_attach(grid, streaming_hotkeys_not_supported_label, 0, row++, num_columns, 1); } else { - hotkey_active_label = gtk_label_new("Press a key combination to set a new hotkey, backspace to remove the hotkey or esc to cancel"); + hotkey_active_label = gtk_label_new("Press a key combination to set a new hotkey, backspace to remove the hotkey or esc to cancel."); gtk_grid_attach(grid, hotkey_active_label, 0, row++, num_columns, 1); } - { - gtk_grid_attach(grid, gtk_label_new("Press"), 0, row, 1, 1); - - streaming_start_hotkey_button = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(streaming_start_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F1"); - g_signal_connect(streaming_start_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), streaming_start_hotkey_button); - gtk_grid_attach(grid, streaming_start_hotkey_button, 1, row, 1, 1); - - gtk_grid_attach(grid, gtk_label_new("to start streaming and"), 2, row, 1, 1); - - streaming_stop_hotkey_button = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(streaming_stop_hotkey_button), gsr_info.system_info.display_server == DisplayServer::WAYLAND ? "" : "Super + F2"); - g_signal_connect(streaming_stop_hotkey_button, "button-press-event", G_CALLBACK(on_hotkey_entry_click), streaming_stop_hotkey_button); - gtk_grid_attach(grid, streaming_stop_hotkey_button, 3, row, 1, 1); - - gtk_grid_attach(grid, gtk_label_new("to stop streaming"), 4, row, 1, 1); - - ++row; - } - gtk_grid_attach(grid, gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), 0, row++, num_columns, 1); + gtk_widget_set_visible(GTK_WIDGET(streaming_hotkeys_grid), false); + gtk_widget_set_visible(GTK_WIDGET(streaming_hotkeys_not_supported_label), false); + GtkGrid *stream_service_grid = GTK_GRID(gtk_grid_new()); gtk_grid_attach(grid, GTK_WIDGET(stream_service_grid), 0, row++, num_columns, 1); gtk_grid_attach(stream_service_grid, gtk_label_new("Stream service: "), 0, 0, 1, 1); @@ -3817,12 +3887,31 @@ static void load_config() { } } -static void init_shortcuts_callback(void *userdata) { +static void init_shortcuts_callback(bool success, void *userdata) { (void)userdata; - if(!gsr_global_shortcuts_list_shortcuts(&global_shortcuts, shortcut_changed_callback, NULL)) { - fprintf(stderr, "gsr error: failed to list shortcuts\n"); + global_shortcuts_initialized = success; + if(success) { + gtk_widget_set_visible(GTK_WIDGET(recording_hotkeys_grid), true); + gtk_widget_set_visible(GTK_WIDGET(replay_hotkeys_grid), true); + gtk_widget_set_visible(GTK_WIDGET(streaming_hotkeys_grid), true); + + gtk_widget_set_visible(GTK_WIDGET(recording_hotkeys_not_supported_label), false); + gtk_widget_set_visible(GTK_WIDGET(replay_hotkeys_not_supported_label), false); + gtk_widget_set_visible(GTK_WIDGET(streaming_hotkeys_not_supported_label), false); + + if(!gsr_global_shortcuts_list_shortcuts(&global_shortcuts, shortcut_changed_callback, NULL)) { + fprintf(stderr, "gsr error: failed to list shortcuts\n"); + } + gsr_global_shortcuts_subscribe_activated_signal(&global_shortcuts, deactivated_callback, shortcut_changed_callback, NULL); + } else { + gtk_widget_set_visible(GTK_WIDGET(recording_hotkeys_grid), false); + gtk_widget_set_visible(GTK_WIDGET(replay_hotkeys_grid), false); + gtk_widget_set_visible(GTK_WIDGET(streaming_hotkeys_grid), false); + + gtk_widget_set_visible(GTK_WIDGET(recording_hotkeys_not_supported_label), true); + gtk_widget_set_visible(GTK_WIDGET(replay_hotkeys_not_supported_label), true); + gtk_widget_set_visible(GTK_WIDGET(streaming_hotkeys_not_supported_label), true); } - gsr_global_shortcuts_subscribe_activated_signal(&global_shortcuts, deactivated_callback, shortcut_changed_callback, NULL); } static const char* gpu_vendor_to_name(GpuVendor vendor) { @@ -3970,11 +4059,11 @@ static void activate(GtkApplication *app, gpointer) { gtk_widget_show_all(window); load_config(); - if(gsr_global_shortcuts_init(&global_shortcuts, init_shortcuts_callback, NULL)) { - global_shortcuts_initialized = true; - } else { - fprintf(stderr, "gsr error: failed to initialize global shortcuts\n"); - global_shortcuts_initialized = false; + if(gsr_info.system_info.display_server == DisplayServer::WAYLAND) { + if(!gsr_global_shortcuts_init(&global_shortcuts, init_shortcuts_callback, NULL)) { + fprintf(stderr, "gsr error: failed to initialize global shortcuts\n"); + global_shortcuts_initialized = false; + } } } |