TL; DR
수업은 다음과 같습니다.
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는 창 관리자를 만들기위한 프레임 워크이며 창 관리자 자체는 아닙니다. Gnome Shell에는 JS로 작성되고 "창 관리자"라는 클래스가 있습니다. 이것은 Mutter를 내부적으로 사용하여 모든 저수준 작업을 수행하는 실제 창 관리자입니다. Mutter에는 MetaDisplay 객체가 있습니다. 핫키 청취를 요청하는 데 사용하는 객체입니다. 그러나! 그러나 Mutter는이 핫키의 사용을 승인하기 위해 Window Manager가 필요합니다. 핫키를 누르면 어떻게됩니까? -MetaDisplay는 'filter-keybinding'이벤트를 생성합니다. -Gnome Shell의 창 관리자는이 핫키를 처리 할 수 있는지 확인합니다. -Window Manager가 MetaDisplay에 적절한 값을 반환합니다.-이 핫키를 처리 할 수있는 경우 MetaDisplay는 'accelerator-actived'이벤트를 생성합니다.