[gnome-terminal/wip/rishi/keypad-accels: 2/2] accels: Make it convenient to use the '+' alphanumeric key
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-terminal/wip/rishi/keypad-accels: 2/2] accels: Make it convenient to use the '+' alphanumeric key
- Date: Fri, 20 Nov 2020 19:51:23 +0000 (UTC)
commit 2dc4965d539c32e6aea052acc33ce3e01e7afe7c
Author: Debarshi Ray <debarshir gnome org>
Date: Fri Nov 20 20:48:18 2020 +0100
accels: Make it convenient to use the '+' alphanumeric key
Currently, the default accelerator for zooming in (ie., Ctrl++)
requires pressing the shift key when using the alphanumeric keys on
keyboards where the '+' is on the upper level. This is inconvenient.
Even more so on laptop keyboards where the numeric keypad isn't easily
accessible.
From now on, any accelerator that has the '+' key will work without
requiring the shift key.
https://gitlab.gnome.org/GNOME/gnome-terminal/-/issues/313
src/terminal-accels.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 76 insertions(+), 1 deletion(-)
---
diff --git a/src/terminal-accels.c b/src/terminal-accels.c
index d2cd49b4..20837de2 100644
--- a/src/terminal-accels.c
+++ b/src/terminal-accels.c
@@ -290,13 +290,79 @@ get_alternate_accel_key (guint key)
return retval;
}
+static guint
+get_convenience_accel_key (guint key)
+{
+ guint retval = 0;
+
+ if (key != GDK_KEY_plus && key != GDK_KEY_KP_Add)
+ goto out;
+
+ GdkDisplay *display = gdk_display_get_default ();
+ if (display == NULL)
+ goto out;
+
+ GdkKeymap *keymap = gdk_keymap_get_for_display (display);
+ guint keycode = 0;
+
+ {
+ gs_free GdkKeymapKey *keymap_keys = NULL;
+ gint n_keymap_keys;
+
+ if (!gdk_keymap_get_entries_for_keyval (keymap, GDK_KEY_plus, &keymap_keys, &n_keymap_keys)) {
+ _terminal_debug_print (TERMINAL_DEBUG_ACCELS, "GdkKeymapKey for GDK_KEY_plus not found\n");
+ goto out;
+ }
+
+ g_message ("n_keymap_keys: %d", n_keymap_keys);
+ g_message ("keymap_key: %u, %d, %d", keymap_keys[0].keycode, keymap_keys[0].group, keymap_keys[0].level);
+
+ gint i;
+
+ for (i = 0; i < n_keymap_keys; i++) {
+ if (keymap_keys[i].level == 1) {
+ keycode = keymap_keys[i].keycode;
+ break;
+ }
+ }
+
+ if (keycode == 0) {
+ _terminal_debug_print (TERMINAL_DEBUG_ACCELS, "No GdkKeymapKey for GDK_KEY_plus is on the upper
level\n");
+ goto out;
+ }
+ }
+
+ {
+ gs_free GdkKeymapKey *keymap_keys = NULL;
+ gint n_keymap_keys;
+ guint *keys;
+
+ if (!gdk_keymap_get_entries_for_keycode (keymap, keycode, &keymap_keys, &keys, &n_keymap_keys)) {
+ _terminal_debug_print (TERMINAL_DEBUG_ACCELS, "Key values for key code %u not found\n", keycode);
+ goto out;
+ }
+
+ gint i;
+
+ for (i = 0; i < n_keymap_keys; i++) {
+ if (keymap_keys[i].level == 0) {
+ retval = keys[i];
+ break;
+ }
+ }
+ }
+
+out:
+ return retval;
+}
+
static void
key_changed_cb (GSettings *settings,
const char *settings_key,
gpointer user_data)
{
GtkApplication *application = user_data;
- const gchar *accels[3] = { NULL, NULL, NULL };
+ const gchar *accels[4] = { NULL, NULL, NULL, NULL };
gsize accels_offset = 0;
_terminal_debug_print (TERMINAL_DEBUG_ACCELS,
@@ -314,6 +380,7 @@ key_changed_cb (GSettings *settings,
gs_free char *value = g_settings_get_string (settings, settings_key);
gs_free char *alternate_value = NULL;
+ gs_free char *convenience_value = NULL;
gs_free char *detailed = g_action_print_detailed_name (key_entry->action_name,
key_entry->parameter);
@@ -347,6 +414,14 @@ key_changed_cb (GSettings *settings,
accels[accels_offset] = alternate_value;
accels_offset++;
}
+
+ guint convenience_key = get_convenience_accel_key (key);
+
+ if (convenience_key != 0) {
+ convenience_value = gtk_accelerator_name (convenience_key, mods);
+ accels[accels_offset] = convenience_value;
+ accels_offset++;
+ }
}
gtk_application_set_accels_for_action (application,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]