Я подписываюсь на события и получаю некоторый код нажатия клавиши в любом окне. Но мне нужно получить сам символ — букву или цифру, в зависимости от раскладки клавиатуры. И я не знаю, как это сделать в моем случае. Мне сказали использовать метод (Xutf8LookupString)
но для этого метода требуется структура XIC.
Как я могу использовать эту структуру в своем коде, если я не могу привязаться к определенному окну, мне нужно получать ввод из любого окна. Подскажите пожалуйста, как это сделать?
Вот мой код, который работает и возвращает мне код ключа, подскажите пожалуйста, как можно добавить использование функции Xutf8LookupString?
Код: Выделить всё
#include
#include
#include
#include
#include
void key_pressed_cb(XPointer arg, XRecordInterceptData *d);
int scan(int verbose) {
XRecordRange* rr;
XRecordClientSpec rcs;
XRecordContext rc;
Display *dpy = XOpenDisplay(NULL);
rr = XRecordAllocRange();
rr->device_events.first = KeyPress;
rr->device_events.last = ButtonReleaseMask;
rcs = XRecordAllClients;
rc = XRecordCreateContext (dpy, 0, &rcs, 1, &rr, 1);
XFree (rr);
XRecordEnableContext(dpy, rc, key_pressed_cb, NULL);
}
void key_pressed_cb(XPointer arg, XRecordInterceptData *d) {
if (d->category != XRecordFromServer)
return;
int key = ((unsigned char*) d->data)[1];
int type = ((unsigned char*) d->data)[0] & 0x7F;
int repeat = d->data[2] & 1;
if(!repeat) {
switch (type) {
case KeyPress:
printf("key press %d\n", key);
break;
case KeyRelease:
printf("key release %d\n", key);
break;
case ButtonPress:
printf("button press %d\n", key);
break;
case ButtonRelease:
printf("button release %d\n", key);
break;
default:
break;
}
}
XRecordFreeData (d);
}
int main() {
scan(True);
std::this_thread::sleep_for(std::chrono::seconds(3600));
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... all-window