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

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

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

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.


person Alexander    schedule 02.01.2012    source источник


Ответы (2)


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

person gfxmonk    schedule 05.05.2012

Позвоните org.gnome.Shell.Eval через dbus.

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

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

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

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

person Lucas Werkmeister    schedule 23.12.2017