Use of Shell object in Gjs

后端 未结 3 1918
小蘑菇
小蘑菇 2021-02-14 01:00

I am writing a gtk+ app using Gjs ( Gnome JavaScript bindings ) As there are no documents available i am reading the sources of gnome-shell JavaScript\'s . In my app i need to g

3条回答
  •  误落风尘
    2021-02-14 01:52

    Call org.gnome.Shell.Eval via dbus.

    As gfxmonk points out, the JavaScript code should be run by the shell itself. If you’re not writing an extension, the way to do that is via dbus, for instance using systemd’s busctl. (I’m sure it’s also possible via dbus-send, I just prefer busctl’s syntax. And it has tab completion!)

    For example, this logs all window titles:

    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);
        }
    '
    

    You can see the log messages with journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell'. (You probably want to add -b too to only see messages from the current boot, or --since '5 minutes ago', … – see journalctl(1) for more options.)

    Alternatively, this GitHub gist describes how to get at the Shell module in gjs (add /usr/lib/gnome-shell to LD_LIBRARY_PATH and to GIRepository.Repository’s search path), but I haven’t managed to get access to a global object using that.

提交回复
热议问题