вторник, 6 декабря 2011 г.

Блокировка клавиатуры в linux/X11

Частенько дочка любит "поклацать" по клавиатуре домашнего компа, пока за ним сидят папа или мама. Оно то понятно - ребенок хочет принять участие в процессе.. Но часто эти "игры" попадают на моменты, когда нужно спокойно изучить парочку страничек, открытых в браузере, а отвлечь ребенка некому или некогда.

Чтобы решить эту проблему, я решил реализовать временную блокировку ввода с клавиатуры (до мышки она еще не дотягивается) по нажатию комбинации клавиш. Исходник получился несложным
#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)
  • И нужно добавить индикацию "залоченности" клавиатуры на экран.

Комментариев нет:

Отправить комментарий