Изменение системных меню (desktop-файлы)

Немного раскрою тему создания и редактирования пунктов системного меню.

Проще всего, конечно, использовать для этого стандартные графические утилиты. Например, подобная в среде Gnome называется alacarte, запускается такой же командой или из меню по пункту Главное меню из раздела Параметры.
alacarte
В KDE есть аналогичная по функционалу программа — kmenuedit.Но могут возникнуть ситуации, где использование подобных инструментов будет невозможно. Например, лично я столкнулась с этой проблемой, когда установила среду LXDE. В ней есть панель (lxpanel) с меню. И в идеале меню там формируется автоматически на основе списка установленных программ, но в моём случае, видимо, что-то пошло не так, и в имевшемся меню не хватало приличного количества пунктов. А графической утилиты для редактирования не предоставляется, более того: почти везде написано, что мол меню само формируется и все установленные программы будут помещены в него. Но ведь оно формируется на основе чего-то, а следовательно, это что-то должно быть можно править как-то напрямую и таким образом влиять на это самое меню.
В ходе подобных изысканий, натолкнулась на информацию о desktop-файлах. Собственно, они-то мне и оказались нужны и именно на их основе в lxde и других средах формируется меню.
Полный охват вопроса не гарантирую, посколько только начала ковырять эту тему, но самые основы тут изложу.

Итак, системное меню формируется на основе всех существующих desktop-файлов. Как несложно догадаться, это файлы с расширением *.desktop.
Лежат все эти файлы в директории /usr/share/applications/. Появлется такой файл там при установке соответствующей программы. Варианты для определённого пользователя хранятся внутри его домашней директории по адресу ~/.local/share/applications/.
Соответственно, прежде всего используются файлы из домашней директории, а всё остальное из общей. И если нужно что-то исправить, то лучше всего это делать именно в файлах из домашней папки.
Хотя тут зависит и от задачи. Может понадобиться, например, создать пункт меню для всех пользователей системы. Тогда, конечно, надо работать с общей папкой с правами суперпользователя. Но нужно учитывать, что файлы из домашней директории точно не будут затронуты при обновлениях, а вот насчёт директории /usr/share/ я не поручусь.

Проще всего понять, как работать с desktop-файлами, просто посмотрев содержание одного из них. Щелчком на таком файле в файловом менеджере не всегда получится его открыть — у меня из наутилуса заупускается соответствующая программа (на которую ссылается сам файл) и через контекстное меню выбрать нужную программу для открытия тоже нельзя, но файл открывается из текстового редактора (через меню «Открыть») или из консоли.
Вот, например, содержание файла baobab.desktop:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Disk Usage Analyzer
Comment=Check folder sizes and available disk space
Exec=baobab
Icon=baobab
Terminal=false
Categories=GTK;GNOME;Utility;
NotShowIn=KDE;

Строки не обязательно должны быть только эти и не обязательно все эти, но для начала сгодятся. Все строки, кроме первой, имеют вид Ключ=Значение. Соответственно количество возможных ключей ограничено и они описаны спецификацией. А значения могут быть различными, общие требования — в них не должны использоваться зарезервированные символы ;, #, \, а если используются, то должны быть экранированы символом \. Значений у одного ключа может быть несколько и они должны быть разделены точкой с запятой. Игнорируются пустые строки и начинающиеся с решётки (закомментированные). Порядок строк может быть любым, кроме первой, которая всегда должна быть первой.
Теперь разберём по строкам:

  • [Desktop Entry] — такая строка должна быть в начале любого desktop-файла по спецификации формата
  • Encoding= — указывает кодировку файла; практически всегда это UTF-8
  • Type= — тип пункта, описываемого файлом; почти всегда это Application — приложение, но может быть ещё Link или Directory (ссылка или директория)
  • Name=
  • — название приложение, которое будет отображаться в меню, если не настроена локализация интерфейса или не указано при этом название на языке локализации

  • Comment= — описание пункта (появляется, например, при наведении на пункт меню в Gnome)
  • Exeс= — команда запуска приложения; пишется либо полный пусть к исполняемому файлу, либо просто название — тогда файл с таким названием система сама будет искать по путям, указанным в системной переменной PATH (обычно туда входят, например, /bin/ и /usr/bin/)
  • Icon= — иконка приложения; можно указывать или полный путь к файлу иконки, или просто название — тогда иконка будет браться из текущей темы иконок системы, если такая там есть (темы лежат в /usr/share/icons/ или в ~/.icons/)
  • Terminal= — задаёт, будет ли приложение запускаться в терминале или нет; в данном случае приложение не консольное, поэтому значение false, иначе было бы true
  • Categories= — группа в меню, где будет находится приложение; в данном примере — группа Utility (в русском варианте интерфейса — Стандартные), остальные группы имеют отношение к создаваемым меню в различных средах, отличных от Gnome (подробно рассматривать эту тему слишком долго)
  • NotShowIn= — определяет, в каких средах данного пункта меню не будет видно; в данном случае анализатор диска — стандартная утилита Gnome, поэтому её не видно в KDE, что, впрочем, можно исправить как раз редактированием этого desktop-файла

Другие возможные строки:

  • Name[ru]= — название приложения на русском языке (понятно, что для других языков ключ выглядит похоже, но с другими значениями в квадратных скобках)
  • Comment[ru]= — то же самое, что выше, только для описания пункта меню
  • NoDisplay= — если значение true, пукт меню будет скрыт
  • Hidden= — если значение true, пукт меню будет скрыт и невозможно будет открыть этим приложением какой-либо файл из файлового менеджера
  • OnlyShowIn= — при использовании нескольких сред, определяет в какой среде исключительно будет видно данный пункт в меню

Есть и ещё несколько ключей, о которых можно прочитать в спецификации данного формата.

Для начала, я воспользовалась данной информацией, чтобы поместить значок запуска программы ДубльГис в системное меню гнома. Программа идёт под вайном и сама ярлык не создаёт, поэтому нужно создать файл ~/.local/share/applications/2gis.desktop следующего содержания:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Categories=
Exec="/home/opossum/.wine/drive_c/Program Files/2gis/3.0/grym.exe"
Icon="/home/opossum/.icons/2gis"
Terminal=false
Name=2gis
Name[ru]=ДубльГис

Если категория не определена, как тут, то приложение будет помещено в подпункт меню «Прочие». Иконка, естественно, должна быть помещена по тому пути, что прописан в файле.

Ещё, пожалуй, стоит сказать о строке запуска. В значении ключа Exec после команды запуска программы могут находиться некоторые аргументы. Впервые я с ними столкнулась, когда просто редактировала пункты меню Gnome через программу alacarte и никто не смог ответить, что же это такое. Поиск тогда тоже результата не дал, а сейчас как-то нашлось само.
Так вот эти аргументы имеют отношение больше не к пункту, отображаемому в меню, а к контекстному меню файлового менеджера.

  • %f — один файл
  • %F — список файлов
  • %u — одна ссылка (URL)
  • %U — список ссылок

То есть из контекстного меню файлового менеджера можно будет открыть только один файл какой-либо программой, если в строке Exec её desktop-файла проставлен аргумент %f, и можно будет открыть сразу несколько файлов (если программа это позволяет), выделив их и выбрав соответствующий пункт контекстного меню, если в desktop-файле прописан аргумент %F.
Это тоже можно найти в спецификации. Аргументов есть ещё несколько.

Добавить комментарий