以编程方式切换 X 服务器上的光标可见性

以编程方式切换 X 服务器上的光标可见性

我有一个信息亭系统,运行着 X 服务器,托管不同的图形程序。所有程序都是互斥的,因为它们的 systemd 单元存在冲突。在其中一些程序中,我想使用本机 X11 光标,例如特克罗斯。我可以通过在相应应用程序的 systemd 单元中设置它xsetroot。是否也可以使用xsetroot或其他工具隐藏光标无需重新启动 X 服务器

我已经排除的选项:

  • -nocursorX 服务器的参数 - 这会在整个运行时禁用所有应用程序的光标
  • unclutter- 我希望光标在整个运行时隐藏在相应的应用程序上,而不仅仅是在未移动时隐藏。
[Unit]
Description=Plain X.org server
After=plymouth-quit-wait.service
[email protected] display-manager.service

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/usr/bin/Xorg vt7 -nolisten tcp -noreset -nocursor
# Wait for server to be ready and set kiosk configuration.
ExecStartPost=/usr/bin/kiosk
# Set chicken as cursor to be able to test touch screen
# and see whether X server is actually running.
ExecStartPost=/usr/bin/xsetroot -cursor_name tcross
Restart=on-failure
RestartSec=3

[Install]
WantedBy=graphical.target

答案1

如果您的 X11 服务器具有 XFIXES 扩展(参见 参考资料xdpyinfo),您可以编写一个小 C 程序来调用XFixesHideCursor()根窗口以隐藏所有光标,直到程序结束。您可能需要安装一些 X11 开发包(例如libXfixes-devel,但这取决于您的发行版)才能包含包含文件/usr/include/X11/extensions/Xfixes.h。创建一个文件nocursor.c来保存:

/* https://unix.stackexchange.com/a/726059/119298 */
/* compile with -lX11 -lXfixes */
/* https://www.x.org/releases/current/doc/fixesproto/fixesproto.txt */
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    Display *display = XOpenDisplay(NULL);
    if(display==0)exit(1);
    int screen = DefaultScreen(display);
    Window root = RootWindow(display, screen);
    XFixesHideCursor(display, root);
    XSync(display, True);
    pause(); /* need to hold connection */
    return 0;
}

并用 进行编译gcc -o nocursor nocursor.c -lX11 -lXfixes./nocursor在合适的环境中运行DISPLAYset 后,在中断程序之前光标不会出现。

相关内容