Mar*_*nes 12 linux keyboard-shortcuts hotkeys shell-extensions gnome-shell
(全局)将组合键(例如<Super>+A)绑定到 gnome shell 扩展中的函数的最简单方法是什么?
检查了几个扩展,我遇到了以下代码:
global.display.add_keybinding('random-name',
new Gio.Settings({schema: 'org.gnome.shell.keybindings'}),
Meta.KeyBindingFlags.NONE,
function() { /* ... some code */ });
Run Code Online (Sandbox Code Playgroud)
我知道组合键是由模式参数指定的,并且可以创建一个描述组合的 XML 文件。有没有更简单的方法来做到这一点?
小智 6
这是一个类:
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)
}
}
})
Run Code Online (Sandbox Code Playgroud)
这就是你使用它的方式:
let keyManager = new KeyManager()
keyManager.listenFor("<ctrl><shift>a", function(){
log("Hot keys are working!!!")
})
Run Code Online (Sandbox Code Playgroud)
您将需要导入:
const Lang = imports.lang
const Meta = imports.gi.Meta
const Shell = imports.gi.Shell
const Main = imports.ui.main
Run Code Online (Sandbox Code Playgroud)
停止收听:
for (let it of keyManager.grabbers) {
global.display.ungrab_accelerator(it[1].action)
Main.wm.allowKeybinding(it[1].name, Shell.ActionMode.NONE)
}
Run Code Online (Sandbox Code Playgroud)
我可能是非常错误的,但这是我最近几天想出来的。
首先是 Mutter 负责监听热键。Mutter 是一个用于创建窗口管理器的框架,它本身并不是一个窗口管理器。Gnome Shell 有一个用 JS 编写的类,称为“窗口管理器”——这是真正的窗口管理器,它在内部使用 Mutter 来做所有低级的事情。Mutter 有一个对象 MetaDisplay。这是您用来请求侦听热键的对象。但!但是 Mutter 将需要 Window Manager 批准使用此热键。那么当按下热键时会发生什么?- MetaDisplay 生成事件“过滤器键绑定”。- Gnome Shell 中的窗口管理器检查是否允许处理此热键。- 窗口管理器向 MetaDisplay 返回适当的值 - 如果允许处理此热键,MetaDisplay 将生成事件 'accelerator-actived'
| 归档时间: |
|
| 查看次数: |
2328 次 |
| 最近记录: |