I have a Thinkpad Edge E130 running Sabayon (a Gentoo-based distro), and I'm fighting the well-know bug Xorg 255 keycodes limit.

My laptop has the Fn+F4 hotkey for Mic Mute/Unmute. This is the problem:

  • showkey -k shows keycode 248 on Fn+F4 keypress
  • showkey -s shows nothing on keypress
  • xev shows nothing on keypress (because 248+8 [added by kernel] is bigger than 255)

If a key has a keycode, it must have a scancode too. With getscancodes program indeed I got 26 as scancode:

# ./Sabayon/getscancodes/getscancodes /dev/input/event6 
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x17aa product 0x5054 version 0x4101
Input device name: "ThinkPad Extra Buttons"
26 (0x1a)
26 (0x1a)

According to this thread, my guess is simply to change the keycode of the hotkey with a smaller, unused one. For example 120 seems to be unused according to my $ xmodmap -pke

I have tried with

# setkeycodes 0x1a 120

but without success, the keycode is always 248 checking with showkey.

How is the proper way to change keycodes?

  1. Use showkey to know your key scancode:

    $ sudo showkey -s
    0xe0 0xXX
  2. Kernel will add 8 to you code, use 112 instead 120:

    $ sudo setkeycodes e0XX 112
  3. Use xmodmap to make your key report XF86AudioMute keysym:

    $ xmodmap -e "keycode 120 = XF86AudioMute"
  4. Optional. Press you key when creating shortcut to what you want in the settings of your DE.

|improve this answer|||||
  • Actually I switched to Debian Sid and Fn+F4 works out of the box here (maybe just because I have a newer kernel version). But thank you anyway, your solution looks good and I hope will help other people. – eang Sep 26 '14 at 8:47
  • This does not work for USB keyboards, because setkeycodes does not support them. If the system has udev, the keys can be remapped by adding a custom entry to the hardware database. Example here: unix.stackexchange.com/a/384566/245377 – user3096626 Aug 8 '17 at 13:01
  • Why subtract 8? Do you have chapter and verse? – Tom Hale Sep 2 '19 at 12:42
  • Note if you are trying to use showkey -s: it may not report real raw scancodes for use with setkeycodes; as a sanity check, compare the resulting keycodes (shown by showkey [-k]) with what keycode the table for the existing mapping shown by getkeycodes says should be produced for the scancode you got from showkey -s. – rakslice Jan 15 at 22:29

step 1: xmodmap -pke will list you keycodes

step 2: xmodmap -e 'keycode 51 = backslash bar' will change that keycode to backslash

|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.