Ниже приведена копия моего ответа здесь Я только тестировал это в гноме 3.22
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
})
}
},
_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
Объяснение
Возможно, я ужасно ошибаюсь, но это то, что я понял за последние пару дней.
В первую очередь именно Mutter отвечает за прослушивание горячих клавиш. Mutter — это фреймворк для создания оконных менеджеров, а не сам оконный менеджер. В Gnome Shell есть класс, написанный на JS и называемый «Диспетчер окон» — это настоящий оконный менеджер, который внутри использует Mutter для выполнения всех низкоуровневых операций. У Mutter есть объект MetaDisplay. Это объект, который вы используете для запроса прослушивания горячей клавиши. Но! Но Mutter потребует от оконного менеджера разрешения на использование этой горячей клавиши. Так что же происходит, когда нажимается горячая клавиша? - MetaDisplay генерирует событие 'filter-keybinding'. - Менеджер окон в Gnome Shell проверяет, разрешено ли обрабатывать эту горячую клавишу. - Диспетчер окон возвращает соответствующее значение в MetaDisplay - Если ему разрешено обрабатывать эту горячую клавишу, MetaDisplay генерирует событие 'accelerator-actived' - Ваше расширение должно прослушивать это событие и определять по идентификатору действия, какая горячая клавиша активирована.
person
p2t2p
schedule
26.02.2017