Po dalším průzkumu to nevypadá, že je možné určit relativní cesty pro ikonu v souboru záznamu na ploše, pokud vidím.
Řešením, které jsem použil, bylo přidání následujícího kódu na konec mého skriptu launcher.sh:
mv myapp.desktop myapp.desktop-bak
sed -e "s,Icon=.*,Icon=$PWD/app.svg,g" myapp.desktop-bak > myapp.desktop
rm myapp.desktop-bak
Tím se aktualizuje cesta k ikoně při každém spuštění spouštěcího skriptu, a protože soubor .desktop ukazuje na spouštěcí skript, kliknutím na soubor .desktop se ikona účinně aktualizuje.
Vím, že byste mohli použít cat
nebo možnost -i pro zkrácení výše uvedeného kódu, ale četl jsem, že řešení, které jsem použil, je spolehlivější. Pokud má někdo další informace o tom, napište komentář.
Je pravda, že specifikace FreeDesktop nepovoluje relativní cesty:
Standardní klíče
Icon
Ikona pro zobrazení ve správci souborů, nabídkách atd. Pokud je název absolutní cestou, použije se daný soubor. Pokud název není absolutní cestou, k nalezení ikony bude použit algoritmus popsaný ve specifikaci tématu ikony.
[ . . . ]
Hodnoty typu
iconstring
jsou názvy ikon; mohou to být absolutní cesty nebo symbolické názvy ikon umístěných pomocí algoritmu popsaného ve specifikaci tématu ikony. Takové hodnoty nejsou uživatelsky zobrazitelné a jsou zakódovány v UTF-8.
Řešení je adekvátní, i když pravděpodobně nebude fungovat pro nabídky a spouštěče panelů. Pokud vám však vyhovuje opravovat soubor plochy při spuštění launcher.sh
script, proč vlastně nenainstalovat ikonu? Můžete to udělat ve dvou řádcích:
cp app.svg ~/.local/share/icons/hicolor/48x48/apps/
cp app.svg ~/.local/share/icons/hicolor/scalable/apps/
a poté vložte
Icon=app
v souboru na ploše (app
je pouze název souboru bez přípony souboru).
Toto je zamýšlený mechanismus pro vyhledání ikon, které nemají absolutní cestu, a zajistí, že se ikony zobrazí v nabídkách a vlastních spouštěcích programech. Specifikace říká:
Jste tedy autor aplikací a chcete nainstalovat ikony aplikací tak, aby fungovaly v nabídkách KDE a Gnome. Minimálně byste měli nainstalovat ikonu 48x48 v motivu hicolor. To znamená instalaci souboru PNG do $prefix/share/icons/hicolor/48x48/apps. Volitelně můžete nainstalovat ikony v různých velikostech. Například instalace ikony svg do $prefix/share/icons/hicolor/scalable/apps znamená, že většina počítačů bude mít jednu ikonu, která bude fungovat pro všechny velikosti.
Jedním ze způsobů, jak toho dosáhnout, je xdg-icon-resource
příkaz, např.
$ xdg-icon-resource install --novendor --context apps --size 48 example-app.png
Nicméně xdg-icon-resource
nepodporuje obrázky SVG a v praxi to dělá to samé:
$ cp example-app.svg ~/.local/share/icons/hicolor/48x48/apps/
$ cp example-app.svg ~/.local/share/icons/hicolor/scalable/apps/
(To není překlep:vložte soubor SVG do 48x48/apps
složky a nabídky a panely budou naprosto spokojené.)
U nabídek je vhodné po instalaci aktualizovat mezipaměť ikon.
$ update-icon-caches ~/.local/share/icons
Pak můžete jednoduše zadat iconstring
jako example-app
takhle:
Icon=example-app
Toto není relativní cesta, ale řeší problém nutnosti použít absolutní cestu a nezlomí se, pokud se soubor plochy přesune na jiné místo.
Za to, co stojí za to, byla podpora relativních cest diskutována na seznamu adres FreeDesktop v září 2008:
Magnus Bergmark magnus.bergmark na gmail.com
Út 23. září 01:01:32 PDT 2008
[ . . . ]
Navrhuji, abychom také nějakým způsobem povolili použití relativních cest.
Případy použití
Používám mnoho souborů .directory k tomu, aby adresáře obsahující film měly jako ikonu filmový plakát. Toto chování se může vztahovat na jakoukoli formu médií, jako jsou komiksy, hudba (umělecká alba) a fotografie.
Prodejce může chtít připojit ikonu k části softwaru, kterou redistribuují, a přidat ji k souboru .desktop, který se nemá zobrazovat v nabídce plochy, a proto se stále nachází v adresáři aplikace.
https://lists.freedesktop.org/archives/xdg/2008-September/009940.html
Jediný protiargument, který jsem k tomuto návrhu dokázal najít, je zde:
Soubor .desktop, který není určen k tomu, aby se dostal do standardního adresáře aplikací, je téměř úplně k ničemu. Možná byste se měli podívat na některé návrhy a implementace softwarových balíků a místo toho s nimi pracovat. Další možností jsou skripty xdg utils pro instalaci souboru .desktop a ikon na příslušná místa. Mohu pouze předpokládat, že vaše odinstalovaná aplikace také nemá v úmyslu dodržovat specifikace Témata ikon a Pojmenování ikon. A nepovažuji nastavení ikony adresáře za užitečné. Nastavení ikony pro aktuální spustitelný soubor by bylo mnohem užitečnější, ačkoli binární soubory elfů nemají prostředky jako binární soubory win32.
https://lists.freedesktop.org/archives/xdg/2008-September/009962.html
Související otázky:
- https://askubuntu.com/questions/277190/how-to-package-an-application-icon-properly
- https://unix.stackexchange.com/questions/404955/is-there-a-home-directory-location-for-overriding-icons
- https://unix.stackexchange.com/questions/428992/why-do-freedesktop-desktop-files-not-allow-relative-paths
- https://unix.stackexchange.com/questions/585997/assign-an-icon-to-a-custom-mimetype
Relevantní odkazy:
- https://gitlab.freedesktop.org/xdg/xdg-utils/-/issues/82
- https://bugs.kde.org/show_bug.cgi?id=68507
- https://bugs.kde.org/show_bug.cgi?id=73463
- https://lists.freedesktop.org/archives/xdg/2008-September/009940.html
- https://lists.freedesktop.org/archives/xdg/2011-April/011883.html
- https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html