Commit 44029221e8423f1ca93470952542a0517a208d42

Pierre Le Marre 2023-09-18T11:59:30

Interactive tools: Escape control character for Unicode output 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.

diff --git a/tools/tools-common.c b/tools/tools-common.c
index 63fce4e..a94466c 100644
--- a/tools/tools-common.c
+++ b/tools/tools-common.c
@@ -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) ] ",