linux – Gnome Shell扩展密钥绑定

前端之家收集整理的这篇文章主要介绍了linux – 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 */ });

我知道组合键是由schema参数指定的,并且可以创建描述组合的XML文件.有更简单的方法吗?

最佳答案
以下是我的答案here的副本
我只在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确定哪个热键已激活.

原文链接:https://www.f2er.com/linux/440919.html

猜你在找的Linux相关文章