Desktop entries (简体中文)
XDG 桌面配置项规范为应用程序和桌面环境的菜单整合提供了一个标准方法。只要桌面环境遵守菜单规范,应用程序图标就可以显示在系统菜单中。
分类
桌面配置项大致分为三类:
- 应用程序
- 文件后缀是 .desktop,包含程序启动方式,XDG MIME Applications 使用的
MimeType
等。将带 XDG 自动启动程序设置的文件放到特定位置,可以自动启动应用程序。 - 链接
- 文件后缀是 .desktop,定义指向某个
URL
的链接。 - 目录
- 文件后缀是 .directory,定义应用程序菜单中的子菜单。
下列章节概述如何创建它们并使其生效。
应用程序配置项
应用程序配置项,即 .desktop
文件是元信息资源和应用程序快捷图标的集合。系统程序的配置项通常位于 /usr/share/applications
或 /usr/local/share/applications
目录,单用户安装的程序位于 ~/.local/share/applications
目录,桌面环境会优先使用用户的配置项。
范例文件
下面是一个示例结构和注释,这个示例文件没有使用所有的键值,freedesktop.org 规范包含了完整的键值列表.
[Desktop Entry] # The type as listed above Type=Application # The version of the desktop entry specification to which this file complies Version=1.0 # The name of the application Name=jMemorize # A comment which can/will be used as a tooltip Comment=Flash card based learning tool # The path to the folder in which the executable is run Path=/opt/jmemorise # The executable of the application, possibly with arguments. Exec=jmemorize # The name of the icon that will be used to display this entry Icon=jmemorize # Describes whether this application needs to be run in a terminal or not Terminal=false # Describes the categories in which this entry should be shown Categories=Education;Languages;Java;
Type
和 Name
是必须的。关键字定义
全部有效的桌面配置项可参阅freedesktop.org网站。
举例:Type
关键字(类型)定义了三类桌面项:应用程序(Application (type 1)),链接(Link (type 2))和目录(Directory (type 3))。
-
Version
(版本)关键字不是指应用程序的版本,而是本文件所遵循的桌面配置项规范的版本。
-
Name
(名称)、GenericName
(通称)和Comment
注释often contain redundant values in the form of combinations of them, like:
Name=Pidgin Internet Messenger GenericName=Internet Messenger
or
Name=NoteCase notes manager Comment=Notes Manager
This should be avoided, as it will only be confusing to users. The Name
key should only contain the name, or maybe an abbreviation/acronym if available.
-
GenericName
should state what you would generally call an application that does what this specific application offers (i.e. Firefox is a "Web Browser"). -
Comment
is intended to contain any usefull additional information.
安装
用 desktop-file-install(1) 将文件安装到目标目录:
desktop-file-install --dir=~/.local/share/applications ~/app.desktop
更新桌面文件数据库
要将 ~/.local/share/applications
下的设置生效,执行下面命令:
$ update-desktop-database ~/.local/share/applications
图标
参考 图标主题标准.
通用图像格式
用于图标的图像文件格式简述如下:
Extension | Full Name and/or Description | Graphics Type | Container Format | Supported |
---|---|---|---|---|
.png | Portable Network Graphics | Raster | 否 | 是 |
.svg(z) | Scalable Vector Graphics | Vector | 否 | Yes (optional) |
.xpm | X PixMap | Raster | 否 | Yes (不推荐) |
.gif | Graphics Interchange Format | Raster | 否 | 否 |
.ico | MS Windows Icon Format | Raster | 是 | 否 |
.icns | Apple Icon Image | Raster | 是 | 否 |
图标格式转换
If you stumble across an icon which is in a format that is not supported by the freedesktop.org standard (like gif
or ico
), you can use the convert tool (which is part of the imagemagick package) to convert it to a supported/recommended format, e.g.:
$ convert <icon name>.gif <icon name>.png
If you convert from a container format like ico
, you will get all images that were encapsulated in the ico
file in the form <icon name>-<number>.png
. If you want to know the size of the image, or the number of images in a container file like ico
you can use the identify tool (also part of the imagemagick package):
$ identify /usr/share/vlc/vlc48x48.ico
/usr/share/vlc/vlc48x48.ico[0] ICO 32x32 32x32+0+0 8-bit DirectClass 84.3kb /usr/share/vlc/vlc48x48.ico[1] ICO 16x16 16x16+0+0 8-bit DirectClass 84.3kb /usr/share/vlc/vlc48x48.ico[2] ICO 128x128 128x128+0+0 8-bit DirectClass 84.3kb /usr/share/vlc/vlc48x48.ico[3] ICO 48x48 48x48+0+0 8-bit DirectClass 84.3kb /usr/share/vlc/vlc48x48.ico[4] ICO 32x32 32x32+0+0 8-bit DirectClass 84.3kb /usr/share/vlc/vlc48x48.ico[5] ICO 16x16 16x16+0+0 8-bit DirectClass 84.3kb
As you can see, the example ico file, although its name might suggest a single image of size 48x48, contains no less than 6 different sizes, of which one is even greater than 48x48, namely 128x128.
Alternatively, you can use icotool (from icoutils) to extract png images from ico container:
$ icotool -x <icon name>.ico
For extracting images from .icns container, you can use icns2png (provided by libicns):
$ icns2png -x <icon name>.icns
Obtaining icons
Although packages that already ship with a .desktop file most certainly contain an icon or a set of icons, there is sometimes the case when a developer has not created a .desktop file, but may ship icons, nonetheless. So a good start is to look for icons in the source package. You can i.e. first filter for the extension with find and then use grep to filter further for certain buzzwords like the package name, "icon", "logo", etc, if there are quite a lot of images in the source package.
$ find /path/to/source/package -regex ".*\.\(svg\|png\|xpm\|gif\|ico\)$"
If the developers of an application do not include icons in their source packages, the next step would be to search on their web sites. Some projects, like i.e. tvbrowser have an artwork/logo page where additional icons may be found. If a project is multi-platform, there may be the case that even if the linux/unix package does not come with an icon, the Windows package might provide one. If the project uses a Version control system like CVS/SVN/etc. and you have some experience with it, you also might consider browsing it for icons. If everything fails, the project might simply have no icon/logo yet.
Icon path
The freedesktop.org standard specifies in which order and directories programs should look for icons:
-
$HOME/.icons
(for backwards compatibility) $XDG_DATA_DIRS/icons
/usr/share/pixmaps
工具
gendesk
gendesk started as an Arch Linux-specific tool for generating .desktop files by fetching the needed information directly from PKGBUILD files. Now it is a general tool that takes command-line arguments.
Icons can be automatically downloaded from openiconlibrary, if available. (The source for icons can easily be changed in the future).
用法
- Add
gendesk
to makedepends
- Start the
prepare()
function with:
gendesk --pkgname "$pkgname" --pkgdesc "$pkgdesc"
- Alternatively, if an icon is already provided ($pkgname.png, for instance). The
-n
flag is for not downloading an icon or using the default icon. Example:
gendesk -n --pkgname "$pkgname" --pkgdesc "$pkgdesc"
-
$srcdir/$pkgname.desktop
will be created and can be installed in thepackage()
function with:
install -Dm644 "$pkgname.desktop" "$pkgdir/usr/share/applications/$pkgname.desktop"
- The icon can be installed with:
install -Dm644 "$pkgname.png" "$pkgdir/usr/share/pixmaps/$pkgname.png"
- Use
--name='Program Name'
for choosing a name for the menu entry.
- Use
--exec='/opt/some_app/elf --some-arg --other-arg'
for setting the exec field.
- See the gendesk project for more information.
lsdesktopf
lsdesktopfAUR can list available .desktop files or search their contents.
$ lsdesktopf $ lsdesktopf --list $ lsdesktopf --list gtk zh_TW,zh_CN,en_GB
It can also perform MIME-type-related searches. See XDG MIME Applications#lsdesktopf.
fbrokendesktop
The fbrokendesktopAUR Bash script detects broken Exec
values pointing to non-existent paths. Without any arguments it uses preset directories in the DskPath
array. It shows only broken .desktop with full path and filename that is missing.
Examples
$ fbrokendesktop $ fbrokendesktop /usr $ fbrokendesktop /usr/share/xsessions/icewm.desktop
提示与技巧
从终端启动程序
安装软件包 dex,并运行 dex /path/to/application.desktop
.
隐藏窗口启动
首先,将桌面配置项复制到 ~/.local/share/applications
,避免修改被后续升级覆盖。
要在所有环境隐藏,在桌面配置项中加入 NoDisplay=true
.
要在某个环境中隐藏,在桌面配置项中加入 NotShowIn=desktop-name
desktop-name 可以是 GNOME, Xfce, KDE 等,指定多个桌面时用分号隔开。
修改环境变量
在 Exec
命令中可以使用 env
修改环境变量:
~/.local/share/applications/abiword.desktop
Exec=env LANG=he_IL.UTF-8 abiword %U