So legen Sie das Symbol für eine Dateierweiterung auf portable Weise ohne sudo fest

So legen Sie das Symbol für eine Dateierweiterung auf portable Weise ohne sudo fest

Ich erstelle eine App, dieInstallieren Sie ein Symbolfür eine anwendungsspezifische Erweiterung ( .crystalopen), und zwar auf eine Weise, die nicht nur unter Ubuntu/GNOME funktioniert, sondern auchportierbar auf andere Desktopumgebungenwie KDE.

Die App installiert sich selbst auf ~/.local/bin(und nicht auf /usr/bin), so dass keine Root-Berechtigungen erforderlich sind. Daher möchte ich das Symbolinstalliert innerhalb~/.local/wenn möglich.

Was ich versucht habe

ICHeinen MIME-Typ registrieren( application/vnd.crystal-opener) für die .crystalopenErweiterung, indem Sie ein erstellen, application-vnd.crystal-opener.xmldas wie folgt aussieht:

<?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>

und installieren Sie es mit:

$ xdg-mime install --mode user application-vnd.crystal-opener.xml

was intern:

  1. kopiert es nach ~/.local/share/mime/packagesund erstellt bei Bedarf Zwischenverzeichnisse.
  2. update-mime-database ~/.local/share/mime/wird zum Aktualisieren ausgeführt ~/.local/share/mime/mime.cache.

ICHÜberprüfen Sie, ob der MIME-Typ registriert istindem Sie eine nicht leere 1- Datei mit der Dateierweiterung erstellen und ihren MIME-Typ abfragen:

$ echo OPEN > OPEN.crystalopen
$ xdg-mime query filetype OPEN.crystalopen
application/vnd.crystal-opener

oder gleichwertig (unter GNOME):

$ gio info OPEN.crystalopen | grep standard::content-type
  standard::content-type: application/vnd.crystal-opener

ICHErstellen Sie ein Symbolbildmit dem richtigen Dateinamen für den MIME-Typ 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>

DerSpezifikation des Symbolthemassagt, dass ich ein solches Bild im „hicolor“-Design installieren können sollte, von dem alle anderen Designs erben. Aber das scheint nicht zu funktionieren. Insbesondere, wenn ich Folgendes mache:

$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/hicolor/scalable/mimetypes
$ sudo update-icon-caches /usr/share/icons/*

dann ändert sich das Symbol für die OPEN.crystalopenDatei in der Dateien-App NICHT zum neuen Bild.

Vielleicht implementiert die App „Dateien“ die Themenvererbung nicht richtig? 2

Stattdessen identifiziere ich, welches spezifische Design das Standarddesign des Systems ist, und installiere das Symbol dort, was sich nicht sehr zuverlässig oder portabel anfühlt:

  • ICHKandidaten für das Standarddesign des Systems identifizierenindem Sie nach dem Symbol eines gängigen MIME-Typs suchen, wie 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)
  • Letztendlich Humanitystellte sich heraus, dass dies das Standarddesign für dieses System (Ubuntu 23) ist.

  • Zuerst versuche ich, das Symbol im maschinenweiten Designverzeichnis zu installieren:

$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*
  • Das funktioniert und das Symbol für die OPEN.crystalopenDatei in der Datei-App wird erfolgreich auf das neue Bild aktualisiert.
  • Ich möchte jedochim Theme-Verzeichnis des Benutzers installierenanstatt in das maschinenweite Themenverzeichnis, also mache ich stattdessen Folgendes:
$ 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.crystalopenDas funktioniert auch und das Symbol für die Datei in der App „Dateien“ wird erfolgreich auf das neue Bild aktualisiert . (Obwohl leider sudoeine Aktualisierung des maschinenweiten Symbolcaches erforderlich ist, damit das Symbol sofort vor der nächsten Abmeldung und Anmeldung angezeigt wird.)

Die große Frage

Wie kann ich ein Symbol in einem Benutzerdesignverzeichnis installieren, sodass das Symbol für zugehörige Dateien in der Datei-App zuverlässig und portierbar auf das neue Bild aktualisiert wird?das nicht nur in GNOME, sondern auch in KDE und anderen Desktopumgebungen funktioniert?

Ist es insbesondere möglich, ein Icon zum ~/.local/share/icons/hicolorTheme zu installieren, das imSpezifikation des Symbolthemasals immer verfügbar?


1 Eine leere Datei wird häufig als MIME-Typ erkannt und application/x-zerosizenicht als ein neuer benutzerdefinierter MIME-Typ, der registriert ist.

2 „Nautilus befolgt die Vererbungsregeln [des Themas] nicht“ gemäßhttps://askubuntu.com/a/752316/1724736

Antwort1

Da die Vererbung von Symbolen zwischen Themen nicht richtig zu funktionieren schien, habe ich einfach ein Skript geschrieben, um das Symbol meiner Apps zu installierenalleThemen auf dem System. Chaotisch, aber effektiv.

Bitte beachten Siedie 124 Zeilen des benutzerdefinierten InstallationscodesFrüher habe ich das erreicht.

verwandte Informationen