Добавление пользовательских иконок для типов MIME в Linux

от автора

Привет! Меня зовут Станислав Ермохин, я руководитель группы методического обеспечения в команде КОМПАС-3D.

По ходу подготовки версии КОМПАС-3D для Linux мы встречаемся с «очевидными и невероятными» ситуациями. Решением одной из них решили поделиться. Тем более, что в Рунете не удалось найти достаточно полного описания, как назначать пользовательские иконки для файлов. Вся информация разрозненная, отрывочная или устаревшая. 

Задача

КОМПАС-3D во время своей работы позволяет создавать собственные документы:

  • Деталь

  • Сборка

  • Чертеж

  • Фрагмент

  • Текстовый

  • Спецификация

    и другие специальные документы.

Каждый из типов документов имеет свою иконку, когда мы просматриваем файлы в Проводнике.

Кроме этого, система работает со множеством собственных служебных файлов (стили линий, стили оформлений документов, пользовательские меню и др.), у которых тоже свои иконки.

Это мы смотрели в Windows. А вот, например, как файл .a3d (КОМПАС-Сборка) отображается в моём файловом менеджере в Debian 12.6.

Иконка совсем не отражает сути содержимого файла. А наши пользователи в Windows привыкли к отображению иконок предопределённых файлов, и мы не хотим их лишать этой возможности.

Решение

Во-первых, делаем расширение файла известным для ОС.

А это делается созданием файла .xml в папке —

/usr/share/mime/packages

Для каждого типа файла, к которому мы хотим добавить определение и значок, необходимо добавить соответствующий xml-файл. Давайте посмотрим на файл m3d.xml, который я создал для демонстрации:

<?xml version="1.0" encoding="UTF-8"?>  <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">       <mime-type type="model/m3d">         <comment>КОМПАС-Деталь</comment>              <glob pattern="*.m3d"/>         </mime-type>   </mime-info>

Важная часть здесь:

  • <mime-type type="model/m3d"> — это MIME-группа и MIME-тип, который совместной образуют общий MIME-тип

  • <glob pattern="*.m3d"/> — указатель расширения файла.

Обновим базу данных MIME, чтобы присвоить определённые нами типы MIME файла, заканчивающиеся на указанные нами расширения. Это можно сделать с помощью команды —

sudo update-mime-database /usr/share/mime

Это сгенерирует папку с нашим определением типа MIME xml в /usr/share/mime/

Примерно так это выглядит у меня:

[root@vbox mime]# tree model model ├── 3mf.xml ├── gltf-binary.xml ├── gltf+json.xml ├── iges.xml ├── m3d.xml

Последний шаг — подготовка иконки .svg и подключение её к нашему типу MIME.

И здесь очень важно следовать синтаксису наименования файла, который доложен строить так <mimetype-group>-<mimetype>.svg , где:

  • <mimetype-group> — тип группы, в нашем случае model

  • разделитель «дефис»

  • <mimetype> — тип файла, в нашем случае m3d

Получился файл model-m3d.svg, который мы копируем в /usr/share/icons/hicolor/scalable/mimetypes/. Иконки кладём в hicolor , потому что они применяются ко всем темам, которые не имеют своей иконки с таким же именем и не надо мучить темы.

И напоследок нам нужно обновить базу данных иконок. Для этого вводим в Debian/Ubuntu или их аналогах —

sudo update-icon-caches /usr/share/icons/*

в Red Hat/Fedora или их аналогах —

sudo gtk-update-icon-cache /usr/share/icons/*

Исходник решения найден в статье https://luca-junge.de/posts/adding-custom-icons-for-mime-types-on-linux/


ссылка на оригинал статьи https://habr.com/ru/articles/858588/