3 октября 2010 г.

Изменение системных меню (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.
Это тоже можно найти в спецификации. Аргументов есть ещё несколько.

12 комментариев:

  1. Спасибо, прикольно )

    Кстати у lx панели есть прозрачность и автоскрытие?

    то залез на openbox опять и все таки тк не только мне приходится за компом виснуть, то о панели думаю, чтоб всем хорошо, но хочу быструю и легкую, fb не оч нравится, но вот lx думаю подойдет, конечно могу сам спробывать, но все таки может у тебя есть мнение по этому вопросу, охото узнать если не секрет конечно

    ОтветитьУдалить
  2. У lxpanel настраивается прозрачность, только в настройках панели задач при этом лучше выбрать "плоские кнопки", иначе они будут непрозрачны.
    Автоскрытие тоже задаётся, правда ширина остающейся полоски меньше 2 пикселов не делается, но вроде можно подкрутить в конфигурационном файле.

    ОтветитьУдалить
  3. Очень пригодилась статья. Спасибо ! Ваш блог - однозначно в закладки !!!

    ОтветитьУдалить
  4. На здоровье. Мне приятно, что это кому-то ещё могло пригодиться)

    ОтветитьУдалить
  5. Благодарю. Многое прояснил для себя.

    ОтветитьУдалить
  6. Хороший блог. Хорошие статьи.

    ОтветитьУдалить
  7. Спасибо! Как раз то что искал...

    ОтветитьУдалить