Desktop entries
The freedesktop Desktop Entry specification provides a standard for applications to integrate into a desktop environment. Desktop entries are the configuration files that describe how an application is launched and which data it can handle. They also configure how an application appears in a menu with an icon, which is subject to the related menu specification standard.
The most common desktop entries are the .desktop and .directory files. This article explains briefly how to create useful and standard compliant desktop entries. It is mainly intended for package contributors and maintainers, but may also be useful for software developers and others.
There are roughly three types of desktop entries:
- Application
- a shortcut to an application
- Link
- a shortcut to a web link.
- Directory
- a container of meta data of a menu entry
The following sections will roughly explain how these are created and validated.
Related to this content, and also defined in .desktop files, are MIME-type associations for data files. Default applications describes how these are configured.
Application entry
Desktop entries for applications, or .desktop files, are generally a combination of meta information resources and a shortcut of an application. These files usually reside in /usr/share/applications
or /usr/local/share/applications
for applications installed system-wide, or ~/.local/share/applications
for user-specific applications. User entries take precedence over system entries.
File example
Following is an example of its structure with additional comments. The example is only meant to give a quick impression, and does not show how to utilize all possible entry keys. The complete list of keys can be found in the freedesktop.org specification.
[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;
Key definition
All Desktop recognized desktop entries can be found on the freedesktop.org site.
For example, the Type
key defines three types of desktop entries: Application (type 1), Link (type 2) and Directory (type 3).
-
Version
key does not stand for the version of the application, but for the version of the desktop entry specification to which this file complies.
-
Name
,GenericName
andComment
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.
Deprecation
There are quite some keys that have become deprecated over time as the standard has matured. The best/simplest way is to use the tool desktop-file-validate
which is part of the package desktop-file-utils. To validate, run
$ desktop-file-validate <your desktop file>
This will give you very verbose and useful warnings and error messages.
Icons
See also the Icon Theme Specification.
Common image formats
Here is a short overview of image formats commonly used for icons.
Extension | Full Name and/or Description | Graphics Type | Container Format | Supported |
---|---|---|---|---|
.png | Portable Network Graphics | Raster | No | Yes |
.svg(z) | Scalable Vector Graphics | Vector | No | Yes (optional) |
.xpm | X PixMap | Raster | No | Yes (deprecated) |
.gif | Graphics Interchange Format | Raster | No | No |
.ico | MS Windows Icon Format | Raster | Yes | No |
.icns | Apple Icon Image | Raster | Yes | No |
Converting icons
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 libicnsAUR):
$ 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.
Tools
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).
How to use
- 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.
List or search in .desktop files
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 Default applications#lsdesktopf.
fbrokendesktop
The fbrokendesktopAUR bash script using command which to detect broken Exec
that points to not existing path. Without any parameters it uses preset folders in DskPath
array. It shows only broken .desktop with full path and filename that is missing.
Examples
$ fbrokendesktop $ fbrokendesktop /usr $ fbrokendesktop /usr/share/apps/kdm/sessions/icewm.desktop
Tips and tricks
Run a desktop file from a terminal
Install the dex package and run dex /path/to/application.desktop
.
Hide desktop entries
Firstly, copy the desktop entry file in question to ~/.local/share/applications
to avoid your changes being overwritten.
Then, to hide the entry in all environments, open the desktop entry file in a text editor and add the following line: NoDisplay=true
.
To hide the entry in a specific desktop, add the following line to the desktop entry file: NotShowIn=desktop-name
where desktop-name can be option such as GNOME, Xfce, KDE etc. A desktop entry can be hidden in more than desktop at once - simply separate the desktop names with a semi-colon.
Autostart
If you use an XDG Autostart-compliant desktop environment, it will automatically start Desktop entries found in specific directories.
Modify environment variables
Edit the Exec
command by prepending env
, for example:
~/.local/share/applications/abiword.desktop
Exec=env LANG=he_IL.UTF-8 abiword %U