For some reason I’ve a notebook with a Swedish keyboard but when docked I use my ergonomic keyboard with a German layout. To automatically switch the layout when the external keyboard is connected, I cooked up this script and added a .desktop file to $HOME/.config/autostart:
#!/usr/bin/env python from gi.repository import Gtk, GLib, Gkbd import usb import sys # Holtek Semiconductor, Inc. PS/2 keyboard + mouse controller vendor=0x04d9 product=0x1400 c = Gkbd.Configuration.get(); try: # find index for german de = c.get_short_group_names().index('de') for bus in usb.busses(): for dev in bus.devices: if dev.idVendor == vendor and dev.idProduct == product: c.lock_group (de) sys.exit(0) except Exception, e: print e pass |
This is using pyusb 0.4, it gets a bit easier with 1.0.
Make it hotpluggable!
http://git.gnome.org/browse/gnome-settings-daemon/tree/plugins/common/input-device-example.sh
Pingback: Modifying your GNOME keymap programmatically | The adventures … | Linux Blog
Oh, that’s neat. Thanks for the hint!
Hello,
Do you know that in the latest xorg you can have a separate layout for each keyboard? Gnome doesn’t allow to configure them separately, but you can easily in a script:
setxkbmap -device $id $LAYOUT
Where $id is the device id as returned by “xinput –list”, and $LAYOUT is the language layout name (eg, “de”). I have a dutch USB keyboard which I use with my laptop which has a US layout, and that works fine
Is the xinput id stable between reboots?
> Is the xinput id stable between reboots?
Absolutely not. But the device ID as well as the device name is passed to the script I mentioned earlier.
Thought so. The hotplug solution looks a bit more reliable to me.
Unfortunately the hotplug solution doesn’t work. I’ve just tried, the main problem is that it’s called only for a mouse or a touchpad event. (The keyboard plugin doesn’t know about anything about run_custom_command()).
Moreover arguments sent are a bit messed up (eg: “-i 5″ is just one argument containing a space, and not 2 as you’d expect), which makes them harder to parse.
Looks a nice idea though… for once that gnome allows such high level of configuration! I’m going to report some bugs in bugzilla….