Предыстория:
Я хочу:
- Предоставлять приложение в виде простого TAR-файла, который пользователи извлекают и запускают.
- Чтобы у этого приложения был правильный значок.
Нет менеджера пакетов, нет sudo, нет скрипта установки.
Я вижу изстандартныйиразличные статьичто иконки приложений требуют .desktop
файл, который требует абсолютные пути к исполняемому файлу (тьфу) и иконке приложения. Я также вижу, что Ubuntu Unity (возможно, другие) поддерживает .desktop
файлы в~/.local/share/applications
Windows поддерживает это, встраивая иконки в исполняемые файлы. Mac OS X имеет относительную структуру каталогов для приложений, которая включает иконку.
«Хаккерское» решение:
Мое «хакерское» решение — при запуске приложения определить, myApp.desktop
существует ли файл в ~/.local/share/applications/
, и если нет, записать его (включая полный абсолютный путь к исполняемому файлу и значок), запустить новый процесс myApp и выйти.
Надеюсь, новый процесс myApp подхватит значок приложения.иногдаоно делает.
Проблема:
Проблема в том, что мне нужно sleep 2
секунд, прежде чем запустить новый процесс. Если я это сделаю, значок будет выбран. Если я этого не сделаю, значка для моего приложения не будет.
Я пробовал перезагружать кэш иконок GTK вместо перехода в режим сна (с помощью gtk-update-icon-cache /usr/share/icons/hicolor
), но это не помогло.
Кто-нибудь знает, как избежать этой задержки и гарантировать, что вновь записанный .desktop
файл будет загружен? (Я очищаю и закрываю файл.) Или есть идея получше моего хакерского решения?
Обновлять:Интересно, тестирование простого скрипта, который записывает .desktop
файл (вручную или с помощьюxdg-desktop-меню) и запускает приложение, ему также нужна задержка в 2 секунды, иначе значок не появится. Увлекательно.
решение1
Использоватьgtk_window_set_iconили аналогичный (есть вариант _from_file и интеграция с Glade).
Без root-прав, я думаю, у вас нет доступа к кэшу иконок, а своевременная загрузка файла рабочего стола, как вы обнаружили, не является надежным методом.