Использование объекта 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
, используя это.