[PATCH] terminal: support entering non-ascii characters

Philipp Brüschweiler blei42 at gmail.com
Sat Aug 18 04:38:38 PDT 2012


Unless the alt modifier is active and the MODE_ALT_SENDS_ESC mode is not
set, any value over 127 is converted to a UTF8 sequence.

Part of https://bugs.freedesktop.org/show_bug.cgi?id=53648 should be
fixed with this.

Part of https://bugs.freedesktop.org/show_bug.cgi?id=52419 is fixed, but
interestingly it depends on the activated keymap (i.e. it works with
dvorak, but not with ch).
---
 clients/terminal.c | 30 +++++++++++++++++++++++-------
 1 Datei geändert, 23 Zeilen hinzugefügt(+), 7 Zeilen entfernt(-)

diff --git a/clients/terminal.c b/clients/terminal.c
index 7e74db7..f97882d 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -20,6 +20,7 @@
  * OF THIS SOFTWARE.
  */
 
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -2116,7 +2117,8 @@ key_handler(struct window *window, struct input *input, uint32_t time,
 	struct terminal *terminal = data;
 	char ch[MAX_RESPONSE];
 	uint32_t modifiers, serial;
-	int len = 0;
+	int ret, len = 0;
+	bool convert_utf8 = true;
 
 	modifiers = input_get_modifiers(input);
 	if ((modifiers & MOD_CONTROL_MASK) &&
@@ -2229,15 +2231,29 @@ key_handler(struct window *window, struct input *input, uint32_t time,
 			else if (sym == '/') sym = 0x1F;
 			else if (sym == '8' || sym == '?') sym = 0x7F;
 		}
-		if ((terminal->mode & MODE_ALT_SENDS_ESC) &&
-		    (modifiers & MOD_ALT_MASK)) {
-			ch[len++] = 0x1b;
-		} else if (modifiers & MOD_ALT_MASK) {
-			sym = sym | 0x80;
+		if (modifiers & MOD_ALT_MASK) {
+			if (terminal->mode & MODE_ALT_SENDS_ESC) {
+				ch[len++] = 0x1b;
+			} else {
+				sym = sym | 0x80;
+				convert_utf8 = false;
+			}
 		}
 
-		if (sym < 256)
+		if ((sym < 128) ||
+		    (!convert_utf8 && sym < 256)) {
 			ch[len++] = sym;
+		} else {
+			ret = xkb_keysym_to_utf8(sym, ch + len,
+						 MAX_RESPONSE - len);
+			if (ret < 0)
+				fprintf(stderr,
+					"Warning: buffer too small to encode "
+					"UTF8 character\n");
+			else
+				len += ret;
+		}
+
 		break;
 	}
 
-- 
1.7.11.5



More information about the wayland-devel mailing list