@@ -750,8 +750,8 @@ test_mod_latch(struct xkb_context *context)
750750
751751 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Latch Shift */
752752 KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , /* Latch Level3 */
753- KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift */
754- KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT , /* Unlatch Level3 */
753+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift, unlatch Level3 */
754+ KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
755755 KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
756756 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Unlock Shift */
757757 KEY_1 , BOTH , XKB_KEY_1 , NEXT ,
@@ -770,12 +770,12 @@ test_mod_latch(struct xkb_context *context)
770770
771771 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Latch Shift */
772772 KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , /* Latch Level3 */
773- KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift */
774- KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , /* Lock Level3 */
775- KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
776- KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
777- KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , /* Unlock Level3 */
773+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift, unlatch Level3 */
774+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , /* Latch Level3 */
775+ KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT , /* Unatch Level3 */
778776 KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
777+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , /* Latch Level3 */
778+ KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
779779 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Unlock Shift */
780780 KEY_1 , BOTH , XKB_KEY_1 , FINISH
781781 ));
@@ -860,17 +860,17 @@ test_mod_latch(struct xkb_context *context)
860860 KEY_RIGHTALT , DOWN , XKB_KEY_ISO_Level3_Latch , NEXT , /* Set Level3 */
861861 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Latch Shift */
862862 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift */
863- KEY_RIGHTALT , UP , XKB_KEY_ISO_Level3_Latch , NEXT , /* Latch Level3 */
864- KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT , /* Unlatch Level3 */
863+ KEY_RIGHTALT , UP , XKB_KEY_ISO_Level3_Latch , NEXT ,
864+ KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
865865 KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
866866 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Unlock Shift */
867867 KEY_1 , BOTH , XKB_KEY_1 , NEXT ,
868868
869869 KEY_RIGHTALT , DOWN , XKB_KEY_ISO_Level3_Latch , NEXT , /* Set Level3 */
870870 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Latch Shift */
871871 KEY_RIGHTALT , UP , XKB_KEY_ISO_Level3_Latch , NEXT , /* Latch Level3 */
872- KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift */
873- KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT , /* Unlatch level 3*/
872+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Lock Shift, unlatch Level3 */
873+ KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
874874 KEY_1 , BOTH , XKB_KEY_exclam , NEXT ,
875875 KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , /* Unlock Shift */
876876 KEY_1 , BOTH , XKB_KEY_1 , FINISH
@@ -1124,6 +1124,52 @@ test_latch_mod_cancel(struct xkb_context *context)
11241124 KEY_Q , BOTH , XKB_KEY_q , FINISH
11251125 ));
11261126
1127+ // `latchToLock` locks and `clearLocks` unlocks break existing latches...
1128+ assert (test_key_seq (keymap ,
1129+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , // Latch Shift
1130+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Latch LevelThree
1131+ KEY_A , BOTH , XKB_KEY_minus , NEXT , // Unlatch Shift, unlatch LevelThree
1132+
1133+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , // Latch Shift
1134+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Latch LevelThree
1135+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Lock LevelThree, unlatch Shift
1136+ KEY_A , BOTH , XKB_KEY_ISO_Level5_Latch , NEXT , // Latch LevelFive
1137+ KEY_Q , BOTH , XKB_KEY_q , NEXT , // Unlatch LevelFive
1138+ KEY_A , BOTH , XKB_KEY_ISO_Level5_Latch , NEXT , // Latch LevelFive
1139+ KEY_Q , BOTH , XKB_KEY_q , NEXT , // Unlatch LevelFive
1140+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , // Latch Shift
1141+ KEY_Q , BOTH , XKB_KEY_Q , NEXT , // Unlatch Shift
1142+ KEY_Q , BOTH , XKB_KEY_q , NEXT ,
1143+ KEY_LEFTSHIFT , BOTH , XKB_KEY_Shift_L , NEXT , // Latch Shift
1144+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Unlock LevelThree, unlatch Shift
1145+ KEY_A , BOTH , XKB_KEY_a , FINISH
1146+ ));
1147+
1148+ // ... but a latch key still sets while being held down
1149+ assert (test_key_seq (keymap ,
1150+ KEY_F3 , DOWN , XKB_KEY_Shift_L , NEXT , // Set Shift
1151+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Latch LevelThree
1152+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Lock LevelThree
1153+ KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
1154+ KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
1155+ KEY_F3 , UP , XKB_KEY_Caps_Lock , NEXT , // Unset Shift
1156+ KEY_1 , BOTH , XKB_KEY_onesuperior , NEXT ,
1157+ KEY_1 , BOTH , XKB_KEY_onesuperior , NEXT ,
1158+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Unlock LevelThree
1159+ KEY_1 , BOTH , XKB_KEY_1 , NEXT ,
1160+
1161+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Latch LevelThree
1162+ KEY_F3 , DOWN , XKB_KEY_Shift_L , NEXT , // Set Shift
1163+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Lock LevelThree
1164+ KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
1165+ KEY_1 , BOTH , XKB_KEY_exclamdown , NEXT ,
1166+ KEY_F3 , UP , XKB_KEY_Caps_Lock , NEXT , // Unset Shift
1167+ KEY_1 , BOTH , XKB_KEY_onesuperior , NEXT ,
1168+ KEY_1 , BOTH , XKB_KEY_onesuperior , NEXT ,
1169+ KEY_RIGHTALT , BOTH , XKB_KEY_ISO_Level3_Latch , NEXT , // Unlock LevelThree
1170+ KEY_1 , BOTH , XKB_KEY_1 , FINISH
1171+ ));
1172+
11271173 xkb_keymap_unref (keymap );
11281174}
11291175
0 commit comments