summaryrefslogtreecommitdiffstats
path: root/panels/keyboard/cc-keyboard-shortcut-row.c
diff options
context:
space:
mode:
Diffstat (limited to 'panels/keyboard/cc-keyboard-shortcut-row.c')
-rw-r--r--panels/keyboard/cc-keyboard-shortcut-row.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/panels/keyboard/cc-keyboard-shortcut-row.c b/panels/keyboard/cc-keyboard-shortcut-row.c
new file mode 100644
index 0000000..8abb042
--- /dev/null
+++ b/panels/keyboard/cc-keyboard-shortcut-row.c
@@ -0,0 +1,139 @@
+/* cc-keyboard-shortcut-row.c
+ *
+ * Copyright (C) 2020 System76, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <glib/gi18n.h>
+#include "cc-keyboard-shortcut-row.h"
+#include "keyboard-shortcuts.h"
+
+struct _CcKeyboardShortcutRow
+{
+ AdwActionRow parent_instance;
+
+ GtkLabel *accelerator_label;
+ GtkButton *reset_button;
+ GtkRevealer *reset_revealer;
+
+ CcKeyboardItem *item;
+ CcKeyboardManager *manager;
+ CcKeyboardShortcutEditor *shortcut_editor;
+};
+
+G_DEFINE_TYPE (CcKeyboardShortcutRow, cc_keyboard_shortcut_row, ADW_TYPE_ACTION_ROW)
+
+static void
+reset_shortcut_cb (CcKeyboardShortcutRow *self)
+{
+ cc_keyboard_manager_reset_shortcut (self->manager, self->item);
+}
+
+static void
+cc_keyboard_shortcut_row_class_init (CcKeyboardShortcutRowClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/keyboard/cc-keyboard-shortcut-row.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutRow, accelerator_label);
+ gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutRow, reset_button);
+ gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutRow, reset_revealer);
+
+ gtk_widget_class_bind_template_callback (widget_class, reset_shortcut_cb);
+}
+
+static void
+cc_keyboard_shortcut_row_init (CcKeyboardShortcutRow *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+static void
+shortcut_modified_changed_cb (CcKeyboardShortcutRow *self)
+{
+ gtk_revealer_set_reveal_child (self->reset_revealer,
+ !cc_keyboard_item_is_value_default (self->item));
+}
+
+static gboolean
+transform_binding_to_accel (GBinding *binding,
+ const GValue *from_value,
+ GValue *to_value,
+ gpointer user_data)
+{
+ g_autoptr(CcKeyboardItem) item = NULL;
+ CcKeyCombo combo;
+ gchar *accelerator;
+
+ item = CC_KEYBOARD_ITEM (g_binding_dup_source (binding));
+ combo = cc_keyboard_item_get_primary_combo (item);
+
+ /* Embolden the label when the shortcut is modified */
+ if (!cc_keyboard_item_is_value_default (item))
+ {
+ g_autofree gchar *tmp = NULL;
+
+ tmp = convert_keysym_state_to_string (&combo);
+
+ accelerator = g_strdup_printf ("<b>%s</b>", tmp);
+ }
+ else
+ {
+ accelerator = convert_keysym_state_to_string (&combo);
+ }
+
+ g_value_take_string (to_value, accelerator);
+
+ return TRUE;
+}
+
+CcKeyboardShortcutRow *
+cc_keyboard_shortcut_row_new (CcKeyboardItem *item,
+ CcKeyboardManager *manager,
+ CcKeyboardShortcutEditor *shortcut_editor,
+ GtkSizeGroup *size_group)
+{
+ CcKeyboardShortcutRow *self;
+
+ self = g_object_new (CC_TYPE_KEYBOARD_SHORTCUT_ROW, NULL);
+ self->item = item;
+ self->manager = manager;
+ self->shortcut_editor = shortcut_editor;
+
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), cc_keyboard_item_get_description (item));
+
+ g_object_bind_property_full (item,
+ "key-combos",
+ self->accelerator_label,
+ "label",
+ G_BINDING_SYNC_CREATE,
+ transform_binding_to_accel,
+ NULL, NULL, NULL);
+
+ gtk_revealer_set_reveal_child (self->reset_revealer,
+ !cc_keyboard_item_is_value_default (item));
+ g_signal_connect_object (item,
+ "notify::key-combos",
+ G_CALLBACK (shortcut_modified_changed_cb),
+ self, G_CONNECT_SWAPPED);
+
+ gtk_size_group_add_widget(size_group,
+ GTK_WIDGET (self->accelerator_label));
+
+ return self;
+}