Ярлыки для программы (desktop-файлы)

В большинстве свободных сред рабочего стола для запуска программы используются desktop-файлы - текстовые файлы с расширением ".desktop". По своему назначению эти файлы аналогичны ярлыкам приложений в операционной системе Windows, но имеют несколько другую функциональность (например, могут включать перевод названия приложения). Формат таких файлов описывается стандартом freedesktop.org. Более подробно об этом можно прочитать на сайте freedesktop.org, по адресу: http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html. В отличие от спецификации freedesktop.org на иконки, спецификация desktop-файлов выглядит менее запутанной и более понятной. Но, тем не менее, я всё-таки опишу здесь основные моменты, нужные для создания desktop-файлов программы.

Desktop-файлы для приложений, в соответствии с их названием, должны иметь расширение ".desktop". Также бывают файлы типа "директория" - у них должно быть расширение ".directory". Desktop-файлы должны сохраняться в кодировке UTF-8. Файл состоит из строк, каждая из которых отделяется от другой символами переноса строки. Символы, находящиеся в разном регистре, имеют разное значение в любой части файла.

Комментарии. Строки, начинающиеся с символа "#", а также пустые строки, игнорируются средой рабочего стола. В них можно помещать любую пояснительную информацию, содержащую любые символы, за исключением символа "LF". Поощряется использование символов UTF-8, не входящих в набор ASCII.

Заголовки групп. Вся информация в desktop-файле делится на группы. Заголовок группы пишется на отдельной строке перед группой, в квадратных скобках:
[groupname]
Заголовок группы может включать любые символы ASCII, за исключением открывающей и закрывающей квадратных скобок. Заголовок группы должен быть уникальным в пределах файла - не допускается наличие нескольких групп с одинаковым именем.

Обязательно требуется, чтобы в файле была группа с заголовком "Desktop Entry". В desktop-файле могут быть и другие группы, но в этой группе содержится наиболее важная информация, поэтому она обязательно должна присутствовать. Кроме того, эта группа также используется для определения MIME-типа desktop-файла методом "магических чисел", в случае, если по каким-то причинам определение типа файла производится не по расширению. Поэтому, заголовок группы "Desktop Entry" должен находиться в самом начале файла. Перед ним может быть один или несколько комментариев, хотя это нежелательно.

Записи. Вся информация в desktop-файле записывается в виде строк в формате "ключ=значение". До и после знака "равно" можно добавлять пробелы - они будут проигнорированы. Ключ и значение разделяются только символом "=". Для ключей могут использоваться только символы латинского алфавита, цифры и пробел (A-Za-z0-9-). Как было сказано выше, регистр имеет значение, поэтому ключи "Name" и "NAME" являются разными. Имя ключа должно быть уникальным в пределах группы - группа не должна содержать две записи с одинаковым ключом. В разных группах могут быть ключи с одинаковыми именами.

Типы данных для записей. Значения в записях могут быть несколких определённых типов:

  • string - строка. Может содержать любые символы ASCII, за исключением управляющих символов.
  • localestring - переводимая строка, т.е. строка, которую можно перевести на разные языки. Обычно эти строки видны пользователю. Символы в таких строках кодируются в UTF-8.
  • boolean - логическое значение. Значений у этого типа данных может быть только два - строки "true" и "false".
  • numeric - числовой тип. Это должна число с плавающей точкой, представленное в виде строки такого вида, чтобы его можно было распознать как спецификатор "%f" функции "scanf" языка C.
В типах данных string и localestring можно использовать escape-последовательности "\s", "\n", "\t", "\r", и "\\", означающие соответственно символы пробела, новой строки, табуляции, возврата каретки, и "\".
Некоторые ключи могут содержать несколько значений. В этом случае, в расположенной ниже таблице, где перечисляются значения ключей, тип данных для ключа указывается в множественной форме - например, "string(s)". Множественные значения должны разделяться точкой с запятой, и значение ключа должно завершаться точкой с запятой (т.е. после последнего значения также должна идти точка с запятой). В случае, если какое-то из множественных значений должно включать в себя точку с запятой, её надо экранировать - записать как "\;".

Значения, переведённые на другие языки. Ключи с типом данных localestring могут переводиться на другие языки.
В случае, если для есть значение, переведённое на какой-то язык, обязательно должно быть значение, язык для которого не указан. Оно будет использоваться, когда переведённое значение для используемого в системе языка найти не удалось.
Чтобы показать, на какой язык переведено значение, после ключа (до знака "=") ставится идентификатор локали, на который переведено значение, в квадратных скобках. Идентификатор локали должен быть в форме "язык_СТРАНА.кодировка@модификатор", где части "СТРАНА", "кодировка" и "модификатор" могут быть пропущены. Например, для русского языка можно указать "ru_RU.UTF-8" или просто "ru". Ключ, его значение по умолчанию и значение, переведённое на русский язык, могут выглядеть, например, так:
Comment=Double Commander is a cross platform open source file manager with two panels side by side.
Comment[ru_RU.UTF-8] = Double Commander - классический двухпанельный файловый менеджер, кроссплатформенный, с открытым исходным кодом.
При определении, какое сообщение отображать, система сначала определяет используемую локаль для категории POSIX LC_MESSAGES. Некоторое представление об используемой в системе локали можно получить, набрав в темринале "echo $LANG" - будет выведена локаль, используемая в данный момент терминалом. После определения локали для LC_MESSAGES проверяются все локализованные значения ключа. При этом значение кодировки не учитывается, так как .desktop-файл, согласно спецификации, должен быть в кодировке UTF-8. Поэтому, проверяется соответствие всех частей без учёта кодировки. Если для LC_MESSAGES указаны все части, т.е. в форме "lang_COUNTRY@MODIFIER", то сначала система попытается найти строку с переведённым значением ключа, для которой локаль также указана в форме "lang_COUNTRY@MODIFIER". В случае, если эта строка найдена - будет использовано её значение. Если нет - система попытается найти строку в форме "lang_COUNTRY". Если и такой строки нет - будет произведён поиск строки в форме "lang@MODIFIER". Затем - просто "lang". Если и такой формы для нужного языка не надено - будет использоваться значение по умолчанию, то есть, значение, для которого локаль не указана.
В случае, если для LC_MESSAGES часть "MODIFIER" не указана - значит, ни одна из строк с локализованными значениями ключа, для которых указана часть "MODIFIER", не подойдёт. Все они при поиске будут проигнорированы. Если для LC_MESSAGES не указана часть "COUNTRY" - тогда не подойдут строки, для которых указана эта часть. Исходя из этого, можно сделать вывод - если для какого-то ключа имеется только одно значение с переводом на какой-либо язык, лучше не указывать для этого значения ни модификатора, ни страны. То есть, если у нас только один перевод на русский язык для ключа "Comment" - лучше будет написать не "[ru_RU.UTF-8]", а просто "[ru]". Указание страны и модификатора имеет смысл только в том случае, когда есть несколько вариантов перевода. Например, если для английского языка есть перевод на "классический" английский (используемый в Великобритании) и на "американский" английский. В этом случае можно, например, значение с переводом на "классический" английским пометить просто как "[en]", а строку со значением, переведённым на "американский" английский - как "[en_US]".

Ключи, распознаваемые системой. Ниже будут приведены различные ключи, которые распознаются и используются системой окружения рабочего стола.
Ключи делятся на требуемые (REQUIRED) и необязательные (OPTIONAL). Необязательные ключи могут быть указаны, но если их нет - это не считается ошибкой, и .desktop-файл всё равно должен нормально обрабатываться системой. Обязательные ключи, как следует из их названия, должны быть в любом .desktop-файле. Однако, есть ситуации, когда даже некоторых обязательных ключей может не быть. Некоторые ключи указывать имеет смысл только в том случе, если для другого ключа установлено некоторое специфическое значение. Например, ключ "Terminal" служит системе для определения, надо ли запускать приложение в терминале или нет. Естественно, используется он только в том случае, если .desktop-файл ссылается на какое-то приложение (т.е. если если ключ "Type" имеет значение "Application"). Поэтому, несмотря на то, что ключ "Terminal" является обязательным, для .desktop-файле, предназначенных не для запуска приложений, а, допустим, для ссылки на веб-сайт, его указывать не нужно.

Обязательные ключи.

Ключ Тип данных Типы файлов Описание
Type string Спецификация определяет три типа .desktop-файлов: "Application" - приложение, т.е. программа, которую можно запустить (тип 1); "Link" - ссылка, например ссылка на web-сайт (тип 2); "Directory" - папка (тип 3). Для того, чтобы обеспечить возможность добавления новых типов в будущем, соответствующие спецификации freedesktop.org окружения работчего стола должны игнорировать .desktop-файлы с неизвестным типом.
Name localestring 1-3 Название. В случае, если .desktop-файл является ярлыком для запуска приложения ("Application" - тип 1), то в записи с таким ключом надо указывать название приложения.
Exec string 1 Исполняемый файл программы, который будет запущен, когда пользователь выберет ярлык. Возможно, программе будут переданы какае-то аргументы, спецификация которых приводится ниже.
URL string 2 Если тип .desktop-файла - ссылка, то URL, по которому надо перейти, когда пользователь выберет .desktop-файл.

Необязательные ключи.

Ключ Тип данных Типы файлов Описание
Version string 1-3 Версия спецификации freedesktop.org, которой соответствует данный .desktop-файл. Версии, которые соответсвуют описываемой здесь спецификации, должны указывать в этом ключе (если он есть в файле) версию 1.0.
GenericName localestring 1-3 Обобщённое название приложения. Например, в desktop-файлах браузеров Chromium и Firefox указывается обобщённое название "Веб-браузер".
Comment localestring 1-3 Подсказка для .desktop-файла, например "Просмотр сайтов в сети Интернет". Для программы имеет смысл указать краткое описание, зачем она нужна и что делает. Значение записи с таким ключом не должно просто повторять значение записей с ключами "Name" и/или "GenericName".
Icon localestring 1-3 Иконка приложения, которая будет отображаться в меню, файловых менеджерах, и т.п. Если значение - абсолютный путь к файлу, то будет отображаться указанный файл. Если значение - не абсолютный путь, то будет применяться алгоритм поиска иконки, описанный в спецификациях freedesktop.org для иконок. Размещение иконок для приложения описано в разделе Назначение иконки для программы. Алгорим поиска иконки freedesktop.org частично также описывается в этом разделе.
Path string 1 Если .desktop-файл предназначен для запуска какой-то программы, в записи с таким ключом указывается рабочая директория для запускаемой программы.
Terminal boolean 1 Если .desktop-файл предназначен для запуска какой-то программы - показывает, нужно ли запускать эту программу в терминале.
Categories string(s) 1 Категории, в которых ярлыки программ должны показываться в меню. Категории, зарегистрированные freedesktop.org, перечислены в спецификации freedesktop.org по адресу http://standards.freedesktop.org/menu-spec/latest/apa.html.
NoDisplay boolean 1-3 Запись с ключом "NoDisplay" означает "это приложение есть, но показывать его в меню не нужно". Файлы .desktop, отображение которых в меню отключено, могут быть полезными, например, для того чтобы привязать приложение к каким-то типам MIME, чтобы оно запускалось при выборе из файлового менеджера (или другого приложения) файла с указанным типом MIME, но само приложение в меню не отображалось.
Hidden boolean 1-3 "Hidden" (т.е. "Скрыто") можно было бы по-другому назвать "удалено". Это означает, что пользователь на своём уровне удалил .desktop-файл, но само приложение осталось, и остались .desktop-файлы где-то на более высоком уровне (например, в системных директориях). Это почти эквивалентно тому, как если бы .desktop-файл не существовал вообще - по крайней мере, так должно быть для пользователя. Также это можно использовать для "деинсталляции" существующих файлов - путём установки .desktop-файла с записью "Hidden=true".
OnlyShowIn, NotShowIn string(s) 1-3 В этих ключах указывается список строк, идентифицирующих окружения рабочего стола, в которых данный .desktop-файл должн отображаться (для ключа "OnlyShowIn") или напротив, не должен отображаться (для ключа "NotShowIn"). Только один из этих ключей может присутствовать в группе - или "OnlyShowIn", или "NotShowIn". Более подробно эти ключи описаны в спецификации freedesktop.org по адресу http://standards.freedesktop.org/menu-spec/latest/. Значения, которые эти ключи могут принимать, описаны в спецификации freedesktop.org по адресу http://standards.freedesktop.org/menu-spec/latest/apb.html.
TryExec string 1 Путь к исполняемому файлу на диске, используемый, чтобы определить, действительно ли программа установлена. В случае, если указанный путь не является абсолютным, будет произведён поиск указанного файла в директориях, перечисленных в переменной окружения $PATH. В случае, если файл не будет найден, или он не является исполняемым файлом, .desktop-файл может быть проигнорирован системой (например, не будет отображаться в меню и т.п.).
Actions string(s) 1 Список идентификаторов для действий, выполняемых приложением. Они могут быть использованы, чтобы запустить приложение для выполнения какой-то специфической задачи, отличающейся от поведения приложения при обычном запуске. Действия приложения будут описаны ниже.
MimeType string(s) 1 Список типов MIME, поддерживаемых приложением.
Keywords localestring(s) 1 Список ключевых слов, описывающих приложение, запускаемое данным .desktop-файлом. Может быть использован, например, для облегчения поиска данного .desktop-файла среди других подобных файлов в меню. Значения не предназначены для отображения пользователю. Они не должны просто повторять значения записей с ключами "Name" и "GenericName".
StartupNotify boolean 1 Если есть запись с таким ключом, и в ней установлено значение "true" - это значит, что ТОЧНО ИЗВЕСТНО, что запускаемое приложение посылает сообщение "remove", если оно будет запущено в окружении с установленной переменной "DESKTOP_STARTUP_ID". Если запись имеет значение "false" - это значит, что ТОЧНО ИЗВЕСТНО, что приложение вообще не работает с оповещением о запуске (не показывает никаких окон, не может использовать StartupWMClass, и так далее). Если записи с таким ключом нет - система примет какое-то обоснованное поведение по умолчанию (предположит, что приложение не работает с оповещением о запуске, как если бы ключ был равен "false", или будет использовать StartupWMClass, и т.п.).Более подробные сведения можно получить из описания "Протокола оповещения о запуске приложений" по адресу http://www.freedesktop.org/wiki/Specifications/startup-notification-spec.
StartupWMClass string 1 Если этот ключ указан, системе будет сообщено, что приложение будет отображать как минимум одно окно с указанной строкой, обозначающей WM-класс окна (WM class) или "WM name hint". Более подробные сведения можно получить из описания "Протокола оповещения о запуске приложений" по адресу http://www.freedesktop.org/wiki/Specifications/startup-notification-spec.

Дальнейшее содержание раздела (добавление дополнительных действий приложения, регистрация типов MIME, расширение формата .desktop-файла и т.д.) планируется перевести и добавить позже.