处理在Gjs Gtk.Application中命令行上作为参数传递的文件

时间:2016-02-03 21:26:59

标签: javascript gtk gtk3 gjs

我正在尝试使用Gjs handles files passed as command line arguments来编写GNOME GTK3应用程序。为此,我连接open的{​​{1}}信号并设置Gtk.Application标记:

Gio.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

我正在运行gjs@1.44。

1 个答案:

答案 0 :(得分:1)

与其他语言的惯例相比,GJS ARGV的定义方式存在差异。例如,在C中,argv[0]是程序的名称,第一个参数从argv[1]开始。在GJS中,程序的名称为System.programInvocationName,第一个参数为ARGV[0]

不幸的是,作为C库的一部分,Gtk.Application希望您根据C约定传入参数。你可以这样做:

ARGV.unshift(System.programInvocationName);

正在发生的事情是./open-files.js open-files.js['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)