Xlib — игнорировать ключи-модификаторы в XGrab*

Холла,

В настоящее время я разрабатываю некоторые изменения в 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); 

person new123456    schedule 17.03.2011    source источник


Ответы (1)


Маска будет 0 без модификаторов.

person geekosaur    schedule 17.03.2011
comment
Никаких кубиков, использование 0 требует от меня использования клавиши-модификатора и нажатия кнопки, чтобы активировать обратный вызов. - person new123456; 17.03.2011
comment
Звучит довольно надломленно; в частности, AnyModifier также должен работать без модификатора. - person geekosaur; 17.03.2011
comment
Проверьте редактирование — AnyModifier меняет способ отправки события клиенту? - person new123456; 17.03.2011
comment
Нет; вы видите нормальное поведение. Вы Grabдобавляете кнопку, вы владеете ее событиями, как только срабатывает захват. Чтобы щелчок сфокусировался с сквозной передачей, вам необходимо синтезировать событие щелчка для клиента (см. XSendEvent()). Я думаю. Все еще исследую это, чтобы сделать такой же патч для XMonad :) - person geekosaur; 17.03.2011
comment
Приятно знать, что кто-то работает над той же проблемой. Я хотя флаг owner_events гарантировал, что события будут переданы клиенту, но я, должно быть, неправильно прочитал справочную страницу. Спасибо за всю рыбу! - person new123456; 17.03.2011