2012-01-02 11 views
11

Estoy escribiendo una aplicación gtk + usando Gjs (enlaces de Gnome JavaScript) Como no hay documentos disponibles, estoy leyendo las fuentes de JavaScript de gnome-shell. En mi aplicación necesito tener acceso al global.userdatadir.Uso del objeto Shell en Gjs

Estoy tratando de agregar el objeto Shell para mi guión:

const Shell = imports.gi.Shell; 

y ejecutarlo con #gjs myscript.js pero cuando hago esto, me tira un error que dice:

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 

no puedo comprenda qué le pasa, es exactamente como en los archivos fuente Gnome-shell. Otros objetos están bien usando imports.gi.Gio, imports.gi.GLib, funciona bien.

Trabajando en Ubuntu 11.10 x64

Respuesta

7

No puede ejecutar las extensiones de gnome-shell a través de gjs, tienen que ser cargados por sí mismo gnome-shell. Para el desarrollo, esto generalmente significa ponerlos en ~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID y reiniciar el shell.

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 
+0

En general, las respuestas de solo código no son preferidas. – Ryan

0

de llamadas a través de org.gnome.Shell.Eval dbus.

Como señala gfxmonk, el código JavaScript debe ser ejecutado por el propio shell. Si está escribiendo escribiendo una extensión, la forma de hacerlo es a través de dbus, por ejemplo, usando systemd's busctl. (Estoy seguro de que también es posible a través de dbus-send, yo prefiero busctl 's sintaxis y que tiene la implementación del tabulador.!)

Por ejemplo, este registra todos los títulos de ventana:

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

se puede ver la mensajes de registro con journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell'. (Es posible que desee añadir -b demasiado a solamente ver los mensajes del arranque actual, o --since '5 minutes ago', ... - ver journalctl (1) para más opciones.)

Alternativamente, this GitHub gist describe cómo obtener en el módulo Shell en gjs (agregue /usr/lib/gnome-shell a LD_LIBRARY_PATH y a la ruta de búsqueda GIRepository.Repository), pero no he logrado obtener acceso a un objeto global usando eso.

Cuestiones relacionadas