日別アーカイブ: 2023/05/07

GTK4 Application in Gjs

そういえば GTK4 になってから Gjs をまったくやっていない。
GTK3 では PyGObject のほうが圧倒的に簡単だし情報がほぼ公式だけだったし。
もしかして GTK4 になってから少しは簡単になっているのだろうか?

GTK4 + GJS Book ? Learn to build a GTK4 application with GJS

#!/usr/bin/gjs -m

/*
 * GTK4 Application in Gjs
 * Requires -m option in command line
 */

// version set
import 'gi://Gtk?version=4.0';
import 'gi://Adw?version=1';

// imports to Dynamic Import
import Gtk from 'gi://Gtk';
import GObject from 'gi://GObject';
import Adw from 'gi://Adw';

export const MyWindow = GObject.registerClass({
    GTypeName: 'MyWindow'
}, class extends Gtk.ApplicationWindow {
    _init(app) {
        // Set Adwaita Style
        let manager = Adw.StyleManager.get_default();
        manager.set_color_scheme(Adw.ColorScheme.DEFAULT);
        // No change from GTK3
        super._init({application: app});
        let button = new Gtk.Button({label: 'Click'});
        button.connect('clicked', ()=> {
            this.title = 'Hello';
        });
        this.set_child(button);
    }
});

export const MyApplication = GObject.registerClass({
    GTypeName: 'MyApplication'
}, class extends Gtk.Application {
    // use _init instead of constructor
    _init() {
        super._init({
            application_id: 'org.myapp.test'
        });
    }
    // override is vfunc_***
    vfunc_activate() {
        let win = new MyWindow(this);
        win.present();
    }
});

new MyApplication().run(null);

gir を使うには -m オプションが必要になった。
gir バージョンの指定はこうするようです。
imports という独自関数は MDN 準拠の Dynamic import っぽく変更。
class の作成も同様に export を指定。
ビルドする場合は main 関数というコンストラクタを用意する。
Adwaita テーマの適用は PyGObject と同じ。
後は GTK3 の時と変わっていないみたい。

全然簡単になっていなかった、むしろ面倒さが増している。
というか GObject.registerClass を隠蔽する仕組みが欲しい。

しかし Python に慣れていると new や let をよく書き忘れる。
Python が人気なのはまあ当然というかなんというか