Linux Keyboard – Make Super Key Behave Like Ctrl/Alt/Shift


After using the Ctrl + "arrow keys" for 13 years to switch virtual desktops in X windows, I've been convinced recently to change to using the Super keys instead (the windows key and the context menu key, which I've remapped). This all works fine for the most part. However, something is still picking up the key events that these keys are sending as if they are a normal alphanumeric like key.

For example, I first noticed this in Google Docs spreadsheet that if I press the windows key alone over top of a cell, that it starts editing that cell. It doesn't insert anything, it just sends a key event that Firefox sees and starts editing the cell. This caused problems on a collaborative document I was working on as the way Google docs works, it led to me accidentally erasing the data in a few fields before I realised what was going on.

I like using the super keys, but I want them to behave more like a Ctrl or Alt key does in that its a modifier key and doesn't send anything until a second key is pressed.

My setup is the following:

  • Ubuntu 10.10
  • XFCE 4
  • Microsoft Natural Ergo 4000 keyboard (with the logo scratched out of course)
  • The following is my .Xmodmap file:

remove Lock = Caps_Lock

keycode 66 = Escape

! The below maps my other windows context menu key.

keycode 135 = Super_R

Edit: As requested, here is the relevant output from xev for a keypress and keyrelease of my Super_L (left windows key)

KeyPress event, serial 34, synthetic NO, window 0x8200001,
    root 0x15d, subw 0x0, time 2428849342, (177,174), root:(182,228),
    state 0x10, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x8200001,
    root 0x15d, subw 0x0, time 2428849430, (177,174), root:(182,228),
    state 0x50, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Best Answer

Non XFCE-related stuff

It won't be exactly an answer to your problem, sorry for that, but still should be useful for someone at least. In Gnome it was fixed in recent Ubuntus. By it I mean treating Win not as a modifier key. In the old days, e.g. in Ubuntu 9.04, you had to do following change:

Go to System -> Preferences -> Keyboard, under Layouts tab click Layout options... button and in Alt/Win key behavior list choose Meta is mapped to Win keys (or Meta is mapped to Left Win) instead of Default.

What it really does? Changes altwin option in $HOME/.gconf/desktop/gnome/peripherals/keyboard/kbd/%gconf.xml file (or creates it if it does not exist):

<?xml version="1.0"?>
        <entry name="options" mtime="1298496603" type="list" ltype="string">
                <li type="string">
                        <stringvalue>altwin     altwin:meta_win</stringvalue>

If you've chosen Left Win, then there will be following string value:

altwin     altwin:left_meta_win

In Ubuntu 10.10 it's not needed as Default apparently has changed.

But you have XFCE, not Gnome, so this rather won't help you.

XFCE-related stuff

I've downloaded Xubuntu (9.10), played with it a bit and finally found a solution.

Firstly, though, I must say that keyboard settings are really screwed in XFCE. In Settings -> Keyboard under Layout tab you don't have too many options. You cannot change XkbOptions there and even if you do it manually in ~/.config/xfce4/xfconf/xfce-perchannel-xml/keyboard-layout.xml, it will be overwritten. So I've changed /etc/default/console-setup by adding altwin:meta_win to XKBOPTIONS (use comma as separator if there are some other option(s) already). Still, no luck.


What's the solution?

Do not care about XFCE way of handling keyboard, because it's apparently broken. Use setxkbmap directly:

setxkbmap -option altwin:meta_win

(or left_meta_win, whatever you prefer)

Now you have to check that it really solved your problem. :)

How to apply it permanently?

echo -option altwin:meta_win >>~/.Xkbmap

It can be also done for all users by writing to /etc/X11/Xkbmap instead.

How can I quickly check if altwin:meta_win or altwin:left_meta_win has been applied?

setxkbmap -print

Line with xkb_symbols should have something like altwin(meta_win).

Related Question