सूक्ति शैल विस्तार कुंजी बंधन


11

<Super>+Aएक सूक्ति शेल एक्सटेंशन में एक फ़ंक्शन के लिए एक प्रमुख संयोजन (जैसे ) को सबसे सरल तरीका क्या है ?

एक्सटेंशन के एक जोड़े का निरीक्षण, मैं निम्नलिखित कोड में भाग गया:

global.display.add_keybinding('random-name',
                              new Gio.Settings({schema: 'org.gnome.shell.keybindings'}),
                              Meta.KeyBindingFlags.NONE,
                              function() { /* ... some code */ });

मैं समझता हूं कि कुंजी संयोजन स्कीमा पैरामीटर द्वारा निर्दिष्ट किया गया है, और संयोजन का वर्णन करते हुए XML फ़ाइल बनाना संभव है। क्या ऐसा करने का कोई सरल तरीका है?


यदि आप एक GNOME शेल एक्सटेंशन बना रहे हैं, तो आपको शायद http://stackoverflow.com/ पर बेहतर प्रतिक्रियाएँ मिलेंगी । मध्यस्थ ध्यान के लिए ध्वज और उन्हें आपके प्रश्न को स्थानांतरित करना चाहिए।
नोबल उत्थान

जवाबों:


5

टी एल; डॉ

यहाँ एक वर्ग है:

KeyManager: new Lang.Class({
    Name: 'MyKeyManager',

    _init: function() {
        this.grabbers = new Map()

        global.display.connect(
            'accelerator-activated',
            Lang.bind(this, function(display, action, deviceId, timestamp){
                log('Accelerator Activated: [display={}, action={}, deviceId={}, timestamp={}]',
                    display, action, deviceId, timestamp)
                this._onAccelerator(action)
            }))
    },

    listenFor: function(accelerator, callback){
        log('Trying to listen for hot key [accelerator={}]', accelerator)
        let action = global.display.grab_accelerator(accelerator)

        if(action == Meta.KeyBindingAction.NONE) {
            log('Unable to grab accelerator [binding={}]', accelerator)
        } else {
            log('Grabbed accelerator [action={}]', action)
            let name = Meta.external_binding_name_for_action(action)
            log('Received binding name for action [name={}, action={}]',
                name, action)

            log('Requesting WM to allow binding [name={}]', name)
            Main.wm.allowKeybinding(name, Shell.ActionMode.ALL)

            this.grabbers.set(action, {
                name: name,
                accelerator: accelerator,
                callback: callback,
                action: action
            })
        }

    },

    _onAccelerator: function(action) {
        let grabber = this.grabbers.get(action)

        if(grabber) {
            this.grabbers.get(action).callback()
        } else {
            log('No listeners [action={}]', action)
        }
    }
})

और आप इसका उपयोग कैसे करते हैं:

let keyManager = new KeyManager()
keyManager.listenFor("<ctrl><shift>a", function(){
    log("Hot keys are working!!!")
})

आपको आयात की आवश्यकता है:

const Lang = imports.lang
const Meta = imports.gi.Meta
const Shell = imports.gi.Shell
const Main = imports.ui.main

सुनने को रोकने के लिए:

for (let it of keyManager.grabbers) {
    global.display.ungrab_accelerator(it[1].action)
    Main.wm.allowKeybinding(it[1].name, Shell.ActionMode.NONE)
}

व्याख्या

मैं बहुत गलत हो सकता हूं, लेकिन यह कि मैंने पिछले कुछ दिनों में क्या सोचा है।

सबसे पहले यह मुटर है जो हॉटकीज़ को सुनने के लिए जिम्मेदार है। मुटर विंडो मैनेजर बनाने के लिए एक ढांचा है, यह स्वयं एक विंडो प्रबंधक नहीं है। गनोम शेल में जेएस में लिखा गया एक वर्ग है और जिसे "विंडो मैनेजर" कहा जाता है - यह वास्तविक विंडो मैनेजर है जो सभी निम्न-स्तरीय सामानों को करने के लिए आंतरिक रूप से Mutter का उपयोग करता है। Mutter में एक ऑब्जेक्ट MetaDisplay है। यह वह वस्तु है जिसे आप हॉटकी के लिए सुनने का अनुरोध करने के लिए उपयोग करते हैं। परंतु! लेकिन मुटर को इस हॉटकी के उपयोग के लिए विंडो मैनेजर की आवश्यकता होगी। तो क्या होता है जब हॉटकी दबाया जाता है? - मेटाडिसेप्ले ने इवेंट 'फिल्टर-कीबाइंडिंग' बनाया है। - गनोम शेल में विंडो मैनेजर चेक करता है कि क्या इस हॉटकी को संसाधित करने की अनुमति है। - विंडो मैनेजर MetaDisplay के लिए उचित मूल्य लौटाता है - यदि इस हॉटकी को संसाधित करने की अनुमति दी जाती है, तो MetDisplay इवेंट 'त्वरक-सक्रिय' उत्पन्न करता है


मैंने इस कोड को केवल Gnome 3.22
P2t2p

यह एक शानदार जवाब है, इसे साझा करने के लिए बहुत बहुत धन्यवाद।
andy.holmes

ग्लोबल कहां से आता है? यह किस पुस्तकालय का हिस्सा है?
बोरिजज़्ज़ज़

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.