Почему не работает? [Решено]

Здравствуйте.
Скачал исходник программы evtest, которая демонстрирует глобальный перехват клавиатуры и мыши, и добавил в нее свой код.
static int print_events(int fd)
{
struct input_event ev[64];
int i, rd;

while (1) {
rd = read(fd, ev, sizeof(struct input_event) * 64);

if (rd < (int) sizeof(struct input_event)) {
printf("expected %d bytes, got %d\n", (int) sizeof(struct input_event), rd);
perror("\nevtest: error reading");
return 1;
}

for (i = 0; i < rd / sizeof(struct input_event); i++) {
            printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec);

if (ev[i].type == EV_SYN) {
if (ev[i].code == SYN_MT_REPORT)
printf("++++++++++++++ %s ++++++++++++\n", syns[ev[i].code]);
else
                    printf("-------------- %s --qqqqqq----------\n", syns[ev[i].code]);
} else {
printf("type %d (%s), code %d (%s), ",
ev[i].type,
events[ev[i].type] ? events[ev[i].type] : "?",
ev[i].code,
names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?");
if (ev[i].type == EV_MSC && (ev[i].code == MSC_RAW || ev[i].code == MSC_SCAN))
                    printf("vay7 y yylue %02x\n", ev[i].value);
                else {
printf("value %d\n", ev[i].value);}
                    if (ev[i].value==1)
if (ev[i].code==97){
if (nn==0){
nn = 1;
printf("press\n");
Display *d;
Window root;

d = XOpenDisplay(NULL);
if (d!=NULL){
printf("d != null\n");

assert(d);
root = DefaultRootWindow(d);

XEvent event;
memset(&event, 0x00, sizeof(event));

event.type = ButtonPress;
event.xbutton.button = Button1;
event.xbutton.same_screen = True;
event.xbutton.subwindow = event.xbutton.window;
while(event.xbutton.subwindow) {
XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
event.xbutton.window = event.xbutton.subwindow;
XQueryPointer(d, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
}
XSendEvent(d, PointerWindow, True, 0xfff, &event);
XCloseDisplay(d);
}
}                   
} else // code<>97
if (nn==1){
nn = 0;
printf("release\n");

Display *d;
Window root;

d = XOpenDisplay(NULL);
if (d!=NULL) {
printf("d != null\n");

assert(d);

root = DefaultRootWindow(d);

XEvent event;
memset(&event, 0x00, sizeof(event));

event.type = ButtonRelease;
event.xbutton.button = Button1;
event.xbutton.same_screen = True;
event.xbutton.subwindow = event.xbutton.window;
while (event.xbutton.subwindow) {
XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
event.xbutton.window = event.xbutton.subwindow;
XQueryPointer(d, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
}
XSendEvent(d, PointerWindow, True, 0xfff, &event);
XCloseDisplay(d);
}
}
}
}

}
}

Собираю так: gcc -o ev evtest.c -lX11
При запуске программы, выбираю опцию перехвата клавиатуры.
При нажатии на клавишу RIGHT_CONTROL левая кнопка мыши должна залипнуть. А при нажатии любой другой клавиши - отлипнуть. Но этого не происходит!
Помогите выяснить, почему.

0
Kubuntovich - 15 Октябрь, 2014 - 09:41

Нашел ошибку! Всё работает!
Тему можно удалить.

0
MacLeod - 15 Октябрь, 2014 - 10:38
Изображение пользователя MacLeod.

Да наоборот - поделились бы опытом с потомками =)

+1
Kubuntovich - 16 Октябрь, 2014 - 08:35

while (event.xbutton.subwindow) {
       XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &event.xbutton.root, event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
       event.xbutton.window = event.xbutton.subwindow;
       //XQueryPointer(d, event.xbutton.window, &event.xbutton.root, event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); //Лишняя строчка
}

Откуда-то взялась лишняя строчка. Без нее работает.

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

CAPTCHA на основе изображений
Введите цифры