1*2b949d04SAndroid Build Coastguard Worker /*
2*2b949d04SAndroid Build Coastguard Worker * Copyright © 2012 Intel Corporation
3*2b949d04SAndroid Build Coastguard Worker *
4*2b949d04SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*2b949d04SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*2b949d04SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*2b949d04SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*2b949d04SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*2b949d04SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*2b949d04SAndroid Build Coastguard Worker *
11*2b949d04SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*2b949d04SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*2b949d04SAndroid Build Coastguard Worker * Software.
14*2b949d04SAndroid Build Coastguard Worker *
15*2b949d04SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*2b949d04SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*2b949d04SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*2b949d04SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*2b949d04SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*2b949d04SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*2b949d04SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
22*2b949d04SAndroid Build Coastguard Worker *
23*2b949d04SAndroid Build Coastguard Worker * Author: Daniel Stone <[email protected]>
24*2b949d04SAndroid Build Coastguard Worker */
25*2b949d04SAndroid Build Coastguard Worker
26*2b949d04SAndroid Build Coastguard Worker #include "config.h"
27*2b949d04SAndroid Build Coastguard Worker
28*2b949d04SAndroid Build Coastguard Worker #include <assert.h>
29*2b949d04SAndroid Build Coastguard Worker #include <stdio.h>
30*2b949d04SAndroid Build Coastguard Worker #include <stdlib.h>
31*2b949d04SAndroid Build Coastguard Worker
32*2b949d04SAndroid Build Coastguard Worker #include "evdev-scancodes.h"
33*2b949d04SAndroid Build Coastguard Worker #include "test.h"
34*2b949d04SAndroid Build Coastguard Worker
35*2b949d04SAndroid Build Coastguard Worker /* Offset between evdev keycodes (where KEY_ESCAPE is 1), and the evdev XKB
36*2b949d04SAndroid Build Coastguard Worker * keycode set (where ESC is 9). */
37*2b949d04SAndroid Build Coastguard Worker #define EVDEV_OFFSET 8
38*2b949d04SAndroid Build Coastguard Worker
39*2b949d04SAndroid Build Coastguard Worker static void
print_state(struct xkb_state * state)40*2b949d04SAndroid Build Coastguard Worker print_state(struct xkb_state *state)
41*2b949d04SAndroid Build Coastguard Worker {
42*2b949d04SAndroid Build Coastguard Worker struct xkb_keymap *keymap;
43*2b949d04SAndroid Build Coastguard Worker xkb_layout_index_t group;
44*2b949d04SAndroid Build Coastguard Worker xkb_mod_index_t mod;
45*2b949d04SAndroid Build Coastguard Worker xkb_led_index_t led;
46*2b949d04SAndroid Build Coastguard Worker
47*2b949d04SAndroid Build Coastguard Worker group = xkb_state_serialize_layout(state, XKB_STATE_LAYOUT_EFFECTIVE);
48*2b949d04SAndroid Build Coastguard Worker mod = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
49*2b949d04SAndroid Build Coastguard Worker /* led = xkb_state_serialize_leds(state, XKB_STATE_LEDS); */
50*2b949d04SAndroid Build Coastguard Worker if (!group && !mod /* && !led */) {
51*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "\tno state\n");
52*2b949d04SAndroid Build Coastguard Worker return;
53*2b949d04SAndroid Build Coastguard Worker }
54*2b949d04SAndroid Build Coastguard Worker
55*2b949d04SAndroid Build Coastguard Worker keymap = xkb_state_get_keymap(state);
56*2b949d04SAndroid Build Coastguard Worker
57*2b949d04SAndroid Build Coastguard Worker for (group = 0; group < xkb_keymap_num_layouts(keymap); group++) {
58*2b949d04SAndroid Build Coastguard Worker if (xkb_state_layout_index_is_active(state, group,
59*2b949d04SAndroid Build Coastguard Worker XKB_STATE_LAYOUT_EFFECTIVE |
60*2b949d04SAndroid Build Coastguard Worker XKB_STATE_LAYOUT_DEPRESSED |
61*2b949d04SAndroid Build Coastguard Worker XKB_STATE_LAYOUT_LATCHED |
62*2b949d04SAndroid Build Coastguard Worker XKB_STATE_LAYOUT_LOCKED) <= 0)
63*2b949d04SAndroid Build Coastguard Worker continue;
64*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "\tgroup %s (%d): %s%s%s%s\n",
65*2b949d04SAndroid Build Coastguard Worker xkb_keymap_layout_get_name(keymap, group),
66*2b949d04SAndroid Build Coastguard Worker group,
67*2b949d04SAndroid Build Coastguard Worker xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_EFFECTIVE) > 0 ?
68*2b949d04SAndroid Build Coastguard Worker "effective " : "",
69*2b949d04SAndroid Build Coastguard Worker xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_DEPRESSED) > 0 ?
70*2b949d04SAndroid Build Coastguard Worker "depressed " : "",
71*2b949d04SAndroid Build Coastguard Worker xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_LATCHED) > 0 ?
72*2b949d04SAndroid Build Coastguard Worker "latched " : "",
73*2b949d04SAndroid Build Coastguard Worker xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_LOCKED) > 0 ?
74*2b949d04SAndroid Build Coastguard Worker "locked " : "");
75*2b949d04SAndroid Build Coastguard Worker }
76*2b949d04SAndroid Build Coastguard Worker
77*2b949d04SAndroid Build Coastguard Worker for (mod = 0; mod < xkb_keymap_num_mods(keymap); mod++) {
78*2b949d04SAndroid Build Coastguard Worker if (xkb_state_mod_index_is_active(state, mod,
79*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE |
80*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED |
81*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_LATCHED |
82*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_LOCKED) <= 0)
83*2b949d04SAndroid Build Coastguard Worker continue;
84*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "\tmod %s (%d): %s%s%s%s\n",
85*2b949d04SAndroid Build Coastguard Worker xkb_keymap_mod_get_name(keymap, mod),
86*2b949d04SAndroid Build Coastguard Worker mod,
87*2b949d04SAndroid Build Coastguard Worker xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_EFFECTIVE) > 0 ?
88*2b949d04SAndroid Build Coastguard Worker "effective " : "",
89*2b949d04SAndroid Build Coastguard Worker xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_DEPRESSED) > 0 ?
90*2b949d04SAndroid Build Coastguard Worker "depressed " : "",
91*2b949d04SAndroid Build Coastguard Worker xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_LATCHED) > 0 ?
92*2b949d04SAndroid Build Coastguard Worker "latched " : "",
93*2b949d04SAndroid Build Coastguard Worker xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_LOCKED) > 0 ?
94*2b949d04SAndroid Build Coastguard Worker "locked " : "");
95*2b949d04SAndroid Build Coastguard Worker }
96*2b949d04SAndroid Build Coastguard Worker
97*2b949d04SAndroid Build Coastguard Worker for (led = 0; led < xkb_keymap_num_leds(keymap); led++) {
98*2b949d04SAndroid Build Coastguard Worker if (xkb_state_led_index_is_active(state, led) <= 0)
99*2b949d04SAndroid Build Coastguard Worker continue;
100*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "\tled %s (%d): active\n",
101*2b949d04SAndroid Build Coastguard Worker xkb_keymap_led_get_name(keymap, led),
102*2b949d04SAndroid Build Coastguard Worker led);
103*2b949d04SAndroid Build Coastguard Worker }
104*2b949d04SAndroid Build Coastguard Worker }
105*2b949d04SAndroid Build Coastguard Worker
106*2b949d04SAndroid Build Coastguard Worker static void
test_update_key(struct xkb_keymap * keymap)107*2b949d04SAndroid Build Coastguard Worker test_update_key(struct xkb_keymap *keymap)
108*2b949d04SAndroid Build Coastguard Worker {
109*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state = xkb_state_new(keymap);
110*2b949d04SAndroid Build Coastguard Worker const xkb_keysym_t *syms;
111*2b949d04SAndroid Build Coastguard Worker xkb_keysym_t one_sym;
112*2b949d04SAndroid Build Coastguard Worker int num_syms;
113*2b949d04SAndroid Build Coastguard Worker
114*2b949d04SAndroid Build Coastguard Worker assert(state);
115*2b949d04SAndroid Build Coastguard Worker
116*2b949d04SAndroid Build Coastguard Worker /* LCtrl down */
117*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
118*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "dumping state for LCtrl down:\n");
119*2b949d04SAndroid Build Coastguard Worker print_state(state);
120*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL,
121*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED) > 0);
122*2b949d04SAndroid Build Coastguard Worker
123*2b949d04SAndroid Build Coastguard Worker /* LCtrl + RAlt down */
124*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_RIGHTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
125*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "dumping state for LCtrl + RAlt down:\n");
126*2b949d04SAndroid Build Coastguard Worker print_state(state);
127*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL,
128*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED) > 0);
129*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT,
130*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED) > 0);
131*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
132*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_ALL,
133*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_CTRL,
134*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_ALT,
135*2b949d04SAndroid Build Coastguard Worker NULL) > 0);
136*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_indices_are_active(state, XKB_STATE_MODS_DEPRESSED,
137*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_ALL,
138*2b949d04SAndroid Build Coastguard Worker xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL),
139*2b949d04SAndroid Build Coastguard Worker xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_ALT),
140*2b949d04SAndroid Build Coastguard Worker XKB_MOD_INVALID) > 0);
141*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
142*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_ALL,
143*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_ALT,
144*2b949d04SAndroid Build Coastguard Worker NULL) == 0);
145*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
146*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_ALL |
147*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_NON_EXCLUSIVE,
148*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_ALT,
149*2b949d04SAndroid Build Coastguard Worker NULL) > 0);
150*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
151*2b949d04SAndroid Build Coastguard Worker (XKB_STATE_MATCH_ANY |
152*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_NON_EXCLUSIVE),
153*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_ALT,
154*2b949d04SAndroid Build Coastguard Worker NULL) > 0);
155*2b949d04SAndroid Build Coastguard Worker
156*2b949d04SAndroid Build Coastguard Worker /* RAlt down */
157*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
158*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "dumping state for RAlt down:\n");
159*2b949d04SAndroid Build Coastguard Worker print_state(state);
160*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL,
161*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE) == 0);
162*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT,
163*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED) > 0);
164*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
165*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_ANY,
166*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_CTRL,
167*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_ALT,
168*2b949d04SAndroid Build Coastguard Worker NULL) > 0);
169*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_LATCHED,
170*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MATCH_ANY,
171*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_CTRL,
172*2b949d04SAndroid Build Coastguard Worker XKB_MOD_NAME_ALT,
173*2b949d04SAndroid Build Coastguard Worker NULL) == 0);
174*2b949d04SAndroid Build Coastguard Worker
175*2b949d04SAndroid Build Coastguard Worker /* none down */
176*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_RIGHTALT + EVDEV_OFFSET, XKB_KEY_UP);
177*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT,
178*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE) == 0);
179*2b949d04SAndroid Build Coastguard Worker
180*2b949d04SAndroid Build Coastguard Worker /* Caps locked */
181*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
182*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
183*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED) > 0);
184*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
185*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "dumping state for Caps Lock:\n");
186*2b949d04SAndroid Build Coastguard Worker print_state(state);
187*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
188*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_DEPRESSED) == 0);
189*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
190*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_LOCKED) > 0);
191*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_CAPS) > 0);
192*2b949d04SAndroid Build Coastguard Worker num_syms = xkb_state_key_get_syms(state, KEY_Q + EVDEV_OFFSET, &syms);
193*2b949d04SAndroid Build Coastguard Worker assert(num_syms == 1 && syms[0] == XKB_KEY_Q);
194*2b949d04SAndroid Build Coastguard Worker
195*2b949d04SAndroid Build Coastguard Worker /* Num Lock locked */
196*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
197*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_UP);
198*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "dumping state for Caps Lock + Num Lock:\n");
199*2b949d04SAndroid Build Coastguard Worker print_state(state);
200*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
201*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_LOCKED) > 0);
202*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, "Mod2",
203*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_LOCKED) > 0);
204*2b949d04SAndroid Build Coastguard Worker num_syms = xkb_state_key_get_syms(state, KEY_KP1 + EVDEV_OFFSET, &syms);
205*2b949d04SAndroid Build Coastguard Worker assert(num_syms == 1 && syms[0] == XKB_KEY_KP_1);
206*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_NUM) > 0);
207*2b949d04SAndroid Build Coastguard Worker
208*2b949d04SAndroid Build Coastguard Worker /* Num Lock unlocked */
209*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
210*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_UP);
211*2b949d04SAndroid Build Coastguard Worker
212*2b949d04SAndroid Build Coastguard Worker /* Switch to group 2 */
213*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
214*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
215*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_led_name_is_active(state, "Group 2") > 0);
216*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_NUM) == 0);
217*2b949d04SAndroid Build Coastguard Worker
218*2b949d04SAndroid Build Coastguard Worker /* Switch back to group 1. */
219*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
220*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
221*2b949d04SAndroid Build Coastguard Worker
222*2b949d04SAndroid Build Coastguard Worker /* Caps unlocked */
223*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
224*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
225*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
226*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE) == 0);
227*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_CAPS) == 0);
228*2b949d04SAndroid Build Coastguard Worker num_syms = xkb_state_key_get_syms(state, KEY_Q + EVDEV_OFFSET, &syms);
229*2b949d04SAndroid Build Coastguard Worker assert(num_syms == 1 && syms[0] == XKB_KEY_q);
230*2b949d04SAndroid Build Coastguard Worker
231*2b949d04SAndroid Build Coastguard Worker /* Multiple symbols */
232*2b949d04SAndroid Build Coastguard Worker num_syms = xkb_state_key_get_syms(state, KEY_6 + EVDEV_OFFSET, &syms);
233*2b949d04SAndroid Build Coastguard Worker assert(num_syms == 5 &&
234*2b949d04SAndroid Build Coastguard Worker syms[0] == XKB_KEY_H && syms[1] == XKB_KEY_E &&
235*2b949d04SAndroid Build Coastguard Worker syms[2] == XKB_KEY_L && syms[3] == XKB_KEY_L &&
236*2b949d04SAndroid Build Coastguard Worker syms[4] == XKB_KEY_O);
237*2b949d04SAndroid Build Coastguard Worker one_sym = xkb_state_key_get_one_sym(state, KEY_6 + EVDEV_OFFSET);
238*2b949d04SAndroid Build Coastguard Worker assert(one_sym == XKB_KEY_NoSymbol);
239*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_6 + EVDEV_OFFSET, XKB_KEY_DOWN);
240*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_6 + EVDEV_OFFSET, XKB_KEY_UP);
241*2b949d04SAndroid Build Coastguard Worker
242*2b949d04SAndroid Build Coastguard Worker one_sym = xkb_state_key_get_one_sym(state, KEY_5 + EVDEV_OFFSET);
243*2b949d04SAndroid Build Coastguard Worker assert(one_sym == XKB_KEY_5);
244*2b949d04SAndroid Build Coastguard Worker
245*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
246*2b949d04SAndroid Build Coastguard Worker }
247*2b949d04SAndroid Build Coastguard Worker
248*2b949d04SAndroid Build Coastguard Worker static void
test_serialisation(struct xkb_keymap * keymap)249*2b949d04SAndroid Build Coastguard Worker test_serialisation(struct xkb_keymap *keymap)
250*2b949d04SAndroid Build Coastguard Worker {
251*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state = xkb_state_new(keymap);
252*2b949d04SAndroid Build Coastguard Worker xkb_mod_mask_t base_mods;
253*2b949d04SAndroid Build Coastguard Worker xkb_mod_mask_t latched_mods;
254*2b949d04SAndroid Build Coastguard Worker xkb_mod_mask_t locked_mods;
255*2b949d04SAndroid Build Coastguard Worker xkb_mod_mask_t effective_mods;
256*2b949d04SAndroid Build Coastguard Worker xkb_mod_index_t caps, shift, ctrl;
257*2b949d04SAndroid Build Coastguard Worker xkb_layout_index_t base_group = 0;
258*2b949d04SAndroid Build Coastguard Worker xkb_layout_index_t latched_group = 0;
259*2b949d04SAndroid Build Coastguard Worker xkb_layout_index_t locked_group = 0;
260*2b949d04SAndroid Build Coastguard Worker
261*2b949d04SAndroid Build Coastguard Worker assert(state);
262*2b949d04SAndroid Build Coastguard Worker
263*2b949d04SAndroid Build Coastguard Worker caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
264*2b949d04SAndroid Build Coastguard Worker assert(caps != XKB_MOD_INVALID);
265*2b949d04SAndroid Build Coastguard Worker shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
266*2b949d04SAndroid Build Coastguard Worker assert(shift != XKB_MOD_INVALID);
267*2b949d04SAndroid Build Coastguard Worker ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
268*2b949d04SAndroid Build Coastguard Worker assert(ctrl != XKB_MOD_INVALID);
269*2b949d04SAndroid Build Coastguard Worker
270*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
271*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
272*2b949d04SAndroid Build Coastguard Worker base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
273*2b949d04SAndroid Build Coastguard Worker assert(base_mods == 0);
274*2b949d04SAndroid Build Coastguard Worker latched_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED);
275*2b949d04SAndroid Build Coastguard Worker assert(latched_mods == 0);
276*2b949d04SAndroid Build Coastguard Worker locked_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED);
277*2b949d04SAndroid Build Coastguard Worker assert(locked_mods == (1U << caps));
278*2b949d04SAndroid Build Coastguard Worker effective_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
279*2b949d04SAndroid Build Coastguard Worker assert(effective_mods == locked_mods);
280*2b949d04SAndroid Build Coastguard Worker
281*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
282*2b949d04SAndroid Build Coastguard Worker base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
283*2b949d04SAndroid Build Coastguard Worker assert(base_mods == (1U << shift));
284*2b949d04SAndroid Build Coastguard Worker latched_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED);
285*2b949d04SAndroid Build Coastguard Worker assert(latched_mods == 0);
286*2b949d04SAndroid Build Coastguard Worker locked_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED);
287*2b949d04SAndroid Build Coastguard Worker assert(locked_mods == (1U << caps));
288*2b949d04SAndroid Build Coastguard Worker effective_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
289*2b949d04SAndroid Build Coastguard Worker assert(effective_mods == (base_mods | locked_mods));
290*2b949d04SAndroid Build Coastguard Worker
291*2b949d04SAndroid Build Coastguard Worker base_mods |= (1U << ctrl);
292*2b949d04SAndroid Build Coastguard Worker xkb_state_update_mask(state, base_mods, latched_mods, locked_mods,
293*2b949d04SAndroid Build Coastguard Worker base_group, latched_group, locked_group);
294*2b949d04SAndroid Build Coastguard Worker
295*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_DEPRESSED) > 0);
296*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0);
297*2b949d04SAndroid Build Coastguard Worker
298*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
299*2b949d04SAndroid Build Coastguard Worker }
300*2b949d04SAndroid Build Coastguard Worker
301*2b949d04SAndroid Build Coastguard Worker static void
test_update_mask_mods(struct xkb_keymap * keymap)302*2b949d04SAndroid Build Coastguard Worker test_update_mask_mods(struct xkb_keymap *keymap)
303*2b949d04SAndroid Build Coastguard Worker {
304*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state = xkb_state_new(keymap);
305*2b949d04SAndroid Build Coastguard Worker xkb_mod_index_t caps, shift, num, alt, mod1, mod2;
306*2b949d04SAndroid Build Coastguard Worker enum xkb_state_component changed;
307*2b949d04SAndroid Build Coastguard Worker
308*2b949d04SAndroid Build Coastguard Worker assert(state);
309*2b949d04SAndroid Build Coastguard Worker
310*2b949d04SAndroid Build Coastguard Worker caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
311*2b949d04SAndroid Build Coastguard Worker assert(caps != XKB_MOD_INVALID);
312*2b949d04SAndroid Build Coastguard Worker shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
313*2b949d04SAndroid Build Coastguard Worker assert(shift != XKB_MOD_INVALID);
314*2b949d04SAndroid Build Coastguard Worker num = xkb_keymap_mod_get_index(keymap, "NumLock");
315*2b949d04SAndroid Build Coastguard Worker assert(num != XKB_MOD_INVALID);
316*2b949d04SAndroid Build Coastguard Worker alt = xkb_keymap_mod_get_index(keymap, "Alt");
317*2b949d04SAndroid Build Coastguard Worker assert(alt != XKB_MOD_INVALID);
318*2b949d04SAndroid Build Coastguard Worker mod1 = xkb_keymap_mod_get_index(keymap, "Mod1");
319*2b949d04SAndroid Build Coastguard Worker assert(mod1 != XKB_MOD_INVALID);
320*2b949d04SAndroid Build Coastguard Worker mod2 = xkb_keymap_mod_get_index(keymap, "Mod2");
321*2b949d04SAndroid Build Coastguard Worker assert(mod2 != XKB_MOD_INVALID);
322*2b949d04SAndroid Build Coastguard Worker
323*2b949d04SAndroid Build Coastguard Worker changed = xkb_state_update_mask(state, 1 << caps, 0, 0, 0, 0, 0);
324*2b949d04SAndroid Build Coastguard Worker assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_EFFECTIVE));
325*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
326*2b949d04SAndroid Build Coastguard Worker (1u << caps));
327*2b949d04SAndroid Build Coastguard Worker
328*2b949d04SAndroid Build Coastguard Worker changed = xkb_state_update_mask(state, (1 << caps), 0, (1 << shift), 0, 0, 0);
329*2b949d04SAndroid Build Coastguard Worker assert(changed == (XKB_STATE_MODS_LOCKED | XKB_STATE_MODS_EFFECTIVE |
330*2b949d04SAndroid Build Coastguard Worker XKB_STATE_LEDS));
331*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
332*2b949d04SAndroid Build Coastguard Worker ((1u << caps) | (1u << shift)));
333*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED) ==
334*2b949d04SAndroid Build Coastguard Worker (1u << caps));
335*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED) == 0);
336*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED) ==
337*2b949d04SAndroid Build Coastguard Worker (1u << shift));
338*2b949d04SAndroid Build Coastguard Worker
339*2b949d04SAndroid Build Coastguard Worker changed = xkb_state_update_mask(state, 0, 0, 0, 0, 0, 0);
340*2b949d04SAndroid Build Coastguard Worker assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LOCKED |
341*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LEDS));
342*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) == 0);
343*2b949d04SAndroid Build Coastguard Worker
344*2b949d04SAndroid Build Coastguard Worker changed = xkb_state_update_mask(state, (1 << alt), 0, 0, 0, 0, 0);
345*2b949d04SAndroid Build Coastguard Worker assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_EFFECTIVE));
346*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
347*2b949d04SAndroid Build Coastguard Worker ((1u << alt) | (1u << mod1)));
348*2b949d04SAndroid Build Coastguard Worker
349*2b949d04SAndroid Build Coastguard Worker changed = xkb_state_update_mask(state, 0, 0, (1 << num), 0, 0, 0);
350*2b949d04SAndroid Build Coastguard Worker assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LOCKED |
351*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LEDS));
352*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
353*2b949d04SAndroid Build Coastguard Worker ((1u << num) | (1u << mod2)));
354*2b949d04SAndroid Build Coastguard Worker
355*2b949d04SAndroid Build Coastguard Worker xkb_state_update_mask(state, 0, 0, 0, 0, 0, 0);
356*2b949d04SAndroid Build Coastguard Worker
357*2b949d04SAndroid Build Coastguard Worker changed = xkb_state_update_mask(state, (1 << mod2), 0, (1 << num), 0, 0, 0);
358*2b949d04SAndroid Build Coastguard Worker assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LOCKED |
359*2b949d04SAndroid Build Coastguard Worker XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LEDS));
360*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
361*2b949d04SAndroid Build Coastguard Worker ((1u << mod2) | (1u << num)));
362*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED) ==
363*2b949d04SAndroid Build Coastguard Worker (1u << mod2));
364*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED) ==
365*2b949d04SAndroid Build Coastguard Worker ((1u << num) | (1u << mod2)));
366*2b949d04SAndroid Build Coastguard Worker
367*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
368*2b949d04SAndroid Build Coastguard Worker }
369*2b949d04SAndroid Build Coastguard Worker
370*2b949d04SAndroid Build Coastguard Worker static void
test_repeat(struct xkb_keymap * keymap)371*2b949d04SAndroid Build Coastguard Worker test_repeat(struct xkb_keymap *keymap)
372*2b949d04SAndroid Build Coastguard Worker {
373*2b949d04SAndroid Build Coastguard Worker assert(!xkb_keymap_key_repeats(keymap, KEY_LEFTSHIFT + 8));
374*2b949d04SAndroid Build Coastguard Worker assert(xkb_keymap_key_repeats(keymap, KEY_A + 8));
375*2b949d04SAndroid Build Coastguard Worker assert(xkb_keymap_key_repeats(keymap, KEY_8 + 8));
376*2b949d04SAndroid Build Coastguard Worker assert(xkb_keymap_key_repeats(keymap, KEY_DOWN + 8));
377*2b949d04SAndroid Build Coastguard Worker assert(xkb_keymap_key_repeats(keymap, KEY_KBDILLUMDOWN + 8));
378*2b949d04SAndroid Build Coastguard Worker }
379*2b949d04SAndroid Build Coastguard Worker
380*2b949d04SAndroid Build Coastguard Worker static void
test_consume(struct xkb_keymap * keymap)381*2b949d04SAndroid Build Coastguard Worker test_consume(struct xkb_keymap *keymap)
382*2b949d04SAndroid Build Coastguard Worker {
383*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state;
384*2b949d04SAndroid Build Coastguard Worker xkb_mod_index_t alt, shift, caps, ctrl, mod5;
385*2b949d04SAndroid Build Coastguard Worker xkb_mod_mask_t mask;
386*2b949d04SAndroid Build Coastguard Worker
387*2b949d04SAndroid Build Coastguard Worker state = xkb_state_new(keymap);
388*2b949d04SAndroid Build Coastguard Worker assert(state);
389*2b949d04SAndroid Build Coastguard Worker
390*2b949d04SAndroid Build Coastguard Worker alt = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_ALT);
391*2b949d04SAndroid Build Coastguard Worker assert(alt != XKB_MOD_INVALID);
392*2b949d04SAndroid Build Coastguard Worker shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
393*2b949d04SAndroid Build Coastguard Worker assert(shift != XKB_MOD_INVALID);
394*2b949d04SAndroid Build Coastguard Worker caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
395*2b949d04SAndroid Build Coastguard Worker assert(caps != XKB_MOD_INVALID);
396*2b949d04SAndroid Build Coastguard Worker ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
397*2b949d04SAndroid Build Coastguard Worker assert(ctrl != XKB_MOD_INVALID);
398*2b949d04SAndroid Build Coastguard Worker mod5 = xkb_keymap_mod_get_index(keymap, "Mod5");
399*2b949d04SAndroid Build Coastguard Worker assert(mod5 != XKB_MOD_INVALID);
400*2b949d04SAndroid Build Coastguard Worker
401*2b949d04SAndroid Build Coastguard Worker /* Test remove_consumed() */
402*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
403*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
404*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_EQUAL + EVDEV_OFFSET, XKB_KEY_DOWN);
405*2b949d04SAndroid Build Coastguard Worker
406*2b949d04SAndroid Build Coastguard Worker fprintf(stderr, "dumping state for Alt-Shift-+\n");
407*2b949d04SAndroid Build Coastguard Worker print_state(state);
408*2b949d04SAndroid Build Coastguard Worker
409*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
410*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << alt) | (1U << shift)));
411*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_mod_mask_remove_consumed(state, KEY_EQUAL + EVDEV_OFFSET,
412*2b949d04SAndroid Build Coastguard Worker mask);
413*2b949d04SAndroid Build Coastguard Worker assert(mask == (1U << alt));
414*2b949d04SAndroid Build Coastguard Worker
415*2b949d04SAndroid Build Coastguard Worker /* Test get_consumed_mods() */
416*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods(state, KEY_EQUAL + EVDEV_OFFSET);
417*2b949d04SAndroid Build Coastguard Worker assert(mask == (1U << shift));
418*2b949d04SAndroid Build Coastguard Worker
419*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods(state, KEY_ESC + EVDEV_OFFSET);
420*2b949d04SAndroid Build Coastguard Worker assert(mask == 0);
421*2b949d04SAndroid Build Coastguard Worker
422*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
423*2b949d04SAndroid Build Coastguard Worker
424*2b949d04SAndroid Build Coastguard Worker /* Test is_consumed() - simple ALPHABETIC type. */
425*2b949d04SAndroid Build Coastguard Worker state = xkb_state_new(keymap);
426*2b949d04SAndroid Build Coastguard Worker assert(state);
427*2b949d04SAndroid Build Coastguard Worker
428*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods(state, KEY_A + EVDEV_OFFSET);
429*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << shift) | (1U << caps)));
430*2b949d04SAndroid Build Coastguard Worker
431*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
432*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
433*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
434*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
435*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
436*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
437*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
438*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
439*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
440*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_UP);
441*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
442*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
443*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
444*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
445*2b949d04SAndroid Build Coastguard Worker
446*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
447*2b949d04SAndroid Build Coastguard Worker
448*2b949d04SAndroid Build Coastguard Worker /* More complicated - CTRL+ALT */
449*2b949d04SAndroid Build Coastguard Worker state = xkb_state_new(keymap);
450*2b949d04SAndroid Build Coastguard Worker assert(state);
451*2b949d04SAndroid Build Coastguard Worker
452*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods(state, KEY_F1 + EVDEV_OFFSET);
453*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << shift) | (1U << alt) | (1U << ctrl) | (1U << mod5)));
454*2b949d04SAndroid Build Coastguard Worker
455*2b949d04SAndroid Build Coastguard Worker /* Shift is preserved. */
456*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
457*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods(state, KEY_F1 + EVDEV_OFFSET);
458*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << alt) | (1U << ctrl) | (1U << mod5)));
459*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_UP);
460*2b949d04SAndroid Build Coastguard Worker
461*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods(state, KEY_F1 + EVDEV_OFFSET);
462*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << shift) | (1U << alt) | (1U << ctrl) | (1U << mod5)));
463*2b949d04SAndroid Build Coastguard Worker
464*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
465*2b949d04SAndroid Build Coastguard Worker
466*2b949d04SAndroid Build Coastguard Worker /* Test XKB_CONSUMED_MODE_GTK, CTRL+ALT */
467*2b949d04SAndroid Build Coastguard Worker state = xkb_state_new(keymap);
468*2b949d04SAndroid Build Coastguard Worker assert(state);
469*2b949d04SAndroid Build Coastguard Worker
470*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods2(state, KEY_F1 + EVDEV_OFFSET,
471*2b949d04SAndroid Build Coastguard Worker XKB_CONSUMED_MODE_GTK);
472*2b949d04SAndroid Build Coastguard Worker assert(mask == 0);
473*2b949d04SAndroid Build Coastguard Worker
474*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
475*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods2(state, KEY_F1 + EVDEV_OFFSET,
476*2b949d04SAndroid Build Coastguard Worker XKB_CONSUMED_MODE_GTK);
477*2b949d04SAndroid Build Coastguard Worker assert(mask == 0);
478*2b949d04SAndroid Build Coastguard Worker
479*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
480*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods2(state, KEY_F1 + EVDEV_OFFSET,
481*2b949d04SAndroid Build Coastguard Worker XKB_CONSUMED_MODE_GTK);
482*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << alt) | (1U << ctrl)));
483*2b949d04SAndroid Build Coastguard Worker
484*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
485*2b949d04SAndroid Build Coastguard Worker
486*2b949d04SAndroid Build Coastguard Worker /* Test XKB_CONSUMED_MODE_GTK, Simple Shift */
487*2b949d04SAndroid Build Coastguard Worker state = xkb_state_new(keymap);
488*2b949d04SAndroid Build Coastguard Worker assert(state);
489*2b949d04SAndroid Build Coastguard Worker
490*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods2(state, KEY_A + EVDEV_OFFSET,
491*2b949d04SAndroid Build Coastguard Worker XKB_CONSUMED_MODE_GTK);
492*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << shift) | (1U << caps)));
493*2b949d04SAndroid Build Coastguard Worker
494*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
495*2b949d04SAndroid Build Coastguard Worker mask = xkb_state_key_get_consumed_mods2(state, KEY_A + EVDEV_OFFSET,
496*2b949d04SAndroid Build Coastguard Worker XKB_CONSUMED_MODE_GTK);
497*2b949d04SAndroid Build Coastguard Worker assert(mask == ((1U << shift) | (1U << caps)));
498*2b949d04SAndroid Build Coastguard Worker
499*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
500*2b949d04SAndroid Build Coastguard Worker }
501*2b949d04SAndroid Build Coastguard Worker
502*2b949d04SAndroid Build Coastguard Worker static void
key_iter(struct xkb_keymap * keymap,xkb_keycode_t key,void * data)503*2b949d04SAndroid Build Coastguard Worker key_iter(struct xkb_keymap *keymap, xkb_keycode_t key, void *data)
504*2b949d04SAndroid Build Coastguard Worker {
505*2b949d04SAndroid Build Coastguard Worker xkb_keycode_t *counter = data;
506*2b949d04SAndroid Build Coastguard Worker
507*2b949d04SAndroid Build Coastguard Worker assert(*counter == key);
508*2b949d04SAndroid Build Coastguard Worker (*counter)++;
509*2b949d04SAndroid Build Coastguard Worker }
510*2b949d04SAndroid Build Coastguard Worker
511*2b949d04SAndroid Build Coastguard Worker static void
test_range(struct xkb_keymap * keymap)512*2b949d04SAndroid Build Coastguard Worker test_range(struct xkb_keymap *keymap)
513*2b949d04SAndroid Build Coastguard Worker {
514*2b949d04SAndroid Build Coastguard Worker xkb_keycode_t counter;
515*2b949d04SAndroid Build Coastguard Worker
516*2b949d04SAndroid Build Coastguard Worker assert(xkb_keymap_min_keycode(keymap) == 9);
517*2b949d04SAndroid Build Coastguard Worker assert(xkb_keymap_max_keycode(keymap) == 569);
518*2b949d04SAndroid Build Coastguard Worker
519*2b949d04SAndroid Build Coastguard Worker counter = xkb_keymap_min_keycode(keymap);
520*2b949d04SAndroid Build Coastguard Worker xkb_keymap_key_for_each(keymap, key_iter, &counter);
521*2b949d04SAndroid Build Coastguard Worker assert(counter == xkb_keymap_max_keycode(keymap) + 1);
522*2b949d04SAndroid Build Coastguard Worker }
523*2b949d04SAndroid Build Coastguard Worker
524*2b949d04SAndroid Build Coastguard Worker static void
test_caps_keysym_transformation(struct xkb_keymap * keymap)525*2b949d04SAndroid Build Coastguard Worker test_caps_keysym_transformation(struct xkb_keymap *keymap)
526*2b949d04SAndroid Build Coastguard Worker {
527*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state = xkb_state_new(keymap);
528*2b949d04SAndroid Build Coastguard Worker xkb_mod_index_t caps, shift;
529*2b949d04SAndroid Build Coastguard Worker int nsyms;
530*2b949d04SAndroid Build Coastguard Worker xkb_keysym_t sym;
531*2b949d04SAndroid Build Coastguard Worker const xkb_keysym_t *syms;
532*2b949d04SAndroid Build Coastguard Worker
533*2b949d04SAndroid Build Coastguard Worker assert(state);
534*2b949d04SAndroid Build Coastguard Worker
535*2b949d04SAndroid Build Coastguard Worker /* See xkb_state_key_get_one_sym() for what's this all about. */
536*2b949d04SAndroid Build Coastguard Worker
537*2b949d04SAndroid Build Coastguard Worker caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
538*2b949d04SAndroid Build Coastguard Worker shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
539*2b949d04SAndroid Build Coastguard Worker assert(caps != XKB_MOD_INVALID && shift != XKB_MOD_INVALID);
540*2b949d04SAndroid Build Coastguard Worker
541*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_layout(state, KEY_A + 8) == 0);
542*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_layout(state, KEY_SEMICOLON + 8) == 0);
543*2b949d04SAndroid Build Coastguard Worker
544*2b949d04SAndroid Build Coastguard Worker /* Without caps, no transformation. */
545*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) == 0);
546*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
547*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_level(state, KEY_A + 8, 0) == 0);
548*2b949d04SAndroid Build Coastguard Worker sym = xkb_state_key_get_one_sym(state, KEY_A + 8);
549*2b949d04SAndroid Build Coastguard Worker assert(sym == XKB_KEY_a);
550*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_level(state, KEY_SEMICOLON + 8, 0) == 0);
551*2b949d04SAndroid Build Coastguard Worker sym = xkb_state_key_get_one_sym(state, KEY_SEMICOLON + 8);
552*2b949d04SAndroid Build Coastguard Worker assert(sym == XKB_KEY_eacute);
553*2b949d04SAndroid Build Coastguard Worker nsyms = xkb_state_key_get_syms(state, KEY_SEMICOLON + 8, &syms);
554*2b949d04SAndroid Build Coastguard Worker assert(nsyms == 1 && syms[0] == XKB_KEY_eacute);
555*2b949d04SAndroid Build Coastguard Worker
556*2b949d04SAndroid Build Coastguard Worker /* With shift, no transformation (only different level). */
557*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + 8, XKB_KEY_DOWN);
558*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) == 0);
559*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) > 0);
560*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_level(state, KEY_A + 8, 0) == 1);
561*2b949d04SAndroid Build Coastguard Worker sym = xkb_state_key_get_one_sym(state, KEY_A + 8);
562*2b949d04SAndroid Build Coastguard Worker assert(sym == XKB_KEY_A);
563*2b949d04SAndroid Build Coastguard Worker sym = xkb_state_key_get_one_sym(state, KEY_SEMICOLON + 8);
564*2b949d04SAndroid Build Coastguard Worker assert(sym == XKB_KEY_odiaeresis);
565*2b949d04SAndroid Build Coastguard Worker nsyms = xkb_state_key_get_syms(state, KEY_SEMICOLON + 8, &syms);
566*2b949d04SAndroid Build Coastguard Worker assert(nsyms == 1 && syms[0] == XKB_KEY_odiaeresis);
567*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + 8, XKB_KEY_UP);
568*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
569*2b949d04SAndroid Build Coastguard Worker
570*2b949d04SAndroid Build Coastguard Worker /* With caps, transform in same level, only with _get_one_sym(). */
571*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_DOWN);
572*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_UP);
573*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) > 0);
574*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
575*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_level(state, KEY_A + 8, 0) == 1);
576*2b949d04SAndroid Build Coastguard Worker sym = xkb_state_key_get_one_sym(state, KEY_A + 8);
577*2b949d04SAndroid Build Coastguard Worker assert(sym == XKB_KEY_A);
578*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_level(state, KEY_SEMICOLON + 8, 0) == 0);
579*2b949d04SAndroid Build Coastguard Worker sym = xkb_state_key_get_one_sym(state, KEY_SEMICOLON + 8);
580*2b949d04SAndroid Build Coastguard Worker assert(sym == XKB_KEY_Eacute);
581*2b949d04SAndroid Build Coastguard Worker nsyms = xkb_state_key_get_syms(state, KEY_SEMICOLON + 8, &syms);
582*2b949d04SAndroid Build Coastguard Worker assert(nsyms == 1 && syms[0] == XKB_KEY_eacute);
583*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + 8, XKB_KEY_UP);
584*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
585*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_DOWN);
586*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_UP);
587*2b949d04SAndroid Build Coastguard Worker
588*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
589*2b949d04SAndroid Build Coastguard Worker }
590*2b949d04SAndroid Build Coastguard Worker
591*2b949d04SAndroid Build Coastguard Worker static void
test_get_utf8_utf32(struct xkb_keymap * keymap)592*2b949d04SAndroid Build Coastguard Worker test_get_utf8_utf32(struct xkb_keymap *keymap)
593*2b949d04SAndroid Build Coastguard Worker {
594*2b949d04SAndroid Build Coastguard Worker char buf[256];
595*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state = xkb_state_new(keymap);
596*2b949d04SAndroid Build Coastguard Worker assert(state);
597*2b949d04SAndroid Build Coastguard Worker
598*2b949d04SAndroid Build Coastguard Worker #define TEST_KEY(key, expected_utf8, expected_utf32) do { \
599*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, key + 8, NULL, 0) == strlen(expected_utf8)); \
600*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, key + 8, buf, sizeof(buf)) == strlen(expected_utf8)); \
601*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, expected_utf8, sizeof(expected_utf8)) == 0); \
602*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf32(state, key + 8) == expected_utf32); \
603*2b949d04SAndroid Build Coastguard Worker } while (0)
604*2b949d04SAndroid Build Coastguard Worker
605*2b949d04SAndroid Build Coastguard Worker /* Simple ASCII. */
606*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_A, "a", 0x61);
607*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_ESC, "\x1B", 0x1B);
608*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_1, "1", 0x31);
609*2b949d04SAndroid Build Coastguard Worker
610*2b949d04SAndroid Build Coastguard Worker /* Invalid. */
611*2b949d04SAndroid Build Coastguard Worker TEST_KEY(XKB_KEYCODE_INVALID - 8, "", 0);
612*2b949d04SAndroid Build Coastguard Worker TEST_KEY(300, "", 0);
613*2b949d04SAndroid Build Coastguard Worker
614*2b949d04SAndroid Build Coastguard Worker /* No string. */
615*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_LEFTCTRL, "", 0);
616*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_NUMLOCK, "", 0);
617*2b949d04SAndroid Build Coastguard Worker
618*2b949d04SAndroid Build Coastguard Worker /* Multiple keysyms. */
619*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_6, "HELLO", 0);
620*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_7, "YES THIS IS DOG", 0);
621*2b949d04SAndroid Build Coastguard Worker
622*2b949d04SAndroid Build Coastguard Worker /* Check truncation. */
623*2b949d04SAndroid Build Coastguard Worker memset(buf, 'X', sizeof(buf));
624*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 0) == strlen("HELLO"));
625*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "X", 1) == 0);
626*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 1) == strlen("HELLO"));
627*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "", 1) == 0);
628*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 2) == strlen("HELLO"));
629*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "H", 2) == 0);
630*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 3) == strlen("HELLO"));
631*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "HE", 3) == 0);
632*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 5) == strlen("HELLO"));
633*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "HELL", 5) == 0);
634*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 6) == strlen("HELLO"));
635*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "HELLO", 6) == 0);
636*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 7) == strlen("HELLO"));
637*2b949d04SAndroid Build Coastguard Worker assert(memcmp(buf, "HELLO\0X", 7) == 0);
638*2b949d04SAndroid Build Coastguard Worker
639*2b949d04SAndroid Build Coastguard Worker /* Switch to ru layout */
640*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
641*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
642*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_layout(state, KEY_A + 8) == 1);
643*2b949d04SAndroid Build Coastguard Worker
644*2b949d04SAndroid Build Coastguard Worker /* Non ASCII. */
645*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_ESC, "\x1B", 0x1B);
646*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_A, "ф", 0x0444);
647*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_Z, "я", 0x044F);
648*2b949d04SAndroid Build Coastguard Worker
649*2b949d04SAndroid Build Coastguard Worker /* Switch back to us layout */
650*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
651*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
652*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_layout(state, KEY_A + 8) == 0);
653*2b949d04SAndroid Build Coastguard Worker
654*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
655*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_A, "A", 0x41);
656*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_ESC, "\x1B", 0x1B);
657*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_1, "!", 0x21);
658*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_UP);
659*2b949d04SAndroid Build Coastguard Worker
660*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_6, "HELLO", 0);
661*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_7, "YES THIS IS DOG", 0);
662*2b949d04SAndroid Build Coastguard Worker
663*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
664*2b949d04SAndroid Build Coastguard Worker }
665*2b949d04SAndroid Build Coastguard Worker
666*2b949d04SAndroid Build Coastguard Worker static void
test_ctrl_string_transformation(struct xkb_keymap * keymap)667*2b949d04SAndroid Build Coastguard Worker test_ctrl_string_transformation(struct xkb_keymap *keymap)
668*2b949d04SAndroid Build Coastguard Worker {
669*2b949d04SAndroid Build Coastguard Worker char buf[256];
670*2b949d04SAndroid Build Coastguard Worker struct xkb_state *state = xkb_state_new(keymap);
671*2b949d04SAndroid Build Coastguard Worker xkb_mod_index_t ctrl;
672*2b949d04SAndroid Build Coastguard Worker
673*2b949d04SAndroid Build Coastguard Worker assert(state);
674*2b949d04SAndroid Build Coastguard Worker
675*2b949d04SAndroid Build Coastguard Worker /* See xkb_state_key_get_utf8() for what's this all about. */
676*2b949d04SAndroid Build Coastguard Worker
677*2b949d04SAndroid Build Coastguard Worker ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
678*2b949d04SAndroid Build Coastguard Worker assert(ctrl != XKB_MOD_INVALID);
679*2b949d04SAndroid Build Coastguard Worker
680*2b949d04SAndroid Build Coastguard Worker /* First without. */
681*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_A, "a", 0x61);
682*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_B, "b", 0x62);
683*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_C, "c", 0x63);
684*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_ESC, "\x1B", 0x1B);
685*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_1, "1", 0x31);
686*2b949d04SAndroid Build Coastguard Worker
687*2b949d04SAndroid Build Coastguard Worker /* And with. */
688*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
689*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0);
690*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_A, "\x01", 0x01);
691*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_B, "\x02", 0x02);
692*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_C, "\x03", 0x03);
693*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_ESC, "\x1B", 0x1B);
694*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_1, "1", 0x31);
695*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
696*2b949d04SAndroid Build Coastguard Worker
697*2b949d04SAndroid Build Coastguard Worker /* Switch to ru layout */
698*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
699*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
700*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_key_get_layout(state, KEY_A + 8) == 1);
701*2b949d04SAndroid Build Coastguard Worker
702*2b949d04SAndroid Build Coastguard Worker /* Non ASCII. */
703*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
704*2b949d04SAndroid Build Coastguard Worker assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0);
705*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_A, "\x01", 0x01);
706*2b949d04SAndroid Build Coastguard Worker TEST_KEY(KEY_B, "\x02", 0x02);
707*2b949d04SAndroid Build Coastguard Worker xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
708*2b949d04SAndroid Build Coastguard Worker
709*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(state);
710*2b949d04SAndroid Build Coastguard Worker }
711*2b949d04SAndroid Build Coastguard Worker
712*2b949d04SAndroid Build Coastguard Worker int
main(void)713*2b949d04SAndroid Build Coastguard Worker main(void)
714*2b949d04SAndroid Build Coastguard Worker {
715*2b949d04SAndroid Build Coastguard Worker struct xkb_context *context = test_get_context(0);
716*2b949d04SAndroid Build Coastguard Worker struct xkb_keymap *keymap;
717*2b949d04SAndroid Build Coastguard Worker
718*2b949d04SAndroid Build Coastguard Worker assert(context);
719*2b949d04SAndroid Build Coastguard Worker
720*2b949d04SAndroid Build Coastguard Worker /* Make sure these are allowed. */
721*2b949d04SAndroid Build Coastguard Worker xkb_context_unref(NULL);
722*2b949d04SAndroid Build Coastguard Worker xkb_keymap_unref(NULL);
723*2b949d04SAndroid Build Coastguard Worker xkb_state_unref(NULL);
724*2b949d04SAndroid Build Coastguard Worker
725*2b949d04SAndroid Build Coastguard Worker keymap = test_compile_rules(context, "evdev", "pc104", "us,ru", NULL, "grp:menu_toggle");
726*2b949d04SAndroid Build Coastguard Worker assert(keymap);
727*2b949d04SAndroid Build Coastguard Worker
728*2b949d04SAndroid Build Coastguard Worker test_update_key(keymap);
729*2b949d04SAndroid Build Coastguard Worker test_serialisation(keymap);
730*2b949d04SAndroid Build Coastguard Worker test_update_mask_mods(keymap);
731*2b949d04SAndroid Build Coastguard Worker test_repeat(keymap);
732*2b949d04SAndroid Build Coastguard Worker test_consume(keymap);
733*2b949d04SAndroid Build Coastguard Worker test_range(keymap);
734*2b949d04SAndroid Build Coastguard Worker test_get_utf8_utf32(keymap);
735*2b949d04SAndroid Build Coastguard Worker test_ctrl_string_transformation(keymap);
736*2b949d04SAndroid Build Coastguard Worker
737*2b949d04SAndroid Build Coastguard Worker xkb_keymap_unref(keymap);
738*2b949d04SAndroid Build Coastguard Worker keymap = test_compile_rules(context, "evdev", NULL, "ch", "fr", NULL);
739*2b949d04SAndroid Build Coastguard Worker assert(keymap);
740*2b949d04SAndroid Build Coastguard Worker
741*2b949d04SAndroid Build Coastguard Worker test_caps_keysym_transformation(keymap);
742*2b949d04SAndroid Build Coastguard Worker
743*2b949d04SAndroid Build Coastguard Worker xkb_keymap_unref(keymap);
744*2b949d04SAndroid Build Coastguard Worker xkb_context_unref(context);
745*2b949d04SAndroid Build Coastguard Worker }
746