2012-01-02 22 views
11

Sto scrivendo un'app gtk + usando Gjs (collegamenti JavaScript di Gnome) Dato che non ci sono documenti disponibili sto leggendo i sorgenti di JavaScript di gnome-shell. Nella mia app ho bisogno di accedere a global.userdatadir.Uso dell'oggetto Shell in Gjs

Sto cercando di aggiungere l'oggetto Shell per il mio script:

const Shell = imports.gi.Shell; 

ed eseguirlo con #gjs myscript.js ma quando faccio questo mi getta un errore che 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 

I cant capire cosa c'è che non va, è esattamente come nei file sorgente di Gnome-shell. Altri oggetti vanno bene con imports.gi.Gio, imports.gi.GLib, funziona OK.

Lavorando su Ubuntu 11.10 x64

risposta

7

Non è possibile eseguire le estensioni gnome-shell tramite gjs, devono essere caricati da gnome-shell stessa. Per lo sviluppo, questo di solito significa metterli in ~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID e riavviare la 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

In generale, le risposte solo in codice non sono preferite. – Ryan

0

chiamata org.gnome.Shell.Eval tramite dbus.

Come indicato da gfxmonk, il codice JavaScript deve essere eseguito dalla shell stessa. Se sei non scrivendo un'estensione, il modo per farlo è tramite dbus, ad esempio utilizzando busctl di systemd. (Sono sicuro che è possibile anche tramite dbus-send, io preferisco la sintassi busctl s' Ed ha il completamento automatico.!)

Ad esempio, questa registra tutti i titoli delle finestre:

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

si può vedere il registra i messaggi con journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell'. (Probabilmente si desidera aggiungere -b troppo per vedere solo i messaggi provenienti avvio corrente, o --since '5 minutes ago', ... - vedi journalctl (1) per ulteriori opzioni.)

In alternativa, this GitHub gist descritto come ottenere sul modulo Shell in gjs (aggiungi /usr/lib/gnome-shell a LD_LIBRARY_PATH e al percorso di ricerca di GIRepository.Repository), ma non sono riuscito ad accedere a un oggetto global utilizzando quello.