Чтобы решить эту проблему, я решил реализовать временную блокировку ввода с клавиатуры (до мышки она еще не дотягивается) по нажатию комбинации клавиш. Исходник получился несложным
#include <X11/Xlib.h> #include <X11/keysym.h> #include <stdio.h> #include <unistd.h> int main(int argc, char* argv[]) { Display *dpy; XEvent ev; KeySym *keysym; int i; dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Unable to open display\n"); return 1; } for (i = 0; i<5; i++) { if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), False, GrabModeAsync, GrabModeAsync, CurrentTime) != 0) { if (i == 4) { fprintf(stderr, "Failed to grab keyboard after 5 attepts\n"); XCloseDisplay(dpy); return 1; } usleep(500000); } else { break; } } while (1) { XNextEvent(dpy, &ev); switch(ev.type) { case KeyRelease: keysym = XGetKeyboardMapping(dpy, ev.xkey.keycode, 1, &i); if ((KeySym) *keysym == XK_Scroll_Lock) { XSync(dpy, True); XUngrabKeyboard(dpy, CurrentTime); XCloseDisplay(dpy); return 0; } } } }Полный архив с исходником можно забрать тут
P.S. в процессе использования всплыли пара багов:
- Если не разлочить клавиатуру перед блокировкой экрана в gnome-screensaver, то обратно зайти не удастся. Скринсейвер долго думает а потом просто запускает заставку обратно.
- При залоченной клавиатуре перестают работать многие вещи, использующие XGrabKeyboard для своих нужд (в частности перемещение окон, меню во многих тулкитах, etc)
- И нужно добавить индикацию "залоченности" клавиатуры на экран.
Комментариев нет:
Отправить комментарий