Подтвердить что ты не робот

Как обрабатывать события клавиатуры в расширениях оболочки gnome?

Как добавить событие или другой метод для прослушивания нажатия клавиш на расширении оболочки gnome? например показать диалог с каждым нажатием клавиши с нажатой клавишей?

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

Class explanation
...
- General utils
   - Keyboard: Manage and define the keyboard events, etc. for gnome shell. 

(читайте выше как цитату из документов, связанных выше. он оформлен как код, потому что стиль цитаты по какой-то причине не сохраняет разрывы строк на этом сайте)

Я нашел некоторые расширения, используя следующий код для результатов, похожих на то, что я прошу, но я снова не нашел документы для конкретных классов и методов:

workViewInjections['_init'] = injectToFunction(WorkspacesView.WorkspacesView.prototype, '_init', function(width, height, x, y, workspaces) {
        this._pickWorkspace = false;
        this._pickWindow = false;
        this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPress));                                                                                
        this._keyReleaseEventId = global.stage.connect('key-release-event', Lang.bind(this, this._onKeyRelease));
        connectedSignals.push({ obj: global.stage, id: this._keyPressEventId });
        connectedSignals.push({ obj: global.stage, id: this._keyReleaseEventId });
        });

Кроме того, ни один класс с именем keyboard не существует...

-

edit1: больше поиска... я думаю, мне, возможно, придется использовать Clutter api. но опять же, мало примеров или документации для этого. Дальше я пошел это

edit2: больше поиска. глядя на исходный код оболочки gnome, на основном дереве ui, я думаю, что ответ заключается в использовании ограниченного упоминаемого объекта global, который доступен для кода расширения. например.

global.connect('key-press-event', function(if, i, know, the, signature){} );

4b9b3361

Ответ 1

Я встретил этот фрагмент в gcampax gtk-js-app template некоторое время назад, что может быть связано с тем, что вы делаете

// Due to limitations of gobject-introspection wrt GdkEvent and GdkEventKey,
// this needs to be a signal handler
this.connect('key-press-event', Lang.bind(this, this._handleKeyPress));

и

_handleKeyPress: function(self, event) {
    return this.main_search_bar.handle_event(event);
},

Мне еще не нужно было использовать события клавиатуры, и это Gtk в GJS, но такое же ограничение может влиять на расширения gnome-shell.

UPDATE

В последнее время я делаю некоторые материалы для связывания ключей, и если привязка обработчика сигнала к глобальному объекту работает, вы можете сделать что-то вроде этого:

global.display.connect("key-press-event", (widget, event, user_data) => {
    let [success, keyval] = event.get_keyval(); // integer
    let keyname = Gdk.keyval_name(keyval); // string keyname

    if (keyname === "Control_L") {
        // Dialog code or eg. this.keys_array.push("<Ctrl>");
    }
});

Там также есть код обмена ключами оболочки здесь и некоторые shell- глобальная документация здесь, которая может дать вам больше информации. Хотел бы я помочь больше, но я борюсь со своим GJS atm;)

ДОПОЛНЕНИЕ

Здесь есть хороший ответ с примером класса с информативным протоколированием, а также умозрительное объяснение. Я также обнаружил, что эта функция отображается в DBus, которая может быть более удобной в некоторых случаях:

Имя шины: org.gnome.Shell → Путь: /org/gnome/Shell → Интерфейс: org.gnome.Shell

Релевантные методы:

  • GrabAccelerator(String accelerator, UInt32 flags)(UInt32 action)
  • UngrabAccelerator(UInt32 action)(Boolean success)

Сигнал:

  • AcceleratorActivate(UInt32, Dict of {String, Variant})