summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorOwen W. Taylor <otaylor@fishsoup.net>2010-11-22 18:21:47 -0500
committerOwen W. Taylor <otaylor@fishsoup.net>2011-01-05 19:04:37 -0500
commit859d214a04c29ec839d5552f3e13dff937260083 (patch)
tree93b4c38cecae9e3e99069d5a6be8ab1776c320e5 /src/ui
parentd149b7c974a6fce2ba80c449840c748656dc74ea (diff)
downloadmetacity-859d214a04c29ec839d5552f3e13dff937260083.tar.gz
metacity-859d214a04c29ec839d5552f3e13dff937260083.tar.bz2
Add an "Above_Tab" pseudo-keysym
We want switching between the windows of an application to be an easily accessible operation. The convenient and memorable keybinding is the key above the tab key - but the keysym for that key isn't consistent across different keyboard layouts. Add code that figures out the key from the XKB geometry and a magic keysym name "Above_Tab" that refers to this key and switch the default binding for cycle_group to <Alt>Above_Tab. https://bugzilla.gnome.org/show_bug.cgi?id=635569
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/ui.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 960e702..5ef4f52 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -896,14 +896,50 @@ meta_ui_accelerator_parse (const char *accel,
guint *keycode,
GdkModifierType *keymask)
{
+ const char *above_tab;
+
if (accel[0] == '0' && accel[1] == 'x')
{
*keysym = 0;
*keycode = (guint) strtoul (accel, NULL, 16);
*keymask = 0;
+
+ return;
}
- else
- gtk_accelerator_parse (accel, keysym, keymask);
+
+ /* The key name 'Above_Tab' is special - it's not an actual keysym name,
+ * but rather refers to the key above the tab key. In order to use
+ * the GDK parsing for modifiers in combination with it, we substitute
+ * it with 'Tab' temporarily before calling gtk_accelerator_parse().
+ */
+#define is_word_character(c) (g_ascii_isalnum(c) || ((c) == '_'))
+#define ABOVE_TAB "Above_Tab"
+#define ABOVE_TAB_LEN 9
+
+ above_tab = strstr (accel, ABOVE_TAB);
+ if (above_tab &&
+ (above_tab == accel || !is_word_character (above_tab[-1])) &&
+ !is_word_character (above_tab[ABOVE_TAB_LEN]))
+ {
+ char *before = g_strndup (accel, above_tab - accel);
+ char *after = g_strdup (above_tab + ABOVE_TAB_LEN);
+ char *replaced = g_strconcat (before, "Tab", after, NULL);
+
+ gtk_accelerator_parse (replaced, NULL, keymask);
+
+ g_free (before);
+ g_free (after);
+ g_free (replaced);
+
+ *keysym = META_KEY_ABOVE_TAB;
+ return;
+ }
+
+#undef is_word_character
+#undef ABOVE_TAB
+#undef ABOVE_TAB_LEN
+
+ gtk_accelerator_parse (accel, keysym, keymask);
}
gboolean