我正在使用Gjs编写一个gtk +应用程序(Gnome JavaScript绑定)
由于没有可用的文档,我正在阅读gnome-shell JavaScript的来源。
在我的应用中,我需要访问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
答案 0 :(得分:7)
你不能通过gjs运行gnome-shell扩展,它们必须由gnome-shell本身加载。对于开发,这通常意味着将它们放入~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID
并重新启动shell。
答案 1 :(得分: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
答案 2 :(得分:0)
通过dbus致电org.gnome.Shell.Eval
。
正如gfxmonk所指出的,JavaScript代码应该由shell本身运行。如果你不编写扩展名,那么这样做的方法是通过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)以获取更多选项。)
或者,this GitHub gist介绍如何访问Shell
中的gjs
模块(将/usr/lib/gnome-shell
添加到LD_LIBRARY_PATH
和GIRepository.Repository
搜索路径),但我还没有设法使用它来访问global
对象。