Gnome Kabuk Uzatma Anahtar Bağlama


11

<Super>+ABir gnome kabuk uzantısındaki bir işleve bir tuş kombinasyonunu (örneğin ) bağlamanın (global olarak) en basit yolu nedir ?

Birkaç uzantı inceleyerek, aşağıdaki koda rastladım:

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

Anahtar birleşiminin şema parametresi tarafından belirtildiğini ve birleşimi açıklayan bir XML dosyası oluşturmanın mümkün olduğunu anlıyorum. Bunu yapmanın daha basit bir yolu var mı?


Bir GNOME kabuk uzantısı oluşturuyorsanız, muhtemelen http://stackoverflow.com/ adresinde daha iyi yanıtlar alırsınız . Moderatörün dikkatini çekmek için işaretleyin ve sorunuzu taşımalıdırlar.
NobleUplift,

Yanıtlar:


5

TL; DR

İşte bir sınıf:

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)
        }
    }
})

İşte böyle kullanıyorsunuz:

let keyManager = new KeyManager()
keyManager.listenFor("<ctrl><shift>a", function(){
    log("Hot keys are working!!!")
})

İthalata ihtiyacınız olacak:

const Lang = imports.lang
const Meta = imports.gi.Meta
const Shell = imports.gi.Shell
const Main = imports.ui.main

Dinlemeyi durdurmak için:

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

açıklama

Çok yanlış olabilirim, ama son birkaç günde anladığım kadarıyla.

Her şeyden önce kısayol tuşlarını dinlemekten sorumlu Mutter. Mutter, Pencere Yöneticileri oluşturmak için bir çerçevedir, bir pencere yöneticisinin kendisi değildir. Gnome Shell, JS'de yazılmış ve "Window Manager" olarak adlandırılan bir sınıfa sahiptir - bu, tüm düşük seviyeli işleri yapmak için Mutter'i dahili olarak kullanan gerçek Pencere Yöneticisi'dir. Mutter'ın bir MetaDisplay nesnesi var. Bu, bir kısayol tuşunu dinlemek için kullandığınız nesnedir. Fakat! Ancak Mutter, Window Manager'ın bu kısayol tuşunun kullanımını onaylamasını isteyecektir. Peki kısayol tuşuna basıldığında ne olur? - MetaDisplay olayı 'filtre-anahtar bağlama' oluşturur. - Gnome Shell'deki Window Manager, bu kısayol tuşunun işlenmesine izin verilip verilmediğini kontrol eder. - Pencere Yöneticisi MetaDisplay'e uygun değeri döndürür - Bu kısayol tuşunu işlemesine izin verilirse, MetaDisplay 'hızlandırıcı-etkin' olayı oluşturur


Bu kodu sadece Gnome 3.22'de test ettim
p2t2p

Bu harika bir cevap, bunu paylaştığınız için çok teşekkürler.
andy.holmes

Küresel nereden geliyor? Hangi kütüphanenin parçası?
borizzzzz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.