我正在使用Zorin OS,但我相信同一件事适用于所有基于Ubuntu的发行版。
[通过概览屏幕上的搜索启动应用程序时,Gnome具有以下行为:
[将窗口带到前景]部分的效果如何?
例如,从.desktop
中检查Google Chrome的/usr/share/applications
文件(通过.deb
安装),我发现Exec
命令为/usr/bin/google-chrome-stable %U
,它始终会创建一个新窗口。因此,当应用程序已在运行时,Gnome显然正在做其他事情。
我正在尝试为每个我最常用的应用程序实现一个全局快捷方式,并且我希望具有完全相同的行为,“如果已经运行,则将其打开或置于前台”。
我有点用wmctrl
编写了脚本,但是该解决方案似乎不太可靠也不优雅,因为我正在使用grep查找当前应用程序的窗口。另外,如果我没记错的话,它也不能与Wayland一起使用。
如果我能以某种方式触发Gnome,那将是一个更好的解决方案。
GNOME Shell的窗口管理器代码始终尝试将每个窗口与其.desktop文件相关联(基于WM_NAME和其他启发式方法)。例如,通过这种方式,它便知道要在顶部栏中显示的应用图标和标题,而与实际窗口的标题无关。在内部,这是“ shell-window-tracker”模块。
因此,当启动器要启动应用程序时,它首先要求窗口管理器显示与同一.desktop文件关联的窗口,并且仅在没有匹配的窗口时才执行该程序。
但是请注意,相同 GNOME Shell既是应用程序启动器,也是窗口管理器。它不需要进行任何外部API调用即可实现–概述/启动器代码仅使用内部函数与窗口管理代码进行通信,因为它们都在同一进程中运行。
要从外部获得相同的效果,您可能需要使用Shell的D-Bus API,尽管它似乎没有启动特定应用程序的任何API,因此您可能需要使用org.gnome.Shell.Eval()
并调用Shell内部的GJS这样的功能。
未经测试:
busctl --user call org.gnome.Shell \
/org/gnome/Shell org.gnome.Shell Eval \
s "Shell.AppSystem.get_default().lookup_app('foo.desktop').activate();"