diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-05-16 14:01:51 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-05-16 14:01:51 +0200 |
commit | fd615a3c901f59abddca27c6a09940be552c0f4d (patch) | |
tree | 75fdd6532b664e0a7971b309c07242aac28d4571 /src/gui_gtk_x11.c | |
parent | a6e67e4f41386c3e6eab7e047671c6d32f6cb0dc (diff) | |
download | vim-git-fd615a3c901f59abddca27c6a09940be552c0f4d.tar.gz |
patch 8.2.0765: In the GUI can't use all the modifiers.v8.2.0765
Problem: In the GUI can't use all the modifiers. (Andri Möll)
Solution: Do not apply Alt/Meta early, do it later like with the terminal.
Avoid the Motif test from crashing.
Diffstat (limited to 'src/gui_gtk_x11.c')
-rw-r--r-- | src/gui_gtk_x11.c | 107 |
1 files changed, 31 insertions, 76 deletions
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index ea43c9385..02526b272 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -1212,39 +1212,9 @@ key_press_event(GtkWidget *widget UNUSED, return FALSE; #endif - // Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character - // that already has the 8th bit set. - // Don't do this for <S-M-Tab>, that should become K_S_TAB with ALT. - // Don't do this for double-byte encodings, it turns the char into a lead - // byte. - if (len == 1 - && ((state & GDK_MOD1_MASK) -#if GTK_CHECK_VERSION(2,10,0) - || (state & GDK_SUPER_MASK) -#endif - ) - && !(key_sym == GDK_BackSpace || key_sym == GDK_Delete) - && (string[0] & 0x80) == 0 - && !(key_sym == GDK_Tab && (state & GDK_SHIFT_MASK)) - && !enc_dbcs - ) - { - string[0] |= 0x80; - state &= ~GDK_MOD1_MASK; // don't use it again - if (enc_utf8) // convert to utf-8 - { - string[1] = string[0] & 0xbf; - string[0] = ((unsigned)string[0] >> 6) + 0xc0; - if (string[1] == CSI) - { - string[2] = KS_EXTRA; - string[3] = (int)KE_CSI; - len = 4; - } - else - len = 2; - } - } + // We used to apply Alt/Meta to the key here (Mod1Mask), but that is now + // done later, the same as it happens for the terminal. Hopefully that + // works for everybody... // Check for special keys. Also do this when len == 1 (key has an ASCII // value) to detect backspace, delete and keypad keys. @@ -1266,52 +1236,37 @@ key_press_event(GtkWidget *widget UNUSED, if (len == 0) // Unrecognized key return TRUE; - // Special keys (and a few others) may have modifiers. Also when using a - // double-byte encoding (can't set the 8th bit). - if (len == -3 || key_sym == GDK_space || key_sym == GDK_Tab - || key_sym == GDK_Return || key_sym == GDK_Linefeed - || key_sym == GDK_Escape || key_sym == GDK_KP_Tab - || key_sym == GDK_ISO_Enter || key_sym == GDK_3270_Enter - || (enc_dbcs && len == 1 && ((state & GDK_MOD1_MASK) -#if GTK_CHECK_VERSION(2,10,0) - || (state & GDK_SUPER_MASK) -#endif - ))) - { - modifiers = modifiers_gdk2vim(state); + // Handle modifiers. + modifiers = modifiers_gdk2vim(state); - /* - * For some keys a shift modifier is translated into another key - * code. - */ - if (len == -3) - key = TO_SPECIAL(string[1], string[2]); - else - key = string[0]; + // For some keys a shift modifier is translated into another key code. + if (len == -3) + key = TO_SPECIAL(string[1], string[2]); + else + key = string[0]; - key = simplify_key(key, &modifiers); - if (key == CSI) - key = K_CSI; - if (IS_SPECIAL(key)) - { - string[0] = CSI; - string[1] = K_SECOND(key); - string[2] = K_THIRD(key); - len = 3; - } - else - { - string[0] = key; - len = 1; - } + key = simplify_key(key, &modifiers); + if (key == CSI) + key = K_CSI; + if (IS_SPECIAL(key)) + { + string[0] = CSI; + string[1] = K_SECOND(key); + string[2] = K_THIRD(key); + len = 3; + } + else + { + string[0] = key; + len = 1; + } - if (modifiers != 0) - { - string2[0] = CSI; - string2[1] = KS_MODIFIER; - string2[2] = modifiers; - add_to_input_buf(string2, 3); - } + if (modifiers != 0) + { + string2[0] = CSI; + string2[1] = KS_MODIFIER; + string2[2] = modifiers; + add_to_input_buf(string2, 3); } if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) |