theme extensions extensiones extension chrome gnome gnome-3 gnome-shell gnome-shell-extensions

extensions - ¿Cómo manejar los eventos de teclado en las extensiones de shell gnome?



gnome>- shell (1)

¿Cómo puedo agregar un evento u otro método para escuchar las pulsaciones de teclas en una extensión de shell de gnome? Por ejemplo, muestra un diálogo con cada tecla, presionando mostrando la tecla presionada?

No puedo encontrar ningún ejemplo. La documentation menciona un módulo de keyboard , pero con esa búsqueda de nombre común es difícil.

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

(leído anteriormente como una cita de los documentos vinculados anteriormente. está estilizado como código porque el estilo de la cita por alguna razón no conserva los saltos de línea en este sitio)

Encontré algunas extensiones usando el código de abajo para resultados similares a los que estoy preguntando, pero nuevamente, no pude encontrar documentos para las clases y métodos específicos:

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

Además, no hay clase llamada keyboard ninguna parte ...

-

edit1: más búsquedas ... creo que puedo tener que usar la API de Clutter . Pero una vez más, no hay muchos ejemplos o documentación para eso. lo más lejos que fui fue esto

edit2: más búsqueda. buscando en el código fuente del shell gnome, en el árbol principal de la interfaz de usuario, creo que la respuesta es usar el objeto global mencionado a la barelly que está disponible para el código de extensión. p.ej

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


Encontré este fragmento en la plantilla gtk-js-app de gcampax hace algún tiempo, que puede estar relacionado con lo que estás haciendo:

// 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));

y

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

No he tenido la necesidad de usar eventos de teclado todavía, y esto es Gtk en GJS, pero la misma limitación puede estar afectando a las extensiones de gnome-shell.

ACTUALIZAR

He estado haciendo algunas tareas de encuadernación de teclas últimamente, y si está conectando un manejador de señales al objeto global, puedes hacer algo como esto:

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

También hay algunos códigos de enlace de teclas de Shell aquí y una documentación global de shell que podría darle más pistas. Ojalá pudiera ayudar más, pero estoy luchando contra mi propio GJS atm;)

APÉNDICE

Hay una buena respuesta aquí con una clase de ejemplo con registro informativo, así como una explicación especulativa. También encontré que esta funcionalidad está expuesta sobre DBus, lo que podría ser más conveniente en algunos casos:

Nombre del bus: org.gnome.Shell -> Ruta: /org/gnome/Shell -> Interfaz: org.gnome.Shell

Métodos relevantes:

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

Señal:

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