我使用 Firefox 作为“独立”运行一些 Web 应用程序:我使用 Firefox 创建一个特定于该应用程序的新配置文件,设置首页,进行登录并根据特定需求自定义 UI。
然后,我可以通过执行以下操作快速启动该 Web 应用程序的实例:
firefox --no-remote -P My_app_profile the_app_url
为了使它更好,我创建了一个my_web_app.desktop
文件并将其放置在 中~/.local/share/application
,并将其设为收藏夹,这样我就可以从 gnome shell 侧栏快速运行它。
问题是,运行应用程序后,我看到火狐浏览器正在运行,而不是我的应用程序。例如,我为 Trello 创建了一个快捷方式,但启动它后,我看到了以下内容:
现在,这是有道理的,因为这是firefox 正在运行,但我希望看到我的应用程序突出显示,并且可以自由使用 firefox 图标,就像没有其他实例正在运行一样。
我认为 gnome 可能会根据可执行文件名称突出显示图标,但到 firefox 的简单符号链接不会触发名称更改(即link /usr/bin/firefox /usr/bin/my_app_firefox
仍然算作 firefox)。
您知道如何解决这个问题吗?我使用的是 gnome shell 3.18.2。
编辑1
以下是 trello.desktop 文件作为示例。我不是选项方面的专家,所以可能我犯了一些严重错误......但如果我这样做了,它看起来不会导致不良行为。
[Desktop Entry]
Version=1.0
Name=Trello (FF)
GenericName=Trello Dashboards
Comment=Trello in FireFox
Exec=firefox --no-remote -P App_Trello http://trello.com
Icon=trello
Terminal=false
Type=Application
MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
StartupNotify=true
Categories=Network;WebBrowser;
Keywords=web;browser;internet;
X-Desktop-File-Install-Version=0.22
编辑2
所以,我想检查一下gnome-shell 源代码看看这是如何发生的。我发现在短跑每个条目都与某些相关联shell应用程序,显然我想确保我的应用程序的 ID 是唯一的。
使用观察镜(Alt+F2 lg),我可以看到我当前正在运行的应用程序被命名为“firefox.desktop”:
appSys = Shell.AppSystem.get_default()
ll = appSys.get_running()
ll[0].get_id() // firefox.desktop (0 is the ID of the firefox app in my case)
如果我启动 trello.desktop 应用程序,该get_running()
方法会返回相同数量的条目,因此我的应用程序不会生成新条目,并且我关于拥有唯一 ID 的假设似乎得到了证实。
所以,我达到了GAppInfo
源代码检查 ID 是什么,它会将我发送回xdg菜单规格。而且,从那里,我设法寻找这:
要确定桌面文件的 ID,请使其完整路径相对于安装桌面文件的 $XDG_DATA_DIRS 组件,删除“applications/”前缀,并将“/”变为“-”。
我的 .desktop 文件位于$HOME/.local/share/applications
,而不是我的.desktop 文件$XDG_DATA_DIRS
。
我将 trello.deskop 文件移动到该路径中的目录中并重新启动 shell,但应用程序仍然显示为firefox.desktop
,因此显然 ID 仍然相同,事实上应用程序仍然与其他 Firefox 窗口分组。
有什么建议吗?
答案1
所以,显然我的第二次编辑不正确:GNOME Shell 确定应用程序分组的方式不是我描述的方式。
在 IRC gnome-shell 频道上询问后,用户 halfline 向我提供了将应用程序分组为 Dash 图标的策略:
窗口的 _GTK_APPLICATION_ID 属性与桌面文件 id 匹配或 WM_CLASS 与桌面文件 id 匹配或 _NET_WM_PID 与启动的桌面文件匹配或桌面文件中的 StartupWMClass 与窗口上的 WM_CLASS 匹配
他还建议可以更改 firefox WM_CLASS,他是对的,因为--class
firefox 有一个标志允许更改它。
这是一个例子:
$ firefox &
$ xprop WM_CLASS
WM_CLASS(STRING) = "Navigator", "Firefox"
使用那个标志我得到
$ firefox --class "Trello" &
$ xprop WM_CLASS
WM_CLASS(STRING) = "Navigator", "Trello"
它只需与桌面文件 ID 匹配即可。现在图标已正确分组。
另外,请注意,epiphany 支持创建桌面应用程序,使用默认浏览器正确处理链接,因此就我最初的目的而言,它甚至比 Firefox 更好。