(全局)将键组合(例如< Super> A)绑定到gnome shell扩展中的函数的最简单方法是什么?
检查了几个扩展,我遇到了以下代码:
global.display.add_keybinding('random-name',new Gio.Settings({schema: 'org.gnome.shell.keybindings'}),Meta.KeyBindingFlags.NONE,function() { /* ... some code */ });
最佳答案
以下是我的答案here的副本
我只在Gnome 3.22中测试了这个
原文链接:https://www.f2er.com/linux/440919.html我只在Gnome 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,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("
你需要进口:
const Lang = imports.lang
const Meta = imports.gi.Meta
const Shell = imports.gi.Shell
const Main = imports.ui.main
说明
我可能非常错误,但这是我在过去几天所想到的.
首先是Mutter负责监听热键. Mutter是一个用于创建窗口管理器的框架,它本身不是窗口管理器.
Gnome Shell有一个用JS编写的类,叫做“Window Manager” – 这是真正的Window Manager,它在内部使用Mutter来完成所有低级的东西.
Mutter有一个对象MetaDisplay.这是您用于请求侦听热键的对象.
但!
但是Mutter将要求Window Manager批准使用这个热键.那么当按下热键时会发生什么?
– MetaDisplay生成事件’filter-keybinding’.
– Gnome Shell中的窗口管理器检查是否允许处理此热键.
– Window Manager将适当的值返回给MetaDisplay
– 如果允许处理此热键,MetaDisplay会生成事件’accelerator-actived’
– 您的分机必须侦听该事件并通过动作ID确定哪个热键已激活.