get the X Window ID from gtk.Drawingarea

私は Y901x という GStreamer フロントエンドな動画プレイヤーを作った。
もちろん自分で使っているのだが Mandriva 2010.0 に乗り換えたら落ちまくる。
でもタマに問題なく動く場合もがあるからややこしい。

ついでに、ソースディレクトリに pyc キャッシュを作成しなくなっているのだが…
Mandriva 2010.0 だからなのか? Python がヤメたのか?それとも他の場所にあるのか?

0.1.9 を色々弄くって以下の処理を行っている場所
GtkDrawingArea の X Window ID を得ようとすると X server Error になると解った。

imagesink.set_xwindow_id(self.video_window.window.xid)
# これさえも error
print self.video_window.window.xid

gtk.DrawingArea.window は gtk.gdk.Window であり gtk.gdk.Drawable のメソッドを持つ。
なので xid アトリビュートで X Window ID が得られるようになっている。

コレが現行の GTK+ ではできなくなったのかな?
と疑って xwininfo をインストールして使ってみた。

xwininfo

何も問題無く root window の xid が得られている。
それなら root な gtk.Window.window に割り当てたらどうなる?

imagesink.set_xwindow_id(self.w.window.xid)
#imagesink.set_xwindow_id(self.video_window.window.xid)

fullwindow

コントローラやメニューが塗りつぶされたけどコレなら問題無く xid が指定できる。
ということは gtk.DrawingArea の window.xid の取得方法がマズイということだろう。
ならば簡易なコードを書いて試してみる。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk

class Xid():
    def __init__(self):
        w = gtk.Window()
        vbox = gtk.VBox()
        self.da = gtk.DrawingArea()
        button = gtk.Button("Press me")
        button.connect("clicked", self.show_xid)
        vbox.pack_start(button)
        vbox.pack_start(self.da)
        w.add(vbox)
        w.set_title("xid")
        w.connect("delete-event", gtk.main_quit)
        w.show_all()

    def show_xid(self, widget):
        widget.set_label("gtk.DrawingArea xid: %s" % (self.da.window.xid))

if __name__ == '__main__':
    w = Xid()
    gtk.main()

あらら、この方法では問題無く取得できてしまった。
ということはタイミングが問題なのか、何か event が起こった時に取得すればイケそうだ。
ということで検索しまくった、日本語で見つかるはずがないのでやはりメリケンの Google で。

Re: [pygtk] get the XID from gtk.Drawingarea

expose-event を吐いた所で xid を保存してソレをブチ込めばいいということかな?
でも expose-event を待つ必要があるので __init__ で sys.argv を処理できない。
show シグナルにて sys.argv を処理するように書き換えて実験。
コードの解説は長くなりすぎるからバックアップを見てくれで済ます。

y901x-0.1.10beta.tar.gz

kkobato

あぁやっと Ubuntu 9.04 で使っていた頃のように Mandriva で動くようになった。
GTK+ が厳密になったのか Ubuntu がいいかげんだったのかは今は解らない。
ところで Mandriva でも Ubuntu と同じインストールスクリプトが使えるね。

もうしばらく自分で試してから本サイトの奴は更新します。
Ubuntu 9.10 でも試さなきゃなぁ、多分同じだと思うけど…
てか RPM にしたほうがいいのだろうか?需要はシラネ。