我想在Xorg中隐藏系统光标
我使用xcb为Xorg编写X11-app,它在某些情况下会隐藏光标(例如“xbanish”或“unlutter”)。我试过使用Xfixes:它可以与xlib一起正常工作,但不适用于xcb。
我的xlib代码隐藏了光标:

#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>

Display *conn = XOpenDisplay(NULL);
XFixesHideCursor(conn, DefaultRootWindow(conn));
Xflush(conn);
我的xcb代码,什么都不做:
#include <xcb/xcb.h>
#include <xcb/xfixes.h>

xcb_connection_t *conn = xcb_connect(NULL, NULL);
xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
xcb_xfixes_hide_cursor(conn, screen->root);
xcb_flush(conn);
我想了解为什么xcb的代码什么都不做,或者只是将光标隐藏在xcb中。
UPD
xtrace没有给我任何帮助,它没有看到错误。
但我敢肯定,xcb_xfixes_hide_cursor中存在错误,因为此代码为我提供了非NULL的generic_error:
xcb_void_cookie_t cookie = xcb_xfixes_hide_cursor_checked(conn, screen->root);
xcb_generic_error_t *generic_error = xcb_request_check(conn, cookie);

实际上,它给了我这个错误:
{
  "error_code": 1,
  "major_code": 138,
  "minor_code": 29,
  "sequence:": 2,
  "full_sequence": 2
}
我使用xcb-util-errors中的xcb_errors_get_name_for_minor_codexcb_errors_get_name_for_major_code来了解有关错误的任何信息。它出现在xcb_xfixes_hide_cursor_checked内部。

最佳答案



错误1是BadRequest / XCB_REQUEST。您收到BadRequest错误,因为您没有初始化XFIXES扩展名(=向X11服务器通知了您支持的版本)。

服务器中用于检查请求是否对客户端提供的版本有效的相关代码:
https://codesearch.debian.net/show?file=xorg-server_2%3A1.20.4-1%2Fxfixes%2Fxfixes.c&line=150#L150

根据协议(protocol)规范(https://codesearch.debian.net/show?file=xorg-server_2%3A1.20.4-1%2Fxfixes%2Fxfixes.c&line=150#L150):

4. Extension initialization

The client must negotiate the version of the extension before executing
extension requests.  Behavior of the server is undefined otherwise.

QueryVersion
[...]

因此,要回答您的问题:您需要先进行xcb_xfixes_query_version(c, 4, 0)才能进行HideCursor请求。

要回答您的第一个后续问题:版本4.0是引入HideCursor的版本。这可以在协议(protocol)规范中看到,因为HideCursor记录在“XFIXES VERSION 4 OR BETTER”下。

回答您的第二个后续问题:XFixesHideCursor自动为您查询版本:https://codesearch.debian.net/show?file=libxfixes_1%3A5.0.3-1%2Fsrc%2FCursor.c&line=255#L250

该代码最终调用XFixesHideCursor-> XFixesFindDisplay-> XFixesExtAddDisplay,此函数查询版本:https://codesearch.debian.net/show?file=libxfixes_1%3A5.0.3-1%2Fsrc%2FXfixes.c&line=79#L79

09-09 20:38