TL; DR
İşte bir sınıf:
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)
}
}
})
İşte böyle kullanıyorsunuz:
let keyManager = new KeyManager()
keyManager.listenFor("<ctrl><shift>a", function(){
log("Hot keys are working!!!")
})
İthalata ihtiyacınız olacak:
const Lang = imports.lang
const Meta = imports.gi.Meta
const Shell = imports.gi.Shell
const Main = imports.ui.main
Dinlemeyi durdurmak için:
for (let it of keyManager.grabbers) {
global.display.ungrab_accelerator(it[1].action)
Main.wm.allowKeybinding(it[1].name, Shell.ActionMode.NONE)
}
açıklama
Çok yanlış olabilirim, ama son birkaç günde anladığım kadarıyla.
Her şeyden önce kısayol tuşlarını dinlemekten sorumlu Mutter. Mutter, Pencere Yöneticileri oluşturmak için bir çerçevedir, bir pencere yöneticisinin kendisi değildir. Gnome Shell, JS'de yazılmış ve "Window Manager" olarak adlandırılan bir sınıfa sahiptir - bu, tüm düşük seviyeli işleri yapmak için Mutter'i dahili olarak kullanan gerçek Pencere Yöneticisi'dir. Mutter'ın bir MetaDisplay nesnesi var. Bu, bir kısayol tuşunu dinlemek için kullandığınız nesnedir. Fakat! Ancak Mutter, Window Manager'ın bu kısayol tuşunun kullanımını onaylamasını isteyecektir. Peki kısayol tuşuna basıldığında ne olur? - MetaDisplay olayı 'filtre-anahtar bağlama' oluşturur. - Gnome Shell'deki Window Manager, bu kısayol tuşunun işlenmesine izin verilip verilmediğini kontrol eder. - Pencere Yöneticisi MetaDisplay'e uygun değeri döndürür - Bu kısayol tuşunu işlemesine izin verilirse, MetaDisplay 'hızlandırıcı-etkin' olayı oluşturur