阻断的Xorg应用的特定输入装置中,仅使用xcb_wait_for_event

问题描述 投票:0回答:1

有Qt中的错误,其中多个触摸屏引起的Qt为处于不一致的状态。更多关于这个问题here

作为短期补丁,我使用事件过滤器(其Qt提供XCB事件),以防止多个设备从在一个时间被Qt被处理。

这些步骤将被作为跟随。

  1. 为输入事件的序列开始(鼠标按钮按下,触摸按等)。
  2. 阻止所有其他活动不属于当前设备被使用的设备。
  3. 当完成事件序列,恢复事件的所有设备中,在步骤1开始回。

实际上,我想门的事件,以便只有一个设备可以同时使用。我希望这得到各地Qt的错误的。

首先,我想只筛选硬编码的设备事件,看看这甚至围绕Qt的错误得到,但事实并非如此。

class DuplicateHardwareEventFilter : public QAbstractNativeEventFilter
{
public:
    DuplicateHardwareEventFilter() {}
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override
    {
        if (eventType == "xcb_generic_event_t") {
            xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message);
            uint responseType = ev->response_type & ~0x80;

            if(responseType == XCB_GE_GENERIC) {
                xcb_ge_event_t* gev = reinterpret_cast<xcb_ge_event_t*>(ev);

                // assume input event
                xcb_input_button_press_event_t* xiEvent = reinterpret_cast<xcb_input_button_press_event_t*>(ev);

                if(xiEvent->event_type == XCB_INPUT_DEVICE_CHANGED) {
                    auto inputChangedEvent = reinterpret_cast<xcb_input_device_changed_event_t *>(gev);
                    if(inputChangedEvent->sourceid == 11) {
                        return true;
                    }
                    qDebug("xcb device changed: %d source: %d", xiEvent->deviceid, inputChangedEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_MOTION) {
                    auto inputMotionEvent = reinterpret_cast<xcb_input_motion_event_t*>(gev);
                    if(inputMotionEvent->sourceid == 11) {
                        return true;
                    }
                    qDebug("xcb motion: %d source: %d", inputMotionEvent->deviceid, inputMotionEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_ENTER) {
                    auto inputEnterEvent = reinterpret_cast<xcb_input_enter_event_t*>(gev);
                    if(inputEnterEvent->sourceid == 11) {
                        return true;
                    }
                    qDebug("xcb enter: %d source: %d", inputEnterEvent->deviceid, inputEnterEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_LEAVE) {
                    auto inputLeaveEvent = reinterpret_cast<xcb_input_leave_event_t*>(gev);
                    qDebug("xcb leave: %d source: %d", inputLeaveEvent->deviceid, inputLeaveEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_BUTTON_PRESS) {
                    auto buttonPressEvent = reinterpret_cast<xcb_input_button_press_event_t*>(gev);
                    qDebug("xcb buttonPress: %d source: %d", buttonPressEvent->deviceid, buttonPressEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_BUTTON_RELEASE) {
                    auto buttonReleaseEvent = reinterpret_cast<xcb_input_button_release_event_t*>(gev);
                    qDebug("xcb buttonRelease: %d source: %d", buttonReleaseEvent->deviceid, buttonReleaseEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_TOUCH_BEGIN) {
                    auto touchBeginEvent = reinterpret_cast<xcb_input_touch_begin_event_t*>(gev);
                    if(touchBeginEvent->sourceid == 11) {
                        return true;
                    }
                    qDebug("xcb touchBegin: %d source: %d", touchBeginEvent->deviceid, touchBeginEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_TOUCH_UPDATE) {
                    auto touchUpdateEvent = reinterpret_cast<xcb_input_touch_update_event_t*>(gev);
                    if(touchUpdateEvent->sourceid == 11) {
                        return true;
                    }
                    qDebug("xcb touchUpdate: %d source: %d", touchUpdateEvent->deviceid, touchUpdateEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_TOUCH_END) {
                    auto touchEndEvent = reinterpret_cast<xcb_input_touch_end_event_t*>(gev);
                    if(touchEndEvent->sourceid == 11) {
                        return true;
                    }
                    qDebug("touchEnd: %d source: %d", touchEndEvent->deviceid, touchEndEvent->sourceid);
                    return false;
                }

                if(xiEvent->event_type == XCB_INPUT_PROPERTY) {
                    auto propertyEvent = reinterpret_cast<xcb_input_property_event_t*>(gev);
                    qDebug("property: %d", propertyEvent->deviceid);
                    return false;
                }

                return false;
            }
        }
        return false;
    }
};

Qt的仍然得到的到它的古怪状态。

如何完全禁止的设备,与xcb_wait_for_event的事件过滤?

qt event-handling xorg input-devices
1个回答
1
投票

我不掌握你的问题正是在这里,我不掌握不一致的状态做什么,但这里绝对是一个可能的途径,如果你绝望。

对于韦兰,我想创建一个能够与我的触摸屏,像autohotkeyxdotools接口的API。使用Linux内核的uinput,我取得了显着成效,与设备接口,并让它发出命令,真正保证其效果是多么容易获得工作。只要看看这里:

https://www.kernel.org/doc/html/v4.12/input/uinput.html

绝对值得建立一个API,甚至虚拟设备驱动程序。

© www.soinside.com 2019 - 2024. All rights reserved.