GNOME 3.26 gjs class

おまたせ、gjs の ES6 class でアプリを作る方法がやっと解ったよ。
PyGObject みたく親切に例外を吐くなんてしてくれないので厳しい。

注意点、constructor はマジでコンストラクタです。
Python の __init__ 等と違う、動的言語でまさかこの仕様だとは。
細かい説明はしないけど、つまり super() 以外は何もできない。
継承で色々行う場合は下記のように別関数にする等の必要あり。

/*
const MyWindow = new Lang.Class({
    Name: 'MyWindow',
    Extends: Gtk.ApplicationWindow,

    _init: function(app) {
        this.parent({application: app});
        this.createContents();
        // etc...
*/
var MyWindow = GObject.registerClass({
    GTypeName: "MyWindow",
}, class MyWindow extends Gtk.ApplicationWindow {
    constructor(props={}) {
        super(props);
    }
    create() {
        this.createContents();
        // etc...

更に constructor の引数はベースへの property を JSON でに限定。
他を入れるとエラーになるのでとにかくこう書く以外に手段は無いみたい。

override で継承元の関数を呼ぶには super からドットで呼び出す。
Lang.Class ではないので this.parent() は使えない。

var MyApplication = GObject.registerClass({
    GTypeName: "MyApplication"
}, class MyApplication extends Gtk.Application {
    constructor(props={}) {
        super(props);
    }
    vfunc_startup() {
        //this.parent();
        super.vfunc_startup();

コレはすぐ気が付くか。

それ以外は今までのコードをそのまんま使えるようだ。
var にする必要があるのは外部から使う class だけでいいみたい。

本当は物凄い遠回りをしたんだけど以上であるようだ。

ということで、もう少し実験してから Y901x を更新する。
ぶっちゃけ動画プレイヤーは gnome-mpv でイイんだけど
Y901x は gjs のサンプルコードがメインの仕事だったことを忘れる所だった。