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 9d495550a79b13c69bf93c875e11bf6804aca025..8bf83bbf3e7c9b1b418755fd8b0311d8238f7dd6 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 ce219b5bf47b16a3d761f7a5382fa8f8999131ff..f5ecb620ed6f08c459d385b1df40c9a3f5283cc5 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,