
Я создаю приложение, которое хочетустановить значокдля расширения, специфичного для приложения ( .crystalopen
), таким образом, чтобы это работало не только в Ubuntu/GNOME, но такжепереносимость в другие среды рабочего столакак KDE.
Приложение устанавливается в ~/.local/bin
(а не в /usr/bin
), поэтому права root не требуются. Поэтому я хотел бы, чтобы значокустановлен внутри~/.local/
если возможно.
Что я пробовал
язарегистрировать тип MIME( application/vnd.crystal-opener
) для .crystalopen
расширения, создав , application-vnd.crystal-opener.xml
который выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="application/vnd.crystal-opener">
<comment>Crystal Opener</comment>
<glob pattern="*.crystalopen"/>
</mime-type>
</mime-info>
и установка его с помощью:
$ xdg-mime install --mode user application-vnd.crystal-opener.xml
который внутри:
- копирует его в
~/.local/share/mime/packages
, создавая любые промежуточные каталоги по мере необходимости; и - запускается
update-mime-database ~/.local/share/mime/
для обновления~/.local/share/mime/mime.cache
.
яубедитесь, что тип MIME зарегистрированпутем создания непустого файла 1 с расширением файла и запроса его типа MIME:
$ echo OPEN > OPEN.crystalopen
$ xdg-mime query filetype OPEN.crystalopen
application/vnd.crystal-opener
или эквивалентно (в GNOME):
$ gio info OPEN.crystalopen | grep standard::content-type
standard::content-type: application/vnd.crystal-opener
ясоздать иконку изображенияс правильным именем файла для типа MIME application-vnd.crystal-opener.svg
:
<svg height="128" width="128">
<ellipse cx="43" cy="32" rx="32" ry="32" style="fill:red" />
<ellipse cx="84" cy="32" rx="32" ry="32" style="fill:green" />
</svg>
TheСпецификация темы иконокговорит, что я должен иметь возможность установить такое изображение в теме "hicolor", от которой наследуются все остальные темы. Но это, похоже, не работает. В частности, если я делаю следующее:
$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/hicolor/scalable/mimetypes
$ sudo update-icon-caches /usr/share/icons/*
то значок файла OPEN.crystalopen
в приложении «Файлы» НЕ изменится на новое изображение.
Возможно, приложение «Файлы» некорректно реализует наследование тем? 2
Вместо этого я определяю, какая конкретная тема является темой системы по умолчанию, и устанавливаю значок туда, что не кажется надежным или переносимым:
- яопределить кандидатов на тему системы по умолчаниюпоискав значок общего типа MIME, например
text/html
:
$ find /usr/share/icons -name 'text-html.*'
/usr/share/icons/Yaru/... (10 lines)
/usr/share/icons/HighContrast/... (1 line)
/usr/share/icons/Humanity/... (7 lines)
В конечном итоге
Humanity
это оказалась системная тема по умолчанию для этой системы (Ubuntu 23).Сначала я пытаюсь установить значок в каталог темы для всей машины:
$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*
- Это сработало, значок файла
OPEN.crystalopen
в приложении «Файлы» успешно обновился до нового изображения. - Однако я хочуустановить в каталог темы пользователяа не в каталог тем для всей машины, поэтому я делаю так:
$ mkdir -p ~/.local/share/icons/Humanity/mimes/256
$ cp application-vnd.crystal-opener.svg ~/.local/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/* # not sufficient to update: ~/.local/share/icons/*
- Это также работает, успешно обновляя значок файла
OPEN.crystalopen
в приложении «Файлы» на новое изображение. (Хотя, к сожалению,sudo
требуется обновить кэш значков на уровне всего компьютера, чтобы значок отображался немедленно, до следующего выхода из системы и входа в систему.)
Большой вопрос
Как установить значок в каталог пользовательской темы таким образом, чтобы значок для связанных файлов в приложении «Файлы» обновлялся до нового изображения, надежным и портативным способом?который будет работать не только в GNOME, но и в KDE и других средах рабочего стола?
В частности, возможно ли установить иконку к ~/.local/share/icons/hicolor
теме, которая задокументирована вСпецификация темы иконоккак всегда доступный?
1 Пустой файл часто распознается как тип MIME, application/x-zerosize
а не как любой новый зарегистрированный пользовательский тип MIME.
2 «Nautilus не подчиняется правилам наследования [темы]» согласноhttps://askubuntu.com/a/752316/1724736
решение1
Поскольку наследование иконок между темами, похоже, работало некорректно, я просто написал скрипт для установки иконок моих приложенийвсетемы в системе. Грязно, но эффективно.
Пожалуйста, посмотри124 строки кода пользовательской установкиМне это удавалось.