Возможно ли (или как) создать механизм (в Linux X11, C ++), который работает как глобальный перехватчик в Windows (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 Window Manager