2016-07-05 11 views
20

Nella mia app OSX Electron ho un'icona sul vassoio che vorrei alternare tra l'apertura e la chiusura della finestra dell'app Electron. Simile a come facendo clic sull'icona della barra laterale di Dropbox OSX si aprirà e chiuderà il menu del vassoio Dropbox, indipendentemente dalla velocità con cui si fa clic sull'icona del vassoio.Come far funzionare in modo affidabile gli eventi di clic del vassoio elettronico?

Ecco il codice che sto utilizzando:

tray.on('click', function(e){ 
    if (mainWindow.isVisible()) { 
     mainWindow.hide() 
    } else { 
     mainWindow.show() 
    } 
    }); 

Questo funziona se si fa clic lentamente (Aspetta un secondo tra un clic) se si fa clic più volte, più di 1x in un secondo, il clic fallisce e non accade nulla. Non sono riuscito a trovare alcun tipo di ritardo nei documenti. Qualche idea su cosa sta succedendo e su come far funzionare l'evento click in modo affidabile?

risposta

14

Il problema che stai descrivendo è facile da riprodurre. Il risultato che stai ottenendo non è un bug o un'implementazione sbagliata dalla tua parte, ma è il risultato atteso per quanto riguarda il modo in cui Electron sta gestendo questi eventi click su un elemento tray.

La classe Tray espone 3 eventi relativi a clic: click, double-click e right-click.

Se si utilizza l'evento right-click, non si verificherà questo problema, è possibile fare clic alla velocità desiderata, richiamare la richiamata ogni volta.

Il codice Electron per MacOS, ad esempio per gestire questo evento è the following:

- (void)rightMouseUp:(NSEvent*)event { 
    trayIcon_->NotifyRightClicked(
    [self getBoundsFromEvent:event], 
    ui::EventFlagsFromModifiers([event modifierFlags])); 
} 

Per ogni tasto destro del mouse, Sparano caso right-click e il gioco è fatto.

Ora, se diamo uno sguardo a come il click sinistro vengono gestiti, the code è leggermente diverso:

- (void)mouseUp:(NSEvent*)event { 

    // ... 
    // Truncated to only show the relevant part... 
    // ... 

    // Single click event. 
    if (event.clickCount == 1) 
    trayIcon_->NotifyClicked(
     [self getBoundsFromEvent:event], 
     ui::EventFlagsFromModifiers([event modifierFlags])); 

    // Double click event. 
    if (event.clickCount == 2) 
    trayIcon_->NotifyDoubleClicked(
     [self getBoundsFromEvent:event], 
     ui::EventFlagsFromModifiers([event modifierFlags])); 

    [self setNeedsDisplay:YES]; 
} 

Quando l'icona sulla barra ottenere cliccato più volte, il event.clickCount non sempre ritornare 1. Invece, restituisce un valore che conta i tempi cliccati.

Così, quando sei clic sull'icona della barra molto veloce, event.clickCount avrà un valore maggiore di 2 e stanno emettendo solo un evento quando il valore è 1 o 2 e se non è il caso, non fare avere qualche ripiego, semplicemente non emettono alcun evento. Questo è il risultato che stai vedendo nei tuoi test quando fai clic abbastanza velocemente.

Quindi, senza modificare autonomamente l'implementazione di Electron, inoltrando un problema o una richiesta di pull, al momento non è possibile evitare questo comportamento.

Problemi correlati