JavaScript でスマホゲームもいいけどメインの GTK+ もやらねば。
久々に Y901x の更新、ポーズからコマ戻しが上手くいく方法を見つけたので。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # self.player @ playbin # self.settingwin @ My Setting def set_next_frame( self , rate): """ 1 frame up down (rate 1.0 or -1.0) """ if self .settingwin.direction ! = rate: self .settingwin.direction = rate self .set_playback_direction(rate) event = Gst.Event.new_step(Gst.Format.BUFFERS, 1 , 1.0 , True , False ) self .player.send_event(event) def set_playback_direction( self , rate): """ Change direction """ pos = self .player.query_position(Gst.Format.TIME)[ 1 ] if rate > = 0.0 : self .player.seek( rate, Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE, Gst.SeekType.SET, pos, Gst.SeekType.SET, - 1 ) else : self .player.seek( rate, Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE, Gst.SeekType.SET, 0 , Gst.SeekType.SET, pos) def on_play( self , widget, data = None ): if self .settingwin.direction = = - 1.0 : self .settingwin.direction = 1.0 self .set_playback_direction( 1.0 ) if self .player.get_state( 1 )[ 1 ] = = Gst.State.PLAYING: self .player.set_state(Gst.State.PAUSED) else : self .player.set_state(Gst.State.PLAYING) |
逆転させる手続きを分離して send_event するだけだった。
GLib.idle_add とか色々試したのに実はこんなに簡単だった…
これなら関数を抜けるので逆転した後で 1 コマ移動ということになるのかな。
再生開始で正転に戻すのを忘れないようにと。
それと手段が全然解らず困り果てていたシークバー上のマウスホイール。
event.direction 引数が Gdk.ScrollDirection.SMOOTH になるのよ。
Gdk.ScrollDirection.UP, DOWN になる記事以外見当たらなかったし。
http://nullege.com/codes/show/src%40p%40i%40pitivi-HEAD%40pitivi%40utils%40widgets.py/1035/gi.repository.Gdk.ScrollDirection.UP/python
そういうことだったのか!
やっぱり GPL のコードを見たほうが圧倒的に参考になるね。
何も作品を作っていなさそうな人って何故勉強しているのか、日本人に多過ぎ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def on_seek_scroll_event( self , widget, event): """ Mouse Wheel event widget @ GtkScale """ delta = 0 if event.direction in [Gdk.ScrollDirection.UP, Gdk.ScrollDirection.RIGHT]: delta = 1 elif event.direction in [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.LEFT]: delta = - 1 elif event.direction in [Gdk.ScrollDirection.SMOOTH]: unused_res, delta_x, delta_y = event.get_scroll_deltas() if delta_x: delta = math.copysign( 1 , delta_x) elif delta_y: delta = math.copysign( 1 , - delta_y) if delta: location = widget.get_value() - (delta * 10000000000 ) if location > 0 and location < self .playinfo.duration: self .set_play_position(location) self .put_time_status(location) |
これで約 10 秒送りなホイールスクロールが可能になった。
Fedora 20 でしか試していないけど多分 GNOME なら大丈夫だろう。
次バージョン早く出ないかなぁ、20 が安定しているからいいけど半年サイクルに慣れ過ぎた。