(全局地)将一个组合键(例如<Super>+A
)绑定到gnome shell扩展中的一个函数最简单的方法是什么?
检查几个扩展,我碰到以下代码:
global.display.add_keybinding('random-name', new Gio.Settings({schema: 'org.gnome.shell.keybindings'}), Meta.KeyBindingFlags.NONE, function() { /* ... some code */ });
我知道这个组合是由schema参数指定的,而且可以创build一个描述组合的XML文件。 有一个更简单的方法来做到这一点?
以下是我的答案的副本,我只在Gnome 3.22中测试过
这是一个班级:
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需要Window Manager来批准这个热键的使用。 那么当热键被按下时会发生什么? – MetaDisplay生成事件'filter-keybinding'。 – Gnome Shell中的窗口管理器检查是否允许处理这个热键。 – 窗口管理器返回适当的值给MetaDisplay – 如果允许它处理这个热键,MetaDisplay产生事件'accelerator-actived' – 你的分机必须监听那个事件,并通过动作ID确定哪个热键被激活。