Gjs @ ARGV in CJK Filename

前々回の記事で Gjs 3.18 の ARGV は日本語未対応だと解った。
一応、Gjs は GTK+ 等と同様 GNOME の一部なのでバージョンは GNOME と同じ。
今後変わるかもしれないけど現状では各自で対策しなければ。

ただし単純に変換すればいいわけではない。
昔と違って今はパラメータが URI である場合もあるのだ。
それを吸収するため GtkApplication が作られたのかも。

function messagebox(text) {
    let dlg = new Gtk.MessageDialog({
        transient_for: null,
        modal: true,
        type: Gtk.MessageType.WARNING,
        buttons: Gtk.ButtonsType.OK,
        text: text
    });
    dlg.run();
    dlg.destroy();
};
ARGV.forEach(function(element) {
    messagebox(element);
});

とりあえずこんな処理を入れて実験。
Mac に日本語ファイル名の動画を置いて Fedora からダブルクリック。

mac_wclick

ダブルクリックだとマウント先が渡るのね。
そして日本語は見事に化けるという。

mac_afp

afp の URI で渡しても再生できる、http もいける。
そもそも URI の場合日本語等は既にエンコードされているはず。
ならばこうすればいいんでないの。

const Y901Application = new Lang.Class({
    Name: 'Y901Application',
    Extends: Gtk.Application,

    _init: function() {
        this.parent({
            flags: Gio.ApplicationFlags.HANDLES_OPEN
        });
    },
    vfunc_open: function(files, hint) {
        let uri = files[0].get_uri();
        let w = new Y901Window(this);
        w.set_uri(uri);
    },
    vfunc_activate: function() {
        new Y901Window(this);
    }
});

let argv = [System.programInvocationName];
ARGV.forEach(function(element) {
    if (element.indexOf("//") == -1) {
        argv.push(decodeURIComponent(escape(element)));
    } else {
        argv.push(element);
    }
});
let application = new Y901Application();
application.run(argv)

“//” があれば URI 確定なのでそのまんま。
パス名なら日本語ファイル名かもしれないから変換処理。
で argv を作り直して g_application_run の引数にする。

これで現状何も問題なく使えている。
てゆーか、ARGV の仕様をなんとかしてくれないかなぁ。