【问题标题】:XCB event loop not getting any eventsXCB 事件循环没有收到任何事件
【发布时间】:2016-03-17 21:07:06
【问题描述】:

我正在 Firefox 中制作插件,所以我有一个 ChromeWorker - 这是一个特权 WebWorker。这只是主线程之外的一个线程。

在这里我没有代码,但这个(修改使其看起来不像 js-ctypes [这是插件的语言])

在启动时我运行这段代码,conn 是一个全局变量:

conn = xcb_connect(null, null);

然后我每隔 200 毫秒运行一次:

evt = xcb_poll_for_event(conn);
console.log('evt:', evt);

if (!evt.isNull()) {
    console.log('good got an event!!');
    ostypes.API('free')(evt);
}

但是evt 始终是null,我从来没有收到任何事件。我的目标是获取系统上的所有事件。

有谁知道是什么导致如此简单的事情无法工作?

我试过了

xcb_change_window_attributes (conn, screens.data->root, XCB_CW_EVENT_MASK, values);

但这并没有解决问题:(

我可以让它工作的唯一方法是通过 xcb_create_window xcb_map_window 但我只得到在这个创建的窗口中发生的事件。

【问题讨论】:

    标签: x11 xcb


    【解决方案1】:

    您不仅可以通过打开连接神奇地获取所有事件。 任何客户端只会收到很少的消息,例如客户端消息,大多数其他消息只有在客户端明确注册接收它们时才会发送给客户端。

    是的,这意味着您必须在每个窗口上注册它们,这包括爬取树和侦听正在创建、映射、取消映射和销毁的窗口以及在它们上注册。

    但是,我会重新考虑是否

    我的目标是获取系统上的所有事件。

    不是 A-B 问题。 为什么你“需要”所有的事件?你到底想做什么?

    【讨论】:

    • 非常感谢 Ingo 的回复我仍在为此苦苦挣扎,我尝试打开和关闭故障排除。从一个衍生线程(非主线程),我试图创建一个全局热键。我创建了一个截图工具 - addons.mozilla.org/en-US/firefox/addon/nativeshot - 它是 Firefox 的插件。它使用 js-ctypes 来使用本机方法。人们要求我允许用户选择将他们的“PrtScn”键设置为全局热键来触发我的屏幕截图。所以我很挣扎。
    • 要做到这一点,您需要做的就是通过 xcb_grab_key 抓取根窗口上的密钥。当然,只有在没有其他应用程序获取密钥的情况下,您才能这样做,请参阅相关文档(可能还有 Xlib 等效项 XGrabKey)。
    • 附录:如果您希望它在不抓取密钥的情况下工作,您可以使用 Xinput2 扩展,这需要更多的工作而不是直接的。但一般来说, xcb_grab_key 应该足够了。例如,窗口管理器通常也是这样做的。
    • 非常感谢,我会继续尝试,我尝试了 xcb_grab_key 但它不起作用我不知道为什么:(
    • 嘿@Ingo 我在这里试过了-github.com/Noitidart/NativeShot/blob/master/modules/hotkey/… 但我没有收到任何事件:( 我没有收到任何错误我不知道为什么它不会抓取:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多