我有一个信息亭系统,运行着 X 服务器,托管不同的图形程序。所有程序都是互斥的,因为它们的 systemd 单元存在冲突。在其中一些程序中,我想使用本机 X11 光标,例如特克罗斯。我可以通过在相应应用程序的 systemd 单元中设置它xsetroot
。是否也可以使用xsetroot
或其他工具隐藏光标无需重新启动 X 服务器?
我已经排除的选项:
-nocursor
X 服务器的参数 - 这会在整个运行时禁用所有应用程序的光标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
在合适的环境中运行DISPLAY
set 后,在中断程序之前光标不会出现。