sudo を使わずに、ポータブルな方法でファイル拡張子のアイコンを設定する方法

sudo を使わずに、ポータブルな方法でファイル拡張子のアイコンを設定する方法

私はアプリを作成していますアイコンをインストールするアプリケーション固有の拡張機能(.crystalopen)は、Ubuntu / GNOMEだけでなく、他のデスクトップ環境に移植可能KDE のように。

アプリは~/.local/bin(ではなく/usr/bin)にインストールされるため、ルート権限は必要ありません。そのため、アイコンインストール済み~/.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>

アイコンテーマ仕様他のすべてのテーマが継承する「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特に、テーマにアイコンをインストールすることは可能ですか?アイコンテーマ仕様常に利用可能でしょうか?


1application/x-zerosize空のファイルは、登録されている新しいカスタム MIME タイプではなく、のような MIME タイプとして認識されることがよくあります。

2「Nautilusは[テーマ]継承ルールに従わない」https://askubuntu.com/a/752316/1724736

答え1

テーマ間のアイコンの継承が正しく機能していないようだったので、アプリのアイコンをインストールするスクリプトを作成しました。全てシステム上のテーマ。乱雑だが効果的。

参照してください124行のカスタムインストールコード私はこれを達成していました。

関連情報