Interactive tools: Escape control character for Unicode output
authorPierre Le Marre <dev@wismill.eu>
Mon, 18 Sep 2023 09:59:30 +0000 (11:59 +0200)
committerWismill <dev@wismill.eu>
Mon, 18 Sep 2023 14:14:12 +0000 (16:14 +0200)
Currently the interactive tools print the string result of key strokes
as it is, without any escape. This is especially annoying for trivial
keysyms such as: Return, BackSpace and Escape.

Fix this by displaying the Unicode code point notation (e.g U+000D for
Return) for single control characters from the C0 set and DEL.

This is a hack: ideally we would like to escape any non-printable
character in the utf-8 string.

tools/tools-common.c

index 63fce4e..a94466c 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "config.h"
 
+#include <ctype.h>
 #include <errno.h>
 #include <limits.h>
 #include <fcntl.h>
@@ -99,7 +100,17 @@ tools_print_keycode_state(struct xkb_state *state,
         xkb_compose_state_get_utf8(compose_state, s, sizeof(s));
     else
         xkb_state_key_get_utf8(state, keycode, s, sizeof(s));
-    printf("unicode [ %s ] ", s);
+    /* HACK: escape single control characters from C0 set using the
+    * Unicode codepoint convention. Ideally we would like to escape
+    * any non-printable character in the string.
+    */
+    if (!*s) {
+        printf("unicode [   ] ");
+    } else if (strlen(s) == 1 && (*s <= 0x1F || *s == 0x7F)) {
+        printf("unicode [ U+%04hX ] ", *s);
+    } else {
+        printf("unicode [ %s ] ", s);
+    }
 
     layout = xkb_state_key_get_layout(state, keycode);
     printf("layout [ %s (%d) ] ",