gimp メニューにアイコン表示

2001/07/21

[2001/08/27]
いっちーさん作成の Win版 GIMP 用のパッケージへのリンクを追加しました.
[2001/08/23]
Script-Fu メニューでもアイコン表示可能となりました(解説はこちら

はじめに

gimp のフィルタやプラグインのメニューでは名称が表示されているだけで,その効果がどのようなものかは実行してみるまではわかりません.これは非効率です.これを解決するために web 上や雑誌・書籍にはフィルタの実行結果の画像とともにその解説が紹介されていたりします.しかし,それらを眺めながら適用したいフィルタを探していくよりも,そのメニューにフィルタの概要がわかる小さなアイコン(サムネイル)画像を表示しておけばすぐに希望の動作を行なうフィルタを探せるのではないでしょうか.誰もが思い付きそうな機能なのですが,どうも gimp にも gtk にもそれは存在していないような雰囲気です.

ということで,NetNews で聞いてみたところ,メニューに画像を貼るには Gtk+ のソースを変更してはどうかというアドバイスを頂きました.メニューの処理は $GTK/gtk/gtkmenu.c で行なわれており,ここでの処理でアイコンの pixmap を貼り込むことで表示が可能となりました.

gimp 改造へ

これを受けて gimp の改造へ取り掛かかりましたが,gimp でのメニュー処理はもう少し複雑な $GTK/gtk/gtkitemfactory.c で行なわれていたのです.これはメニューのパスをテキスト情報で与えると適切なメニュー構造を作成してくれるもので,それを利用してプログラムを記述する分には便利でも gtk の詳細も知らないで改造をしようという暴挙にとっては面喰うものでした.

それはともかく,なんとか itemfactory でのメニューへの画像表示を可能としましたが,gimp でのメニュー表示はさらに一段複雑なものなのです.行ないたいのは個々のプラグインに対応したアイコン画像の表示ですが,プラグインのメニュー作成は次の流れで行なわれています(流れの図解).

  1. gimp起動
  2. プラグイン起動
  3. プラグイン登録 (query())
  4. gimp へプラグイン情報 (メニューパスなど) を通知 (wire)
  5. gimp 側で受けたプラグイン情報からメニューを作成
アイコン画像を 4. で通知する情報に含めることにしました.形式は画像生成などで扱いが容易そうな xpm を選択します.それを wire 接続(?)でプラグインから gimp 側でバトンリレーしていかなければならないので,それに対応した箇所もアイコン画像を扱うよう(プラグイン・ライブラリ・gimp アプリ側で)変更します.
※データリレーの過程でところどころ malloc() により動的に画像保存用にメモリ確保を行なっていますが,現在はそれがいつ不要になるのか把握できておらず,解放処理も行なえていません.ですので,メモリを使い果たしたりする致命的な症状がでる可能性があります.

表示はできたがキャッシュが……

この改造により表示することができました.ですが,初回起動ではアイコン画像をメニューに表示できても,なぜか2度目からはそれが消えてしまいます.

gimp は起動を高速化するためプラグインの登録処理を一度行なうとその情報をテキストファイルへキャッシュし,次回の起動ではそのファイルのみを参照しプラグインの登録呼び出しは行ないません.このためキャッシュする情報にもアイコン画像を含めてやらねばならないのでした.

キャッシュ情報は ~/.gimprc/pluginrc に収められており,これは lisp 形式で記述され pdb と呼ばれているようです.この書き出し・読み込み箇所もアイコン画像に対応したものに変更する必要があります.ここでの形式も xpm としました.記述形式は xpm テキスト形式のそれぞれの行をリストでまとめたものにします.

※読み込み側の手抜きから現在は xpm のリストデータの前にデータ行数を意味する数値を付加しなければなりません.柔軟性を持たせるためにこれは省けるといいと思っています.

このキャッシュ情報のデータは .gimprc にありユーザ側からアクセスできることからプラグイン毎の好みのアイコン情報をユーザが自由に登録することもできるようになりました.テキスト形式なので編集も容易です.しかし,プラグインの実体が更新されるとキャッシュデータは破棄されてしまいます.ユーザ側でのアイコン登録を有効にするにはもう少し凝った処理が必要でしょう.

データも作ろう

ここまでで gimp でのプラグインメニューへのアイコン表示の機能付加はできました.試しのアイコンとして Tips で表示されるウィルバー君の画像をキャプチャーし,それを縮小して貼り込んでみました.しかし,実際にどのような見栄えになるのか,使い物になりそうかはプラグイン毎にその結果に応じたアイコン画像にしなければわかりません.誰が作ってくれるわけでもないのでもちろん自分で用意しなければデータはありません.

それで,ひとつずつプラグイン毎でウィルバー君の画像に処理をかけアイコン画像を作成していきました.Script-Fu を使えば処理をある程度自動化できるかとも思いましたが,使ったことがないので手動で作成しました.全部で 71 個のアイコンを作成しています(要領を掴むまでがかなりしんどかった...).表示例を後ろに付けています.

作成の流れは次のようなものです.gimp で処理しました.

  1. サイズ 69x44 のアイコン元画像を表示
  2. モードを RGB へ切替え
  3. フィルタ適用
  4. モードをインデックスへ切替え.色数を 32 色とする.
  5. 画像を 50% 縮小.
  6. 生成画像を xpm 形式で保存.
  7. xpm データをプラグインソースへ挿入.登録箇所を変更.
ビデオフィルタなどはサイズを縮小してからの適用としました.メニューに貼り込んだときにわかりやすいような結果を心がけましたが,フィルタの目的がわかっておらずそれに達していないものもあると思います.適用方法がわからないフィルタは当然除外しました.

さらに、

課題として残っているのは次のものでしょうか. とここまでやってから気づいたのですが,Gnome のパネルのメニューにはそれぞれの項目のアイコン画像が貼り込まれているんですね.テキストの列揃えもできています.その機構を持ってくればよかったのかも...Gtk にはこの機能はないようだったんですが,それに基づいているはずの Gnome ではどうやって実現しているのでしょうか?

ま,やってみたということで (^^).


[2001/08/07 補記]
ItemFactory の icon 貼り付け版ウィジェットを作成されている方がいらっしゃいました.ちょっと試しただけなのですが,質が良さそうなので gtk 部はこちらに書き換えられればと思っています.

[2001/08/08 補記]
gimp-developer メーリングリストに「こんなパッチを書いたんだけど」とメールを送ってみたところ,次のような返事を貰いました:

  1. Gtk+ の ustable 版ではメニューにアイコンが表示できるようになっている
  2. GIMP もそれを使用する方向で作業する予定である
  3. 貼り付けるアイコンは自動生成させたい
とのことですので,おそらく新GIMPが登場した暁にはプラグインのアイコン表示の機能を有するものになっているのかと思います.本パッチはそれまでのつなぎ的に使えるでしょうか.

改造パッチ

Gtk+ の itemfactory に関するものと gimp に関するものとの2種類あります.それぞれ,gtk+-1.2.10 と gimp-1.2.1 のバージョンに対するものです.

逆リンク

本パッチに対する感想などへのリンク

リンク


スクリーンショット

アプリケーションのメニューにアイコンを表示せずともこのスクリーンショットを眺めるだけでも十分なような気もしてきました...












||Programs||Home||

oshiro@mibai.tec.u-ryukyu.ac.jp