私は 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 を処理するように書き換えて実験。
コードの解説は長くなりすぎるからバックアップを見てくれで済ます。
y901x-0.1.10beta.tar.gz
あぁやっと Ubuntu 9.04 で使っていた頃のように Mandriva で動くようになった。
GTK+ が厳密になったのか Ubuntu がいいかげんだったのかは今は解らない。
ところで Mandriva でも Ubuntu と同じインストールスクリプトが使えるね。
もうしばらく自分で試してから本サイトの奴は更新します。
Ubuntu 9.10 でも試さなきゃなぁ、多分同じだと思うけど…
てか RPM にしたほうがいいのだろうか?需要はシラネ。