加入收藏 | 设为首页 | 会员中心 | 我要投稿 商洛站长网 (https://www.0914zz.com/)- AI应用、CDN、边缘计算、云计算、物联网!
当前位置: 首页 > 综合聚焦 > Linux > 正文

linux – Gnome Shell扩展密钥绑定

发布时间:2021-03-30 17:08:24 所属栏目:Linux 来源:互联网
导读:(全局)将键组合(例如 Super A)绑定到gnome shell扩展中的函数的最简单方法是什么?检查了几个扩展,我遇到了以下代码:global.display.add_keybinding(random-name, new Gio.Settings({schema: org.gnome

(全局)将键组合(例如< 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确定哪个热键已激活.

(编辑:商洛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读