2

コマンドライン引数として渡されたファイルを処理するGjsを使用して GNOME GTK3 アプリケーションを作成しようとしています。そうするために、の信号を接続し、フラグを設定します。openGtk.ApplicationGio.ApplicationFlags.HANDLES_OPEN

#!/usr/bin/gjs

const Gio = imports.gi.Gio
const Gtk = imports.gi.Gtk
const Lang = imports.lang

const MyApplication = new Lang.Class({
  Name: 'MyApplication',

  _init: function() {
    this.application = new Gtk.Application({
      application_id: 'com.example.my-application',
      flags: Gio.ApplicationFlags.HANDLES_OPEN
    })

    this.application.connect('startup', this._onStartup.bind(this))
    this.application.connect('open', this._onOpen.bind(this))
    this.application.connect('activate', this._onActivate.bind(this))
  },

  _onStartup: function() {
    log('starting application')
  },

  _onOpen: function(application, files) {
    log('opening ' + files.length + ' files')
    this._onStartup()
  },

  _onActivate: function() {
    log('activating application')
  }
})

let app = new MyApplication()
app.application.run(ARGV)

ファイル引数を指定してプログラムを実行する_onOpenと、渡されたもので呼び出されることを期待していますが、ファイル引数なしで実行した場合のように、GFile代わりに呼び出されます。_onActivate

$ ./open-files.js open-files.js 
Gjs-Message: JS LOG: starting application
Gjs-Message: JS LOG: activating application

gjs@1.44 を実行しています。

4

1 に答える 1

2

GJS のARGV定義方法には、他の言語の慣例との相違点があります。たとえば、Cargv[0]はプログラムの名前で、最初の引数は から始まりますargv[1]。GJS では、プログラムの名前は でSystem.programInvocationName、最初の引数はARGV[0]です。

残念ながら、C ライブラリの一部であるGtk.Applicationため、C の規則に従って引数を渡す必要があります。あなたはこれを行うことができます:

ARGV.unshift(System.programInvocationName);

何が起こっていたかというと、それはas./open-files.js open-files.jsを入れていて、それはプログラムの名前として解釈されていて、他の引数はありませんでした。2 つのファイル引数を指定してプログラムを実行すると、2 番目のファイルだけが "開かれた" ことがわかります。['open-files.js']ARGVGtk.Application

PS。残念ながら、GJS 1.44 にはバグがあり、open信号が正しく機能しないようです。今のところ、問題Gtk.Applicationをプロキシする代わりにサブクラス化することで問題を回避することをお勧めします。プログラムは次のようになります。

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

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

  _init: function(props={}) {
    this.parent(props)
  },

  vfunc_startup: function() {
    log('starting application')
    this.parent()
  },

  vfunc_open: function(files, hint) {
    log('opening ' + files.length + ' files')
  },

  vfunc_activate: function() {
    log('activating application')
    this.parent()
  }
})

let app = new MyApplication({
  application_id: 'com.example.my-application',
  flags: Gio.ApplicationFlags.HANDLES_OPEN
})
ARGV.unshift(System.programInvocationName)
app.run(ARGV)
于 2016-02-06T05:23:35.283 に答える