如何为Linux桌面条目文件指定带有RELATIVE路径的图标?

时间:2010-08-10 19:37:12

标签: linux desktop shortcut

对于我的一个Linux应用程序,我有应用程序二进制文件,一个launcher.sh脚本(对于LD_LIBRARY_PATH)和一个.desktop文件,都在同一个文件夹中。

我想使用相对路径而不是图标的绝对路径。

我试过了:

Icon=app.svg
Icon=./app.svg
Icon=$PWD/app.svg
Icon=$(dirname %k)/app.svg

但这些都不起作用(仅Icon=/path/to/app.svg)。如果无法指定相对路径并且我必须使用解决方法,那么每次运行launcher.sh脚本时,我都认为我可以在.desktop文件中重新生成图标路径。

最好的方法是什么?使用sed或其他替换实用程序可能会使用Icon=([valid path chars]+)\n这样的伪正则表达式吗?

3 个答案:

答案 0 :(得分:15)

在做了一些更多的研究之后,就我所见,它看起来似乎不可能为桌面条目文件中的图标指定相对路径。

我使用的解决方法是将以下代码添加到我的launcher.sh脚本的末尾:

mv myapp.desktop myapp.desktop-bak
sed -e "s,Icon=.*,Icon=$PWD/app.svg,g" myapp.desktop-bak > myapp.desktop
rm myapp.desktop-bak

这将在每次运行启动器脚本时更新图标的路径,并且由于.desktop文件指向启动器脚本,因此单击.desktop文件可以有效地更新其图标。

我知道您可以使用cat或-i选项来缩短上述代码但我已经读过我使用的解决方案更可靠。如果有人有进一步的信息,请发表评论。

答案 1 :(得分:2)

FreeDesktop specification的确是 不允许相对路径:

标准键

Icon

要显示在文件管理器,菜单等中的图标。如果名称是绝对路径, 给定的文件将被使用。如果名称不是绝对路径,则 Icon Theme Specification中描述的算法将是 用于定位图标。

[。 。 。 ]

类型iconstring的值是图标的名称;这些可能是绝对的 路径或使用以下算法描述的图标的符号名称 Icon Theme Specification。这样 值不能由用户显示,并以UTF-8编码。

解决方法足够, 尽管它可能不适用于菜单和面板启动器。 但是,如果您愿意修补桌面文件 运行launcher.sh脚本时, 为什么不实际安装图标? 您可以分两行进行操作:

cp app.svg ~/.local/share/icons/hicolor/48x48/apps/
cp app.svg ~/.local/share/icons/hicolor/scalable/apps/

然后放

Icon=app

在桌面文件中(app只是没有文件扩展名的文件名)。

这是用于定位图标的预期机制 没有绝对的道路, 并确保图标显示在菜单和自定义启动器中。 spec has this to say

因此,您是应用程序作者,并且想要安装应用程序 图标,以便它们可以在KDE和Gnome菜单中使用。最少你 应该在hicolor主题中安装一个48x48的图标。这表示 在$ prefix / share / icons / hicolor / 48x48 / apps中安装PNG文件。 (可选)您可以安装不同大小的图标。例如, 在$ prefix / share / icons / hicolor / scalable / apps中安装svg图标 意味着大多数台式机将具有一个适用于所有尺寸的图标。

可以做到这一点的一种方法 与xdg-icon-resource命令一起使用,例如

$ xdg-icon-resource install --novendor --context apps --size 48 example-app.png

但是,xdg-icon-resource does not support SVG images, 实际上,这完成了同一件事:

$ cp example-app.svg ~/.local/share/icons/hicolor/48x48/apps/
$ cp example-app.svg ~/.local/share/icons/hicolor/scalable/apps/

(这不是输入错误:将SVG文件放在48x48/apps文件夹中 并且菜单和面板将非常令人满意。)

对于菜单,在安装后更新图标缓存是个好主意。

$ update-icon-caches ~/.local/share/icons

然后,您可以像这样将iconstring设置为example-app

Icon=example-app

这不是相对路径, 但这解决了必须使用绝对路径的问题 并且如果桌面文件移到其他位置也不会中断。

对于它的价值, 支持相对路径 在FreeDesktop邮件列表中进行了讨论 早在2008年9月:

Magnus Bergmark magnus.bergmark在gmail.com

2008年9月23日星期二01:01:32

[。 。 。 ]

我建议我们也以某种方式允许使用相对路径。

用例

  1. 我使用很多.directory文件来制作包含电影的目录 将电影海报作为图标。此行为可能适用于任何形式的 媒体,例如漫画书,音乐(相册)和照片。

  2. 供应商可能希望将图标捆绑到他们所使用的软件中 分发以与.desktop文件一起使用,而该文件不在 桌面菜单,因此仍位于应用程序目录中。

https://lists.freedesktop.org/archives/xdg/2008-September/009940.html

我唯一能找到的反驳 该提案的位置在这里:

.desktop文件 不打算进入标准应用程序目录的是 几乎完全没用。也许您应该看一些 软件包建议和实施,并与使用 这些,代替。另一个选择是xdg utils脚本,用于安装 .desktop文件和图标放在适当的位置。我只能 假定您卸载的应用程序也打算不遵循 图标主题和图标命名规范。我看不到 将目录的图标设置为确实有用。设置图标 实际的可执行文件会有用得多,尽管elf二进制文件确实可以 没有像win32二进制文件那样的资源。

https://lists.freedesktop.org/archives/xdg/2008-September/009962.html

相关问题:

相关链接:

答案 2 :(得分:0)

您可以使用echo $(echo ~)来使用命令输出,或者使用echo $(echo $var)来获取变量

例如:

echo "Icon=$(echo ~)/Pictures/Icons/whatsapp-webapp.svg" > path/to/file.desktop 
  

如果您对多行回声命令感兴趣,请查看this link