[Xcb] problem with xcb_poll_for_reply (or xcb_wait_for_reply)

Vincent Torri vtorri at univ-evry.fr
Tue Aug 5 09:56:34 PDT 2008


I'm trying to implement xcb replies in ecore in a more fashion way, using 
xcb_poll_for_reply or xcb_wait_for_reply. But I have some problems.

First, let me explain how I manage events. It's almost the same:

The ecore main loop is using select to examine the file descriptor 
associated to an X connection. Ecore allows to check the file descriptor: 
if it receive data to the filedescriptor, a callback is called.

For the events, it's easy and it is working: when an X event is sent, the 
callback is called and we manage the event corresponding to what we have. 
The code for that callback is roughly:

/* c is the xcb_connection_t */

while ((ev = xcb_poll_for_event(c))) {
    uint8_t response_type = ev->response_type & ~0x80;

    if (response_type < _ecore_xcb_event_handlers_num)
         /* we manage the event */
 	if (_ecore_xcb_event_handlers[response_type])
 	  _ecore_xcb_event_handlers[response_type] (ev);

I want to do something similar to that but for the replies. I tried 
several things.

1) First, I tried to add another callback to check the file descriptor. I 
used the poll version, with a test program (it was using 
xcb_get_geometry_unchecked() ). All the cookies are stored into a list. I 
read them with _ecore_xcb_cookie_next(). The callback was indeed called 
(that is, something arrived to the file descriptor. I manage that with the 
following code in the callback:

while ((cookie = _ecore_xcb_cookie_next()))
     if (xcb_poll_for_reply(c, cookie, &reply, NULL))

handle_reply() just prints the geometry of the window.

But xcb_poll_for_reply() returns always 0, so handle_reply() is never 

2) I replaced xcb_poll_for_reply() by xcb_wait_for_reply(). It works, but 
*only* the first time. More precisely, each time I click on the window, I 
call xcb_get_geometry_unchecked(). For the first click, I print correctly 
the geometry. But when I click the second time, xcb_wait_for_reply() hangs 
and the program is not responding anymore. I think that this behavior is 
normal, as xcb_wait_for_reply() blocks.

3) I did the same tests than above, but within the callback of the event 
(a second callback specific for replies should not be necessary as events 
and replyes goes through the file descriptor. Same problem.

I have several questions:

a) Is my assulption that using only 1 callback is correct ?

b) I think that I must use xcb_poll_for_reply() and not 
xcb_wait_for_reply(). Why isn't the code above working ?

thank you


More information about the Xcb mailing list