Always use fake keycode bindings for level3 and level5
authorStephan Hilb <stephan@ecshi.net>
Sun, 2 Dec 2012 15:52:54 +0000 (16:52 +0100)
committerSergey V. Udaltsov <svu@gnome.org>
Sun, 2 Dec 2012 19:25:50 +0000 (19:25 +0000)
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
symbols/level5

index 9d49555..8bf83bb 100644 (file)
@@ -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 <LVL3> {
+    vmods = LevelThree,
+    symbols[Group1] = [ ISO_Level3_Shift ],
+    actions[Group1] = [ SetMods(modifiers=LevelThree) ]
+  };
+  modifier_map Mod5 { <LVL3> };
+};
+
 // 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   { <LALT> };
+  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)"
 };
index ce219b5..f5ecb62 100644 (file)
@@ -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 <MDSW> {
+    vmods = LevelFive,
+    symbols[Group1] = [ ISO_Level5_Shift ],
+    actions[Group1] = [ SetMods(modifiers=LevelFive) ]
+  };
+  modifier_map Mod3 { <MDSW> };
+};
+
 // 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 <MDSW> {
-    vmods = LevelFive,
-    symbols[Group1] = [ ISO_Level5_Shift ],
-    actions[Group1] = [ SetMods(modifiers=LevelFive) ]
-  };
-  modifier_map Mod3 { <MDSW> };
+  include "level5(modifier_mapping)"
 
   replace key <HYPR> {
     vmods = NumLock,