Qt: контролировать событие щелчка глобального курсора с X11?
Я хочу захватить глобальное событие щелчка мыши в X11, сейчас
Я попытался установить фильтр x11event, но он не работает глобально.
class XApplication: public QApplication
{
public:
XApplication (int & argc, char **argv):
QApplication (argc , argv)
{
}
protected:
bool x11EventFilter (XEvent *e)
{
qDebug() << "X11 Event: " << e->type;
return QApplication::x11EventFilter(e);
}
};
ОБНОВИТЬ
Я имею в виду за окном, код выше работает, когда я нажимаю на окно.
1 ответ
Вы можете запросить информацию X11 из Qt, используя класс QX11Info. Смотрите его документацию. Тогда вы можете использовать сырой Xlib из него.
Ты можешь использовать XGrabPointer()
, Если вы используете его, другие приложения не будут получать события указателя, пока он захвачен. man XGrabPointer
поможет вам.
"Нормальный" способ подписки на события заключается в использовании XSelectInput()
в окне, но проблема в том, что вам придется вызывать XSelectInput для каждого существующего окна. Смотрите его справочную страницу...
Я знаю, что расширение xxf86dga имеет несколько вызовов, связанных с мышью, но я не уверен, что они делают.
XQueryPointer()
это еще один способ запроса состояния указателя без кражи событий из других окон.
Единственное другое место, о котором я могу подумать, - это расширение XInput, но я не уверен, что оно вам тоже поможет.
Увидеть xev
исходный код для хорошей справки по обработке событий X11: http://cgit.freedesktop.org/xorg/app/xev
Пример кода с использованием XGrabPointer:
#include <stdio.h>
#include <assert.h>
#include <X11/Xlib.h>
int main(void)
{
Display *d;
Window root;
d = XOpenDisplay(NULL);
assert(d);
root = DefaultRootWindow(d);
XGrabPointer(d, root, False, ButtonPressMask | ButtonReleaseMask |
PointerMotionMask, GrabModeAsync, GrabModeAsync, None,
None, CurrentTime);
XEvent ev;
while (1) {
XNextEvent(d, &ev);
switch (ev.type) {
case ButtonPress:
printf("Button press event!\n");
break;
case ButtonRelease:
printf("Button release event!\n");
break;
case MotionNotify:
printf("Motion notify event!\n");
break;
default:
printf("Unknown event...\n");
}
}
XCloseDisplay(d);
return 0;
}
Скомпилировано с использованием: gcc x11mouse.c -o x11mouse -lX11