[Xcb] _XRegisterInternalConnection()
Russell Shaw
rjshaw at netspace.net.au
Mon May 11 21:12:14 PDT 2009
Hi,
I want to monitor the stdin file descriptor so that a callback
function is called, whilest select() is waiting on the X file descriptor.
It seems to no longer work. The old code in
libx11-1.2.1/src/XlibInt.c: _XWaitForReadable(Display *dpy) does:
...
result = Select(highest_fd + 1, &r_mask, NULL, NULL, NULL);
...
for (ilist=dpy->im_fd_info, i=1; ilist; ilist=ilist->next, i++) {
if (FD_ISSET(ilist->fd, &r_mask)) {
_XProcessInternalConnection(dpy, ilist); <<< what i want
did_proc_conni = True;
}
}
...
The new code in libx11-1.2.1/src/xcb_io.c: _XReadEvents(Display *dpy) gets
stuck in xcb_conn.c: select(), where it does not monitor file descriptors
in dpy->im_fd_info provided by _XRegisterInternalConnection():
void _XReadEvents(Display *dpy)
{
if(dpy->flags & XlibDisplayIOError)
return;
_XSend(dpy, NULL, 0);
if(dpy->xcb->event_owner != XlibOwnsEventQueue)
return;
check_internal_connections(dpy); <<< should be called in
process_responses() below
do {
process_responses(dpy, 1, NULL, 0); <<< stuck in xcb_conn.c: select()
} while (dpy->qlen == 0);
}
Here's a test case that doesn't work. Every time you press <return> on the
command line while the prog is running (stdin), "fd: 0" should be printed:
#include<X11/Xlibint.h>
#include<X11/Xlib.h>
#include<X11/XKBlib.h>
#include<assert.h>
#include<stdio.h>
static void
cmdproc(Display *display, int fd, XPointer xdata)
{
printf("fd: %d\n", fd);
}
int
main(int argc, char **argv)
{
Display *display = XOpenDisplay(NULL);
assert(display);
// XSynchronize(display, 1);
Status res = _XRegisterInternalConnection(display, 0, cmdproc, NULL);
assert(res);
XEvent event;
while(1) {
XNextEvent(display, &event);
}
return 0;
}
More information about the Xcb
mailing list