从 XEvent 获取 window

Get window from XEvent

我正在努力弄清楚如何获取 window 触发特定事件的方法。我想要实现的是:

  1. 捕获 XCursorNotifyEvent
  2. 找出哪个 window 请求更改光标
  3. 用特定 window
  4. 的自定义光标替换请求的光标

第 1 步有效,如果我能找出实际 window 请求更改光标的来源,第 3 步也有效。

请注意,我不想更改我自己的应用程序的光标,它应该适用于任何应用程序。这就是为什么我需要弄清楚哪个 application/window 请求更改光标!

我知道每个事件都有一个 window 成员变量,但显然 window 变量对我来说总是 returns 根 window。根据文档,window 成员不代表触发事件的 window,因此必须有另一种方式。

XEvent xev;
Display* _display;
Window _root_window = XRootWindow(display, 0);
XFixesSelectCursorInput(_display, _root_window, XFixesDisplayCursorNotifyMask);

while(1) {
    XNextEvent(_display, &xev);
    XFixesCursorNotifyEvent xc_event = *(reinterpret_cast<XFixesCursorNotifyEvent*>(&xev));

    std::cout << "Window of captured event: " << xc_event.window << std::endl;

    ...
    XDefineCursor(_display, ???, MyCustomCursor);
}

基本上我需要弄清楚用什么来替换'???'在 XDefineCursor 函数调用中。

原来我的问题是基于误解(你可以在评论中看到)。为了解决我的问题,我必须使用 XGetInputFocus 库函数查询焦点 window。

Window focus_window;
int revert_to;
focus_window = XGetInputFocus(_display, &focus_window, &revert_to);
XDefineCursor(_display, focus_window, MyCustomCursor);

如果您使用此代码,请不要忘记处理可能的错误。