2 * Copyright © 2016 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
23 * Author: Mike Blumenkrantz <zmike@osg.samsung.com>
37 struct xkb_context *context = test_get_context(0);
38 struct xkb_keymap *keymap;
41 xkb_mod_mask_t masks_out[4] = { 0, 0, 0, 0 };
43 xkb_mod_mask_t shift_mask;
44 xkb_mod_mask_t lock_mask;
45 xkb_mod_mask_t mod2_mask;
49 keymap = test_compile_rules(context, "evdev", "pc104", "us,ru", NULL, "grp:menu_toggle");
52 kc = xkb_keymap_key_by_name(keymap, "AE09");
53 assert(kc != XKB_KEYCODE_INVALID);
54 keyname = xkb_keymap_key_get_name(keymap, kc);
55 assert(streq(keyname, "AE09"));
57 kc = xkb_keymap_key_by_name(keymap, "COMP");
58 assert(kc != XKB_KEYCODE_INVALID);
59 keyname = xkb_keymap_key_get_name(keymap, kc);
60 assert(streq(keyname, "COMP"));
62 kc = xkb_keymap_key_by_name(keymap, "MENU");
63 assert(kc != XKB_KEYCODE_INVALID);
64 keyname = xkb_keymap_key_get_name(keymap, kc);
65 assert(streq(keyname, "COMP"));
67 kc = xkb_keymap_key_by_name(keymap, "AC01");
68 assert(kc != XKB_KEYCODE_INVALID);
70 // AC01 level 0 ('a') requires no modifiers on us-pc104
71 mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 0, masks_out, 4);
72 assert(mask_count == 0);
74 shift_mask = 1 << xkb_keymap_mod_get_index(keymap, "Shift");
75 lock_mask = 1 << xkb_keymap_mod_get_index(keymap, "Lock");
76 mod2_mask = 1 << xkb_keymap_mod_get_index(keymap, "Mod2");
78 // AC01 level 1 ('A') requires either Shift or Lock modifiers on us-pc104
79 mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 1, masks_out, 4);
80 assert(mask_count == 2);
81 assert(masks_out[0] == shift_mask);
82 assert(masks_out[1] == lock_mask);
84 kc = xkb_keymap_key_by_name(keymap, "KP1");
86 // KP1 level 0 ('End') requires no modifiers or Shift+Mod2 on us-pc104
87 mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 0, masks_out, 4);
88 assert(mask_count == 2);
89 assert(masks_out[0] == 0);
90 assert(masks_out[1] == (shift_mask | mod2_mask));
92 // KP1 level 1 ('1') requires either Shift or Mod2 modifiers on us-pc104
93 mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 1, masks_out, 4);
94 assert(mask_count == 2);
95 assert(masks_out[0] == shift_mask);
96 assert(masks_out[1] == mod2_mask);
98 // Return key is not affected by modifiers on us-pc104
99 kc = xkb_keymap_key_by_name(keymap, "RTRN");
100 mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 0, masks_out, 4);
101 assert(mask_count == 1);
102 assert(masks_out[0] == 0);
104 xkb_keymap_unref(keymap);
105 xkb_context_unref(context);