First off, excuse my ignorance of X and XKB; I've been trying to hack together a solution in the hope of being able to achieve what I want without requiring a detailed grasp of it.
I'm trying to create an XKB keyboard map on Ubuntu 12.04 that allows me to stipulate which of the two shift keys constitutes the Level2 modifier. Specifically, the 4 key should only produce a $
when the right shift is held, not the left.
My reading so far:
- http://www.charvolant.org/~doug/xkb/html/node5.html
- http://people.uleth.ca/~daniel.odonnell/Blog/custom-keyboard-in-linuxx11
- http://www.x.org/releases/X11R7.5/doc/input/XKB-Enhancing.html
- Lots of searching!
I've attempted to define a custom type, and then refer to it explicitly in a symbols map:
/usr/share/X11/xkb/types/mbfisher
:
default xkb_types "mbfisher" {
type "RIGHT_SHIFT" {
modifiers = None+Shift_R;
map[None] = Level1;
map[Shift_R] = Level2;
};
}
/usr/share/X11/xkb/symbols/mbfisher
:
default
partial alphanumeric_keys
xkb_symbols "basic" {
name[Group1]= "mbfisher";
key <AE04> {
type= "RIGHT_SHIFT",
symbols[Group1]= [ 4, dollar ]
};
};
I'm then selecting the map with the Ubuntu Keyboard Layout GUI.
This obviously disables the alphanumeric keyboard apart from the 4 key, but the dollar sign can still be typed with either shift key.
I'm conscious of writing a massive question with lots of useless information so I'll stop here; please ask for anything I've missed out.
Any ideas?
Best Answer
Here's what finally worked! I used
xmodmap
and a~/.Xmodmap
file rather than xkb configuration.~/.Xmodmap
:The 2 commented lines (staring with
!
) show the column headings before and after my changes. This has allowed me to specify col 2 as Shift_L and col 3 as Shift_R, as I've mapped shift_R as Mode_switch.The changes are made by running:
setxkbmap us
sets the default US map so you're working from a clean slate, andxmodmap
appends the custom changes to it.When implemented the
!
,@
,#
,$
and%
characters can only be typed with the right shift key, and^
,&
,*
,(
and)
can only be typed with the left shift key.I can now continue by mapping all keys on the left hand side of the keyboard to only be modified by the right shift key (i.e. the aplhabetical characters and their uppercase modifications) and vice versa; this solution means I only need to remap the left side.
Other useful links found along the way:
Thank you very much to @Trudbert for getting me most of the way to the answer!