summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuentin Glidic <sardemff7+git@sardemff7.net>2017-05-04 23:53:52 +0200
committerQuentin Glidic <sardemff7+git@sardemff7.net>2017-05-04 23:53:52 +0200
commitbb5d839f9c2110a78823a35b25a4ececfa7be7e7 (patch)
treed1c57f99860070fef7e4fadb8e64c7cee921902b
parent6f117c3589a9014e3877fc0341c9bc974afab6b7 (diff)
xkb: Allow binding modifiers
And modified modifiers too. Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
-rw-r--r--source/x11-helper.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/source/x11-helper.c b/source/x11-helper.c
index 0e58d829..4a66ba36 100644
--- a/source/x11-helper.c
+++ b/source/x11-helper.c
@@ -662,8 +662,10 @@ gboolean x11_parse_key ( const char *combo, unsigned int *mod, xkb_keysym_t *key
char *input_key = g_strdup ( combo );
char *mod_key = input_key;
char *error_msg = NULL;
- unsigned int modmask = 0;
- xkb_keysym_t sym = XKB_KEY_NoSymbol;
+ unsigned int last_modmask = 0;
+ unsigned int modmask = 0;
+ xkb_keysym_t last_sym = XKB_KEY_NoSymbol;
+ xkb_keysym_t sym = XKB_KEY_NoSymbol;
// Test if this works on release.
if ( g_str_has_prefix ( mod_key, "!" ) ) {
++mod_key;
@@ -676,6 +678,8 @@ gboolean x11_parse_key ( const char *combo, unsigned int *mod, xkb_keysym_t *key
// Remove trailing and leading spaces.
entry = g_strstrip ( entry );
// Compare against lowered version.
+ last_modmask = modmask;
+ last_sym = xkb_keysym_from_name ( entry, XKB_KEYSYM_NO_FLAGS );
char *entry_lowered = g_utf8_strdown ( entry, -1 );
if ( g_utf8_collate ( entry_lowered, "shift" ) == 0 ) {
modmask |= x11_mod_masks[X11MOD_SHIFT];
@@ -720,7 +724,7 @@ gboolean x11_parse_key ( const char *combo, unsigned int *mod, xkb_keysym_t *key
if ( sym != XKB_KEY_NoSymbol ) {
error_msg = g_markup_printf_escaped ( "Only one (non modifier) key can be bound per binding: <b>%s</b> is invalid.\n", entry );
}
- sym = xkb_keysym_from_name ( entry, XKB_KEYSYM_NO_FLAGS );
+ sym = last_sym;
if ( sym == XKB_KEY_NoSymbol ) {
error_msg = g_markup_printf_escaped ( "∙ Key <i>%s</i> is not understood\n", entry );
}
@@ -730,6 +734,11 @@ gboolean x11_parse_key ( const char *combo, unsigned int *mod, xkb_keysym_t *key
g_strfreev ( entries );
g_free ( input_key );
+ if ( ( sym == XKB_KEY_NoSymbol ) && ( last_sym != XKB_KEY_NoSymbol ) ) {
+ sym = last_sym;
+ modmask = last_modmask;
+ }
+
if ( error_msg ) {
char *name = g_markup_escape_text ( combo, -1 );