composetable: Warn for things we can't handle
authorMatthias Clasen <mclasen@redhat.com>
Tue, 29 Aug 2023 16:18:49 +0000 (12:18 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 19 Sep 2023 19:19:51 +0000 (15:19 -0400)
The compose table stores the keyvals to match against
in a guint16 array, so it can't handle directly encoded
Unicode codepoints (which have a high bit set). Warn
if we encounter those.

gtk/gtkcomposetable.c

index 538003923a657c9e21b3d06dbafa865b287a54ac..a369abbd90a34efd2c9fda4f04cd3cd06c0b4366 100644 (file)
@@ -231,7 +231,7 @@ parse_compose_sequence (const char *seq,
       char *start = words[i];
       char *end = strchr (words[i], '>');
       char *match;
-      gunichar codepoint;
+      guint keyval;
 
       if (words[i][0] == '\0')
              continue;
@@ -248,18 +248,24 @@ parse_compose_sequence (const char *seq,
 
       if (is_codepoint (match))
         {
-          codepoint = (gunichar) g_ascii_strtoll (match + 1, NULL, 16);
-          sequence[n] = codepoint;
+          keyval = gdk_unicode_to_keyval ((gunichar) g_ascii_strtoll (match + 1, NULL, 16));
+          if (keyval > 0xffff)
+            g_warning ("Can't handle >16bit keyvals");
+
+          sequence[n] = (guint16) keyval;
           sequence[n + 1] = 0;
         }
       else
         {
-          codepoint = (gunichar) gdk_keyval_from_name (match);
-          sequence[n] = codepoint;
+          keyval = gdk_keyval_from_name (match);
+          if (keyval > 0xffff)
+            g_warning ("Can't handle >16bit keyvals");
+
+          sequence[n] = (guint16) keyval;
           sequence[n + 1] = 0;
         }
 
-      if (codepoint == GDK_KEY_VoidSymbol)
+      if (keyval == GDK_KEY_VoidSymbol)
         g_warning ("Could not get code point of keysym %s", match);
       g_free (match);
       n++;