From 74fb8e1115755d1156f7a049e3d26de9b9c33a85 Mon Sep 17 00:00:00 2001 From: Stephan Hilb Date: Sun, 2 Dec 2012 16:52:54 +0100 Subject: [PATCH] Always use fake keycode bindings for level3 and level5 With this patch the real modifiers get bound to a virtual modifier only through fake keycodes, which accounts for both the case where a key gets bound to a different modifier by the first layout (and thus the second layout loses its modifier behaviour) and the case where two virtual modifiers would get bound to the same keycode. see bug report #50935 --- symbols/level3 | 42 ++++++++++++++++++++++++++++-------------- symbols/level5 | 26 +++++++++++++++++--------- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/symbols/level3 b/symbols/level3 index 9d49555..8bf83bb 100644 --- a/symbols/level3 +++ b/symbols/level3 @@ -2,6 +2,19 @@ // the third shift level can be reached // +// Ensure a mapping to a real modifier for LevelThree +partial modifier_keys +xkb_symbols "modifier_mapping" { + key.type[Group1] = "ONE_LEVEL"; + + replace key { + vmods = LevelThree, + symbols[Group1] = [ ISO_Level3_Shift ], + actions[Group1] = [ SetMods(modifiers=LevelThree) ] + }; + modifier_map Mod5 { }; +}; + // the default behavior is for the right Alt key (AltGr) to generate the // third engraved symbol default partial modifier_keys @@ -10,7 +23,7 @@ xkb_symbols "ralt_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; // Right Alt key never chooses 3rd level. @@ -38,6 +51,7 @@ xkb_symbols "ralt_switch_multikey" { type[Group1]="TWO_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, Multi_key ] }; + include "level3(modifier_mapping)" }; // special case or right Alt switch - for use with grp:alts_toggle @@ -55,7 +69,7 @@ xkb_symbols "ralt_switch_for_alts_toggle" { symbols[Group1] = [ ISO_Level3_Shift, ISO_Next_Group ], virtualMods= AltGr }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; // using the level(alt_switch) map, either Alt key temporarily chooses @@ -72,7 +86,7 @@ xkb_symbols "lalt_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { }; + include "level3(modifier_mapping)" }; // using the level(switch) map, the right Control key temporarily @@ -83,7 +97,7 @@ xkb_symbols "switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; // using the level(menu_switch) map, the Menu key temporarily @@ -94,7 +108,7 @@ xkb_symbols "menu_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; // using the level3(win_switch) map, the either Windows' logo key @@ -113,7 +127,7 @@ xkb_symbols "lwin_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; // using the level(rwin_switch) map, the right Windows' logo key @@ -126,7 +140,7 @@ xkb_symbols "rwin_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; // using the level3(enter_switch) map, the Enter key on the keypad @@ -138,7 +152,7 @@ xkb_symbols "enter_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; partial modifier_keys @@ -147,7 +161,7 @@ xkb_symbols "caps_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; partial modifier_keys @@ -156,7 +170,7 @@ xkb_symbols "bksl_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; partial modifier_keys @@ -165,7 +179,7 @@ xkb_symbols "lsgt_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; partial modifier_keys @@ -174,7 +188,7 @@ xkb_symbols "caps_switch_latch" { type[Group1]="THREE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; partial modifier_keys @@ -183,7 +197,7 @@ xkb_symbols "bksl_switch_latch" { type[Group1]="THREE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; partial modifier_keys @@ -192,5 +206,5 @@ xkb_symbols "lsgt_switch_latch" { type[Group1]="THREE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] }; - modifier_map Mod5 { ISO_Level3_Shift }; + include "level3(modifier_mapping)" }; diff --git a/symbols/level5 b/symbols/level5 index ce219b5..f5ecb62 100644 --- a/symbols/level5 +++ b/symbols/level5 @@ -2,6 +2,19 @@ // the third shift level can be reached // +// Ensure a mapping to a real modifier for LevelFive +partial modifier_keys +xkb_symbols "modifier_mapping" { + key.type[Group1] = "ONE_LEVEL"; + + replace key { + vmods = LevelFive, + symbols[Group1] = [ ISO_Level5_Shift ], + actions[Group1] = [ SetMods(modifiers=LevelFive) ] + }; + modifier_map Mod3 { }; +}; + // using the level(switch) map, the right Control key temporarily // chooses the fifth shift level (until it is released). partial modifier_keys @@ -10,7 +23,7 @@ xkb_symbols "rctrl_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; - modifier_map Mod3 { ISO_Level5_Shift }; + include "level5(modifier_mapping)" }; partial modifier_keys @@ -19,7 +32,7 @@ xkb_symbols "lsgt_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; - modifier_map Mod3 { ISO_Level5_Shift }; + include "level5(modifier_mapping)" }; partial modifier_keys @@ -28,7 +41,7 @@ xkb_symbols "ralt_switch" { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; - modifier_map Mod3 { ISO_Level5_Shift }; + include "level5(modifier_mapping)" }; @@ -43,12 +56,7 @@ xkb_symbols "lock" { // See also: compat/level5(level5_lock) key.type[Group1] = "ONE_LEVEL"; - replace key { - vmods = LevelFive, - symbols[Group1] = [ ISO_Level5_Shift ], - actions[Group1] = [ SetMods(modifiers=LevelFive) ] - }; - modifier_map Mod3 { }; + include "level5(modifier_mapping)" replace key { vmods = NumLock, -- 1.7.9.5