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

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

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

Задача

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

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

7f44e0eed316fb725f9c56561e64d5d2.png

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

3d018a73c8b3d805d2d29fb2dd15d249.png

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

670d8d6f2472d5f1a968f8b4d7c11d0a.png

d04dd3cf72fa357f7e036577220fe81f.gif

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

Решение

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

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

/usr/share/mime/packagese/packages  

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




   
  
   
    КОМПАС-Деталь
       
     
   
    

 

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

  •  — это MIME-группа и MIME-тип, который совместной образуют общий MIME-тип

  •  — указатель расширения файла.

Обновим базу данных 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.

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

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

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

  •  — тип файла, в нашем случае 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/*

e8f09c1c016383e7baf3f78d0bc11769.png

© Habrahabr.ru