2012-01-02 3 views
11

में शैल ऑब्जेक्ट का उपयोग मैं जीजेएस (जीनोम जावास्क्रिप्ट बाइंडिंग) का उपयोग कर gtk + ऐप लिख रहा हूं क्योंकि कोई दस्तावेज उपलब्ध नहीं है, मैं gnome-shell जावास्क्रिप्ट के स्रोतों को पढ़ रहा हूं। मेरे ऐप में मुझे global.userdatadir तक पहुंच प्राप्त करने की आवश्यकता है।जीजे

मैं अपने स्क्रिप्ट के शैल वस्तु को जोड़ने के लिए कोशिश कर रहा हूँ:

const Shell = imports.gi.Shell; 

और #gjs myscript.js साथ इसे चलाने, लेकिन यह मुझे कह रही है एक त्रुटि फेंकता है जब मैं यह कर:

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 

मैं नहीं कर सकते समझें कि इसमें क्या गड़बड़ है, यह बिल्कुल जीनोम-खोल स्रोत फ़ाइलों में है। अन्य ऑब्जेक्ट imports.gi.Gio, imports.gi.GLib का उपयोग कर ठीक हैं, ठीक है काम करता है।

उबंटू 11.10 x64

उत्तर

7

आप GJS के माध्यम से सूक्ति-शेल एक्सटेंशन नहीं चला सकते हैं पर काम करते हुए, वे सूक्ति-खोल अपने आप में लोड करना होगा। विकास के लिए, आमतौर पर इसका मतलब है कि उन्हें ~/.local/share/gnome-shell/extensions/YOUR-EXTENSION-ID में डालें और खोल को पुनरारंभ करें।

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

सामान्यतः, केवल-कोड वाले उत्तरों को प्राथमिकता नहीं दी जाती है। – Ryan

0

dbus के माध्यम से कॉल org.gnome.Shell.Eval

जैसा कि gfxmonk बताता है, जावास्क्रिप्ट कोड को खोल से ही चलाया जाना चाहिए। यदि आप एक्सटेंशन लिख रहे हैं, तो ऐसा करने का तरीका dbus के माध्यम से है, उदाहरण के लिए systemd के busctl का उपयोग करना। (मुझे यकीन है कि यह dbus-send के माध्यम से भी संभव है कर रहा हूँ, मैं सिर्फ busctl की वाक्य रचना पसंद करते हैं और यह टैब पूरा होने है।!)

उदाहरण के लिए, यह सब खिड़की खिताब लॉग:

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

आप देख सकते हैं journalctl /usr/bin/gnome-shell 'GLIB_DOMAIN=GNOME Shell' के साथ संदेश लॉग करें। (आप शायद -b भी जोड़ने के लिए केवल वर्तमान बूट के संदेश दिखाई, या --since '5 minutes ago' करना चाहते हैं ... - (1) अधिक विकल्पों के लिए journalctl देखें।)

वैकल्पिक रूप से, this GitHub gist बताता है कि कैसे में Shell मॉड्यूल में प्राप्त करने के लिए gjs (/usr/lib/gnome-shellLD_LIBRARY_PATH और GIRepository.Repository के खोज पथ जोड़ें), लेकिन मैं इसका उपयोग कर global ऑब्जेक्ट तक पहुंच प्राप्त करने में कामयाब नहीं रहा हूं।