Line | Branch | Exec | Source |
---|---|---|---|
1 | #include <gdk/gdk.h> | ||
2 | #include <gtk/gtk.h> | ||
3 | #include <locale.h> | ||
4 | #include <stdlib.h> | ||
5 | #include "keyboard-shortcuts.h" | ||
6 | |||
7 | #define NUM_LAYOUTS 4 | ||
8 | |||
9 | typedef struct _shortcut_test { | ||
10 | guint16 keycode; | ||
11 | GdkModifierType modifiers; | ||
12 | char *expected_results[NUM_LAYOUTS]; | ||
13 | } shortcut_test; | ||
14 | |||
15 | /* keycodes taken from /usr/share/X11/xkb/keycodes/evdev */ | ||
16 | shortcut_test shortcut_tests[] = { | ||
17 | { | ||
18 | 24 /* first key after tab in first letter row */, | ||
19 | GDK_SHIFT_MASK | GDK_SUPER_MASK, | ||
20 | { | ||
21 | "<Shift><Super>q" /* us */, | ||
22 | "<Shift><Super>apostrophe" /* us+dvorak */, | ||
23 | "<Shift><Super>a" /* fr+azerty */, | ||
24 | "<Shift><Super>Cyrillic_shorti" /* ru */ | ||
25 | /* "<Shift><Super>q" would be valid, too */, | ||
26 | }, | ||
27 | }, | ||
28 | { | ||
29 | 13 /* fifth key in num row */, | ||
30 | GDK_SUPER_MASK, | ||
31 | { | ||
32 | "<Super>4" /* us */, | ||
33 | "<Super>4" /* us+dvorak */, | ||
34 | "<Super>4" /* fr+azerty */, | ||
35 | "<Super>4" /* ru */, | ||
36 | }, | ||
37 | }, | ||
38 | { | ||
39 | 13 /* fifth key in num row */, | ||
40 | GDK_SHIFT_MASK | GDK_SUPER_MASK, | ||
41 | { | ||
42 | "<Shift><Super>4" /* us */, | ||
43 | "<Shift><Super>4" /* us+dvorak */, | ||
44 | "<Shift><Super>4" /* fr+azerty */, | ||
45 | "<Shift><Super>4" /* ru */, | ||
46 | }, | ||
47 | }, | ||
48 | { | ||
49 | 65 /* space key */, | ||
50 | GDK_SHIFT_MASK | GDK_SUPER_MASK, | ||
51 | { | ||
52 | "<Shift><Super>space" /* us */, | ||
53 | "<Shift><Super>space" /* us+dvorak */, | ||
54 | "<Shift><Super>space" /* fr+azerty */, | ||
55 | "<Shift><Super>space" /* ru */, | ||
56 | }, | ||
57 | }, | ||
58 | { | ||
59 | 23 /* tab key */, | ||
60 | GDK_SHIFT_MASK | GDK_SUPER_MASK, | ||
61 | { | ||
62 | "<Shift><Super>Tab" /* us */, | ||
63 | "<Shift><Super>Tab" /* us+dvorak */, | ||
64 | "<Shift><Super>Tab" /* fr+azerty */, | ||
65 | "<Shift><Super>Tab" /* ru */, | ||
66 | }, | ||
67 | }, | ||
68 | { | ||
69 | 107 /* print screen/sysrq key */, | ||
70 | GDK_ALT_MASK, | ||
71 | { | ||
72 | "<Alt>Print" /* us */, | ||
73 | "<Alt>Print" /* us+dvorak */, | ||
74 | "<Alt>Print" /* fr+azerty */, | ||
75 | "<Alt>Print" /* ru */, | ||
76 | }, | ||
77 | }, | ||
78 | }; | ||
79 | |||
80 | static void | ||
81 | 6 | test_event_translation (shortcut_test *shortcut_test) | |
82 | { | ||
83 | 6 | g_autofree char *translated_name = NULL; | |
84 | guint keyval; | ||
85 | GdkModifierType modifiers; | ||
86 | |||
87 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 6 times.
|
30 | for (int group = 0; group < NUM_LAYOUTS; group++) |
88 | { | ||
89 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
|
24 | if (!shortcut_test->expected_results[group]) |
90 | ✗ | continue; | |
91 | |||
92 | 24 | normalize_keyval_and_mask (shortcut_test->keycode, | |
93 | shortcut_test->modifiers, | ||
94 | group, | ||
95 | &keyval, | ||
96 | &modifiers); | ||
97 | |||
98 | 24 | translated_name = gtk_accelerator_name (keyval, modifiers); | |
99 | |||
100 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
|
24 | if (g_strcmp0 (translated_name, shortcut_test->expected_results[group]) != 0) |
101 | { | ||
102 | ✗ | g_error ("Result for keycode %u with modifieres %u for " | |
103 | "group %d doesn't match '%s' (got: '%s')", | ||
104 | shortcut_test->keycode, | ||
105 | shortcut_test->modifiers, | ||
106 | group, | ||
107 | shortcut_test->expected_results[group], | ||
108 | translated_name); | ||
109 | g_test_fail (); | ||
110 | } | ||
111 | } | ||
112 | 6 | } | |
113 | |||
114 | static void | ||
115 | 1 | set_keyboard_layouts (char *layouts, | |
116 | char *variants, | ||
117 | char *options) | ||
118 | { | ||
119 | GSubprocess *proc; | ||
120 | 1 | GError *error = NULL; | |
121 | |||
122 | 1 | proc = g_subprocess_new (G_SUBPROCESS_FLAGS_NONE, | |
123 | &error, | ||
124 | "setxkbmap", | ||
125 | "-layout", layouts, | ||
126 | "-variant", variants, | ||
127 | "-option", options, | ||
128 | "-model", "pc105", | ||
129 | NULL); | ||
130 | |||
131 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | if (!proc || !g_subprocess_wait_check(proc, NULL, &error)) |
132 | { | ||
133 | ✗ | g_critical ("Failed to set layout: %s", error->message); | |
134 | ✗ | exit (1); | |
135 | } | ||
136 | |||
137 | 1 | g_object_unref (proc); | |
138 | 1 | } | |
139 | |||
140 | static void | ||
141 | 1 | run_shortcut_tests (void) | |
142 | { | ||
143 | 1 | set_keyboard_layouts ("us,us,fr,ru", ",dvorak,azerty,", ""); | |
144 | |||
145 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
|
7 | for (int i = 0; i < G_N_ELEMENTS(shortcut_tests); i++) |
146 | 6 | test_event_translation (&shortcut_tests[i]); | |
147 | 1 | } | |
148 | |||
149 | 1 | int main (int argc, char **argv) | |
150 | { | ||
151 | 1 | g_setenv ("GSETTINGS_BACKEND", "memory", TRUE); | |
152 | 1 | g_setenv ("GDK_BACKEND", "x11", TRUE); | |
153 | 1 | g_setenv ("LC_ALL", "C", TRUE); | |
154 | |||
155 | 1 | gtk_test_init (&argc, &argv, NULL); | |
156 | |||
157 | 1 | g_test_add_func ("/keyboard/shortcut-translation", | |
158 | run_shortcut_tests); | ||
159 | |||
160 | 1 | return g_test_run (); | |
161 | } | ||
162 |