]> granicus.if.org Git - vim/commitdiff
patch 8.2.0770: cannot map CTRL-B when using the GUI v8.2.0770
authorBram Moolenaar <Bram@vim.org>
Sat, 16 May 2020 16:57:53 +0000 (18:57 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 May 2020 16:57:53 +0000 (18:57 +0200)
Problem:    Cannot map CTRL-B when using the GUI.
Solution:   Reset the CTRL modifier when used. (closes #6092)

src/gui_gtk_x11.c
src/version.c

index 02526b2726aab7f4d86eb7c51db63918bfd165b1..8e272970d2bd8825a15bef55c4fff2f3a034076a 100644 (file)
@@ -1023,7 +1023,7 @@ focus_out_event(GtkWidget *widget UNUSED,
  * 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, unsigned int *state, char_u *string)
 {
     int            len;
     guint32 uc;
@@ -1031,8 +1031,8 @@ keyval_to_string(unsigned int keyval, unsigned int state, char_u *string)
     uc = gdk_keyval_to_unicode(keyval);
     if (uc != 0)
     {
-       // Check for CTRL-foo
-       if ((state & GDK_CONTROL_MASK) && uc >= 0x20 && uc < 0x80)
+       // 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
@@ -1051,6 +1051,10 @@ keyval_to_string(unsigned int keyval, unsigned int state, char_u *string)
            else
                string[0] = uc;
            len = 1;
+
+           if (string[0] != uc)
+               // The modifier was used, remove it.
+               *state = *state & ~GDK_CONTROL_MASK;
        }
        else
        {
@@ -1169,7 +1173,7 @@ key_press_event(GtkWidget *widget UNUSED,
     else
 #endif
     {
-       len = keyval_to_string(key_sym, state, string2);
+       len = keyval_to_string(key_sym, &state, string2);
 
        // Careful: convert_input() doesn't handle the NUL character.
        // No need to convert pure ASCII anyway, thus the len > 1 check.
index a1b038f15779fa32113657f83f9ec43d5e53a3ab..277650488c6f7f235c940fe482077d349ae8d9b7 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    770,
 /**/
     769,
 /**/