Есть hellowworld для x11. Если закоментировать вызов select, он работает - печчатает коды всех набранных клавиш. Если оставить как есть - ничего не печатает. Вообще не выходит из select. Почему? Чую что-то чрезвычайно нубское не учитываю, но не могу понять. Помогите, пожалуйста.
#include <X11/Xlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
Display *dpy;
int screen;
Window root;
void xconnect()
{
dpy = XOpenDisplay( NULL );
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
int on_error(Display *dsply, XErrorEvent *ee)
{
printf("error set mask on root\n");
exit(1);
return -1;
}
XSetErrorHandler(on_error);
//XSelectInput(dpy, root, SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask | StructureNotifyMask | ButtonPressMask | ButtonReleaseMask);
//XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime);
XGrabKey(dpy, AnyKey, AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
}
void keypress(XKeyEvent* event)
{
printf("key: %d\n", event->keycode);
}
void buttonpress(XButtonEvent* event)
{
printf("key: %d\n", event->button);
}
void mapnotify(XEvent* event)
{
printf("here");
}
void main_loop()
{
fd_set fds;
XEvent evt;
int fd;
fd = XConnectionNumber(dpy);
while (1) {
FD_ZERO(&fds);
FD_SET(fd, &fds);
if (select(fd + 1, &fds, NULL, NULL, NULL) == -1)
printf("failed\n");
while (XPending(dpy)) {
XNextEvent(dpy, &evt);
switch (evt.type) {
case MapNotify: {
mapnotify(&evt);
break;
}
case KeyPress: {
keypress(&evt);
break;
}
}
}
}
}
int main(int argc, char** argv)
{
printf("%s\n", argv[0]);
xconnect();
main_loop();
return 0;
}