在Gjs中使用Shell对象

时间:2012-01-02 11:38:28

标签: gnome-shell

我正在使用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.Gioimports.gi.GLib可以正常使用其他对象。

使用Ubuntu 11.10 x64

3 个答案:

答案 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_PATHGIRepository.Repository搜索路径),但我还没有设法使用它来访问global对象。