Pregunta GJS: Gtk.TextView key-press-event no funciona


Estoy tratando de crear una aplicación gtk simple para gnome-shell usando gjs.

Su ventana contiene solo Gtk.TextView y quiero procesar eventos cuando el usuario está escribiendo.

Aquí está mi código:

#!/usr/bin/gjs

var Gtk = imports.gi.Gtk;

function MainWindow () {
    this._init ();
}

MainWindow.prototype = {
    _init: function () {
        this.window = new Gtk.Window ({
            title: "Just Calculator",
            window_position: Gtk.WindowPosition.CENTER,
            default_height: 400,
            default_width: 440,
        });

        //this.window.show ();
        this.window.connect ("hide", Gtk.main_quit);
        this.window.connect ("delete-event", function () {
            Gtk.main_quit();
            return true;
        });

        this.textbox = new Gtk.TextView();
        this.textbox.connect('key-press-event', this._keyPress);

        var sw = new Gtk.ScrolledWindow ({shadow_type:Gtk.ShadowType.IN});
        sw.add (this.textbox);
        this.window.add(sw);

        this.window.show_all();
    },

    _keyPress: function(textview, event) {
        print(event, event.type, event.keyval);
        textview.buffer.text = 'ok';
        return true;
    }
}

Gtk.init (null, null);
var window = new MainWindow ();
Gtk.main ();

Funciona en general, pero no puedo leer event.keyval: la salida de la consola está "indefinida":

[union instance proxy GIName:Gdk.Event jsobj@0x7f99b1027040 native@0x1dfeab0] undefined undefined

¿Podría alguien decirme qué estoy haciendo mal? ¡Gracias!


7
2018-06-04 22:56


origen


Respuestas:


Gdk.Event no contiene propiedades type o keyval y es por eso que son undefined. No ha existido por mucho tiempo, pero ahora hay documentación disponible para GObject Introspection bindings a Gjs en https://people.gnome.org/~gcampagna/docs.

De su impresión, usted ve que event es un Gdk.Event y la documentación para eso está en https://people.gnome.org/~gcampagna/docs/Gdk-3.0/Gdk.Event.html. Ahí puedes ver que hay una función get_event_type y get_keyval. El primero devuelve un Gdk.EventType (https://people.gnome.org/~gcampagna/docs/Gdk-3.0/Gdk.EventType.html) y el último una matriz donde el segundo elemento contiene un código numérico para la tecla presionada. Puede comparar las teclas numéricas con constantes en Clutter que comienzan con KEY_.

Por ejemplo, agregue algunas importaciones a la parte superior de su código

var Gdk = imports.gi.Gdk;
var Clutter = imports.gi.Clutter;

y cambie la línea de registro a

print(event,
      event.get_event_type() === Gdk.EventType.KEY_PRESS, 
      event.get_keyval()[1] === Clutter.KEY_Escape);

para obtener un resultado sensato


0
2017-12-13 13:49