2012-01-02 16 views
11

Piszę aplikację gtk + używając Gjs (powiązania Gnome JavaScript) Ponieważ nie ma dostępnych dokumentów, czytam źródła skryptów JavaScript gnome-shell. W mojej aplikacji muszę uzyskać dostęp do global.userdatadir.Używanie obiektu Shell w Gjs

Próbuję dodać obiekt Shell do mojego skryptu:

const Shell = imports.gi.Shell; 

i uruchomić go z #gjs myscript.js ale kiedy to zrobić to wyrzuca mi błąd mówiąc:

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 zrozumieć, co jest z nim nie tak, jest dokładnie takie, jak w plikach źródłowych Gnome-shell. Inne obiekty są w porządku przy użyciu imports.gi.Gio, imports.gi.GLib, działa OK.

Praca na Ubuntu 11.10 x64

Odpowiedz

7

nie można uruchomić rozszerzenia gnome-shell poprzez GJS, muszą być ładowane przez samą gnome-shell. Dla rozwoju oznacza to zwykle umieszczenie ich w ~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID i ponowne uruchomienie powłoki.

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

Generalnie odpowiedzi tylko do kodu nie są preferowane. – Ryan

0

połączeń org.gnome.Shell.Eval poprzez dbus.

Jak wskazuje gfxmonk, kod JavaScript powinien być uruchamiany przez samą powłokę. Jeśli jesteś nie pisanie rozszerzenia, sposób to zrobić poprzez dbus, na przykład przy użyciu systemd's busctl. (Jestem pewien, że jest to również możliwe poprzez dbus-send, po prostu wolą busctl „s składni i ma zakończenie zakładki.!)

Na przykład ten rejestruje wszystkie tytuły okno:

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

można zobaczyć zaloguj wiadomości z numerem journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell'. (Prawdopodobnie chcesz dodać -b zbyt aby zobaczyć tylko komunikaty z bieżącego rozruchu lub --since '5 minutes ago' ... - patrz journalctl (1) po więcej informacji.)

Alternatywnie this GitHub gist opisuje w jaki sposób dostać się na module w Shellgjs (dodaj /usr/lib/gnome-shell do LD_LIBRARY_PATH i do ścieżki wyszukiwania GIRepository.Repository), ale nie udało mi się uzyskać dostępu do obiektu global za pomocą tego.

Powiązane problemy