टी एल; डॉ
यहाँ एक वर्ग है:
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 इवेंट 'त्वरक-सक्रिय' उत्पन्न करता है