私は 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 をインストールして使ってみた。
何も問題無く root window の xid が得られている。
それなら root な gtk.Window.window に割り当てたらどうなる?
imagesink.set_xwindow_id(self.w.window.xid) #imagesink.set_xwindow_id(self.video_window.window.xid)
コントローラやメニューが塗りつぶされたけどコレなら問題無く 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 を処理するように書き換えて実験。
コードの解説は長くなりすぎるからバックアップを見てくれで済ます。
あぁやっと Ubuntu 9.04 で使っていた頃のように Mandriva で動くようになった。
GTK+ が厳密になったのか Ubuntu がいいかげんだったのかは今は解らない。
ところで Mandriva でも Ubuntu と同じインストールスクリプトが使えるね。
もうしばらく自分で試してから本サイトの奴は更新します。
Ubuntu 9.10 でも試さなきゃなぁ、多分同じだと思うけど…
てか RPM にしたほうがいいのだろうか?需要はシラネ。