ClutterGst 3.0 and GtkHeaderBar

タイトルどおりのモノを作っているので覚書。
実は GtkHeaderBar って Widget を置けるはずがない所に描写している。
なのでこんなことがおこります。

いきなり少し違うけど PyGObject のオーバーライドバグ。

def do_size_allocate(self, allocation):
    pass

ovverride_error

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)

allocate_size

外枠とタイトルバーの大きさの二倍が加算されてしまうようです。
Box を噛ませてその Box の大きさに合わせてなら問題ないようだ。
GtkHeaderBar さえ使わなければコレでもいいんですけどね。

それと draw シグナルは絶対に処理してはいけない。

def do_draw(self, cr):
    pass

gtkheaderbar_draw

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()

gst_headerbar

GtkHeaderBar とダークテーマが実装できた。
次はシークバーだな、また色々出るんだろうな…
だから楽しいんだYO!