On my laptop, I tweak some keybindings and keyboard preferences with xmodmap and xset. When I plug an external USB keyboard, the configuration for that new keyboard is the default, i.e., without my tweaks. If I xmodmap and xset again, then these preferences are applied to the newly plugged keyboard too, but on pluging/unpluging, they are again reseted to the default. Note that the pluging/unpluging never affects the configuration of the laptop keyboard, which stay tuned during the whole process.

Question: How can I have one xmodmap and xset preference set, which applies to any keyboard (plugged now and in the future).

Configuration: Arch Linux on 3.1.1 kernel, Xorg 1.11.2 with no homemade configuration, window manager: awesome 3.4.11, no kde or gnome stuff



3 Answers 3


@Patkos Csaba: It changed: now the default is that you don't have to configure anything at all and it works automagically. In a certain way, adding setxkbmap to .xinitrc became way easier than changing the server configuration.

Nowadays you can plug an USB keyboard or mouse and have X11 add it and recognize it, no need to rely on /dev/mice or something like that.

Now I've experienced the issue and, IMHO, the perfect solution would be some way to tell Xorg to inherit the new keyboard settings from the currently connected keyboard or to tell setxkbmap to set the options as the server default for current and future keyboards.

So far, I did not find any way to do so. The only way to avoid running setxkbmap/xmodmap again is to edit the default settings employed by hald when configuring new devices, see the freebsd documentation, §6.4.2 (some paragraphs below the section header, has two examples of setting keyboard defaults). See also "option 2" at Klaas Teschauer's tutorial on the hal migration. There's also a question on Stackoverflow with links about triggering a script on hardware additions, if you prefer to do it that way.


I managed to solve this problem by using Xorg configuration files generated with localectl. I use a dvorak/qwerty layout with capslock as an extra control key. I previously had this in my .xinitrc:

setxkbmap -layout us,us -variant dvorak, \
-option 'grp:alt_space_toggle' \
-option 'grp_led:caps' \
-option 'ctrl:nocaps'

To get the equivalent setup in an Xorg configuration file, I used

sudo localectl set-x11-keymap us,us "" dvorak, 'grp:alt_space_toggle,grp_led:caps,ctrl:nocaps'

which gets stored in the file /etc/X11/xorg.conf.d/00-keyboard.conf.

From the archwiki keyboard configuration page:

For convenience, the tool localectl may be used instead of manually editing X configuration files. It will save the configuration in /etc/X11/xorg.conf.d/00-keyboard.conf, this file should not be manually edited, because localectl will overwrite the changes on next start.

The usage is as follows:

  $ localectl set-x11-keymap layout [model] [variant] [options]

I never used it, but 'usbd' seems to be what you are looking for. According to it's documentation it watches usb ports and executes user commands on specific changes.

Here is the man page.

  • The main point of my question is that the device-specific xmodmap and xset properties is probably a feature. Xorg tracks back which device is triggered, and acts accordingly. I have the feeling that this can be disabled; I didn't plan to add more mechanisms --- though of course, if no better answer is given, yours will be chosen.
    – Michaël
    Commented Jan 14, 2012 at 18:11
  • I do not know about X.org monitoring input devices. Maybe something changed in the past couple of years since I used multiple keyboards, but as far as I know X.org knows what you have connected when it starts. After that you need some mechanism to notify it. Of course, you could just put an icon on the desktop or assign a shortcut to run those commands. Commented Jan 15, 2012 at 9:55

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .