Linux X11 - Global Keyboard Hook

Возможно ли (или как) создать механизм (в Linux X11, C ++), который работает как глобальный перехватчик в Windows (SetWindowsHookEx () )?

Я хотел бы иметь возможность поймать ключевое событие, но с возможностью дальнейшего распространения . Я пытаюсь использовать решение XGrabKey (например, xbindkeys ), но когда я устанавливаю захват ключевого события, это событие «потребляется».

Требования для этого механизма: следующее:

  1. Глобальные / общесистемные - перехват событий вне зависимости от окна, в котором находится фокус.
  2. Возможность «перехвата» и «перехвата-прохода»
  3. Это должно быть довольно быстро

Пример кода выглядит так:

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

27
задан Community 23 May 2017 в 12:18
поделиться