Как установить значок для расширения файла, портативным способом, без sudo

Как установить значок для расширения файла, портативным способом, без sudo

Я создаю приложение, которое хочетустановить значокдля расширения, специфичного для приложения ( .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

который внутри:

  1. копирует его в ~/.local/share/mime/packages, создавая любые промежуточные каталоги по мере необходимости; и
  2. запускается 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 строки кода пользовательской установкиМне это удавалось.

Связанный контент