Как обрабатывать события клавиатуры в расширениях оболочки 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){} );
Ответы
Ответ 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})