`Bad Value` возврат по вызову xcb_input_xi_grab_device - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь взять клавиатуру с расширением XCB XInput2. Это делается для поддержки использования виртуальных клавиатур в оконном менеджере, который я разрабатываю. Вот соответствующий код:

static const uint32_t event_mask =
XCB_INPUT_XI_EVENT_MASK_KEY_PRESS | XCB_INPUT_XI_EVENT_MASK_KEY_RELEASE;
static const uint16_t mask_len = sizeof(event_mask) / sizeof(char);
auto cookie =
    xcb_input_xi_grab_device(
        conn,
        window,
        XCB_CURRENT_TIME,
        XCB_CURSOR_NONE,
        device_id,
        XCB_INPUT_GRAB_MODE_22_SYNC,
        XCB_INPUT_GRAB_MODE_22_SYNC,
        XCB_INPUT_GRAB_OWNER_OWNER,
        mask_len,
        &event_mask);
xcb_generic_error_t *e;
xcb_input_xi_grab_device_reply(conn->conn, cookie, &e);
if (e)
{
    const auto code = e->error_code;
    TRACE << "[KEYBOARD] Error during grab [code:" << std::to_string(code) << "]";
    const auto label = xcb_event_get_error_label(code);
    if (label)
    {
        TRACE << "[KEYBOARD] Grab error: " << label;
    }
    free(e);
}

Этот код дает следующие выходные данные в журналах:

[KEYBOARD] Error during grab [code:2]
[KEYBOARD] Grab error: BadValue

Запуск его под xtrace предлагает следующее:

000:<:127f: 40: XInputExtension-Request(131,51): XIGrabDevice grab_window=0x00800001 time=0x00000000 cursor=0x00000000 device=14 grab_mode=Synchronous(0x00) paired_device_mode=Synchronous(0x00) owner_events=true(0x01) masks=0x0000000c,0x00000000,0x00000000,0x39317453;
000:>:127f:Error 2=Value: major=131, minor=51, bad=96

И идентификатор устройства, и идентификатор окна выглядят правильно. Я просто озадачен тем, какой параметр создает неправильное значение, если только я не испортил маску события. Есть идеи?

...