Возможно ли (или как) создать механизм (в Linux X11, С++), который работает как глобальный крючок в окнах (SetWindowsHookEx())?
Я хотел бы иметь возможность поймать ключевое событие, но с возможностью дальнейшего распространения. Я пытаюсь использовать XGrabKey решение (например, xbindkeys), но когда я устанавливаю захват ключевого события, это событие "потребляется".
Требования к этому механизму следующие:
- Глобальные/общесистемные события, независимо от окна с фокусом
- Возможность "удержания" и "прохода"
- Он должен быть довольно быстрым
Пример кода выглядит следующим образом:
bool myFlagIsSet = false;
XEvent event;
while (true) {
while (XPending(display) > 0) {
usleep(SLEEP_TIME);
}
XNextEvent(display, &event);
switch (e.type) {
case KeyPress:
if (myFlagIsSet) {
//do not propagate
}
// propagate
break;
case KeyRelease:
if (myFlagIsSet) {
//do not propagate
}
// propagate
break;
}
}
В Windows я просто писал:
if(event.isConsumed()) {
return LRESULT(1);
}
//...
return CallNextHookEx(hookHandle, nCode, wParam, lParam);
Я также пытался использовать XUngrabKey и XSendEvent:
switch (event.type) {
case KeyPress:
if (myFlagIsSet) {
//do not propagate
}
// propagate
XUngrabKey(...);
XSendEvent(..., &event);
XGrabKey(...);
break;
case KeyRelease:
...
}
К сожалению XSendEvent по неизвестным причинам для меня - не отправляйте это событие, даже если строка XGrabKey прокомментирована.
Можно ли успешно завершить этот подход?
Пожалуйста, предложите другой подход, если я обречен на неудачу
ИЗМЕНИТЬ
Я хотел бы реализовать это на Ubuntu Gnome с помощью диспетчера окон Compiz