Saturday, January 08, 2011

Remapping keys in linux

My problem:

I got a very crappy PS2 to USB cable, and when I use the mouse scroll, from time to time a extra mouse key press was sent (key 9). This was not a problem in most of the places, except in firefox where it would trigger a back in history when I scrolled up (very annoying).
I've changed all the firefox preferences in about:config in mousewheel.* to only scroll (action=0), but I was always getting the back in scroll up. (about:config information here.)

Diagnosis:

To figure out what was the problem I used xev That will print to the terminal the events occurred in the small x window created by the program. Here is the problem I was having, the log is from me scrolling down, you can see at some point the keys sent are 9 and 8:
ButtonPress event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747353, (40,101), root:(1358,514),
    state 0x10, button 4, same_screen YES
ButtonRelease event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747353, (40,101), root:(1358,514),
    state 0x810, button 4, same_screen YES
MotionNotify event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747449, (40,102), root:(1358,515),
    state 0x10, is_hint 0, same_screen YES
ButtonRelease event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747449, (40,102), root:(1358,515),
    state 0x10, button 8, same_screen YES
ButtonRelease event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747449, (40,102), root:(1358,515),
    state 0x10, button 9, same_screen YES
MotionNotify event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747553, (40,102), root:(1358,515),
    state 0x10, is_hint 0, same_screen YES
ButtonPress event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747553, (40,102), root:(1358,515),
    state 0x10, button 8, same_screen YES
ButtonPress event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747553, (40,102), root:(1358,515),
    state 0x10, button 9, same_screen YES
ButtonPress event, serial 40, synthetic NO, window 0x3800001,
    root 0xb6, subw 0x0, time 747553, (40,102), root:(1358,515),
    state 0x10, button 4, same_screen YES
As my mouse only has 2 buttons and a scroll wheel, I changed the mouse mapping to disable all the other buttons (buttons above 5 are set to button 0). The command is:
xmodmap -e "pointer = 1 2 3 4 5 0 0 0 0 0 0 0 0 0 "
You can check what mapping you are using by doing: xmodmap -pp In my case, after changing the mapping I get:
# xmodmap -pp
There are 14 pointer buttons defined.

Physical        Button
 Button          Code
    1              1
    2              2
    3              3
    4              4
    5              5
    6              0
    7              0
    8              0
    9              0
   10              0
   11              0
   12              0
   13              0
   14              0
To return to the default mapping you can do : # xmodmap -e "pointer = default" And check:
# xmodmap -pp
There are 14 pointer buttons defined.

Physical        Button
 Button          Code
    1              1
    2              2
    3              3
    4              4
    5              5
    6              6
    7              7
    8              8
    9              9
   10             10
   11             11
   12             12
   13             13
   14             14
To make this change permanent you just need to create a file ~/.Xmodmap with the content:
pointer = 1 2 3 4 5 0 0 0 0 0 0 0 0 0
You can check the correctness of your file by doing xmodmap ~/.Xmodmap and check if the mapping was changed correctly.

No comments :

Post a Comment