2007年8月31日の日記の2番目の記事へのコメント
■icewm-1.2.32のシステムトレイ問題
icewmのシステムトレイに uim-toolbar-gtk-systray を出そうとすると,つぶれた状態で表示されてしまう問題があって,しばらく uim-toolbar-gtkの方を使ってたんですが,最近になってPidginのアイコンもつぶれるようになっちゃってしょぼーん・・・というのがここまでのあらすじ.
で,以前にekatoさんにヒントをいただいたのを思い出し,探してみたらちょうど一年前の日記にありました.とりあえず yxtray.cc のTICON_W_MAX を,デフォルトの30から128とかに変えてみたところ, uim-toolbar-gtk-systray の方はバッチリ表示されるようになりました.なんであん時やらなかったんだろ・・・
が,これでもPidginの方のアイコンは,つぶれた状態のまま.しかも uim-toolbar-gtk-systray が起動している状態だと,スペースは作られるのにアイコンが出てきません.なんだこりゃ.
icewm側でアイコンの幅とか調整してるのかと思って探してみたら,yxtray.cc の YXTray::handleConfigureRequest にありました.
w = w * h / TICON_H_MAX; //MCM FIX h = TICON_H_MAX;
えーと,ここは多分 h の変更の比率に合わせて w も変えたいのでしょうな.下の行で,高さを TICON_H_MAX にしているので,上の行では,面積を新しい高さで割って新しい幅を・・・って違うじゃねーかこれ(;´Д`)
h を TICON_H_MAX / h 倍 して TICON_H_MAX にしてんだから,w も ↓のようにしないとダメっすよね・・・.
w = w * TICON_H_MAX / h; // ← こんな感じ h = TICON_H_MAX;
これでPidginのアイコン幅は直りました.めでたしめでたし・・・と思いきや,まだだめで,複数アイコンを出そうとすると,なぜか謎の隙間が空いてしまいます.
ソースを見ると,システムトレイがあって,その中にアイコンを格納するガワみたいなのがあって,さらにその中に実際のアイコンが入る構造になっているっぽいっす.で,指定する座標を色々いじって変化を確認した結果,アイコンのシステムトレイ内の座標を (x, y) に設定すると,各アイコンのガワがシステムトレイ内の (x, y) に配置された上で,さらにガワの中身がガワから x 離れたところに配置されてしまうということがわかりました.なるほど,きっとパラメータの設定をどっかで間違えてるってわけですな.該当箇所を直してすぐ終わりだね.
・・・と思ったんですが,どこでそれを設定してるのかが全く見つからずorz.その後,数時間の迷走の末,ようやく発見しました.ガワの座標・大きさを変えた後に呼ばれる↓で,ガワの中身の座標・大きさをガワと同じに設定してました.
void YXTrayEmbedder::configure(const YRect &r, const bool resized) { YXEmbed::configure(r, resized); fDocked->setGeometry(r); // ←ここ }
YXTrayEmbedder ってのが所謂ガワでして,fDocked->setGeometry(r) は,ガワの中身の座標とかを設定することになるんですが,システムトレイのクラスの方にも同じ名前の fDocked なる YXTrayEmbedderのアレイがあって,そっちと混同して,ここではガワの大きさを設定しているだけだとばかり思ってました・・・.紛らわしいんじゃコンチクショウ!
というわけで,この次の行に「fDocked->setPosition(0, r.y());」と足してやったら直りました.うむ,アイコンもバッチリ.パッチはたったのこれだけ.
しかし,Pidginのアイコンとかがつぶれちゃう方のバグは,少なくとも 1.2.30からあるようですね(それ以前は未確認).Pidgin-2.1.0以前には,ここでひっかかるようなアプリ,無かったのかなぁ.それともicewmのシステムトレイなんか誰も使ってないとか?
2007年8月31日の日記の2番目の記事へのコメント
[コメントを書く]