Как указать значок с ОТНОСИТЕЛЬНЫМ путем для файла записи на рабочем столе Linux?

Для одного из моих приложений для Linux у меня есть двоичный файл приложения, сценарий launcher.sh (для LD_LIBRARY_PATH) и файл .desktop — все в одной папке.

Я хотел бы использовать относительный путь, а не абсолютный путь для значка.

Я пробовал:

Icon=app.svg
Icon=./app.svg
Icon=$PWD/app.svg
Icon=$(dirname %k)/app.svg

но ни один из них не работает (только Icon=/path/to/app.svg). Если невозможно указать относительный путь и я должен использовать обходной путь, я подумал, что могу регенерировать путь к значку в файле .desktop каждый раз, когда запускается сценарий launcher.sh.

Как лучше всего это сделать? Возможно, с помощью sed или какой-либо другой заменяющей утилиты с псевдорегулярным выражением, например Icon=([valid path chars]+)\n?


person Jake Petroules    schedule 10.08.2010    source источник


Ответы (3)


После проведения дополнительных исследований, насколько я понимаю, невозможно указать относительные пути для значка в файле записи на рабочем столе.

Обходной путь, который я использовал, состоял в том, чтобы добавить следующий код в конец моего сценария 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

Это будет обновлять путь к значку каждый раз, когда запускается сценарий запуска, а поскольку файл .desktop указывает на сценарий запуска, щелчок по файлу .desktop эффективно обновляет его значок.

Я знаю, что вы можете использовать cat или параметр -i, чтобы сократить приведенный выше код, но я читал, что решение, которое я использовал, более надежно. Если у кого-то есть дополнительная информация об этом, пожалуйста, оставьте комментарий.

person Jake Petroules    schedule 12.08.2010
comment
Спасибо за это ... тем не менее, это отстойная спецификация. - person sk29910; 11.08.2011
comment
Конечно... Я не могу поверить, что никто не подумал о добавлении поддержки относительного пути (очевидно). - person Jake Petroules; 12.08.2011
comment
Ну, я где-то читал, что это проблема безопасности: что, если вы переместите файл .desktop и случайно откроете исполняемый файл, отличный от того, который вы думали ... и я думаю, это справедливое замечание. Но тогда другой способ указать значки был бы хорош. - person sk29910; 12.08.2011
comment
Это должно отлично работать с этим вопросом/ответом askubuntu.com/a/345123/112263. - person CrandellWS; 29.03.2014
comment
Разве это не будет сломано, пока не запустится один раз? Так что он просто сломан, потому что он не может зафиксироваться в рабочем состоянии ... Я думаю, вы исправляете только путь к значку, а не путь exec. - person ThorSummoner; 09.08.2019
comment
Я не могу поверить во все эти обходные пути только для того, чтобы иконка работала. И действительно, он даже не работает, пока вы не запустите файл рабочего стола в первый раз. Подобные вещи не позволяют Linux доминировать на настольных компьютерах. - person Juan Gonzalez Burgos; 17.12.2020

Это правда, что спецификация FreeDesktop не разрешает относительные пути:

Стандартные ключи

Icon

Значок для отображения в файловом менеджере, меню и т. д. Если имя представляет собой абсолютный путь, будет использоваться данный файл. Если имя не является абсолютным путем, алгоритм, описанный в Спецификации темы значков будет использоваться для поиска значка.

[ . . . ]

Значения типа iconstring — это имена иконок; это могут быть абсолютные пути или символические имена для значков, расположенных с использованием алгоритма, описанного в теме значков. Спецификация. Такие значения не отображаются пользователем и кодируются в UTF-8.

Обходной путь является адекватным, хотя он, вероятно, не будет работать для меню и панелей запуска. Но если вам удобно исправлять файл рабочего стола при запуске скрипта launcher.sh, почему бы не установить значок? Вы можете сделать это в две строки:

cp app.svg ~/.local/share/icons/hicolor/48x48/apps/
cp app.svg ~/.local/share/icons/hicolor/scalable/apps/

а потом поставить

Icon=app

в файле рабочего стола (app — это просто имя файла без расширения).

Это предполагаемый механизм для поиска значков, у которых нет абсолютного пути, и он обеспечит отображение значков в меню и пользовательских средствах запуска. В спецификации говорится следующее:

Итак, вы автор приложения и хотите установить значки приложений, чтобы они работали в меню KDE и Gnome. Как минимум вы должны установить иконку 48x48 в теме hicolor. Это означает установку файла PNG в $prefix/share/icons/hicolor/48x48/apps. По желанию можно установить иконки разных размеров. Например, установка значка svg в $prefix/share/icons/hicolor/scalable/apps означает, что на большинстве рабочих столов будет один значок, который подходит для всех размеров.

Один из способов сделать это — использовать команду xdg-icon-resource, например

$ xdg-icon-resource install --novendor --context apps --size 48 example-app.png

Однако xdg-icon-resource не поддерживает изображения SVG, и на практике это выполняет то же самое:

$ cp example-app.svg ~/.local/share/icons/hicolor/48x48/apps/
$ cp example-app.svg ~/.local/share/icons/hicolor/scalable/apps/

(Это не опечатка: поместите файл SVG в папку 48x48/apps, и меню и панели будут совершенно счастливы.)

Для меню рекомендуется обновить кеш значков после установки.

$ update-icon-caches ~/.local/share/icons

Затем вы можете просто указать iconstring как example-app следующим образом:

Icon=example-app

Это не относительный путь, но он решает проблему использования абсолютного пути и не сломается, если файл рабочего стола будет перемещен в другое место.

Что бы это ни стоило, поддержка относительных путей обсуждалась в списке рассылки FreeDesktop еще в сентябре 2008 года:

Магнус Бергмарк magnus.bergmark на gmail.com

Вт 23 сен 01:01:32 PDT 2008

[ . . . ]

Я предлагаю также каким-то образом разрешить использование относительных путей.

Случаи использования

  1. Я использую много файлов .directory, чтобы каталоги, содержащие фильм, имели постер фильма в качестве значка. Такое поведение может применяться к любым формам медиа, таким как комиксы, музыка (обложки альбомов) и фотографии.

  2. Поставщик может захотеть связать значок с частью программного обеспечения, которое они распространяют, с файлом .desktop, который не должен отображаться в меню рабочего стола и, следовательно, все еще находится в каталоге приложения.

https://lists.freedesktop.org/archives/xdg/2008-September/009940.html

Единственный контраргумент, который я смог найти на это предложение, находится здесь:

Файл .desktop, который не предназначен для размещения в стандартном каталоге приложений, почти полностью бесполезен. Возможно, вам следует взглянуть на некоторые из предложений и реализаций пакетов программного обеспечения и вместо этого работать с ними. Другой вариант — скрипты xdg utils для установки файла .desktop и значков в соответствующие места. Я могу только предположить, что ваше удаленное приложение также не намерено следовать спецификациям темы значков и именования значков. И я не считаю настройку значка каталога действительно полезной. Установка значка для фактического исполняемого файла была бы гораздо полезнее, хотя двоичные файлы elf не имеют ресурсов, как двоичные файлы win32.

https://lists.freedesktop.org/archives/xdg/2008-September/009962.html

Связанные вопросы:

Соответствующие ссылки:

person Nathaniel M. Beaver    schedule 04.08.2020

Вы можете использовать echo $(echo ~) для использования вывода команды или echo $(echo $var) для переменных

Например:

echo "Icon=$(echo ~)/Pictures/Icons/whatsapp-webapp.svg" > path/to/file.desktop 

Если вас интересует многострочная команда echo, перейдите по этой ссылке< /а>

person Yedhrab    schedule 26.05.2019