Set your computer free

Menu

Xmodmap and “XKB: Couldn’t compile keymap”

A while ago when I upgraded my distribution, several keys went wonky on me and ceased functioning according to my wishes. It was a minor inconvenience to have things like the Caps Lock key become enabled again. So I pecked around at fixing it here and there, but never really put in much thought or effort until today.

I remap my keys with the /etc/X11/xinit/.Xmodmap (aka ~/.Xmodmap) file. The problem was my .Xmodmap was borking when X started, so no remappings were taking place. (If one part of .Xmodmap fails, they all fail.) In my /var/log/Xorg.0.log I found this:

And in the output from X – apparently from the keymap compiler (xkbcomp) – were repeated warnings/errors like this:

Warning: Duplicate shape name ""
Using last definition
Error: Section defined without a name
Definition ignored
Warning: Multiple doodads named ""
Using first definition

With a little googling I came across this thread which gave some insight, but was of little help in fixing the problem. This Arch Linux forum thread has several people using various remapping methods reporting the same error. The thread is marked “Solved,” however, the fixes suggested had no effect on my situation. Daedalus’ suggestion of using the “keyboard” driver did manage to provide me with more helpful error messages that pointed out line numbers. This indicated my Caps_Lock remapping was the culprit.

I quit searching on the error messages and began learning more about xmodmap. I didn’t read anything of much use, but I did come across some examples of xmodmap commands I had never used before. I have always used the ‘clear’ and ‘keycode’ commands to disable Caps_Lock and assign different functions to keys, like this:

clear Lock
keycode 66 = Tab

What I found was the use of the ‘remove’ and ‘keysym’ commands to do the same thing:

remove Lock = Caps_Lock
keysym Caps_Lock = Tab

I tried those, and voila! Problem solved.

I wish I could explain why the old method ceased to work, but I can’t. Both methods are still described in the xmodmap man page, and examples of both still exist there as well. The first thread linked above suggests broken data in keyboard-config-1.3 on X Server 1.4.2. I have keyboard-config-1.4 on X 1.4.2, however, so questions remain. Yet despite no explanation, I hope the fix alone will be helpful to others with similar problems.

Finally, here is my new .Xmodmap, which I have enhanced a bit, for those of you curious about it. Explanations for my remappings are in the comments. As for why I prefer to use the xmodmap method for keyboard mapping, there are several reasons. First, it is a single file containing all changes. Those changes universally affect all programs since it is built into the X server. That means no third-party daemon is needed. Also, .Xmodmap is really very easy to configure once you get used to the xev utility. And last, it uses the xmodmap command which I have been familiar with since I adopted Linux – because once upon a time I had to remap the buttons on my mouse in order to get “advanced functions” (read: the scroll wheel) to work. =-)

About the Linux Critic

I'm a professional troubleshooter (a.k.a. IT Guy) who has been using Linux as his main desktop OS for over a decade.

I'm more technical than the "average user" by quite a ways, but I like to think that there's no reason why Linux and Free/Open Source Software can't find a home on the average user's desktop as a part of their everyday computing life.

I love to play around with technology, and I love to talk about it, so stick around and let me know what you're thinking.

DISCLAIMER: The posts I write and publish on this blog are my own opinions and the opinions of those who contribute to The Linux Critic, and in no way reflect the opinions or official positions of my employer or any of the employers of my contributors.

All content on this blog is copyright (C) Trent Isaacson unless otherwise indicated.