LINUX.ORG.RU

Возможно ли как-то подсунуть иконку пусковому файлу без установки?

 ,


0

1

В Windows назначить иконку exe-шнику не вызывает вопросов, так как картинки можно поместить внутрь файла. В Unix-е же я вижу, что нужно использовать некий файл .desktop, который надо поместить в определенное место, потом внутри прописать путь к файлу иконок (не понимаю, почему путь только один, ведь иконок может быть много для разных размеров). И как бы очевидно, что для всего этого нужна установка программы. Кроме того, как я понимаю, всё это опять же привязывается к конкретному пути, по которому находится программа и если папку переместить, то опять всё перестанет работать. Видимо ответ на мой вопрос «нет», но на всякий случай решил уточнить.



Последнее исправление: Dimez (всего исправлений: 1)

Что такое «установка»? Копирование в /usr? Можно этого не делать. .desktop файл может ссылаться откуда угодно куда угодно по относительным или абсолютным путям. Иконки там прописываются один раз для всех размеров потому что Icon=foo это /usr/share/icons/hicolor/{16x16,256x256,...}/apps/foo.png, но в XXI веке иконка одна /usr/share/icons/hicolor/scalable/apps/foo.svg. Там также можно прописать путь к конкретному файлу Icon=./foo.svg.

anonymous
()

как бы очевидно, что для всего этого нужна установка программы

Как бы нет, не очевидно, и не нужна. Это простой текстовый файл, описание формата тут, никто не мешает его сочинить в блокноте не имея самой установленной программы. А иконки уже давно принято в виде svg хранить, что расшифровывается как scalable vector graphic.

Jameson ★★★★★
()

Кроме того, как я понимаю, всё это опять же привязывается к конкретному пути, по которому находится программа и если папку переместить, то опять всё перестанет работать.

.desktop может в относительные пути.

В Unix-е же я вижу, что нужно использовать некий файл .desktop, который надо поместить в определенное место, потом внутри прописать путь к файлу иконок (не понимаю, почему путь только один, ведь иконок может быть много для разных размеров).

Просто открой любой такой типичный и посмотри, что написано. Это просто текстовый файл, по сути-то.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

.desktop может в относительные пути.

ОК, но этот .desktop надо же в определенное место класть ? Не… если его можно сунуть в папку с собственной программой и это сработает, тогда, конечно, всё сразу становится понятно.

Просто открой любой такой типичный и посмотри, что написано.

Да я сначала посмотрел, прежде чем спрашивать. Но после Windows-а вся эта логика Unix-ов тяжело заходит.

Вот исходя из того, что я услышал, я могу предположить следующее… этот .desktop можно положить в папку с программой и туда же положить иконки. И вот тогда будет работать даже при перемещении папки с программой.

Odin_KG
() автор топика
Ответ на: комментарий от anonymous

Что такое «установка»? Копирование в /usr?

Видимо да.

Иконки там прописываются один раз для всех размеров потому что Icon=foo это /usr/share/icons/hicolor/{16x16,256x256,…}/apps/foo.png

Вопрос… а могут эти png лежать в папке с программой, куда мне очень хочется засунуть и .desktop ? Тогда будет понятная мне аналогия с Windows

но в XXI веке иконка одна /usr/share/icons/hicolor/scalable/apps/foo.svg., где просто ресурсы вынесены наружу.

Мне очень желательно, чтобы иконка была в виде png. Это долго объяснять, но я если вкратце, то я могу, например, собрать руками файл ico, но я не знаю как собрать svg. Т.е. иконку я генерирую из набора картинок и это важное условие.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Да, можно и так. Тогда при заходе любым гуёвым файловым манагером в директорию с прогой ты будешь там видеть иконочку её запускающую. А дальше ты можешь уже на этот .desktop файл сделать «ярлык», в виндовой терминологии, на рабочий стол, в меню твоего WM\DE или куда там тебе будет удобно...

Jameson ★★★★★
()
Ответ на: комментарий от Jameson

Да, можно и так.

Это радует. Только есть ещё один непонятный момент. Как всё же указывать путь к нескольким png ? Единственное что пока в голову приходит, это Icon=./Icon/foo Потом создать папку Icon в той же папке и внутри сделать ещё папки типа 16x16, 32x32 и т.д. А потом в каждую положить foo.png соответствующего размера. Это верная логика ?

И ещё один познавательный вопрос. Зачем на Unix-е всё пихают по разным папкам ? Т.е. программа в одном месте, .desktop в другом, а сами иконки в третьем. Просто это сбивает невероятно, потому как зачем всё это размазывать по всей OS… я просто не понимаю. Куда лучше, когда всё, что от носится к одной программе лежит в её родной папке.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Это верная логика ?

Да. Но лучше всё таки оттранслировать иконку в векторы и сохранить в svg. 21 век на дворе, космические корабли запускают частники, а у тебя до сих пор иконки разных калибров в png хранятся.

Зачем на Unix-е всё пихают по разным папкам ?

Так исторически сложилось, ну и https://ru.wikipedia.org/wiki/FHS

Куда лучше, когда всё, что от носится к одной программе лежит в её родной папке.

Не факт, это дискуссионный вопрос. Например несколько программ могут использовать общую разделяемую библиотеку, и не одну при этом. А вообще это работа пакетного менеджера, помнить что он куда положил и при удалении это подтереть. Юзеру тонкости реализации должны быть неинтересны. Это в винде была проблема с тем что у каждой софтины свой установщик, который не всегда может при удалении убрать там где насрал, и юзер иногда вынужден ручками подчищать за ним какули в Program files и реестре. В Линукс такого обычно не происходит, если ставить софт штатным образом через пакетный манагер. Вообще есть дистрибутив реализующий привычный тебе «виндовый подход», я его название забыл, но тут напомнят. А есть ещё более экзотический NixOS, со своей инопланетной реализацией этого всего, придуманный разумными кальмарами с Альдебарана.

И пожалуйста, не ставь пробел перед "?". Ты же перед точкой и запятой его не ставишь, чем знак вопроса отличается? Глаза от этого болят, и да, я душный.

Jameson ★★★★★
()
Последнее исправление: Jameson (всего исправлений: 5)
Ответ на: комментарий от Jameson

Что-то пока не получилось. Вроде стало всё понятно, но всё равно не работает.

Мой файл Manual.desktop сейчас выглядит так:

[Desktop Entry]

Type=Application

Categories=Utility;

Exec=/root/Development/mtest/Manual/ExpUnix/Manual

Terminal=false

Icon=/root/Development/mtest/Manual/ExpUnix/res/icon (была попытка с icon.png, но тоже не помогает)

Name=Magic Manual

NoDisplay=false

Hidden=false

Я написал абсолютные пути, потому что понадеялся, что хоть так заработает, но нет. Сама программа лежит тут: /root/Development/mtest/Manual/ExpUnix/Manual, т.е. Manual - это уже пусковой файл. Это папка, где лежат папки с иконками: /root/Development/mtest/Manual/ExpUnix/res Я сделал там множество папок типа 16x16, 32x32 и т.д и в каждую поместил icon.png. Есть также вариант, когда в папке с размером сначала лежит папка apps, а уже внутри неё icon.png. Также в res пытался создать hicolor и всё это загнать туда, но опять результат нулевой - на пусковом файле иконки не видно. Правда, при щелчке по Manual.desktop происходит нормальный запуск.

Но лучше всё таки оттранслировать иконку в векторы и сохранить в svg.

Ну, они же не только у меня так хранятся, а во всем Windows и, по моему, на Mac-е тоже.

В любом случае, я не могу это сделать, потому что не знаю как сохранить svg ручками, а по другому у меня тут никак.

Например несколько программ могут использовать общую разделяемую библиотеку

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

И пожалуйста, не ставь пробел перед «?»

Хм… всегда ставил и мне кажется, что так гораздо красивее. Но чтобы вас не нервировать могу временно воздержаться.

Odin_KG
() автор топика

В Windows назначить иконку exe-шнику не вызывает вопросов, так как картинки можно поместить внутрь файла.

Никогда об этом не задумывался, но на сколько понимаю в linux elf файлы не могут содержать иконки которые будут отображаться на превью. Отсюда свистопляски с desktop файлами.

Kolins ★★★★
()
Ответ на: комментарий от Kolins

Содержать то, конечно, могут. А вот «отображаться в превью» - нет, ведь линукс вообще ничего не рисует, это ядро. А что там реализовано в разных файловых менеджерах по-разному - надо смотреть. Можешь, в конце концов, свой написать, который берёт и рисует иконки из elf-секций.

Файловый менеджер, который я использую (mc), например, вообще никакие иконки к файлам не рисует.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Odin_KG

Ещё кэш необходимо обновлять каждый раз, при изменении иконок и их путей.

update-icon-caches
# или
update-icon-caches ~/.local/share/icons/*
IIIypuk ★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 2)
Ответ на: комментарий от IIIypuk

Команда update-icon-caches вообще отсутствует, но есть похожая gtk-update-icon-cache, которая при применении к моей папке выдает: No theme index file. Короче я не понимаю, как вы тут программируете - нет общих правил, а есть принцип «везде маленько по разному».

Odin_KG
() автор топика
Ответ на: комментарий от firkax

А что там реализовано в разных файловых менеджерах по-разному - надо смотреть.

Т.е. я изначально верно написал, что ответ «нет»? Просто тут меня люди убедили в том, что «нет проблем». Но пока я не добился результата.

Можешь, в конце концов, свой написать, который берёт и рисует иконки из elf-секций.

Ага… в Unix-ах и так 100 разных версий одного и того же - давайте сделаем версию номер 101, чтобы ещё больше добавить идиотизма в происходящее.

Odin_KG
() автор топика
Ответ на: комментарий от piyavking

У меня кастомные иконки лежат в ~/.local/share/icons, никаких путей к ним в desktop-файле не прописываю

А .desktop куда кладёте ?

Ну, и как иконки попадают в ~/.local/share/icons без установки программы в виде пакета? Не… я могу, конечно, скопировать при первом запуске программы, но это как-то выглядит не очень классно, ведь иконки там останутся если папку с программой просто удалить.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Короче я не понимаю, как вы тут программируете - нет общих правил, а есть принцип «везде маленько по разному».

Мы программируем очень просто - мы пишем и пользуемся СПО, и все пайплайны для этого процесса отточены и работают как часы. В частности, софт ставится в ${PREFIX}/bin, иконки в ${PREFIX}/share/icons а .desktop файлы в ${PREFIX}/share/applications. Иконка указывается по имени (а не пути), и софт сам выбирает иконку удобного ему размера или svg из всего набора того что есть в share/icons.

Проблемы с этим испытывают только враги, пытающиеся в нашей экосистеме распространять проприетарную малварь, или дурачки которые не могут осознать принятый у нас подход. Поймите, то что вы испытываете проблемы - это намеренно.

anonymous
()
Ответ на: комментарий от anonymous

Мой изначальный вопрос был: можно ли иконки и .desktop поместить в папку с проектом? Я сам же и предположил, что нельзя, потому что всё надо распихивать по разным папкам (мне пофиг по каким, но сам подход именно такой). Вы мой вопрос изначальный читали? Я и без вас понимаю, что если всё положить по конкретным папкам, то сработает. Пришли люди и убедили меня, что-таки можнои в одну папку. Теперь приходите вы и опять говорите, что нельзя. Да вы сами тут не знаете, что можно, а что нет, насколько я понимаю. Потому что имеется расхождение во мнениях, которое лично меня очень путает.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Т.е. я изначально верно написал

Ты формально верно написал, но кардинально неверно понимаешь ситуацию. А именно: линукс вообще не занимается рисованием какого бы то ни было графического интерфейса. Это делают программы. Соответственно, вопрос надо задавать «умеет ли такая-то программа рисовать иконки из ELF». И .desktop-файлы это тоже всего лишь какие-то проги заявили что будут поддерживать этот формат. У меня вот например эти файлы поддерживаются только в качестве аналога симлинков в рисовалке меню (никаких иконок).

Ага… в Unix-ах и так 100 разных версий одного и того же - давайте сделаем версию номер 101, чтобы ещё больше добавить идиотизма в происходящее.

Ну да, после винды, где гуи относительно стандартизировано, это может запутать. Но это так - ОС ты выбираешь отдельно, графическую среду к ней - отдельно.

firkax ★★★★★
()
Ответ на: комментарий от Odin_KG

Мой изначальный вопрос был: можно ли иконки и .desktop поместить в папку с проектом?

Тебе на него уже ответили.

Теперь приходите вы и опять говорите, что нельзя

Я такого не говорил. Я отвечал исключительно про твои типичные для пришлого фрустрации и обвинения:

нет общих правил, а есть принцип «везде маленько по разному».

чтобы ещё больше добавить идиотизма в происходящее

которое лично меня очень путает.

Всё предельно логично если распространяешь СПО как принято в экосистеме. Не хочешь - ковыряйся и страдай. Хотя я лично не понимаю что у тебя не работает.

anonymous
()
Ответ на: комментарий от anonymous

Тебе на него уже ответили.

Мне ответили сначала что можно, а потом что нельзя. Эти 2 ответа в сумме дают нулевую информацию. Но я честно попробовал и у меня не получилось, хотя может я что-то сделал не так.

Я отвечал исключительно про твои типичные для пришлого фрустрации и обвинения:

Зачем вообще было писать не по делу, и устраивать глупый холивар.

Всё предельно логично если распространяешь СПО как принято в экосистеме.

Меня это устраивает - кидаем иконки в папку и пишем readme типа «не моё дело - так принято в местной экосистеме, а кто хочет увидеть как выглядит иконка на приложении - собирайте пакет и устанавливайте». Для меня это самый простой вариант. Просто мне как-то трудно такое принять. Но видимо так и будет.

Odin_KG
() автор топика
Ответ на: комментарий от firkax

У меня вот например эти файлы поддерживаются только в качестве аналога симлинков в рисовалке меню (никаких иконок).

А вот, например, если вы ставите какой-нибудь code::blocks из пакета. Он тоже в результате будет без иконки?

В общем я понял, что моё первое предположение было верным. Просто мне надо было четко это знать, чтобы этим вопросом не заниматься.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Меня это устраивает - кидаем иконки в папку и пишем readme типа «не моё дело - так принято в местной экосистеме, а кто хочет увидеть как выглядит иконка на приложении - собирайте пакет и устанавливайте». Для меня это самый простой вариант. Просто мне как-то трудно такое принять. Но видимо так и будет.

У тебя проблема XY. Ты решаешь как установить иконку, а надо решить как распространять приложение. Если приложение опенсорсное то нужно распространять исходники, а сборочная система должна устанавливать и приложение и иконку в системные каталоги, и тебе больше ни о чём заботиться не надо. Если это проприетарщина, тебе нужно flatpak/snap/appimage и подобное говно. Там и иконки есть, и установка под пользователем, и магазин даже. Ну или если тебе делать нечего то можешь собрать deb/rpm где также поставить всё по системным каталогам.

Других вариантов нет. Чтобы приложение кидалось куда-то руками, и рядом десктоп файл чтобы у него была иконка - это какая-то невообразимая шизофреническая дичь. Она, правда, работает, и я это проверил - .desktop с относительными путями на иконку и бинарник нормально показывается и запускает бинарник. Только так никто не делает, и вообще не понятно что с этим должен делать пользователь - руками класть .desktop в ~/Desktop или ~/.local/share/applications и прописывать пути туда где лежит приложение и иконка? Нахрена это ему?

anonymous
()
Ответ на: комментарий от Odin_KG

А вот, например, если вы ставите какой-нибудь code::blocks из пакета. Он тоже в результате будет без иконки?

Он не просто будет без иконки, в моей графической среде в принципе никакие иконки не поддерживаются (вот как она выглядит). Если программа сама её рисует в своём запущеном окне (например браузер на заголовках вкладок) - это другое дело, там будет.

В общем я понял, что моё первое предположение было верным

Нет, неверным. Никакого «в юниксе» в плане иконок нет. Если у тебя графическая среда KDE - то смотри как работает с иконками KDE. Если гном (фу) - смотри как работает гном. Итд.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ты решаешь как установить иконку, а надо решить как распространять приложение.

У меня совсем другая проблема. Очень нечастый случай - моя программа должна использоваться для создания других программ. Если использовать громкие слова, то, наверное, это можно назвать кроссплатформенной средой разработки, которая максимально визуализирована, но не имеет собственного компилятора. В том числе там есть и такой незначительный пунктик, как автоматическое создание иконки из предоставленных пользователем картинок. «Распространение» меня сейчас вообще не интересует, потому что это проблема того, кто будет моей средой пользоваться (при условии, что кто-то будет). Но я бы хотел, чтобы иконка хоть в каком-нибудь виде, но создалась, потому как у меня эта возможность заложена. Поэтому меня устраивает вариант, когда .desktop и иконки просто попадают в папку проекта (я весь код автоматически сгенерирую, а картинки раскидаю по нужным папкам). Если пользователь хочет, то он может потом всё это переиначить как ему вздумается, но, по крайней мере, у него на руках будет рабочий пример, а у меня будет чистая совесть, что я сделал всё, что мог.

Она, правда, работает, и я это проверил - .desktop с относительными путями на иконку и бинарник нормально показывается и запускает бинарник.

А могу я увидеть пример ? Я, как мне кажется, перебрал все возможные варианты и ничего. Правда, может быть дело было в том, что надо иконки обновить. У меня Fedora и, как я понял, SDDM.

Odin_KG
() автор топика
Ответ на: комментарий от firkax

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

Очень любопытно выглядит. Только я не очень понимаю, а для чего лишать себя иконок ? Вреда от них я не вижу, а польза присутствует.

Если у тебя графическая среда KDE - то смотри как работает с иконками KDE

Дык, мне надо не чтобы у меня работало, а чтобы хотя бы у подавляющего большинства, если уж у всех не получается.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Вреда от них я не вижу, а польза присутствует.

Ну я согласен что польза присутствует, но небольшая. Есть и небольшой вред - занимают место на экране, которое хотелось бы зря не тратить. Есть ещё и третий аспект - поддержку иконок надо ещё написать (я сам себе window manager сделал полностью кастомный), то есть трата времени что тоже минус. В итоге решил пока без них. Когда-нить может сделаю и посмотрю как смотрятся (учитывая что под надписи отведено 16 пикселей по вертикали, иконка будет такой же маленькой, расширять вертикальное занятое место под строку точно не вариант).

Дык, мне надо не чтобы у меня работало, а чтобы хотя бы у подавляющего большинства, если уж у всех не получается.

А, ну так сразу бы сказал. Я думал ты себе настроить всё красиво хочешь. Тогда да, скорее всего desktop файлы поддерживаются чаще всего, но я детально в это не вникал.

firkax ★★★★★
()
Ответ на: комментарий от Odin_KG

И ещё один познавательный вопрос. Зачем на Unix-е всё пихают по разным папкам ? Т.е. программа в одном месте, .desktop в другом, а сами иконки в третьем. Просто это сбивает невероятно, потому как зачем всё это размазывать по всей OS… я просто не понимаю. Куда лучше, когда всё, что от носится к одной программе лежит в её родной папке.

Конечно же нет. Тебе же сказали - со своими виндовыми привычками создавать помойку вали на винду. Какие тут плюсы:

  • Всё лежит по известным путям. Например, банарники - в bin, это значит что в $PATH достаточно указать один bin и все бинарники сразу будут доступны. Также, библиотеки - в lib. Это значит что когда я собираю софт, все библиотеки мне сразу доступны. В винде по этой причине невозможна безболезненная разработка с внешними зависимостями - каждую зависимость или втаскивают в своё дерево исходников, или тянут из сети во время сборки какими-нибудь ублюдскими conan’ами, оба способа неудобны и небезопасны и в приличном обществе запрещены.
  • Это ещё и быстрее, потому что например софту которому нужны конкретно .desktop файлы нужно перебрать каталоги конкретно для .desktop файлов в которых будут конкретно .desktop файлы, а не ворочать иерархии произвольной вложенности каждого приложения.
  • Разграничение прав - у пользователя нет прав на запись в системные каталоги, поэтому какой-нибудь вирусне нечего заражать. Так как софт ставится из системного репозитория, ей ещё и не от куда взяться.
  • Изменяемые данные лежит в выделенных местах, поэтому их проще бэкапить и переносить. Т.е. известно что всё важное лежит в /etc, /var и /home, поэтому бэкапить, переносить или шарить между системами нужно только эти каталоги. При этом в них не попадает ничего лишнего как-то бинарники и собственные данные программ. У меня есть x86_64 и arm64 устойства, которые используют один насшаренный по сети $HOME. Потому что те бинарники разные, а данные общие.

Видишь, уже только за счёт иерархии ФС *nix системы на голову быстрее и безопаснее винды.

anonymous
()
Ответ на: комментарий от Odin_KG

У меня совсем другая проблема. Очень нечастый случай - моя программа должна использоваться для создания других программ. Если использовать громкие слова, то, наверное, это можно назвать кроссплатформенной средой разработки, которая максимально визуализирована, но не имеет собственного компилятора. В том числе там есть и такой незначительный пунктик, как автоматическое создание иконки из предоставленных пользователем картинок. «Распространение» меня сейчас вообще не интересует, потому что это проблема того, кто будет моей средой пользоваться (при условии, что кто-то будет). Но я бы хотел, чтобы иконка хоть в каком-нибудь виде, но создалась, потому как у меня эта возможность заложена. Поэтому меня устраивает вариант, когда .desktop и иконки просто попадают в папку проекта (я весь код автоматически сгенерирую, а картинки раскидаю по нужным папкам). Если пользователь хочет, то он может потом всё это переиначить как ему вздумается, но, по крайней мере, у него на руках будет рабочий пример, а у меня будет чистая совесть, что я сделал всё, что мог.

Почему все альтернативно одарённые думают что у них какой-то уникальный случай? У тебя совсем обычный стандартный заурядный шаблонный случай, ни капельки ничего уникального. Иконка твоей «кроссплатформенной среды разработки» должна ставиться в системный каталог, и у того что она генерирует иконка должна ставиться в системный каталог. Если это .deb/.rpm пакет, значит файлы должны лежать в пакете по стандартным системным каталогам. Если это .tar.gz с бинарями, все файлы должны лежать там по стандартным системным каталогам (т.е. пути в тарболе должны быть, например, usr/bin/... и usr/share/icons/...). Если это дерево исходников, значит к нему твоя ИДЕ должна генерить систему сборки, или хотя бы мейкфайл, который должен ставить иконки в, представь себе, стандартный системный каталог (${DESTDIR}${PREFIX}/share/icons). Вот и всё.

anonymous
()