Mercurial > vim
changeset 20595:3609e842f822 v8.2.0851
patch 8.2.0851: can't distinguish <M-a> from accented "a" in the GUI
Commit: https://github.com/vim/vim/commit/f4ae6b245a54f11dd967d06b80f30e5abf55fb82
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat May 30 19:52:46 2020 +0200
patch 8.2.0851: can't distinguish <M-a> from accented "a" in the GUI
Problem: Can't distinguish <M-a> from accented "a" in the GUI.
Solution: Use another way to make mapping <C-bslash> work. (closes https://github.com/vim/vim/issues/6163)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 30 May 2020 20:00:03 +0200 |
parents | 033006d6a9c6 |
children | 4ec94bcaef86 |
files | src/getchar.c src/gui.c src/gui_gtk_x11.c src/version.c |
diffstat | 4 files changed, 28 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -1593,16 +1593,26 @@ merge_modifyOtherKeys(int c_arg) if (mod_mask & MOD_MASK_CTRL) { if ((c >= '`' && c <= 0x7f) || (c >= '@' && c <= '_')) - { c &= 0x1f; - mod_mask &= ~MOD_MASK_CTRL; - } else if (c == '6') - { // CTRL-6 is equivalent to CTRL-^ c = 0x1e; +#ifdef FEAT_GUI_GTK + // These mappings look arbitrary at the first glance, but in fact + // resemble quite exactly the behaviour of the GTK+ 1.2 GUI on my + // machine. The only difference is BS vs. DEL for CTRL-8 (makes + // more sense and is consistent with usual terminal behaviour). + else if (c == '2') + c = NUL; + else if (c >= '3' && c <= '7') + c = c ^ 0x28; + else if (c == '8') + c = BS; + else if (c == '?') + c = DEL; +#endif + if (c != c_arg) mod_mask &= ~MOD_MASK_CTRL; - } } if ((mod_mask & (MOD_MASK_META | MOD_MASK_ALT)) && c >= 0 && c <= 127)
--- a/src/gui.c +++ b/src/gui.c @@ -803,8 +803,8 @@ gui_init(void) if (!p_beval) gui_mch_disable_beval_area(balloonEval); #endif - // In case the terminal was used before ":gui". - seenModifyOtherKeys = FALSE; + // In the GUI modifiers are prepended to keys. + seenModifyOtherKeys = TRUE; #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) if (!im_xim_isvalid_imactivate())
--- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -1018,12 +1018,11 @@ focus_out_event(GtkWidget *widget UNUSED * The output is written to string, which must have room for at least 6 bytes * plus the NUL terminator. Returns the length in bytes. * - * This function is used in the GTK+ 2 GUI only. The GTK+ 1 code makes use - * of GdkEventKey::string instead. But event->string is evil; see here why: + * event->string is evil; see here why: * http://developer.gnome.org/doc/API/2.0/gdk/gdk-Event-Structures.html#GdkEventKey */ static int -keyval_to_string(unsigned int keyval, unsigned int *state, char_u *string) +keyval_to_string(unsigned int keyval, char_u *string) { int len; guint32 uc; @@ -1031,37 +1030,9 @@ keyval_to_string(unsigned int keyval, un uc = gdk_keyval_to_unicode(keyval); if (uc != 0) { - // Check for CTRL-char - if ((*state & GDK_CONTROL_MASK) && uc >= 0x20 && uc < 0x80) - { - // These mappings look arbitrary at the first glance, but in fact - // resemble quite exactly the behaviour of the GTK+ 1.2 GUI on my - // machine. The only difference is BS vs. DEL for CTRL-8 (makes - // more sense and is consistent with usual terminal behaviour). - if (uc >= '@') - string[0] = uc & 0x1F; - else if (uc == '2') - string[0] = NUL; - else if (uc >= '3' && uc <= '7') - string[0] = uc ^ 0x28; - else if (uc == '8') - string[0] = BS; - else if (uc == '?') - string[0] = DEL; - else - string[0] = uc; - len = 1; - - if (string[0] != uc) - // The modifier was used, remove it. - *state = *state & ~GDK_CONTROL_MASK; - } - else - { - // Translate a normal key to UTF-8. This doesn't work for dead - // keys of course, you _have_ to use an input method for that. - len = utf_char2bytes((int)uc, string); - } + // Translate a normal key to UTF-8. This doesn't work for dead + // keys of course, you _have_ to use an input method for that. + len = utf_char2bytes((int)uc, string); } else { @@ -1173,7 +1144,7 @@ key_press_event(GtkWidget *widget UNUSED else #endif { - len = keyval_to_string(key_sym, &state, string2); + len = keyval_to_string(key_sym, string2); // Careful: convert_input() doesn't handle the NUL character. // No need to convert pure ASCII anyway, thus the len > 1 check. @@ -1261,6 +1232,9 @@ key_press_event(GtkWidget *widget UNUSED } else { + // <C-H> and <C-h> mean the same thing, always use "H" + if ((modifiers & MOD_MASK_CTRL) && ASCII_ISALPHA(key)) + key = TOUPPER_ASC(key); string[0] = key; len = 1; }