changeset 29381:5f2d86ec61eb v9.0.0033

patch 9.0.0033: on a Belgian keyboard CTRL-[ does not work Commit: https://github.com/vim/vim/commit/4dd9252d6f0e93c9118c808bd47f407d581947a8 Author: Anton Sharonov <anton.sharonov@gmail.com> Date: Mon Jul 4 10:47:31 2022 +0100 patch 9.0.0033: on a Belgian keyboard CTRL-[ does not work Problem: On a Belgian keyboard CTRL-[ does not work. Solution: Handle GDK_KEY_dead_circumflex. (Anton Sharonov, closes https://github.com/vim/vim/issues/10658)
author Bram Moolenaar <Bram@vim.org>
date Mon, 04 Jul 2022 12:00:03 +0200
parents 9a01e19b2202
children 289171b6aba3
files src/gui_gtk_x11.c src/version.c
diffstat 2 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -1160,6 +1160,7 @@ key_press_event(GtkWidget *widget UNUSED
     int		key;
     guint	state;
     char_u	*s, *d;
+    int		ctrl_prefix_added = 0;
 
     gui.event_time = event->time;
     key_sym = event->keyval;
@@ -1245,6 +1246,20 @@ key_press_event(GtkWidget *widget UNUSED
 	}
     }
 
+    // Belgian Ctrl+[ workaround
+    if (len == 0 && key_sym == GDK_KEY_dead_circumflex)
+    {
+	string[0] = CSI;
+	string[1] = KS_MODIFIER;
+	string[2] = MOD_MASK_CTRL;
+	string[3] = '[';
+	len = 4;
+	add_to_input_buf(string, len);
+	// workaround has to return here, otherwise our fake string[] entries
+	// are confusing code downstream
+	return TRUE;
+    }
+
     if (len == 0)   // Unrecognized key
 	return TRUE;
 
@@ -1288,6 +1303,8 @@ key_press_event(GtkWidget *widget UNUSED
 	string2[1] = KS_MODIFIER;
 	string2[2] = modifiers;
 	add_to_input_buf(string2, 3);
+	if (modifiers == 0x4)
+	    ctrl_prefix_added = 1;
     }
 
     // Check if the key interrupts.
@@ -1302,6 +1319,15 @@ key_press_event(GtkWidget *widget UNUSED
 	}
     }
 
+    // workaround for German keyboard, where instead of '[' char we have code
+    // sequence of bytes 195, 188 (UTF-8 for "u-umlaut")
+    if (ctrl_prefix_added && len == 2
+		    && ((int)string[0]) == 195
+		    && ((int)string[1]) == 188)
+    {
+	string[0] = 91; // ASCII('[')
+	len = 1;
+    }
     add_to_input_buf(string, len);
 
     // blank out the pointer if necessary
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    33,
+/**/
     32,
 /**/
     31,