2012-01-02 31 views
11

Tôi đang viết ứng dụng gtk + sử dụng Gjs (liên kết JavaScript Gnome) Vì không có tài liệu nào có sẵn, tôi đang đọc nguồn JavaScript của gnome-shell. Trong ứng dụng của tôi, tôi cần truy cập vào global.userdatadir.Sử dụng đối tượng Shell trong Gjs

Tôi cố gắng để thêm đối tượng Shell để kịch bản của tôi:

const Shell = imports.gi.Shell; 

và chạy nó với #gjs myscript.js nhưng khi tôi làm điều này nó ném cho tôi một lỗi nói:

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 

tôi không thể hiểu những gì sai với nó, nó chính xác như trong các tệp nguồn Gnome-shell. Các đối tượng khác là tốt sử dụng imports.gi.Gio, imports.gi.GLib, hoạt động OK.

Làm việc trên Ubuntu 11.10 x64

Trả lời

7

Bạn không thể chạy tiện ích gnome-shell qua gjs, họ phải được nạp bởi gnome-shell riêng của mình. Để phát triển, điều này thường có nghĩa là đặt chúng trong ~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID và khởi động lại trình bao.

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

Nói chung, các câu trả lời chỉ mã không được ưu tiên. – Ryan

0

Gọi org.gnome.Shell.Eval qua dbus.

Như gfxmonk chỉ ra, mã JavaScript phải được chạy bởi chính vỏ. Nếu bạn đang không phải là viết tiện ích mở rộng, cách thực hiện điều đó là qua dbus, ví dụ bằng cách sử dụng busctl của systemd. (Tôi chắc rằng nó cũng có thể thông qua dbus-send, tôi chỉ thích busctl 's cú pháp Và nó có hoàn tab.!)

Ví dụ, đây ghi lại tất cả tiêu đề cửa sổ:

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

Bạn có thể xem thông điệp tường trình với journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell'. (Bạn có thể muốn thêm -b quá để chỉ thấy tin nhắn từ khởi động hiện tại, hoặc --since '5 minutes ago' ... - xem journalctl (1) cho nhiều lựa chọn hơn.)

Ngoài ra, this GitHub gist mô tả làm thế nào để có được ở các mô-đun Shell trong gjs (thêm /usr/lib/gnome-shell đến LD_LIBRARY_PATH và đường dẫn tìm kiếm của GIRepository.Repository), nhưng tôi chưa quản lý để truy cập vào đối tượng global bằng cách sử dụng điều đó.

Các vấn đề liên quan