2012-01-02 3 views
11

Я пишу gtk + приложение с использованием Gjs (привязки JavaScript Gnome) Поскольку нет доступных документов, я читаю источники JavaScript-гномов-оболочек. В моем приложении мне нужно получить доступ к global.userdatadir.Использование объекта Shell в Gjs

Я пытаюсь добавить объект оболочки к моему сценарию:

const Shell = imports.gi.Shell; 

и запустить его с #gjs myscript.js , но когда я делаю это он бросает мне ошибку говоря:

JS ERROR: !!! Exception was: Error: Requiring Shell, version none: Typelib file for namespace 'Shell' (any version) not found 
    JS ERROR: !!!  lineNumber = '0' 
    JS ERROR: !!!  fileName = '"gjs_throw"' 
    JS ERROR: !!!  stack = '"("Requiring Shell, version none: Typelib file for namespace 'Shell' (any version) not found")@gjs_throw:0 
@manager.js:5 
"' 
    JS ERROR: !!!  message = '"Requiring Shell, version none: Typelib file for namespace 'Shell' (any version) not found"' 
Error: Requiring Shell, version none: Typelib file for namespace 'Shell' (any version) not found 

Я не могу понять, что с ним не так, это точно так же, как в исходных файлах Gnome-shell. Другие объекты в порядке, используя imports.gi.Gio, imports.gi.GLib, работает нормально.

Работа на Ubuntu 11.10 x64

ответ

7

Вы не можете запустить расширения гном-оболочки через GJS, они должны быть загружены самой гнома-оболочки. Для разработки обычно это означает, что они помещаются в ~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID и перезапускают оболочку.

2
$ apt-file search -x "Shell.*typelib" 
gnome-shell: /usr/lib/gnome-shell/Shell-0.1.typelib 
gnome-shell: /usr/lib/gnome-shell/ShellJS-0.1.typelib 
gnome-shell: /usr/lib/gnome-shell/ShellMenu-0.1.typelib 

$ sudo apt-get install gnome-shell 
+0

В общем случае ответы только на код не являются предпочтительными. – Ryan

0

Вызов org.gnome.Shell.Eval через DBus.

Как указывает gfxmonk, код JavaScript должен запускаться самой оболочкой. Если вы не, написание расширения, способ сделать это через dbus, например, с помощью systemd's busctl. (Я уверен, что это возможно с помощью dbus-send, я просто предпочитаю busctl «s синтаксиса и имеет автодополнение.!)

Например, это регистрирует все заголовки окон:

busctl --user call org.gnome.Shell /org/gnome/Shell org.gnome.Shell Eval s ' 
    for (const actor of global.get_window_actors()) { 
     const window = actor.get_meta_window(), 
       title = window.get_title(); 
     log(title); 
    } 
' 

Вы можете увидеть регистрировать сообщения с journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell'. (Вы, вероятно, хотите добавить -b тоже видеть только сообщения от текущей загрузки, или --since '5 minutes ago' ... - см journalctl (1) больше вариантов.)

В качестве альтернативы, this GitHub gist описывает, как получить на Shell модуля в gjs (добавьте /usr/lib/gnome-shell в LD_LIBRARY_PATH и в путь поиска GIRepository.Repository), но мне не удалось получить доступ к объекту global, используя это.