Wayland下如何实现Terminator单实例运行(替代X11下wmctrl方案)
嘿,我之前也碰到过这个问题——在X11下靠wmctrl -xa Terminator || Terminator就能轻松让Terminator只跑一个实例,换成Wayland之后那套突然就不管用了!下面给你几个亲测好用的方案,适配不同的Wayland窗口管理器:
利用Terminator自身的单实例支持(最简单通用)
其实Terminator本身就自带单实例机制,很多人可能没注意到!直接用这条命令:terminator --new-tab || terminator如果已经有Terminator实例在运行,这条命令会直接在已有窗口里打开新标签;如果没有,就启动新的实例。这个方法不需要额外安装工具,在绝大多数Wayland环境下都能正常工作。
针对wlroots系窗口管理器(如Sway、Hyprland):使用wlrctl
如果你用的是基于wlroots的窗口管理器,可以用wlrctl这个Wayland原生的窗口控制工具替代X11的wmctrl。先通过包管理器安装它(比如Ubuntu上执行sudo apt install wlrctl),然后用这条命令:wlrctl window focus app-id=terminator || terminator它会查找app-id为
terminator的窗口并将其聚焦到前台,如果找不到就启动新的Terminator实例。针对GNOME Shell(Ubuntu默认Wayland环境):用gdbus调用原生接口
如果你用的是Ubuntu默认的GNOME Wayland环境,不需要额外装工具,直接用gdbus调用GNOME Shell的窗口控制接口:gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval " const windows = global.get_window_actors().map(a => a.meta_window); const terminatorWindow = windows.find(w => w.get_wm_class() === 'Terminator'); if (terminatorWindow) { terminatorWindow.activate(global.get_current_time()); } else { GLib.spawn_command_line_async('terminator'); } " > /dev/null || terminator这条命令会通过GNOME Shell的JS接口查找Terminator窗口,找到就激活它,找不到就启动新实例。后面的
> /dev/null是为了屏蔽gdbus的冗余输出,让命令更干净。
备注:内容来源于stack exchange,提问作者vice_spirit




