Gjs Application HANDLES_OPEN

Gjs にて C 言語の __FILE__、Python の __file__ に相当するもの。
const System = imports.system;
System.programInvocationName;

javascript – Handle files passed as arguments on the command line in a Gjs Gtk.Application – Stack Overflow

なんだあったのか。
これでちょっぴりコードがスッキリできるぞ。

それと open シグナルの引数は二つだった。
引数や戻り値の数を間違って指定してもエラーにならない仕様ってチト困るよ。

Gio.Application::open

それらはそれほど問題にならないのだけれども。
コレはどうにかならないものか…

#!/usr/bin/gjs

const Lang = imports.lang;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const System = imports.system;

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

    _init: function() {
        this.parent({
            // set G_APPLICATION_HANDLES_OPEN
            flags: Gio.ApplicationFlags.HANDLES_OPEN
        });
    },
    vfunc_open: function(files, hint) {
        // Not compatible CJK
        print(files[0].get_path());
        // to JavaScript String
        let jstr = decodeURIComponent(escape(files[0].get_path()));
        print(jstr);
    },
    vfunc_activate: function() {
        //
    }
});

let app = new OpenApplication();
ARGV.unshift(System.programInvocationName)
app.run(ARGV)

ちなみに PyGObject

#!/usr/bin/env python3

import sys, gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio

class OpenApplication(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self,
            flags=Gio.ApplicationFlags.HANDLES_OPEN )

    def do_open(self, files, n_file, hint):
        print(files[0].get_path())

    def do_activate(self):
        pass

app = OpenApplication()
app.run(sys.argv)

gjs_handles_open

アルファベットなら問題ないけど CJK だと引数の GioFile がおかしい。
path が滅茶苦茶な状態で渡されてくるので自力変換する必要あり。
変換方法はココで見つけたけどアルファベットは問題ないし UTF-16 じゃなくね?

javascriptで文字コード変換 – Qiita

get_uri でも同じ、一度変換して再変換という手間が必要。
PyGObject は問題ないのでバインディングの失敗ですよね。

# 追記
ARGV 自体がおかしかった。

ARGV.forEach(function(element) {
    print(element);
});
/*
gjs test.js 日本語.txt
#=>æ?æ?¬èª?.txt
*/