試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

システムトレイアイコンの並び方向に関する覚え書き(2009/2/10現在)

PyGTKでシステムトレイのアイコンの隣にポップアップウィンドウを作成する(前半)」で、手元のGNOMEのパネルでは画面左右にパネルを配置したときなど、アイコンが縦並びのときにも並び方向情報が正常に取得できていたのだが、Fluxbox上ではそうならないとのコメントを頂いたので試してみた。

デスクトップ環境/ウィンドウマネージャ環境によって結果が異なる?

システムトレイを提供するパネル/タスクバーはデスクトップ環境や(システムトレイ付きタスクバーを持つ)ウィンドウマネージャの環境ごとに異なるため、色々な環境で「左右にパネル/バーを配置した状態でget_geometry()からシステムトレイの並び方向情報を取得する」実験を行った。

成功(gtk.ORIENTATION_VERTICALが返される)

上記デスクトップ環境のパネルではgtk.ORIENTATION_VERTICALが返り、正常に処理ができていることを確認した。

失敗(gtk.ORIENTATION_HORIZONTALが返される)
  • Fluxbox (fluxbox 1.1.1)
  • KDE4 (kdebase4-workspace 4.1.3)
  • Xfce4(xfce4-panel 4.4.2)

上記環境では常にgtk.ORIENTATION_HORIZONTALが返される結果となった。

システムトレイの仕様では

freedesktop.orgが定めるシステムトレイの仕様においては、バージョン0.2(2004年11月)において_NET_SYSTEM_TRAY_ORIENTATIONという「トレイマネージャヒント」というものが追加されていて、システムトレイを提供するパネル/バー側はアイコンの並び方向の情報を処理することができるようになっている。
HORIZONTALのほうの値が0なのと、上の実験で正常に動作していないときの値がgtk.ORIENTATION_HORIZONTALなのには関係がありそうな気もする。

ソースから「_NET_SYSTEM_TRAY_ORIENTATION」を検索してみると

上の実験では環境によって結果が分かれたが、その全てのシステムトレイマネージャ(パネル/バー)のソースを入手して「_NET_SYSTEM_TRAY_ORIENTATION」の文字列で検索をしてみた。

(GNOMEパネル)
$ grep "_NET_SYSTEM_TRAY_ORIENTATION" gnome-panel-2.24.0 -r || echo "Not Found"
gnome-panel-2.24.0/applets/notification_area/na-tray-manager.c:                                                            "_NET_SYSTEM_TRAY_ORIENTATION");
(LXDEパネル)
$ grep "_NET_SYSTEM_TRAY_ORIENTATION" lxpanel-0.3.8.1 -r || echo "Not Found"   
lxpanel-0.3.8.1/src/systray/eggtraymanager.c:                                                            "_NET_SYSTEM_TRAY_ORIENTATION");
(Fluxbox)
$ grep "_NET_SYSTEM_TRAY_ORIENTATION" fluxbox-1.1.1 -r || echo "Not Found"
Not Found
(KDE4パネル)
$ grep "_NET_SYSTEM_TRAY_ORIENTATION" kdebase-workspace-4.1.3 -r || echo "Not Found"                                                         
Not Found
(Xfce4パネル)
$ grep "_NET_SYSTEM_TRAY_ORIENTATION" xfce4-panel-4.4.2 -r || echo "Not Found" 
Not Found 

結果、対応済みで動作に問題がなかったものからはこの文字列が見つかり、逆に動作に問題があったほうでは見つからなかった。
なお、ソースの該当部分周辺を見ると、これはX11上でのみ利用可能ということも分かった。

LXDEパネルの該当部分を無効化してみる

試しに、問題の起こらなかったLXDEパネルのソースlxpanel-0.3.8.1/src/systray/eggtraymanager.cからna_tray_manager_set_orientation_property()関数の中身を全てコメントにしてみた(無効化した)ところ、画面の左右にパネルを配置したときにもgtk.ORIENTATION_HORIZONTALが返されるようになった。なお、この関数はGNOMEパネルで使用されていたものと同一のものだった。

結論

上記の結果より「トレイマネージャ(パネル/バー)側が_NET_SYSTEM_TRAY_ORIENTATIONを扱えるかどうか」に影響している可能性が高く、未対応なものでも対応まで待つか対応済みなものにならって修正*1をすれば正常に動作するのではないかと考えられる。

関連記事:

関連URL:

*1:X11の低レベルなライブラリXlibに関する知識が必要となりそう