Fwd: [kdelibs/frameworks] tier1/kidletime/src: Port the native event filtering to XCB, to fix compilation with Qt5.

David Faure faure at kde.org
Thu Jul 26 11:51:39 UTC 2012


On Wednesday 25 July 2012 17:10:57 Fredrik Höglund wrote:
> They use the freedesktop bugzilla, and there's also an xcb mailinglist
> there.

Actually the bug has been reported to the freedesktop bugzilla 3 years ago...
https://bugs.freedesktop.org/show_bug.cgi?id=23403
I added a comment.

The good thing is that it includes a workaround, so I'll use that for now.

Hmm, but that only fixes one issue, not the other one:

    // Workaround for https://bugs.freedesktop.org/show_bug.cgi?id=23403
#define xcb_sync_systemcounter_name(sc) (((char *) &(sc)->name_len) + 2)

    xcb_sync_list_system_counters_cookie_t cookie = xcb_sync_list_system_counters(m_xcb_connection);
    xcb_sync_list_system_counters_reply_t* reply = xcb_sync_list_system_counters_reply(m_xcb_connection, cookie, NULL);
    int xcbcounters = xcb_sync_list_system_counters_counters_length(reply);
    xcb_sync_systemcounter_iterator_t it = xcb_sync_list_system_counters_counters_iterator(reply);
    for (int i = 0; i < xcbcounters; ++i) {
        qDebug() << it.data->counter << it.rem << it.index;
        qDebug() << "name length" << xcb_sync_systemcounter_name_length(it.data);
        QByteArray name(xcb_sync_systemcounter_name(it.data), xcb_sync_systemcounter_name_length(it.data));
        qDebug() << name;
        xcb_sync_systemcounter_next(&it);
    }
    delete reply;

outputs

kidletime_example(12226)/default XSyncBasedPoller::XSyncBasedPoller: 345 2 32 
kidletime_example(12226)/default XSyncBasedPoller::XSyncBasedPoller: name length 10 
kidletime_example(12226)/default XSyncBasedPoller::XSyncBasedPoller: "SERVERTIME" 
kidletime_example(12226)/default XSyncBasedPoller::XSyncBasedPoller: 0 1 26 
kidletime_example(12226)/default XSyncBasedPoller::XSyncBasedPoller: name length 17481 
kidletime_example(12226)/default XSyncBasedPoller::XSyncBasedPoller: "LETIME_TONS_OF_GARBAGE_HERE"
(This should have been IDLETIME instead, according to the old X11 based code)

The name length for the second entry is bogus (it says 17481 bytes!).
Am I using the iterator wrongly?

I tried the code from the attachment of the above bug report, but
    for (iter = xcb_sync_list_system_counters_counters_iterator(reply) ;
         iter.rem ; xcb_sync_systemcounter_next(&iter)) {
      ...
   }
only goes once into the loop, i.e. it prints "SERVERTIME" but not "IDLETIME".

[If only this xcb stuff was documented.... but generating code including empty
doxygen comments gives a pretty crappy result in the end, documentation-wise]

> > Also, the alarms don't trigger, so I wonder if this is another bug in xcb,
> > or if my port (which mixes the use of XCB and X11) is faulty...
> 
> The only thing I can think of is that it may be necessary to call XFlush()
> after making Xlib calls.  The output buffer is automatically flushed when
> XNextEvent() is called, but since Qt is using xcb to handle events it
> never calls that function.  So it is quite possible that the requests to
> set the alarms are just sitting in the queue.

Wow, you're good! (Not that I had a doubt).
This fixed the issue. Thanks!

This leads me to wonder: is there any reason for actually porting the remaining
X11 code to XCB? I ported the event handling because Qt5 forces us to use XCB events, but
I could just keep XSyncListSystemCounters and XSyncCreateAlarm, XSyncChangeAlarm,
and be done with this? Or is that suboptimal?

> The if (event->response_type == ...) should probably also be
> if (XCB_EVENT_RESPONSE_TYPE(event->response_type) == ...),
> but I don't think that's the problem in this case.

No, in the initial test ("move the mouse now"), I got a response_type of 118, which
is the expected value, so that part worked already.

-- 
David Faure, faure at kde.org, http://www.davidfaure.fr
Sponsored by Nokia to work on KDE, incl. KDE Frameworks 5



More information about the Kde-frameworks-devel mailing list