Y901x-0.2.3 は大失敗だった。
motion-notify-event で処理しているから VideoArea 領域を外れたら認識しない。
つまり 16:9 の動画を 16:10 ディスプレイで表示した場合とかでは下に黒帯が出る。
その黒帯部分では領域外なので motion を認識なんてするはずがない。
つまりフルスクリーンでのコントローラは出ないわけだ。
んー Cinema では WM_MOUSEMOVE で計算してやっていたんだけどなぁ。
GTK+ ではレイアウタなので超ややこしいし、WindowsAPI の GetCapture みたく…
ってソレどうやるの?面倒なので Timer で処理するようにしよう。
# GetCursolPos a, x, y, b = gtk.gdk.display_get_default().get_pointer()
で x と y にスクリーン座標で現在のマウスカーソル位置が取得できるようだ。
a は gtk.gdk.Screen、b は Shift や Ctrl の Mask、ここでは使わないのでダミー。
この値を元に処理したらとりあえずディスプレイより横長動画でも処理できた。
せっかくタイマー処理でマウスカーソル位置を取得しているんだからカーソル消去も。
只の Y901 からの伝統で通常時でも画面上は静止状態マウスカーソルを一秒後に消す。
っっって、GTK+ で WindowsAPI の ShowCursor(FALSE); ってどうするの?
の下のほうに普通に書いていた、つまり自分で作らないといけないんだね。
これが解れば処理方法自体は同じなので Python コードにて書き換えるだけだ。
ということで細かい処理は Y901x のコードを見てもらうとして簡単に。
class Y901window(dbus.service.Object): def __init__(self, bus_name): # ... self.mousepoint = [0, 0] self.invisiblecount = 0; # Create invisible cursor pixmap = gtk.gdk.Pixmap(None, 1, 1, 1) color = gtk.gdk.Color() self.noncursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
省略しすぎかな、とにかくタイマーで
def on_timer(self): # ... # GetCursolPos a, x, y, b = gtk.gdk.display_get_default().get_pointer() # FullScreen at Controler if self.fullobj: if self.fullobj.y_pos < y: self.fullobj.show_all() else: self.fullobj.hide() # Cursor Auto Invisible if self.mousepoint[0] == x and self.mousepoint[1] == y: if self.invisiblecount < 5: self.invisiblecount += 1 else: self.video_window.window.set_cursor(self.noncursor) else: self.invisiblecount = 0; self.mousepoint[0] = x self.mousepoint[1] = y self.video_window.window.set_cursor(None) # return True is Repeat return self.is_playing
と時間表示とフルスクリーンコントローラとカーソル消去を全部やってみた。
とりあえずこれでつじつまが合っている、かなり Windows 用 Y901(Cinema) を再現できた。
ということで Y901x-0.2.4 公開しました。
やっぱり全然人増えねぇ、Windows 用のようにいかないわな。