GNOME 3.26 gjs p2

散々探してやっと見つけた。

Inventing GObject ES6 classes | The Mad Scientist Review

なんかイッパイ手段があるみたい。
一番簡単そうな手段で試してみる。

/* btn.js */

const Gtk = imports.gi.Gtk;
const GObject = imports.gi.GObject;

var Btn = GObject.registerClass({
    GTypeName: "BtnClass"
}, class Btn extends Gtk.Button {
    constructor(props={}) {
        super(props);
    }
    // function
    set_button_label(txt) { this.label = txt; }
    // getter
    get prop() { return this.label }
});

#!/usr/bin/gjs

imports.gi.versions.Gtk = "3.0";
imports.searchPath.unshift('.');

const Gtk = imports.gi.Gtk;
const Btn = imports.btn;

class Test extends Gtk.Window {
    constructor() {
        super();
        this.connect("hide", ()=> {
            Gtk.main_quit();
        });
        this.ll = "カワイイ";
        var btn = new Btn.Btn({label: "睦ちゃん"});
        btn.connect("clicked", (widget)=> {
            // getter
            var s = widget.prop;
            // function
            widget.set_button_label(`${s} ${this.ll}`);
        });
        this.add(btn);
        this.show_all();
    }
}

Gtk.init(null);
let test = new Test();
Gtk.main();

で動かしてみる。

何も警告は出なくなった、思いっきり const を使っているのに。
これで安心してコード分割ができるぞい。
ただ、ちょっぴり面倒臭い。

関数定義や getter/setter は検索して一番解りやすかったページが以下。

JavaScriptにもクラスがやってきた!JavaScriptの新しいclass構文をマスターしよう | HTML5Experts.jp

コピペして console.log を print に書き換えてと。
うん gjs 1.50.2 で問題なく動くんだね。
だけど gir で継承すると…

#!/usr/bin/gjs

imports.gi.versions.Gtk = "3.0";

const Gtk = imports.gi.Gtk;
Gtk.init(null);

//* gir @ Error
class Btn extends Gtk.Button {
    constructor() { super(); }
    put() { print("func test"); }
}
//*/

/* no gir @ OK!
class Btn {
    constructor() {}
    put() { print("func test"); }
}
*/
var btn = new Btn();
btn.put();

何でや!

getter/setter も同様だった、理由が解らない。
上記のように GObject.registerClass をするしかないっぽい。
class が使えるようになって面倒になるとは思わなかったよ。

GNOME 3.26 gjs

GNOME 3.26 の目玉、gjs が ES6 フル対応になった。
これでで class が使えるぞ、Lang.Class の奇妙なコードとはおさらばじゃ。
んと、その前に。

#!/usr/bin/gjs

// 'gjs a.js 苗ちゃん'

const GLib = imports.gi.GLib;

for (let val of ARGV) {
    print(val);
    //let s = decodeURIComponent(escape(val));
    //print(s);
}

変わっていないや、まあいいか。
ClutterImage のセットが激遅なのもそのまんまだね。
ClutterImage PyGObject/Gjs | PaePoi

それはそれとして新機能だ。
GtkWindow を作ってみよう、やっぱり GUI だよね。

#!/usr/bin/gjs

imports.gi.versions.Gtk = "3.0";

const Gtk = imports.gi.Gtk;

class Test extends Gtk.Window {
    constructor() {
        super();
        this.connect("hide", ()=> {
            Gtk.main_quit();
        });
        this.show_all();
    }
}

Gtk.init(null);
let test = new Test();
Gtk.main();

これでウインドウを作るだけの最小限コードのようだ。

imports は PyGObject と同様にバージョン指定が無いと警告が出るようになった。
アロー関数を使えば Lang.bind を使わずにあの this の糞仕様を回避できる。
他の説明はいらないよね。

次はコード分割してみよう。

#!/usr/bin/gjs

imports.gi.versions.Gtk = "3.0";
imports.searchPath.unshift('.');

const Gtk = imports.gi.Gtk;
const Btn = imports.btn;

class Test extends Gtk.Window {
    constructor() {
        super();
        this.connect("hide", ()=> {
            Gtk.main_quit();
        });
        this.btn = new Btn.Btn("睦ちゃん");
        this.add(this.btn);
        this.show_all();
    }
}

Gtk.init(null);
let test = new Test();
Gtk.main();

var Gtk = imports.gi.Gtk;

class Btn extends Gtk.Button {
    constructor(lb) {
        super({
            label: lb
        });
    }
}

えーーーーー
let も const も定義していないお!
Java と違って同一ソースに複数の class が書けるのでこうすればいいけど。

#!/usr/bin/gjs

imports.gi.versions.Gtk = "3.0";

const Gtk = imports.gi.Gtk;

class Test extends Gtk.Window {
    constructor() {
        super();
        this.connect("hide", ()=> {
            Gtk.main_quit();
        });
        this.btn = new Btn("睦ちゃん");
        this.add(this.btn);
        this.show_all();
    }
}

class Btn extends Gtk.Button {
    constructor(lb) {
        super({
            label: lb
        });
    }
}

Gtk.init(null);
let test = new Test();
Gtk.main();

コードが長くなると…

モジュールとして継承 class は作ってはいけないってことかな?
まだ試したばかりだし他の方法はあるかもしれないけど。
なんか一気にテンションが下がった、PyGObject に戻るかなぁ。。。

Fedora 27 Upgrade

Fedora 27 が出たので gnome-softwere からアップグレード。
手段は今までと変わらない。

Fedora 26 Upgrade | PaePoi

同日に iOS のアップデートがあったが iOS のほうが時間が掛かった。
平日だしチビッとしか触っていないけど GNOME はリリースノートのとおりだね。
久々な日本語翻訳になっている、英語でも慣れたからいいんだけーが。

GNOME 3.26 リリースノート

Super か Ait+F1 で macOS の spotlight と同様だが強力になった。
‘lo’ と打ち込むとログアウトや画面ロックも出てくる、なるほど。
‘ed’ で dconf-editor や gedit も出る、部分一致も検索対象なのか。
‘sh’ でシャットダウン等の他に gnome-terminal が出る、マジか!

リリースノートに書かれていない気が付いたことを少し。

gedit は 3.22 のまま、開発者がいなくなったとかなんとか。
Ctrl+F9 が使えない以外は困っていないので別にいいけど。

nautilus でアーカイブを file-roller にまかせる設定が消えた。
古臭い使い方をヤメろということなのかな。
あと長いファイル名の場合に改行されない場合があるようだ。

端末から GUI を起動で出て行たサイズがどうのの警告は出なくなった。
筆者が公開しているアプリやプラグインも今までどおり普通に動く。
と思ったけど…

一応動くんだけど。

GNOME 3.26 Gjs | PaePoi
で書いたとおり Gjs はモジュールにする場合は var にしなきゃいけないっぽい。
Lang.Class を ES6 class に書き換えなきゃだし、休日にでも。
sushi は Lang.Class のままだったけど。

今日はココまで。

26

今朝 Fedora 26 で ffmpeg のアップデートがあった。
再起動したら GStreamer で H.264 が再生できるように戻っていた。
え???

たしか GStreamer 1.0 現行版では ffmpeg は関係ないはずだよね。
いったい何が影響していたかは筆者の知識ではワカラン!
とにかくよかったよかった。
Nautilus でサムネイル作成失敗したのをリネームで再作成するべ。

Emoji

あれ?
Family: Man, Woman, Girl, Boy Emoji

あたりを Gedit にコピペして、更に gnome-terminal にコピペ。

全部違うwwwwwwwwwwwwwwwwwww
Gedit は解りやすいように Monospace フォントをデカく変更しているけどさ。

surrogate-pair | PaePoi

コレをこの記事用途で Gedit に下書きでコピペしたモンが何故かこんな感じに変わっていた。
Gedit 自体はまったくアップデートしていないので仕様だね。
あの記事を書いた時にはあのまんまコピペされたのにいつのまにかこんなことに。

アプリ側のフォント選択でこんな奇妙なことになるようです。
自前でヤルか OS にまかせるか Google さんの気紛れを先読みするか、それとも…

フォントってふぉんとに面倒臭いです(ソレが言いたかっただけ?