Холла,
В настоящее время я разрабатываю некоторые изменения в TinyWM — одно из них, которое я хотел бы реализовать, — это политика «щелчок для фокусировки».
Я понял, что мне нужно запустить XGrabButton
для дочернего элемента, поскольку он создается в событии MapNotify
, но я не могу понять, какую маску модификатора использовать, которая игнорирует все маски модификатора (это означает, что я хотел бы, чтобы щелчок фокуса произошел независимо от того, какие клавиши-модификаторы активированы).
Я столкнулся с кирпичной стеной, так как даже AnyModifier
, кажется, не работает, когда у меня не нажаты клавиши-модификаторы (и даже тогда это довольно придирчиво).
Вот соответствующий фрагмент кода:
void eMapNotify(Display *dpy, XEvent *ev){
// Ignore windows we don't care about
if (!ev.xmap.override_redirect) XSetWindowBorderWidth(dpy, ev.xmap.window, 3);
// Allows us to hook into this window's clicks to let us focus it
XGrabButton(dpy, 1, WHAT_MASK_DO_I_PUT_HERE, ev.xmap.window,
True, ButtonPressMask, GrabModeAsync, GrabModeAsync,
None, None);
}
Любые идеи?
РЕДАКТИРОВАТЬ:
Я обнаружил, что на самом деле обработчик события записывает щелчок, но щелчок не перенаправляется в дочернее окно, а это именно то поведение, которое мне нужно.
ОБНОВИТЬ
В настоящее время я реализовал функцию фокусировки с помощью следующего кода, который отслеживает указатель и фокусирует его, где бы он ни находился. На моей машине это не так дорого, как может показаться:
Window dump, child;
int rx, ry, cx, cy;
unsigned int mask;
// Get the pointer's location
XQueryPointer(dpy, root, &dump, &child, &rx, &ry, &cx, &cy, &mask);
// Focuses the pointer's current window
XSetInputFocus(dpy, dump, RevertToNone, CurrentTime);