2016-02-03 8 views
2

Я пытаюсь написать приложение GNOME GTK3, используя Gjs, который handles files passed as command line arguments. Для того, чтобы сделать это я подключить open сигнал Gtk.Application и установите Gio.ApplicationFlags.HANDLES_OPEN флаг:.Обрабатывать файлы, переданные в качестве аргументов в командной строке в Gjs Gtk.Application

#!/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 

Я бегу [email protected]

ответ

1

Существует расхождение в том, как определяется ARGV GJS относительно условностей на других языках. Например, в 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'] в ARGV, который Gtk.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) 

 Смежные вопросы

  • Нет связанных вопросов^_^