タイトルどおりのモノを作っているので覚書。
実は GtkHeaderBar って Widget を置けるはずがない所に描写している。
なのでこんなことがおこります。
いきなり少し違うけど PyGObject のオーバーライドバグ。
def do_size_allocate(self, allocation): pass
BUG って出るんだね、親切になったもんだ。
connect メソッドなら普通にコネクトできる。
ただ本体の大きさで ClutterActor のサイズを合わせると
class ClPlayer(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) # etc... self.connect("size-allocate", self.on_size_allocate) def on_size_allocate(self, widget, allocation): self.actor.set_width(allocation.width) self.actor.set_height(allocation.height)
外枠とタイトルバーの大きさの二倍が加算されてしまうようです。
Box を噛ませてその Box の大きさに合わせてなら問題ないようだ。
GtkHeaderBar さえ使わなければコレでもいいんですけどね。
それと draw シグナルは絶対に処理してはいけない。
def do_draw(self, cr): pass
GtkHeaderBar が真っ黒なレゴになってしまいます。
描写処理は Clutter で行うようにする。
そんなこんなで色々困ったことが起こったけどなんとかなった。
#!/usr/bin/env python3 import sys, gi gi.require_version("Gtk", "3.0") gi.require_version("ClutterGst", "3.0") gi.require_version("GtkClutter", "1.0") from gi.repository import Gtk, Gdk, ClutterGst, GtkClutter, Clutter # Own Change URI = "file:///home/sasakima-nao/movie/kawasaki_h2r.mp4" class ClPlayer(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) # Dark Theme settings = Gtk.Settings.get_default() settings.props.gtk_application_prefer_dark_theme = True # GtkHeaderBar self.hbar = Gtk.HeaderBar() self.hbar.set_show_close_button(True) self.set_titlebar(self.hbar) # Full Screen Button fullbutton = Gtk.Button.new() image_full = Gtk.Image.new_from_icon_name("view-fullscreen-symbolic", Gtk.IconSize.MENU) fullbutton.set_image(image_full) self.hbar.pack_end(fullbutton) # new self.actor = Clutter.Actor.new() self.content = ClutterGst.Aspectratio.new() self.player = ClutterGst.Playback.new() # set self.content.set_player(self.player) self.actor.set_content(self.content) # add embed = GtkClutter.Embed() stage = embed.get_stage() stage.add_child(self.actor) # box vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) vbox.pack_start(embed, True, True, 0) vbox.connect("size-allocate", self.on_vbox_size_allocate) self.add(vbox) # play self.player.set_uri(URI) self.player.set_playing(True) # show self.show_all() def do_delete_event(self, event): Gtk.main_quit() def on_vbox_size_allocate(self, vbox, allocation): """ Fit a Clutter.Actor """ self.actor.set_width(allocation.width) self.actor.set_height(allocation.height) GtkClutter.init(sys.argv) ClutterGst.init(sys.argv) win = ClPlayer() Gtk.main()
GtkHeaderBar とダークテーマが実装できた。
次はシークバーだな、また色々出るんだろうな…
だから楽しいんだYO!