summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJaroslaw Kubik <jarek@froglogic.com>2020-02-12 23:44:42 +0100
committerRan Benita <ran234@gmail.com>2020-02-24 09:54:09 +0200
commit0345aba082c83e9950f9dd8b7ea3bf91fe566a02 (patch)
treedf668811fa129e0af1151544525ebc76f7200243 /test
parent1b23a650abf09a8bbebc566900d0e22a58a826d3 (diff)
downloadxorg-lib-libxkbcommon-0345aba082c83e9950f9dd8b7ea3bf91fe566a02.tar.gz
Support translation Unicode codepoints to keysyms
In order to support features like auto-type and UI automation, the relevant tools need to be able to invert the keycode->keysym->text transformation. In order to facilitate that, a new API was added. It allows querying the keysyms that correspond to particular Unicode codepoints. For all practical purposes, it can be thought of as an inverse of xkb_keysym_to_utf32().
Diffstat (limited to 'test')
-rw-r--r--test/keysym.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/test/keysym.c b/test/keysym.c
index 2a8ca90..bb2ec28 100644
--- a/test/keysym.c
+++ b/test/keysym.c
@@ -104,6 +104,29 @@ test_github_issue_42(void)
setlocale(LC_CTYPE, "C");
}
+static void
+get_keysym_name(xkb_keysym_t keysym, char *buffer, size_t size)
+{
+ int name_length = xkb_keysym_get_name(keysym, buffer, size);
+ if (name_length < 0) {
+ snprintf(buffer, size, "(unknown: 0x%lx)", (unsigned long)keysym);
+ }
+}
+
+static int
+test_utf32_to_keysym(uint32_t ucs, xkb_keysym_t expected)
+{
+ char expected_name[64];
+ char actual_name[64];
+ xkb_keysym_t actual = xkb_utf32_to_keysym(ucs);
+ get_keysym_name(expected, expected_name, 64);
+ get_keysym_name(actual, actual_name, 64);
+
+ fprintf(stderr, "Code point 0x%lx: expected keysym: %s, actual: %s\n\n",
+ (unsigned long)ucs, expected_name, actual_name);
+ return expected == actual;
+}
+
int
main(void)
{
@@ -182,6 +205,49 @@ main(void)
assert(test_utf8(0x110ffff, "\xf4\x8f\xbf\xbf"));
assert(test_utf8(0x1110000, NULL) == 0);
+ assert(test_utf32_to_keysym('y', XKB_KEY_y));
+ assert(test_utf32_to_keysym('u', XKB_KEY_u));
+ assert(test_utf32_to_keysym('m', XKB_KEY_m));
+ assert(test_utf32_to_keysym(0x43c, XKB_KEY_Cyrillic_em));
+ assert(test_utf32_to_keysym(0x443, XKB_KEY_Cyrillic_u));
+ assert(test_utf32_to_keysym('!', XKB_KEY_exclam));
+ assert(test_utf32_to_keysym(0xF8, XKB_KEY_oslash));
+ assert(test_utf32_to_keysym(0x5D0, XKB_KEY_hebrew_aleph));
+ assert(test_utf32_to_keysym(0x634, XKB_KEY_Arabic_sheen));
+ assert(test_utf32_to_keysym(0x1F609, 0x0101F609)); // ;) emoji
+
+ assert(test_utf32_to_keysym('\b', XKB_KEY_BackSpace));
+ assert(test_utf32_to_keysym('\t', XKB_KEY_Tab));
+ assert(test_utf32_to_keysym('\n', XKB_KEY_Linefeed));
+ assert(test_utf32_to_keysym(0x0b, XKB_KEY_Clear));
+ assert(test_utf32_to_keysym('\r', XKB_KEY_Return));
+ assert(test_utf32_to_keysym(0x1b, XKB_KEY_Escape));
+ assert(test_utf32_to_keysym(0x7f, XKB_KEY_Delete));
+
+ assert(test_utf32_to_keysym(' ', XKB_KEY_space));
+ assert(test_utf32_to_keysym(',', XKB_KEY_comma));
+ assert(test_utf32_to_keysym('.', XKB_KEY_period));
+ assert(test_utf32_to_keysym('=', XKB_KEY_equal));
+ assert(test_utf32_to_keysym('9', XKB_KEY_9));
+ assert(test_utf32_to_keysym('*', XKB_KEY_asterisk));
+ assert(test_utf32_to_keysym(0xd7, XKB_KEY_multiply));
+ assert(test_utf32_to_keysym('-', XKB_KEY_minus));
+ assert(test_utf32_to_keysym(0x10fffd, 0x110fffd));
+
+ // Unicode non-characters
+ assert(test_utf32_to_keysym(0xfdd0, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xfdef, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xfffe, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xffff, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0x7fffe, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0x7ffff, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xafffe, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xaffff, XKB_KEY_NoSymbol));
+
+ // Codepoints outside the Unicode planes
+ assert(test_utf32_to_keysym(0x110000, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xdeadbeef, XKB_KEY_NoSymbol));
+
assert(xkb_keysym_is_lower(XKB_KEY_a));
assert(xkb_keysym_is_lower(XKB_KEY_Greek_lambda));
assert(xkb_keysym_is_lower(xkb_keysym_from_name("U03b1", 0))); /* GREEK SMALL LETTER ALPHA */