diff --git a/src/home.c b/src/home.c index a57c8026a22ffec92db721d6b74062731901c030..e08641008da237f64caac296daaeb20c70489011 100644 --- a/src/home.c +++ b/src/home.c @@ -393,34 +393,25 @@ toggle_application_view_action (GSimpleAction *action, GVariant *param, gpointer static void add_keybindings (PhoshHome *self) { - const GActionEntry entries[] = { + const GActionEntry super_entries[] = { { "Super_R", .activate = toggle_overview_action }, { "Super_L", .activate = toggle_overview_action }, }; - GStrv overview_bindings; - GStrv app_view_bindings; - GPtrArray *action_names = g_ptr_array_new (); + g_autoptr (GStrvBuilder) builder = g_strv_builder_new (); g_autoptr (GSettings) settings = g_settings_new (KEYBINDINGS_SCHEMA_ID); g_autoptr (GArray) actions = g_array_new (FALSE, TRUE, sizeof (GActionEntry)); - overview_bindings = g_settings_get_strv (settings, KEYBINDING_KEY_TOGGLE_OVERVIEW); - for (int i = 0; i < g_strv_length (overview_bindings); i++) { - GActionEntry entry = { .name = overview_bindings[i], .activate = toggle_overview_action }; - g_array_append_val (actions, entry); - g_ptr_array_add (action_names, overview_bindings[i]); - } - /* Free GStrv container but keep individual strings for action_names */ - g_free (overview_bindings); - - app_view_bindings = g_settings_get_strv (settings, KEYBINDING_KEY_TOGGLE_APPLICATION_VIEW); - for (int i = 0; i < g_strv_length (app_view_bindings); i++) { - GActionEntry entry = { .name = app_view_bindings[i], .activate = toggle_application_view_action }; - g_array_append_val (actions, entry); - g_ptr_array_add (action_names, app_view_bindings[i]); - } - /* Free GStrv container but keep individual strings for action_names */ - g_free (app_view_bindings); - g_ptr_array_add (action_names, NULL); + PHOSH_UTIL_BUILD_KEYBINDING (actions, + builder, + settings, + KEYBINDING_KEY_TOGGLE_OVERVIEW, + toggle_overview_action); + + PHOSH_UTIL_BUILD_KEYBINDING (actions, + builder, + settings, + KEYBINDING_KEY_TOGGLE_APPLICATION_VIEW, + toggle_application_view_action); phosh_shell_add_global_keyboard_action_entries (phosh_shell_get_default (), (GActionEntry*) actions->data, @@ -428,11 +419,14 @@ add_keybindings (PhoshHome *self) self); phosh_shell_add_global_keyboard_action_entries (phosh_shell_get_default (), - (GActionEntry*)entries, - G_N_ELEMENTS (entries), + (GActionEntry*)super_entries, + G_N_ELEMENTS (super_entries), self); - self->action_names = (GStrv) g_ptr_array_free (action_names, FALSE); + for (int i = 0; i < G_N_ELEMENTS (super_entries); i++) + g_strv_builder_add (builder, super_entries[i].name); + + self->action_names = g_strv_builder_end (builder); } diff --git a/src/keyboard-events.c b/src/keyboard-events.c index 99b1ecff84ca8473d28d403c43e1cb078f70ebc0..f729179ac1ed011dd11c8ad8df3f128d64293e90 100644 --- a/src/keyboard-events.c +++ b/src/keyboard-events.c @@ -315,11 +315,10 @@ phosh_keyboard_events_init (PhoshKeyboardEvents *self) PhoshKeyboardEvents * -phosh_keyboard_events_new (void) +phosh_keyboard_events_new (GError **err) { - g_autoptr (GError) err = NULL; return g_initable_new (PHOSH_TYPE_KEYBOARD_EVENTS, NULL, - &err, + err, NULL); } diff --git a/src/keyboard-events.h b/src/keyboard-events.h index 06b152880509c4c21bfbf953f27256fee3fa156d..f2fefc6c3f8b23501764b0d99d96c52ae4b632f9 100644 --- a/src/keyboard-events.h +++ b/src/keyboard-events.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2020 Evangelos Ribeiro Tzaras + * 2025 Phosh.mobi e.V. * * SPDX-License-Identifier: GPL-3.0-or-later * @@ -8,8 +9,9 @@ #pragma once -#include -#include +#include + +G_BEGIN_DECLS #define PHOSH_TYPE_KEYBOARD_EVENTS (phosh_keyboard_events_get_type ()) @@ -19,5 +21,6 @@ G_DECLARE_FINAL_TYPE (PhoshKeyboardEvents, KEYBOARD_EVENTS, GSimpleActionGroup) -PhoshKeyboardEvents *phosh_keyboard_events_new (void); +PhoshKeyboardEvents *phosh_keyboard_events_new (GError **err); +G_END_DECLS diff --git a/src/run-command-manager.c b/src/run-command-manager.c index 9604c1e4d4276ba475efd5def163dff8017d790c..97f2e656d353b26f4519394f57f11cfd32eee5fd 100644 --- a/src/run-command-manager.c +++ b/src/run-command-manager.c @@ -119,19 +119,20 @@ show_run_command_dialog (GSimpleAction *action, GVariant *param, gpointer data) static void add_keybindings (PhoshRunCommandManager *self) { - g_auto (GStrv) bindings = NULL; + g_autoptr (GStrvBuilder) builder = g_strv_builder_new (); g_autoptr (GArray) actions = g_array_new (FALSE, TRUE, sizeof (GActionEntry)); - bindings = g_settings_get_strv (self->settings, KEYBINDING_KEY_RUN_DIALOG); - for (int i = 0; i < g_strv_length (bindings); i++) { - GActionEntry entry = { .name = bindings[i], .activate = show_run_command_dialog }; - g_array_append_val (actions, entry); - } + PHOSH_UTIL_BUILD_KEYBINDING (actions, + builder, + self->settings, + KEYBINDING_KEY_RUN_DIALOG, + show_run_command_dialog); + phosh_shell_add_global_keyboard_action_entries (phosh_shell_get_default (), (GActionEntry *)actions->data, actions->len, self); - self->action_names = g_steal_pointer (&bindings); + self->action_names = g_strv_builder_end (builder); } static void diff --git a/src/screenshot-manager.c b/src/screenshot-manager.c index 2dfb433805109c5374787e007d306f4fae5dae3d..f5b72f007ccee1772458145fd03f995356b302fb 100644 --- a/src/screenshot-manager.c +++ b/src/screenshot-manager.c @@ -1207,20 +1207,20 @@ take_screenshot (GSimpleAction *action, GVariant *param, gpointer data) static void add_keybindings (PhoshScreenshotManager *self) { - g_auto (GStrv) bindings = NULL; + g_autoptr (GStrvBuilder) builder = g_strv_builder_new (); g_autoptr (GArray) actions = g_array_new (FALSE, TRUE, sizeof (GActionEntry)); - bindings = g_settings_get_strv (self->settings, KEYBINDING_KEY_SCREENSHOT); - for (int i = 0; i < g_strv_length (bindings); i++) { - GActionEntry entry = { .name = bindings[i], .activate = take_screenshot }; - g_array_append_val (actions, entry); - } + PHOSH_UTIL_BUILD_KEYBINDING (actions, + builder, + self->settings, + KEYBINDING_KEY_SCREENSHOT, + take_screenshot); phosh_shell_add_global_keyboard_action_entries (phosh_shell_get_default (), (GActionEntry *)actions->data, actions->len, self); - self->action_names = g_steal_pointer (&bindings); + self->action_names = g_strv_builder_end (builder); } diff --git a/src/shell.c b/src/shell.c index a40b95f392f23347ecad7c011e05fe17484c4ff8..2cb66ca8ceda89eadef87d04c47cef25b92f2008 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1012,6 +1012,7 @@ phosh_shell_constructed (GObject *object) { PhoshShell *self = PHOSH_SHELL (object); PhoshShellPrivate *priv = phosh_shell_get_instance_private (self); + g_autoptr (GError) err = NULL; guint id; G_OBJECT_CLASS (phosh_shell_parent_class)->constructed (object); @@ -1076,11 +1077,15 @@ phosh_shell_constructed (GObject *object) priv->polkit_auth_agent = phosh_polkit_auth_agent_new (); priv->feedback_manager = phosh_feedback_manager_new (); - priv->keyboard_events = phosh_keyboard_events_new (); - g_signal_connect_swapped (priv->keyboard_events, - "pressed", - G_CALLBACK (on_keyboard_events_pressed), - self); + priv->keyboard_events = phosh_keyboard_events_new (&err); + if (priv->keyboard_events) { + g_signal_connect_swapped (priv->keyboard_events, + "pressed", + G_CALLBACK (on_keyboard_events_pressed), + self); + } else { + g_warning ("Failed to initialize keyboard events: %s", err->message); + } id = g_idle_add ((GSourceFunc) setup_idle_cb, self); g_source_set_name_by_id (id, "[PhoshShell] idle"); diff --git a/src/top-panel.c b/src/top-panel.c index 8c8ec6ad4acd7d9214ab78a4ef201106fb5921e3..d6f1267faeeb6e6f1a7f82eb61b64712263e6e7f 100644 --- a/src/top-panel.c +++ b/src/top-panel.c @@ -437,19 +437,20 @@ toggle_message_tray_action (GSimpleAction *action, GVariant *param, gpointer dat static void add_keybindings (PhoshTopPanel *self) { - g_auto (GStrv) keybindings = NULL; + g_autoptr (GStrvBuilder) builder = g_strv_builder_new (); g_autoptr (GArray) actions = g_array_new (FALSE, TRUE, sizeof (GActionEntry)); - keybindings = g_settings_get_strv (self->kb_settings, KEYBINDING_KEY_TOGGLE_MESSAGE_TRAY); - for (int i = 0; i < g_strv_length (keybindings); i++) { - GActionEntry entry = { .name = keybindings[i], .activate = toggle_message_tray_action }; - g_array_append_val (actions, entry); - } + PHOSH_UTIL_BUILD_KEYBINDING (actions, + builder, + self->kb_settings, + KEYBINDING_KEY_TOGGLE_MESSAGE_TRAY, + toggle_message_tray_action); + phosh_shell_add_global_keyboard_action_entries (phosh_shell_get_default (), (GActionEntry*) actions->data, actions->len, self); - self->action_names = g_steal_pointer (&keybindings); + self->action_names = g_strv_builder_end (builder); } diff --git a/src/util.h b/src/util.h index 09f52a29f7937eef66c4dc4ea2d9c5762383659e..afd4fe0a1e02e9dd3168176f39641a0e66b7e024 100644 --- a/src/util.h +++ b/src/util.h @@ -19,6 +19,31 @@ G_IO_ERROR_NOT_FOUND, G_IO_ERROR_CANCELLED, \ __VA_ARGS__) +/** + * PHOSH_UTIL_BUILD_KEYBINDING: + * @actions: (array)(element-type GActionEntry)(inout): The action array to build + * @builder: A `GStrvBuilder` for the action names + * @settings: The settings + * @key: The settings key + * @callback: The callback to invoke when the keybinding is pressed + * + * Helper to construct keybindings easily + * + * Append the actions for the keybindings found in the settings and add the keybindings + * strings to builder. + */ +#define PHOSH_UTIL_BUILD_KEYBINDING(actions, builder, settings, key, callback) \ + G_STMT_START { \ + GStrv _bindings = g_settings_get_strv (settings, key); \ + for (int i = 0; _bindings[i]; i++) { \ + GActionEntry _entry = { .name = _bindings[i], .activate = callback }; \ + g_array_append_val (actions, _entry); \ + g_strv_builder_take (builder, _bindings[i]); \ + } \ + /* Free container but keep individual strings for action_names */ \ + g_free (_bindings); \ + } G_STMT_END + void phosh_cp_widget_destroy (void *widget); GDesktopAppInfo *phosh_get_desktop_app_info_for_app_id (const char *app_id); char *phosh_munge_app_id (const char *app_id);