从 XEvent 获取 window
Get window from XEvent
我正在努力弄清楚如何获取 window 触发特定事件的方法。我想要实现的是:
- 捕获 XCursorNotifyEvent
- 找出哪个 window 请求更改光标
- 用特定 window
的自定义光标替换请求的光标
第 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);
如果您使用此代码,请不要忘记处理可能的错误。
我正在努力弄清楚如何获取 window 触发特定事件的方法。我想要实现的是:
- 捕获 XCursorNotifyEvent
- 找出哪个 window 请求更改光标
- 用特定 window 的自定义光标替换请求的光标
第 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);
如果您使用此代码,请不要忘记处理可能的错误。