First find the scancode of the key that needs to be remapped, e.g. with the evtest
utility. A line like the following one (with MSC_SCAN
in it) should be output:
Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068
followed by a second one giving the current key code. If no MSC_SCAN
line is output, this is due to a kernel driver bug, but the scancode can still be found with the input-kbd
utility; evtest
should have given the key code, so that it should be easy to find the corresponding line in the input-kbd
output (e.g. by using grep
).
Once the scancodes of the keys to be remapped have been determined, create a file such as /etc/udev/hwdb.d/98-custom-keyboard.hwdb
containing the remappings. The beginning of the file /lib/udev/hwdb.d/60-keyboard.hwdb
gives some information. In my case (which works), I have:
evdev:input:b0003v05ACp0221*
KEYBOARD_KEY_70035=102nd # Left to z: backslash bar
KEYBOARD_KEY_70064=grave # Left to 1: grave notsign
KEYBOARD_KEY_70068=insert # F13: Insert
(Before udev 220, I had to use keyboard:usb:v05ACp0221*
for the first line.)
The evdev:
string must be at the beginning of the line.
Note that the letters in the vendor and product id should be capital letters.
Each KEYBOARD_KEY_
settings should have exactly one space before (note: a line with no spaces will give an error message, and a line with two spaces were silently ignored with old udev versions). KEYBOARD_KEY_
is followed by the scancode in hexadecimal (like what both evtest
and input-kbd
give). Valid values could be obtained from either the evtest
output or the input-kbd
output, or even from the /usr/include/linux/input.h
file: for instance, KEY_102ND
would give 102nd
(by removing KEY_
and converting to lower case), which I used above.
After the file is saved, type:
udevadm hwdb --update
to (re)build the database /etc/udev/hwdb.bin
(you can check its timestamp). Then,
udevadm trigger --sysname-match="event*"
will take the new settings into account. You can check with evtest
.
In 2014, the released udev had incomplete/buggy information in /lib/udev/hwdb.d/60-keyboard.hwdb
, but you can look at the latest development version of the file and/or my bug report and discussion concerning the documentation and spacing issues.
If this doesn't work, the problem might be found after temporarily increasing the log level of udevd
with udevadm control
(see the udevadm(8) man page for details).
For old udev
versions such as 204, this method should still work.
Key chords (like Shift+\) are specified by combining one key with a set of modifiers, not by combining keys directly. So rather than “keycode 50 plus keycode 21”, what you need to specify is “keycode 21 plus the Shift modifier”. Only modifiers can be used in combinations. Furthermore xmodmap is somewhat limited: you need to specify all the key chords for a particular base key at the same time.
keycode 21 = backslash grave acute
The first keysym (character or function key name) after the equal sign is the one corresponding to the bare key, then comes the one corresponding to the key with Shift, then with AltGr, then with Shift+AltGr.
If you want dead keys, then change this to
keycode 21 = backslash dead_grave dead_acute
If you want a standard Norwegian layout, though, you should be able to select it in your desktop environment's configuration interface, or with XKB — setxkbmap -layout no
switches to a Norwegian layout.
Best Answer
To disable them via
XKB
you could comment them out in your Xkeycodes
file (the one that corresponds to your keyboard - linux uses/usr/share/X11/xkb/keycodes/evdev
). Numpad key codes start with<KP...
so you could use the following to prepend those lines with//kp_dsbl
(//
is the comment andkp_dsbl
is some arbitrary string that you can use later to identify those lines if you want to revert changes):or
To re-enable them:
or