Привязка Ключа Расширения Оболочки Gnome

какой самый простой способ (глобально) привязать комбинацию клавиш (например,<Super>+A) к функции в расширении оболочки gnome?

проверять пару расширений, я наткнулся на следующий код:

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

Я понимаю, что комбинация клавиш задается параметром schema,и что можно создать XML-файл, описывающий комбинацию. есть ли простой способ сделать это?

10
задан Mark Jones
23.01.2023 14:50 Количество просмотров материала 2875
Распечатать страницу

2 ответа

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,
                action: action
            })
        }

    },

    _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

перестать слушать:

for (let it of keyManager.grabbers) {
    global.display.ungrab_accelerator(it[1].action)
    Main.wm.allowKeybinding(it[1].name, Shell.ActionMode.NONE)
}

объяснение

Я могу быть ужасно неправ, но это то, что я понял за последние пару дней.

прежде всего, это Mutter, который отвечает за прослушивание горячих клавиш. Mutter-это фреймворк для создания оконных менеджеров, сам оконный менеджер. Gnome Shell имеет класс, написанный в JS и называемый "оконный менеджер" - это настоящий оконный менеджер, который использует Mutter внутренне, чтобы делать все низкоуровневые вещи. У Mutter есть объект MetaDisplay. Это объект, который используется для запроса прослушивания горячей клавиши. Но! Но Mutter потребует, чтобы оконный менеджер одобрил использование этой горячей клавиши. Что происходит при нажатии горячей клавиши? - MetaDisplay создает фильтр-клавиш событие''. - Оконный менеджер в Gnome Shell проверяет, если это горячая клавиша разрешено к обработке. - Оконный менеджер возвращает соответствующее значение MetaDisplay - Если разрешено обрабатывать эту горячую клавишу, MetaDisplay генерирует событие 'accelerator-actived' - Ваше расширение должно прослушать это событие и определить по идентификатору действия, Какая горячая клавиша активирована.

5
отвечен p2t2p 2023-01-24 22:38

gconf-editor может делать то, что вы хотите: ссылке

1
отвечен Andrea Gottardi 2023-01-25 00:55

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

gnome-shell
hotkeys
keyboard-shortcuts
linux
shell-extensions
Вверх