前々回の記事で 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 からダブルクリック。
ダブルクリックだとマウント先が渡るのね。
そして日本語は見事に化けるという。
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 の仕様をなんとかしてくれないかなぁ。