从 Xlib 转换为 xcb

Nid*_*ger 6 c linux x11 xlib xcb

我目前正在将我的一个应用程序从 Xlib 移植到 libxcb,但在查找有关我在某个时候使用的 XInput2 扩展的信息时遇到了一些麻烦。libxcb 中是否有 XInput2 实现?如果是,我在哪里可以找到文档。

目前我在使用以下功能时遇到了麻烦:XIQueryDevice, XISelectEvents. 这些主要是我使用的功能。

也许有人可以为我指出文档或为我提供一个非常小的例子来开始。

tve*_*eeg 5

你基本上有两个选择:

选项1

调用常规XI*Xinput2 函数并使用通用事件在事件循环中轮询它们。事件循环可能类似于以下内容:

xcb_generic_event_t *event;
while ((event = xcb_wait_for_event(connection))) {
    xcb_ge_generic_event_t *generic_event = (xcb_ge_generic_event_t*)event;
    if (generic_event->response_type == XCB_GE_GENERIC && generic_event->extension == xinput_ext_opcode && generic_event->event_type == XI_RawMotion) {
        // Handle motion
        continue;
    }
}
Run Code Online (Sandbox Code Playgroud)

另请查看XCB 协议扩展 API

选项2

您可以使用xcb_input_*xcb-xinput 扩展函数。根据官方文档

当 XCB 将其 API 风格添加到混合中时,它遵循较新的风格并为每个扩展创建了一个以“libxcb”为前缀的库——libxcb-composite、libxcb-render 等。由于 XCB 可以为扩展生成 API 代码自动从扩展协议的 XML 描述中创建新的扩展 API,只需将扩展描述添加到 xcb-proto 包并重建即可。

看一下xinput.h标题

  • 顺便说一句,上次我检查 xcb 中的 XI2 扩展在已发布的版本中几乎无法使用。不过,也许现在情况已经改变了。 (2认同)