Need xcb/xkb help for severe kglobalaccel_x11 issue

David Faure faure at kde.org
Sat Jan 30 17:32:32 GMT 2021


For years, I've noticed that when resuming a laptop from sleep, kglobalaccel and X11 
use 100% CPU for a few minutes, making everything crawl for a while.

I finally debugged why: kglobalaccel grabs and ungrabs all global shortcuts many many times in a row.

KGlobalAccelImpl::nativeEventFilter event->response_type= 85 xkbEvent= 1 calling x11MappingNotify()
KGlobalAccelImpl::x11MappingNotify Got XMappingNotify event
KGlobalAccelInterface::ungrabKeys 
KGlobalAccelInterface::grabKeys 
KGlobalAccelImpl::nativeEventFilter event->response_type= 85 xkbEvent= 1 calling x11MappingNotify()
KGlobalAccelImpl::x11MappingNotify Got XMappingNotify event
KGlobalAccelInterface::ungrabKeys 
KGlobalAccelInterface::grabKeys 
and so on, and so on...

The reason why x11MappingNotify() does ungrabKeys+grabKeys is apparently "Maybe the X modifier map has been changed."
... which is not the case at all...

What's an XCB_XKB_MAP_NOTIFY anyway?  http://manpages.ubuntu.com/manpages/xenial/en/man3/xcb_xkb_map_notify_event_t.3.html
is very much incomplete...

Is it event really such an event that we're getting?
The code says

    } else if (m_xkb_first_event && responseType == m_xkb_first_event) {
        const uint8_t xkbEvent = event->pad0;
        switch (xkbEvent) {
            case XCB_XKB_MAP_NOTIFY:
                qDebug() << "event->response_type=" << event->response_type << "xkbEvent=" << xkbEvent << "calling x11MappingNotify()";
                x11MappingNotify();
                break;

What sense does it make that this code is checking pad0, which looks like some padding member? To avoid a downcast to a more specific event type maybe?

I'm not sure:
* if we're really getting a stream of XCB_XKB_MAP_NOTIFY events or if this code misunderstands that
* if so, why is X11 sending such a high number of those
* why the code reacts the same to XCB_XKB_MAP_NOTIFY and to XCB_MAPPING_NOTIFY, isn't one enough?

Without outside help I guess I would just compress those events using a timer, but that would be a "fix without really understanding the code", never good.

I just noticed https://phabricator.kde.org/D16434 so CC'ing Fabian :)
                
-- 
David Faure, faure at kde.org, http://www.davidfaure.fr
Working on KDE Frameworks 5





More information about the Kde-frameworks-devel mailing list