<div dir="ltr"><div>I am trying to write a simple program that will receive mouse motion events from all windows. I found the following Xlib code and I have tested it and it works perfectly. So I did some research and tried to write an equivalent function in XCB. The Xlib code gets me events from all windows and everything works as usual (original windows still get the events as well). However, the XCB code finds all the children correctly, but only gets events from the JWM desktop and none of the other children despite finding them correctly. In addition, while the XCB code is running, the JWM desktop no longer receives those events (clicking does not activate the menu).<br>

<br></div>I can't figure out how the two are different, XSelectInput must be doing something more that I don't understand. Can anybody provide some insight?<br><div><div><br>XLib Code:<br><br>void snoop_all_windows(Window root, unsigned long type)<br>

{<br>  static int level = 0;<br>  Window parent, *children, *child2;<br>  unsigned int nchildren;<br>  int stat, i,j,k;<br><br>  level++;<br><br>  stat = XQueryTree(display, root, &root, &parent, &children, &nchildren);<br>

  if (stat == 0)<br>   {<br>     fprintf(stderr, "Can't query window tree...\n");<br>     return;<br>   }<br><br>  if (nchildren == 0)<br>    return;<br><br>  XSelectInput(display, root, type);<br><br>  for(i=0; i < nchildren; i++)<br>

   {<br>     XSelectInput(display, children[i], type);<br>     snoop_all_windows(children[i], type);<br>   }     <br><br>  XFree((char *)children);<br>}<br><br><br><br></div><div>XCB Code:<br><br>static void select_children(xcb_window_t root, uint32_t mask)<br>

{<br>    xcb_query_tree_cookie_t cookie = xcb_query_tree(conn,root);<br><br>    xcb_query_tree_reply_t *reply = xcb_query_tree_reply(conn,cookie,NULL);<br>    <br>    xcb_window_t *children = xcb_query_tree_children(reply);<br>

    <br>    value[0]=XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_BUTTON_PRESS;<br>    xcb_change_window_attributes(conn,root,XCB_CW_EVENT_MASK, value);<br><br>    int i;<br>    for (i = 0; i < xcb_query_tree_children_length(reply); i++)<br>

    {<br>        value[0]=XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_BUTTON_PRESS;<br>        xcb_change_window_attributes(conn,children[i],XCB_CW_EVENT_MASK, value);<br><br>        printf("child window = 0x%08x\n", children[i]);<br>

        select_children(children[i],0);<br>    }<br>    free(reply);<br>    <br>    return;<br>}<br><br><br></div><div>For reference, XSelectInput source: <a href="http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/SelInput.c">http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/SelInput.c</a><br>

<br></div><div>Thanks!<br></div></div></div>