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

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

PyGTKでシステムトレイのアイコンの隣にポップアップウィンドウを作成する(前半)

システムトレイのアイコンをクリックしたときにメニューを表示するのは簡単で、表示位置をアイコンに合わせることもできる(詳しくは「PyGTKでシステムトレイを使用してメニューを表示する」を参照)。しかし、デスクトップ環境のパネルに配置する音量調整のアプレットのように、隣にGUI部品(を含む小さなウィンドウ)を表示することは簡単にはいかない。

システムトレイアイコンの画面上の位置と大きさを取得

システムトレイアイコンの隣にウィンドウを作成することができるように(かは分からないが)、gtk.StatusIconオブジェクトにはget_geometry()というメンバ関数が用意されている。

get_geometry()が返すタプルの中身について

このメンバ関数が返すのは3つの要素(以下それぞれscreen,area,orientationとする)を含むタプルとなる。これらはシステムトレイアイコンの隣にウィンドウを作成する上で役に立つ。

screen(gtk.gdk.Screen)

ウィンドウシステムにおける「画面」に関する情報(解像度など)を保持している。例えばscreen.get_width()では画面の幅のピクセル数が得られる。

area(gtk.gdk.Rectangle)

ウィンドウシステムの画面上において、どの座標(area.x,area.y)においてどの領域サイズ(area.width,area.height)でシステムトレイアイコンが描画されているかのデータを持っている。

orientation(GTK Orientation Constants)

システムトレイのアイコン群の並び方向を示す定数で、デスクトップ環境のパネルなどの配置によって決まる。

  • パネルが画面上端もしくは下端(横方向に並ぶ): gtk.ORIENTATION_HORIZONTAL
  • パネルが画面左端もしくは右端(縦方向に並ぶ): gtk.ORIENTATION_VERTICAL

もちろん、パネルなどは画面端に置かずに自由に動かすことができるのだが、その場合でもアイコンが縦方向に並ぶか横方向に並ぶかのどちらかにすることになるため、それに応じた方向を示す値が得られることになる。

ポップアップウィンドウ側の処理

作成されるウィンドウ側では、上の情報をもとに計算したサイズと座標を用いてgtk.Windowオブジェクトのメンバ関数resize()move()でサイズと位置を調整してから表示する。

(事前にgtk.StatusIcon.get_geometry()の結果よりx, y, width, heightを計算しておく)
self.win = gtk.Window(gtk.WINDOW_POPUP)
self.win.resize(width, height)
self.win.move(x, y)
self.win.show_all()

(「PyGTKでシステムトレイのアイコンの隣にポップアップウィンドウを作成する(後半)」に続く)

関連記事:

参考URL:

使用したバージョン: