2015-02-15 20 views
23

Wie kann ich ein Ereignis oder eine andere Methode hinzufügen, um Tastendrucke auf einer gnome-Shell-Erweiterung zu hören? z.B. einen Dialog mit jedem Tastendruck anzeigen, der die gedrückte Taste zeigt?Wie behandelt man Tastaturereignisse in gnome Shell-Erweiterungen?

Ich kann kein Beispiel finden. Die documentation erwähnt ein keyboard-Modul, aber mit dieser allgemeinen Namenssuche ist schwer.

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

(liest oben als Zitat aus den oben verlinkten Dokumenten. Es wird als Code-Stil, weil das Zitat Styling aus irgendeinem Grunde erhält keine Zeilenumbrüche in dieser Seite)

ich einige Erweiterungen gefunden die mit Balg-Code für ähnliche Ergebnisse zu, was ich frage, aber ich wieder gescheitert docs für die spezifischen Klassen und Methoden zu finden:

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

auch keine Klasse keyboard überall dort genannt ...

-

edit1: mehr suchen ... ich denke, ich muss möglicherweise die Clutter api verwenden. aber wieder, nicht viel Beispiele oder Dokumentation dafür. Am weitesten ging ich das war

edit2: mehr suchen. schau auf den Gnome-Shell-Quellcode, in der Haupt-ui-Baum, ich denke, die Antwort ist die Verwendung der bloßen erwähnten global Objekt, das für den Erweiterungscode verfügbar ist. z.B.

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

+0

relevant: https://askubuntu.com/questions/86840/documentation-for-gnome-shell-extension-development – gcb

+0

das Tastaturmodul gefunden: https://git.gnome.org/browse/gnome-shell/tree/js/ui/keyboard.js – gcb

Antwort

3

Ich kam in diesem Schnipsel in gcampax der gtk-js-app template vor einiger Zeit, die verwandt sein kann, was Sie tun:

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

und

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

I haven‘ Es war noch nicht notwendig, Tastaturereignisse zu verwenden, und dies ist Gtk in GJS, aber die gleiche Einschränkung kann sich auf gnome-shell-Erweiterungen auswirken.

UPDATE

Ich habe in letzter Zeit einige Keybinding Sachen getan, und wenn ein Signal-Handler auf das globale Objekt Befestigung funktioniert, können Sie etwas tun:

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

Es auch ist einige Shell keybinding code here und einigeshell-global documentation here, die Ihnen mehr Hinweise geben könnten. meine eigene GJS wünsche, ich könnte mehr helfen, aber ich bin Ring atm;)

NACHTRAG

Es gibt eine good answer here mit einer Beispiel-Klasse mit informativer Protokollierung ist, sowie eine spekulative Erklärung.Ich habe auch festgestellt, diese Funktionalität über DBus ausgesetzt ist, die in einigen Fällen bequemer sein könnte:

Bus Name: org.gnome.Shell -> Pfad: /org/gnome/Shell -> Schnittstelle: org.gnome.Shell

Relevante Methoden:

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

Signal:

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

Interessant, die Hauptmethode, '... .connect ('key-press-event', ...' ist nicht erwähnt auf dem Shell-Global Doc. – gcb

+0

und im verknüpften Beispiel verwenden sie 'gobal.display.add_keybinding()' ... die Shell-globale Liste diese Eigenschaft als ein 'Metacity-Anzeigeobjekt'. Aber wenn ich nach diesem Begriff suche, finde ich ihn nur auf dem Shell-Objekt für gnome-Quellkommentare. – gcb

+0

Am besten finde ich https://people.gnome.org/~tthurman/docs/metacity/struct__MetaDisplay.html 'MetaDisplay', aber es hat keine' add_keybinding() 'Methode. – gcb