xmodmap
has no notion of state, so it has no way to reset state directly. You can simulate it by using xmodmap -pke >.xmodmap.orig
before making any changes (although it doesn't save the modifier map, which you would have to save and restore manually) — but it's a bit too late for that.
Modern systems don't generally use xmodmap
to configure the keyboard, though. setxkbmap
is the modern way to do it; and that does reset bindings when run. So you may be able to use setxkbmap -layout us
to reset things to normal. More complete would be to check for the default configuration in /etc/X11/xorg.conf
. For example, on my system
jinx:718 Z$ sed -n '/Identifier.*Keyboard/,/EndSection/p' /etc/X11/xorg.conf
Identifier "Generic Keyboard"
Driver "kbd"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
Option "XkbOptions" "grp:alt_shift_toggle"
EndSection
The corresponding command is
setxkbmap -model pc105 -layout us -option grp:alt_shift_toggle
If there were an XkbVariant
entry in the output, you would pass its value with -variant
. One thing to watch out for is that options are handled specially: you can only set one option per -option
parameter, and you need to use -option ''
to reset parameters first. So to fully reset when there is something like XkbOptions "grp:alt_shift_toggle,grp:ctrls_toggle"
you would need
setxkbmap -model pc105 -layout us -option '' -option grp:alt_shift_toggle -option grp:ctrls_toggle
@i08in https://askubuntu.com/a/92235/72576 seems to do the job.
This is what I ended up with on my Debian jessie, KDE.
/etc/pm/sleep.d/20_xmodmap.sh
case "${1}" in
resume|thaw)
su $USER -c "sleep 3; /usr/bin/xmodmap /home/$USER/.Xmodmap" &
;;
esac
Note: At first it may seem to not work, but just give it a minute or so. There seems to be something with X that cuses this delay, though I haven't cared enough to check on it... See https://superuser.com/q/626769/185360 for more info.
Best Answer
It took a while to figure out, but I have an answer for this. This actually happens on all Ubuntu versions that I checked and I'm using this fix on 12.04 right now.
I have found that these mappings are not reset if you have all of your xmodmap mappings in a file that is called
~/.Xmodmap
.I had called my file
.xmodmaprc
and had exactly the behavior that you experience. After changing to the new file name, this annoying behavior went away. My guess is that Ubuntu reads mappings from this file whenever there is a new keyboard added to the system.