Использование объекта Shell в Gjs

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

Я пытаюсь добавить объект Shell в свой script:

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

Ответ 1

Вы не можете запускать расширения gnome-shell через gjs, они должны быть загружены самой gnome-shell. Для разработки обычно это означает, что они помещаются в ~/.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

Ответ 3

Вызовите org.gnome.Shell.Eval через dbus.

Как указывает gfxmonk, код JavaScript должен запускаться самой оболочкой. Если вы не пишете расширение, способ сделать это через dbus, например, с помощью systemds 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',... - см. журналctl (1) для получения дополнительных параметров.)

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