侏儒Shell扩展键绑定(Gnome Shell Extension Key Binding)

2019-07-31 10:43发布

什么是(全局)中的密钥组合(例如结合的最简单的方式<Super>+A ),以在一个侏儒外壳扩展函数?

检查一对夫妇的扩展,我碰到了下面的代码:

global.display.add_keybinding('random-name',
                              new Gio.Settings({schema: 'org.gnome.shell.keybindings'}),
                              Meta.KeyBindingFlags.NONE,
                              function() { /* ... some code */ });

据我所知,组合键通过模式参数指定,而且它可以创建描述相结合的XML文件。 有没有一种简单的方法来做到这一点?

Answer 1:

以下是我的回答副本这里我只在侏儒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

说明

我可能是可怕的错误,但我已经在过去几天想通了。

首先,它是穆特是谁负责侦听热键。 穆特是创建的窗口管理器的框架,它不是一个窗口管理器本身。 侏儒壳牌写在JS和所谓的“窗口管理器”一类 - 这是使用穆特内完成所有低层次的东西真正的窗口管理器。 穆特都有一个对象MetaDisplay。 这是反对你使用请求监听热键。 但! 但是,穆特将要求窗口管理器批准该热键的使用。 按下热键时,会发生什么? - MetaDisplay生成事件“过滤器 - 键绑定”。 - 在侏儒壳牌窗口管理器检查是否这个热键允许进行处理。 - 窗口管理器返回适当的值MetaDisplay - 如果允许处理这个热键,MetaDisplay生成事件“加速器actived” - 你的分机号必须监听该事件,并通过热键激活动作ID弄清楚。



文章来源: Gnome Shell Extension Key Binding