2929#include <stdio.h>
3030#include <stdlib.h>
3131
32+ #include "evdev-scancodes.h"
3233#include "test.h"
3334#include "keymap.h"
3435
@@ -230,6 +231,80 @@ test_multiple_keysyms_per_level(void)
230231 xkb_context_unref (context );
231232}
232233
234+ static void
235+ test_multiple_actions_per_level (void )
236+ {
237+ struct xkb_context * context = test_get_context (0 );
238+ struct xkb_keymap * keymap ;
239+ xkb_keycode_t kc ;
240+ int keysyms_count ;
241+ const xkb_layout_index_t first_layout = 0 ;
242+ const xkb_keysym_t * keysyms ;
243+ xkb_mod_index_t ctrl ;
244+ xkb_layout_index_t layout ;
245+ xkb_mod_mask_t base_mods ;
246+
247+ assert (context );
248+
249+ keymap = test_compile_rules_with_flags (
250+ context , "evdev" , "pc104" , "awesome,cz" , NULL , "grp:menu_toggle" ,
251+ XKB_KEYMAP_COMPILE_RANGE_REDIRECT_TO_0 );
252+ assert (keymap );
253+
254+ ctrl = xkb_keymap_mod_get_index (keymap , XKB_MOD_NAME_CTRL );
255+
256+ kc = xkb_keymap_key_by_name (keymap , "LCTL" );
257+ keysyms_count = xkb_keymap_key_get_syms_by_level (keymap , kc , first_layout , 0 , & keysyms );
258+ assert (keysyms_count == 2 );
259+ assert (keysyms [0 ] == XKB_KEY_Control_L );
260+ assert (keysyms [1 ] == XKB_KEY_ISO_First_Group );
261+
262+ struct xkb_state * state = xkb_state_new (keymap );
263+ assert (state );
264+ layout = xkb_state_key_get_layout (state , KEY_LEFTCTRL + EVDEV_OFFSET );
265+ assert (layout == 0 );
266+ xkb_state_update_key (state , KEY_LEFTCTRL + EVDEV_OFFSET , XKB_KEY_DOWN );
267+ base_mods = xkb_state_serialize_mods (state , XKB_STATE_MODS_DEPRESSED );
268+ assert (base_mods == (1U << ctrl ));
269+ layout = xkb_state_key_get_layout (state , XKB_KEY_2 + EVDEV_OFFSET );
270+ assert (layout == 0 );
271+ xkb_state_update_key (state , KEY_LEFTCTRL + EVDEV_OFFSET , XKB_KEY_UP );
272+ base_mods = xkb_state_serialize_mods (state , XKB_STATE_MODS_DEPRESSED );
273+ assert (base_mods == 0 );
274+ layout = xkb_state_key_get_layout (state , XKB_KEY_2 + EVDEV_OFFSET );
275+ assert (layout == 0 );
276+ xkb_state_update_key (state , KEY_COMPOSE + EVDEV_OFFSET , XKB_KEY_DOWN );
277+ xkb_state_update_key (state , KEY_COMPOSE + EVDEV_OFFSET , XKB_KEY_UP );
278+ layout = xkb_state_key_get_layout (state , XKB_KEY_2 + EVDEV_OFFSET );
279+ assert (layout == 1 );
280+ xkb_state_update_key (state , KEY_LEFTCTRL + EVDEV_OFFSET , XKB_KEY_DOWN );
281+ base_mods = xkb_state_serialize_mods (state , XKB_STATE_MODS_DEPRESSED );
282+ assert (base_mods == (1U << ctrl ));
283+ layout = xkb_state_key_get_layout (state , XKB_KEY_2 + EVDEV_OFFSET );
284+ assert (layout == 0 );
285+ xkb_state_update_key (state , KEY_LEFTCTRL + EVDEV_OFFSET , XKB_KEY_UP );
286+ base_mods = xkb_state_serialize_mods (state , XKB_STATE_MODS_DEPRESSED );
287+ assert (base_mods == 0 );
288+ layout = xkb_state_key_get_layout (state , XKB_KEY_2 + EVDEV_OFFSET );
289+ assert (layout == 1 );
290+ xkb_state_unref (state );
291+
292+ assert (test_key_seq (keymap ,
293+ KEY_2 , BOTH , XKB_KEY_2 , NEXT ,
294+ KEY_LEFTCTRL , DOWN , XKB_KEY_Control_L , XKB_KEY_ISO_First_Group , NEXT ,
295+ KEY_2 , BOTH , XKB_KEY_2 , NEXT ,
296+ KEY_LEFTCTRL , UP , XKB_KEY_Control_L , XKB_KEY_ISO_First_Group , NEXT ,
297+ KEY_COMPOSE , BOTH , XKB_KEY_ISO_Next_Group , NEXT ,
298+ KEY_2 , BOTH , XKB_KEY_ecaron , NEXT ,
299+ KEY_LEFTCTRL , DOWN , XKB_KEY_Control_L , XKB_KEY_ISO_First_Group , NEXT ,
300+ KEY_2 , BOTH , XKB_KEY_2 , NEXT ,
301+ KEY_LEFTCTRL , UP , XKB_KEY_Control_L , XKB_KEY_ISO_First_Group , NEXT ,
302+ KEY_2 , BOTH , XKB_KEY_ecaron , FINISH ));
303+
304+ xkb_keymap_unref (keymap );
305+ xkb_context_unref (context );
306+ }
307+
233308int
234309main (void )
235310{
@@ -239,6 +314,7 @@ main(void)
239314 test_keymap ();
240315 test_numeric_keysyms ();
241316 test_multiple_keysyms_per_level ();
317+ test_multiple_actions_per_level ();
242318
243319 return 0 ;
244320}
0 commit comments