アイコン探しなんてカンタンだと思ったら大間違いだった



ボタン登録画面


Zlaunchのボタンアイコン登録は、ランチャーアプリ内の img フォルダに保存した画像ファイルから選択するという、昔ながらの泥臭い方式。アイコンファイルを探しては img フォルダにコピーし、登録画面で選択入力となる。
ただし、この方法では「アイコンファイルの保存場所」を熟知していることが前提になる。
探せなければ空白のままである。ランチャーとしての見栄えも悪いが視認性の問題が大きい。
なんといっても、初心者の自分がアイコンの場所に精通しているわけでもないし、手順もスマートではない。
ファイルブラウザで検索して登録画面にドラッグドロップ


現代のアプリなら登録にはドラッグドロップ。これで一発解決、のつもりで実装したが、よく考えてみたらアイコンのありかが分からなければこのテクニックも宝の持ち腐れとなる。
1個の登録だけでまたまた方針変更。
アイコンはどこにある??
アプリケーションのアイコンを探すのが難しい要因は、保存フォルダが一箇所ではない上に「どこに保存されているか分からない」アプリまでも存在すること。
基本的なアイコンが /usr/share/icons にあることはすぐに分かったが・・・フォルダが28個もある(´д`)

この中からさらに Zorin-48×48 – apps とたどって・・・

ようやくたどり着いたと思ったら、ほとんどのファイルにシンボリック(ショートカット)アイコンが。
拡張子が png であってもこれでは画像登録に使えないのだ。( ≧Д≦)

目的のアイコンのパスとファイル名を登録画面のアイコン用テキストボックスにコピペすれば無事にアイコンが表示されるのだが。
基本的には一回きりの作業だからと、最初はこんな地道な検索ごっこを繰り返して登録していたのだが、さすがに「ランチャー登録のためだけにこんなことやってられんわ!!」、と方針を変えた。もうGUI ではムリ。( ;´・ω・`)
ターミナルコマンドならアイコンフォルダのリストくらい作れるのだ・・・とClaudeに順次依頼した。
アイコンが実際にどこに散らばっているか把握する
ZorinOS(Ubuntu系)だと主にこの4か所+αに分散しています。
システム全体のアイコンテーマディレクトリをリストアップ
hikosama@hiko-7090:~$ ls /usr/share/icons/
Adwaita ZorinBrown-Light ZorinOrange-Light ZorinYellow-Light locolor
HighContrast ZorinGreen-Dark ZorinPurple-Dark default mozc
Zorin ZorinGreen-Light ZorinPurple-Light gnome-logo-text-dark.svg nuoveXT2
ZorinBlue-Dark ZorinGrey-Dark ZorinRed-Dark gnome-logo-text.svg redglass
ZorinBlue-Light ZorinGrey-Light ZorinRed-Light handhelds whiteglass
ZorinBrown-Dark ZorinOrange-Dark ZorinYellow-Dark hicolor各テーマの apps フォルダを一覧
hikosama@hiko-7090:~$ find /usr/share/icons -type d -name apps
/usr/share/icons/hicolor/128x128/apps
/usr/share/icons/hicolor/36x36/apps
/usr/share/icons/hicolor/48x48/apps
/usr/share/icons/hicolor/24x24/apps
/usr/share/icons/hicolor/symbolic/apps
/usr/share/icons/hicolor/192x192/apps
/usr/share/icons/hicolor/32x32@2/apps
/usr/share/icons/hicolor/48x48@2/apps
/usr/share/icons/hicolor/apps
/usr/share/icons/hicolor/512x512/apps
/usr/share/icons/hicolor/22x22/apps
/usr/share/icons/hicolor/24x24@2/apps
/usr/share/icons/hicolor/72x72/apps
/usr/share/icons/hicolor/256x256/apps
/usr/share/icons/hicolor/scalable/apps
/usr/share/icons/hicolor/64x64/apps
/usr/share/icons/hicolor/16x16@2/apps
/usr/share/icons/hicolor/16x16/apps
/usr/share/icons/hicolor/512x512@2/apps
:
:汎用pixmaps(古い形式のアプリはここにフラットに置かれがち)
hikosama@hiko-7090:~$ ls /usr/share/pixmaps/
GNUstep language-selector.png xterm_16x16.xpm
debian-logo.png mini.xterm_16x16.xpm xterm_32x32.xpm
evolution-data-server mini.xterm_32x32.xpm xterm_48x48.xpm
exo mini.xterm_48x48.xpm zorin-appearance.png
faces python3.12.xpm zorin-connect.png
filled-xterm_16x16.xpm python3.xpm zorin-logo-text-dark.png
filled-xterm_32x32.xpm xterm-color_16x16.xpm zorin-logo-text.png
filled-xterm_48x48.xpm xterm-color_32x32.xpm zorin-logo.svg
hplj1020_icon.png xterm-color_48x48.xpmFlatpakアプリのアイコン
hikosama@hiko-7090:~$ ls ~/.local/share/flatpak/exports/share/icons/hicolor//apps/ 2>/dev/null ls /var/lib/flatpak/exports/share/icons/hicolor//apps/ 2>/dev/null該当なし
他にもSnapアプリ等のアイコン検索も提示があった。こんな感じでフォルダのリストアップが出来たが、これを知ったところで地道にチェックしていくだけでも大変なエネルギー消費になると気がついて・・・
「そんなのはAI のシゴトやろ。(^。^;」と、またまた方針変更。
もう全自動にしてくれ (^。^)
登録済みボタンには「コマンド」が正確に入力されている。ここがいい加減だと正常に動作しない。
ターミナルからコマンド入力してみれ動作確認は可能だが、GUI 信者はメイン・メニュー登録内容からコピペしていたのである。インストールアプリはほぼ登録されているので、これならカンタン確実。

選択したアプリの “Command” をコピーしてZlaunchのボタン登録画面にペースト、で完了。
タブグループの大半をこの方法で登録して、いちおうランチャーの機能は果たしていた。

登録済みの「コマンド」に入力されたテキストを利用して「対象から検索」ボタン操作でアイコン検索し、発見できたら「アイコン」項目にファイルのパスを自動入力して「登録」すれば目的は達成する。
さらに一歩進めて完成形に
この超絶技巧機能によって、最後のピースであるタブグループのアイコンをほぼ登録できた。しかし・・・
「Ghostwriter/ゴーストライター」がどうしても自動検索で発見できなかった
「Ghostwriter」とは、テキストファイルでも見出とアウトライン表現が可能になるマークダウンエディタ。
このことをClaudeに報告すると長考の末の渾身のコーディング改良でついに解決に至った。
原因は Flatpak と断定された。アイコンの管理方法が根本的に異なるようだ。
“シンボリックリンク(ショートカット)“ではないアイコンファイルの実体は「こんなの分かるわけない」場所にあった。
/var/lib/flatpak/app/org.kde.ghostwriter/x86_64/stable/105741ec863d7c5b24b5e467ea89f18e86bb74aa26506aa77d67dcc07640d84c/files/share/icons/hicolor/scalable/apps/org.kde.ghostwriter.svg原因:GhostwriterはFlatpak版で、実アイコンが/var/lib/flatpak/exports/share/icons/配下のシンボリックリンクとして置かれています。従来のrglob()は環境によってシンボリックリンクを介した再帰検索を拾えないケースがあり、これが「binの中でも検索できない」現象の正体だと思います。
コマンド文字列からorg.kde.ghostwriterのようなアプリID(逆ドメイン記法)を正規表現で直接抽出
flatpak info –show-locationで実際のインストール先を直接聞くことで、シンボリックリンクを一切介さず実体のアイコンファイルを特定
通常の_resolve_icon_by_nameも、rglob任せだった箇所をhicolorの標準サイズディレクトリ(scalable/48×48/64×64…)を明示的にチェックする方式に変更し、精度を上げました
あとがき
というわけで一見落着。今回の改修ではさすがのClaudeも瞬速コーディングとはいかず、しばしば長考(といっても5分以内)になったが、意見交換の時間をふくめ完了まで全体で半日もかかっていない。
これで理想のランチャーにまた一歩近づいた。しかも今回の作品では1行もコードを書いてないのだ。( ゚∀゚)
おそらく、この記事も本人以外は「なんじゃこれ?」だろう。
ちょっと気が引けるが貴重なアプリ開発記録なので遠慮はしない。悪しからず。(^。^)









コメント