Файлы ярлыков приложений (".desktop") и их меню
В Linux значки и описания программ (приложений) хранятся отдельно от исполняемых файлов. Для GUI-программ составляют "файлы рабочего стола" (desktop files), схожие по назначению с ярлыками в Windows. Более удобного имени нет, поэтому пусть и здесь будут ярлыками.
Расширение - ".desktop"; имя любое. Формат ярлыков схож с форматом файлов ".ini" в Windows. То есть это структурированный текст, разделённый на группы; имя группы в квадратных скобках; в группах заданы строки-параметры вида "ключ=значение"; строка-комментарий начинается с #.
Общие ярлыки приложений хранят в /usr/share/applications; свои - в ~/.local/share/applications. Для примера - сценарий оболочки и его ярлык.
Сценарий:
#/usr/bin/env bash
# Сценарий top10t.sh
# Хранить следует здесь: ~/.local/bin/
# Сделать исполняемым: chmod u+x ~/.local/bin/top10t.sh
# Десять самых жадных до процессора процессов/потоков.
# Процессы отсортированы по убыванию жадности.
# Ежесекундное обновление.
/usr/bin/watch -p -n 1 \
"ps k -%cpu -eL -o pid,comm,%cpu | head"
# Завершить - Ctrl C.
Ярлык:
# ~/.local/share/applications/top10t.sh.desktop
# Общее название группы для всех файлов ".desktop".
# Строка [Desktop Entry] - первая; прочие - в любом порядке.
[Desktop Entry]
# Какой версии спецификации соответствует сам этот файл.
# Свежая - 1.1. Не обязательно.
Version=1.0
# Кодировка самого файла. Обычно - UTF-8.
# Списки есть, например, у iconv. Не обязательно (устарело).
# Encoding=UTF-8
# Тип объекта: Application - приложение;
# Directory - категория; Link - ссылка на ресурс Интернета.
Type=Application
# "Категория" здесь - это заголовок подменю
# в общем меню приложений. Здесь не переводится.
# В значении может быть несколько частей,
# их отделять символом ;.
# И в конце строки рекомендуется поставить символ ;.
# Если символ ; используется сам по себе - экранировать: \;.
Categories=System;Utility;
# Команда для запуска. Желательно указать полный путь.
# Можно короткое имя, если программа доступна через $PATH.
# Если нужно запустить с правами суперпользователя,
# то нужно начинать команду, например, с gksudo -gk.
# Понадобится установить программу gksudo или kdesudo.
Exec=top10t.sh
# Рабочий каталог. Не обязательно.
Path=/home/student
# Нужно ли сначала открыть окно эмулятора терминала,
# а потом запустить в нём значение Exec.
# "Да" - true; "нет" - false. Обычно "нет".
Terminal=true
# Файл значка. Обычно указывают короткое имя без расширения.
# Стандартные форматы файлов: PNG, SVG (SVGZ).
# Значки обычно хранят в /usr/share/icons.
Icon=utilities-terminal
# Нужно ли оповещать о запуске: помигать указателем мыши
# или аплетом списка задач и тому подобное. Обычно "да".
StartupNotify=true
# Название ярлыка, видимое как подпись к значку или
# как имя пункта в меню. Здесь на английском.
Name=Top 10 greedy threads
# Желательно перевести. Список условных обозначений
# языков есть, например, у locale.
Name[ru]=Десять самых жадных потоков
# Описание, обычно видимое как всплывающая подсказка.
Comment=Shows Top 10 cpu eating processes/threads
# Желательно перевести.
Comment[ru]=Показывает 10 самых жрущих ЦПУ процессов/потоков
# Не показывать в меню. Обычно "нет".
# Файловые ассоциации, если есть, будут работать.
NoDisplay=false
# Не показывать в меню, убрать из файловых ассоциаций.
# И вообще сделать вид, что приложения не существует.
# Обычно "нет".
Hidden=false
# Показывать только в указанной рабочей среде:
# GNOME, KDE, Xfce, ещё какие-нибудь через ;.
# OnlyShowIn=GNOME;
# Не показывать в указанных рабочих средах.
# В файле должен быть только один из параметров:
# либо OnlyShowIn, либо NotShowIn.
NotShowIn=KDE;
Такие файлы можно помещать на Рабочий стол по необходимости: перетаскиванием; или же копированием/ссылкой файла в ~/Рабочий стол (англоязычный - ~/Desktop). Расположение каталога рабочего стола может быть указано в файле ~/.config/user-dirs.dirs. Его читает программа xdg-user-dirs-update, создавая указанные каталоги.
Проверить синтаксическую корректность ярлыка можно программой desktop-file-validate.
Если нужно на Рабочий стол добавить каталог, то может быть достаточно символьной ссылки. Или составить ярлык, где в Exec будет имя диспетчера файлов либо xdg-open, а потом аргумент - путь к каталогу:
Exec=xdg-open /home/student/Загрузки
В среде GNOME разработчики пытаются запретить размещение файлов на Рабочем столе. Может понадобиться специальное расширение для GNOME Shell.
Ярлык для адреса Интернета имеет другое значение Type и вместо ключа Exec содержит URL:
# Помимо прочего:
Type=Link
URL=https://www.freedesktop.org/wiki/
Адрес будет открыт браузером по умолчанию. Если нужен другой браузер, следует сделать обычный ярлык с Type=Application, далее в Exec задать имя браузера с аргументом-URL.
Есть сколько-то общепринятых категорий в спецификации к файлам меню: Audio, Education, Graphics, System и другие. Файлы категорий синтаксически аналогичны файлам ярлыков. Расширение - ".directory". Хранят их обычно в /usr/share/desktop-directories. Свои - в ~/.local/share/desktop-directories. Пример файла для категории "Система" (условное имя файла - system.directory). Не используйте его как есть.
[Desktop Entry]
Version=1.0
Type=Directory
Icon=preferences-system
Name=System
Name[ru]=Система
Comment=System tools and utilities
Comment[ru]=Средства администрирования системы
Графическая среда обычно автоматически при запуске каждого сеанса пересобирает меню из имеющихся ярлыков и категорий для каждого пользователя.
Формат файлов меню - XML. Расширение - ".menu". Только пример, без пояснений. Не используйте его как есть.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Menu
PUBLIC '-//freedesktop//DTD Menu 1.0//EN'
'http://standards.freedesktop.org/menu-spec/menu-1.0.dtd'>
<Menu>
<Name>System</Name>
<Directory>system.directory</Directory>
<DefaultAppDirs/>
<DefaultDirectoryDirs/>
<MergeDir>applications-merged</MergeDir>
<Layout>
<Merge type="menus" />
<Filename>top10t.sh.desktop</Filename>
<Merge type="files" />
</Layout>
</Menu>
Проверить синтаксическую корректность меню можно программой xmllint. Все меню не проходят валидацию (не находится DTD), вероятно, из-за беспорядка на сайте FreeDesktop.org.
Редакторы меню для GUI: KMenuEdit для KDE; LXMenuEditor (lxmed) для LXDE, требует Java; MenuLibre для GNOME, XFCE; Mozo для Mate.
Свои меню хранят в ~/.config/menus. Точнее, в $XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu. Здесь XDG_MENU_PREFIX - это "gnome-", "kde-" и тому подобное.
Своё меню вроде как должно перекрывать (заменять собой) автоматическое. Добавочные (не перекрывание, а слияние) меню хранят в $XDG_CONFIG_DIRS/menus/applications-merged/.
Документация: ярлыки; меню. Для семейства программ xdg-* и desktop-* есть man-страницы. XDG (X Desktop Group) - старое название сообщества FreeDesktop.org.
У Debian (и производных) есть своя система меню, отличающаяся от XDG. Эти меню применяют в разных небольших диспетчерах окон: awesome, fvwm, openbox и других. Документация - в пакете menu.
GNU/Linux
1.1K постов15.6K подписчика
Правила сообщества
Все дистрибутивы хороши.
Будьте людьми.