Das Bizarre ist, dass mittels printf-Debugging klar wird, dass der Inhalt des XPending-Loops nicht ausgeführt wird. Aber wenn ich den Loop auskommentiere, funktioniert das Setzen des Titels des RootWindows nicht mehr...
printf-Debugging:
Code: Alles auswählen
Before XPending.
After XPending.
Before select.
After select.
Before continue.
Before XPending.
After XPending.
Before select.
After select.
Before continue.
Before XPending.
After XPending.
Before select.
After select.
Before read.
After read.
Before XStoreName.
After XStoreName.
Before XPending.
After XPending.
Before select.
After select.
Before read.
After read.
Before XStoreName.
After XStoreName.
Before XPending.
After XPending.
Before select.
After select.
Before read.
After read.
Before XStoreName.
After XStoreName.
Before XPending.
After XPending.
Before select.
After select.
Before read.
After read.
Before XStoreName.
After XStoreName.
Before XPending.
After XPending.
Before select.
After select.
Before read.
After read.
Before XStoreName.
After XStoreName.
Before XPending.
After XPending.
Before select.
After select.
Before continue.
Before XPending.
After XPending.
Before select.
After select.
Before continue.
Before XPending.
After XPending.
Before select.
After select.
Before error.
select: Interrupted system call
After error.
Before end.
After end.
Der printf-Debugging-Code:
Code: Alles auswählen
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <X11/Xlib.h>
/* BEGIN: user configuration */
static const char program_name[] = "myxd";
/* static const char fifo[] = "/tmp/dwmblocks_fifo_intern"; */
static const char fifo[] = "/home/user/fifo";
/* END: user configuration */
static int finish;
static void
term_hdl (int signum)
{
/* if we do not use signum, gcc complains */
if (signum == SIGTERM) {
finish = 1;
}
}
int
main(void)
{
static char *display_name = NULL;
static char name[BUFSIZ];
static int fd;
static int rc;
static int screen;
static int state = EXIT_SUCCESS;
static Window root;
static Display *dpy;
static struct sigaction term_act;
static struct timeval tv;
static XEvent ev;
fd_set rfds; /* fixed size buffer */
memset(&term_act, 0, sizeof(term_act));
term_act.sa_handler = term_hdl;
if (sigaction(SIGTERM, &term_act, NULL) < 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
dpy = XOpenDisplay(display_name);
if (dpy == NULL) {
fprintf(stderr, "%s: unable to open display '%s'\n",
program_name, XDisplayName(display_name));
exit(EXIT_FAILURE);
}
root = RootWindow(dpy, screen);
fd = open(fifo, O_RDWR | O_NONBLOCK);
if (fd == -1) {
perror("open");
XCloseDisplay(dpy);
exit(EXIT_FAILURE);
}
while (finish == 0) {
printf("Before XPending.\n");
while (XPending(dpy)) {
printf("Before XNextEvent.\n");
XNextEvent(dpy, &ev);
printf("After XNextEvent.\n");
}
printf("After XPending.\n");
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
printf("Before select.\n");
rc = select(fd + 1, &rfds, NULL, NULL, &tv);
printf("After select.\n");
if (rc > 0) { /* success */
memset(name, 0, sizeof(name));
printf("Before read.\n");
ssize_t got = read(fd, name, sizeof(name)-sizeof(char));
printf("After read.\n");
if (got < 0) {
perror("read");
state = EXIT_FAILURE;
break;
} else if (got == 0) {
printf("EOF\\n");
break;
} else {
/* remove trailing newline */
if ((*name) && (name[strlen(name)-1] == '\n')) {
name[strlen(name)-1] = '\0';
}
printf("Before XStoreName.\n");
XStoreName(dpy, root, name);
printf("After XStoreName.\n");
}
} else if (rc == 0) { /* timeout expired */
printf("Before continue.\n");
continue;
printf("After continue.\n");
} else { /* error */
printf("Before error.\n");
perror("select");
state = EXIT_FAILURE;
printf("After error.\n");
break;
}
}
printf("Before end.\n");
close(fd);
XCloseDisplay(dpy);
printf("After end.\n");
exit(state);
}