启动桌面应用程序时,Gnome到底做了什么?

问题描述 投票:0回答:1

我正在使用Zorin OS,但我相信同一件事适用于所有基于Ubuntu的发行版。

[通过概览屏幕上的搜索启动应用程序时,Gnome具有以下行为:

  • 如果应用程序尚未运行,请启动它
  • 如果应用程序已经在运行,则将其当前窗口置于前台

[将窗口带到前景]部分的效果如何?

例如,从.desktop中检查Google Chrome的/usr/share/applications文件(通过.deb安装),我发现Exec命令为/usr/bin/google-chrome-stable %U,它始终会创建一个新窗口。因此,当应用程序已在运行时,Gnome显然正在做其他事情。

我正在尝试为每个我最常用的应用程序实现一个全局快捷方式,并且我希望具有完全相同的行为,“如果已经运行,则将其打开或置于前台”。

我有点用wmctrl编写了脚本,但是该解决方案似乎不太可靠也不优雅,因为我正在使用grep查找当前应用程序的窗口。另外,如果我没记错的话,它也不能与Wayland一起使用。

如果我能以某种方式触发Gnome,那将是一个更好的解决方案。

gnome xorg wayland
1个回答
0
投票

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();"
© www.soinside.com 2019 - 2024. All rights reserved.