You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Wayland下如何实现Terminator单实例运行(替代X11下wmctrl方案)

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

火山引擎 最新活动