Programming」カテゴリーアーカイブ

リサイズ処理はなんとかなった

動画のオリジナルサイズを得る

でリサイズはなんとかなったぞと。
コレでイケたのか、なんて遠回りをしたものだ。
でも勉強にはなったのでヨシとしよう。

次はリサイズするためのメニュー作りだ。

PyGTK + Gladeのアプリケーションにおけるハンドラ関数について(後半) – 試験運用中なLinux備忘録

ユーザーデータがやはり Glade からは使えないみたい。
menuitem 毎にハンドラ作成ではコードが美しく無いんだが…
綺麗に書かなきゃ Python じゃないし。
○uby 屋は他人が読みにくいコードを書くのを好(以下略

しかもラジオボタンのグループにすると何故かグループ全部シグナル吐くし…
まだイマイチ理解していないだけだと思うけど、後は明日だ。

他人のプレイヤー

morphin – Google Code

なんて Python 製プレイヤーを見つけた。
でもインストールしないと起動できないみたい…

まあ思いっきり作りかけのようだけど参考にさせてもらおう。
同じ処理にならないように考えながら。
リサイズ処理は未実装だなぁと思ったけど…他の所にこんなのが。

rc = widget.get_allocation()

で GdkRectangle が取れる!この方法があったか。
rc.width で FILL でも幅が解る、これでリサイズはなんとかなりそうだ。
なんだよ、GetWindowRect() 相当が Gtk+ にもあったんだ。

self.player.get_property(“stream-info-value-array”)

で GstStreamInfo のリストが取れるようだ。
stream-info だけでは gobject.GPointer が返ってくるだけだもん。
のでどうにもできなかった、使うなと書いてあるし。
しかしコレをどう展開すればいいのかな?いまココ。

しかし…

meopera

たいしてカスタマイズしていない Opera だが毎日無茶な使い方をしている。

指定サイズでドンズマリ!

昨日とりあえずボリューム調節関連だけアップロードして追記しようと考えた。
とにかく後はリサイズだわ、それさえ済めばアルファ版として成立すると思う。

とりあえずこんなのを定義して

self.video = {  "width": 0,
                "height": 0,
                "videocrop": None}

ほとんど海外某所のコピペだがこーんなのを定義しておいて

# サイズ取り出しの処理
# 何かシンクロさせるものを作らないといけないので videocrop でも
# ちなみにコレの left とかのプロパティを弄くればクリッピングできる
bin = gst.Bin('video-sink')
self.video["videocrop"] = gst.element_factory_make('videocrop')
bin.add(self.video["videocrop"])
pad = self.video["videocrop"].get_pad("sink")
bin.add_pad(gst.GhostPad("sink", pad))
videosink = gst.element_factory_make('autovideosink')
bin.add(videosink)
gst.element_link_many(self.video["videocrop"], videosink)
self.player.set_property("video-sink", bin)
pad.connect("notify::caps", self.gst_on_notify_caps)

コネクトするハンドラをば

def gst_on_notify_caps(self, pad, pcaps):
    caps = pad.get_negotiated_caps()
    if caps != None:
        if "video" in caps.to_string():
            x = caps[0]["width"]
            y = caps[0]["height"]
            self.new_size(x, y)

元サイズはコレでなんとか取れるようになった。
(もっといい方法は無いのかなぁ?)
後は指定倍率にリサイズする関数を作ればいい。

def new_size(self, x, y):
    if x == self.video["width"] and y == self.video["height"]:
        return
    self.video["width"] = x
    self.video["height"] = y
    # で…あれ??????

今のレイアウトではいったいどうやったらこのサイズにできる?
うわあぁ丸ごとソース変更になりそうな悪寒。

そのまま

結局そのままいった。

GDK イベントの取得とリサイズ

チラツキは後でなんとかすればいいや!
地味に小ネタを入れておいたからゆるしてくれ。
って待っている人なんかいないと思うけど。

てゆーか給付金を早く配ってくれよ政治家さん。

テレビニュースの捏造っぷりは最近やりたい放題だよね。
「給付金は無駄」だと言っている奴なんかいるはずがないのによくもまあ。
誘導尋問のインタビューとご都合主義の編集とスタッフのさくらはもうウンザリだ。

その捏造をネタに国会をやる民主党は更に…俺がこんなことを書いてもしゃーないが。
そろそろ朝はおはスタしか見る番組がない現実をなんとかしてくれよ。

リサイズは難しい

begin_resize_drag はこの動作には使えなかった…
マウスボタンを離すまで motion_notify_event シグナルが発行されない。
ウインドのリサイズが完了するまで普通の動きになる、あぁ駄目だ。

つーかリサイザにボタンを使うと motion_notify_event シグナルが発行されない。
GtkDrawingArea でも使うとするか。

パッキングの展張を全部「いいえ」にして Windows のように自前計算と考えた。
GtkContainer の check_resize シグナルで width_request プロパティを弄くれば…
それでは当然小さくリサイズすることができなくなってしまう、あぁ駄目だ。
どうでもいいが「展張」なんて日本語は無いヤン!

パッキングのプロパティを動的に変更できれば楽なんだけど…
「フィル」にしたウイジェットの幅が取得できないのでどっちにしても。
size_request() は最小値だし get_size_request() は -1 だし。

def gtk_on_drawingarea2_motion_notify_event(self, widget, event):
    if self.resize_list:
        x = event.x_root - self.resize_x
        if self.resize_list + x > 0:
            # この上に Treeview が乗っている
            self["scrolledwindow1"].set_property("width_request", self.resize_list + x)
            self["y901window"].resize(int(self.cx + x), int(self.cy))
    
def gtk_on_drawingarea2_button_press_event(self, widget, event):
    self.resize_list = self["scrolledwindow1"].get_property("width_request")
    self.resize_x = event.x_root
    self.cx, self.cy = self["y901window"].get_size()
                            
def gtk_on_drawingarea2_button_release_event(self, widget, event):
    self.resize_list = 0

でなんとか希望どおりの動きになったけどチラツキまくる。
ハンドラを抜けるまで描写ロックなんてできないのかな?

GTK 側が意図していない動作をむりやり行うのは苦労するわ。

いつまでたっても更新ができないのでとりあえずこのままいこう。
とも思うけど今のままでは二倍表示とかを実装時に詰まりそうなんですけど…