2015-02-15 13 views
23

Come posso aggiungere un evento o un altro metodo per ascoltare i tasti su un'estensione shell gnome? per esempio. mostra una finestra di dialogo con ogni pressione del tasto che mostra il tasto premuto?Come gestire gli eventi della tastiera nelle estensioni della shell di gnome?

Non riesco a trovare alcun esempio. Lo documentation menziona un modulo keyboard, ma con tale ricerca di nomi comuni è difficile.

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

(leggere sopra come una citazione dalla documentazione collegate sopra. È designato come codice perché lo stile citazione per qualche motivo non conservano interruzioni di riga in questo sito)

ho trovato alcune estensioni utilizzando il muggito codice per risultati simili a quello che sto chiedendo, ma io, ancora una volta, non è riuscito a trovare della documentazione per le classi e metodi specifici:

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

Inoltre, nessuna classe denominata keyboard ovunque ci ...

012.

-

edit1: più ricerca ... penso che potrebbe essere necessario utilizzare l'api Clutter. ma ancora, non molti esempi o documentazione per questo. il più lontano che sono andato era questo

edit2: più ricerca. guardando il codice sorgente della shell di gnome, sull'albero ui principale, penso che la risposta sia usare il barelly menzionato oggetto global che è disponibile per il codice di estensione. per esempio.

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

+0

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

+0

trovato il modulo di tastiera: https://git.gnome.org/browse/gnome-shell/tree/js/ui/keyboard.js – gcb

risposta

3

mi sono imbattuto in questo frammento in gcampax di gtk-js-app template qualche tempo fa, che può essere correlato a quello che stai facendo:

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

e

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

Mi rifugio' Ho avuto bisogno di usare ancora gli eventi di tastiera, e questo è Gtk in GJS, ma la stessa limitazione potrebbe interessare le estensioni di gnome-shell.

UPDATE

Ho fatto alcune cose scorciatoia ultimamente, e se associare un gestore di segnale per l'oggetto globale sta lavorando, si può fare qualcosa di simile:

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

C'è anche alcuni Shell keybinding code here e alcunishell-global documentation here che potrebbero darvi ulteriori indizi. Vorrei poter aiutare di più, ma sto lottando miei GJS atm;)

ADDENDUM

C'è un good answer here con una classe di esempio con la registrazione informativo, così come una spiegazione speculativa.Ho anche trovato questa funzionalità è esposta nel corso DBus che potrebbe essere più conveniente in alcuni casi:

Nome Bus: org.gnome.Shell -> Percorso: /org/gnome/Shell -> Interfaccia: org.gnome.Shell

relativi metodi:

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

segnale:

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

Interessante, il metodo principale, '... .connect ('key-press-event', ...' non è menzionato sulla shell-global doc. – gcb

+0

e sull'esempio collegato, usano 'gobal.display.add_keybinding()' ... l'elenco globale della shell che la proprietà è un oggetto di visualizzazione Metacity'. Ma cercando quel termine, lo trovo solo sull'oggetto shell per i commenti di gnome source. – gcb

+0

La cosa migliore che ho trovato è https://people.gnome.org/~tthurman/docs/metacity/struct__MetaDisplay.html 'MetaDisplay', ma non ha un metodo' add_keybinding() '. – gcb

Problemi correlati