X11运行时动态切换鼠标光标方案优化问询
解决方案
1. 开机及时切换光标状态
你当前的systemd服务启动依赖配置不合理,且缺少X服务就绪的等待逻辑,调整两处即可解决:
修改systemd服务配置
替换cursor-init.service内容如下:
[Unit] Description=X11 cursor initialisation After=xserver-nodm.service Requires=xserver-nodm.service [Service] Type=oneshot # 内置重试逻辑,等待DISPLAY可用后再执行操作,最多等待5秒 ExecStart=/bin/sh -c 'for i in $(seq 1 10); do if DISPLAY=:0 xset q > /dev/null 2>&1; then break; fi; sleep 0.5; done; DISPLAY=:0 /usr/bin/matchbox-remote -show-cursor $(ls -1 /dev/input/by-*/*-mouse 2>/dev/null | wc -l)' RemainAfterExit=true StandardOutput=journal [Install] WantedBy=graphical.target
如果你的场景默认无鼠标使用概率更高,也可以直接在Xorg启动参数中添加-nocursor,从根源避免开机显示光标,后续插入鼠标时再调用matchbox-remote启用光标即可。
2. 光标状态修改立即生效
你当前的代码仅修改了根窗口的光标配置,已存在的子窗口不会自动继承新配置,且X服务的指针缓存没有主动刷新,才会出现需要交互才消失的问题,修改matchbox-remote.c的set_show_cursor函数即可:
void set_show_cursor (int show) { Window root = DefaultRootWindow(dpy); if (!show) { // 直接调用Xfixes原生接口隐藏光标,无需创建空白光标,立即生效 XFixesHideCursor(dpy, root); } else { XFixesShowCursor(dpy, root); Cursor cursor = XCreateFontCursor(dpy, XC_left_ptr); XDefineCursor(dpy, root, cursor); XFreeCursor(dpy, cursor); } // 强制刷新所有 pending 事件,保证修改立即生效 XFlush(dpy); XSync(dpy, True); }
如果不想修改源码,也可以在每次调用matchbox-remote后追加一行指针移动命令,强制触发UI刷新:
DISPLAY=:0 xdotool mousemove 0 0 mousemove restore
udev规则和systemd服务的调用逻辑中都可以添加该行。
内容的提问来源于stack exchange,提问作者Micrified
相关产品推荐
相关产品推荐

