LINUX.ORG.RU

Я, X11 и select


0

0

Есть 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;
}
★★

поменял местами блок while (XPending(dpy)) { и select

заработала как надо. хм, понял в чем дело.

wieker ★★
() автор топика

Если я правильно помню, Xlib буферизует вывод x11-сообщений. И вполне возможно, что пока не будет вызван XPending, Xlib не пошлет свои сообщения, и соответственно X11-сервер не будет знать, что ему что-то надо послать.

dmitry_vk ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.