私は Y901x という GStreamer フロントエンドな動画プレイヤーを作った。
もちろん自分で使っているのだが Mandriva 2010.0 に乗り換えたら落ちまくる。
でもタマに問題なく動く場合もがあるからややこしい。
ついでに、ソースディレクトリに pyc キャッシュを作成しなくなっているのだが…
Mandriva 2010.0 だからなのか? Python がヤメたのか?それとも他の場所にあるのか?
0.1.9 を色々弄くって以下の処理を行っている場所
GtkDrawingArea の X Window ID を得ようとすると X server Error になると解った。
1 2 3 | 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 に割り当てたらどうなる?
1 2 | imagesink.set_xwindow_id( self .w.window.xid) #imagesink.set_xwindow_id(self.video_window.window.xid) |
コントローラやメニューが塗りつぶされたけどコレなら問題無く xid が指定できる。
ということは gtk.DrawingArea の window.xid の取得方法がマズイということだろう。
ならば簡易なコードを書いて試してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/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 にしたほうがいいのだろうか?需要はシラネ。