2015-06-04 13 views
7

Ich versuche, einfache gtk-Anwendung für Gnome-Shell mit gjs zu erstellen.GJS: Gtk.TextView Key-Press-Event funktioniert nicht

Sein Fenster enthält nur Gtk.TextView und ich möchte Ereignisse verarbeiten, wenn der Benutzer tippt.

Hier ist mein Code:

#!/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(); 

Es funktioniert im Allgemeinen, aber ich event.keyval nicht lesen kann: Konsolenausgabe „undefiniert“ ist:

[union instance proxy GIName:Gdk.Event [email protected] [email protected]] undefined undefined 

mir jemand sagen könnte, was ich tue falsch? Danke!

+0

Haben Sie es geschafft, dies zu beheben? – gosukiwi

+0

versuchen Sie dies: '_keyPress: Funktion (selbst, Textansicht, Ereignis)' – Gonzalo

Antwort

0

Gdk.Event enthält keine Eigenschaften type oder keyval und deshalb sind sie undefined. Es ist noch nicht so lange her, aber jetzt gibt es Dokumentation für GObject Introspection-Bindungen zu Gjs unter https://people.gnome.org/~gcampagna/docs.

Von Ihrem Ausdruck sehen Sie, dass event ein Gdk.Event ist und die Dokumentation dafür ist https://people.gnome.org/~gcampagna/docs/Gdk-3.0/Gdk.Event.html. Dort können Sie sehen, dass es die Funktionen get_event_type und get_keyval gibt. Die erste gibt eine Gdk.EventType (https://people.gnome.org/~gcampagna/docs/Gdk-3.0/Gdk.EventType.html) und die letztere ein Array zurück, wo das zweite Element einen numerischen Code für die gedrückte Taste enthält. Sie können die numerischen Tasten mit Konstanten in Clutter vergleichen, die mit KEY_ beginnen.

Zum Beispiel einige Importe an die Spitze des Codes hinzufügen

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

und ändern Sie die Logging-Linie zu

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

eine sinnvolle Ausgabe zu erhalten.

Verwandte Themen