Нашел причину. Хоткеи захватываются только когда модификаторы вида *Lock потушены. Т.к. у меня был включен NumLock, они и не работали.
Идея проверить эти модификаторы появилась, когда вспомнил, что в конфиге xbindkeys можно включить/отключить их влияние на обработку хоткеев. А в самой программе граббинг осуществляется вот таким образом:
static void
my_grab_button (Display * dpy, unsigned int button, unsigned int modifier,
Window win)
{
modifier &= ~(numlock_mask | capslock_mask | scrolllock_mask);
XGrabButton (dpy, button, modifier, (win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (modifier == AnyModifier)
return;
if (numlock_mask)
XGrabButton (dpy, button, modifier | numlock_mask,
(win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (capslock_mask)
XGrabButton (dpy, button, modifier | capslock_mask,
(win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (scrolllock_mask)
XGrabButton (dpy, button, modifier | scrolllock_mask,
(win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (numlock_mask && capslock_mask)
XGrabButton (dpy, button, modifier | numlock_mask | capslock_mask,
(win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (numlock_mask && scrolllock_mask)
XGrabButton (dpy, button, modifier | numlock_mask | scrolllock_mask,
(win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (capslock_mask && scrolllock_mask)
XGrabButton (dpy, button, modifier | capslock_mask | scrolllock_mask,
(win ? win : DefaultRootWindow (dpy)),
False, ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None);
if (numlock_mask && capslock_mask && scrolllock_mask)
XGrabButton (dpy, button,
modifier | numlock_mask | capslock_mask | scrolllock_mask,
(win ? win : DefaultRootWindow (dpy)), False,
ButtonPressMask | ButtonReleaseMask, GrabModeAsync,
GrabModeAsync, None, None);
}