[Interest] Any possible workaround for QTBUG-40889 ?

Elvis Stansvik elvstone at gmail.com
Fri Jul 1 14:01:48 CEST 2016


2016-06-30 18:59 GMT+02:00 Thiago Macieira <thiago.macieira at intel.com>:
> On quinta-feira, 30 de junho de 2016 17:16:54 PDT Elvis Stansvik wrote:
>> Would it be possible to install a QAbstractNativeEventFilter and
>> somehow "fix-up" the event combination that makes the event
>> compression fail? Has anyone else been in the same boat?
>
> Yes, in combination with a non-native filter that detects when the event has
> been delivered and processed. You need to keep a state:
>
>  if event has been seen
>  and event has not been delivered
>         swallow event

I'm not actually sure I understand this approach, would be great if
you could elaborate just a little.

Also, how would I determine if an event has been "seen"? And how would
I correlate the non-native event and the native when I receive the
non-native one?

Using this code:

static inline bool isXIEvent(xcb_generic_event_t *event, int opCode)
{
    xcb_ge_generic_event_t *e = (xcb_ge_generic_event_t *)event;
    return e->extension == opCode;
}

static inline bool isXIType(xcb_generic_event_t *event, int opCode,
uint16_t type)
{
    if (!isXIEvent(event, opCode))
        return false;

    xXIGenericDeviceEvent *xiEvent =
reinterpret_cast<xXIGenericDeviceEvent *>(event);
    return xiEvent->evtype == type;
}

MotionEventFilter::MotionEventFilter(QObject *parent) : QObject(parent)
  , m_xiOpCode(0)
{
    // Query the XInput extension for its major opcode
    int xiEventBase, xiErrorBase;
    XQueryExtension(QX11Info::display(), "XInputExtension",
&m_xiOpCode, &xiEventBase, &xiErrorBase);
}

bool MotionEventFilter::nativeEventFilter(const QByteArray &eventType,
void *message, long *result)
{
    Q_UNUSED(result);

    if (eventType == "xcb_generic_event_t") {
        auto event = static_cast<xcb_generic_event_t *>(message);

        switch (event->response_type & ~0x80) {
        case XCB_MOTION_NOTIFY: {
            std::cout << "XCB_MOTION_NOTIFY" << std::endl;
            break;
        }
        case XCB_GE_GENERIC: {
            if (isXIType(event, m_xiOpCode, XI_Motion))
                std::cout << "XI_Motion" << std::endl;
            break;
        }
        default:
            break;
        }
    }
    return false;
}

I've been able to determine that the XCB_GE_GENERIC events I'm getting
are actually XI_Motion events from the XInput2 extension: The above
prints:

XI_Motion
XI_Motion
...

when I move the mouse.

But I'm not seeing the symptom described in that bugfix commit
message, which says:

"The current version of the mouse motion event compression
algorithm does not work with certain configurations -
situations where we get one XCB_GE_GENERIC event between
every XCB_MOTION_NOTIFY event."

So I'm now unsure if this is really the bug I'm seeing, or if
something else is causing event compression to fail.

If I'm going to compress events on my own, wouldn't I need to maintain
my own event queue like Qt does? Or is there an API to inspect the Qt
event queue?

Elvis

>
> --
> Thiago Macieira - thiago.macieira (AT) intel.com
>   Software Architect - Intel Open Source Technology Center
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest



More information about the Interest mailing list