2016-07-05 14 views
20

In meiner OSX Electron App habe ich ein Tray-Icon, das ich zwischen dem Öffnen und Schließen des Electron App-Fensters wechseln möchte. Ähnlich wie beim Klicken auf das OSX Dropbox-Taskleistensymbol wird das Dropbox-Taskleistenmenü geöffnet und geschlossen, unabhängig davon, wie schnell Sie auf das Taskleistensymbol klicken.Wie macht man elektronische Click-Ereignisse in der Elektronikschale zuverlässig?

Hier ist der Code Ich verwende:

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

Dies funktioniert, wenn Sie langsam klicken (eine Sekunde zwischen Klicks warten) jedoch, wenn Sie wiederholt klicken, mehr als 1x in einer zweiten, der Klick ausfällt und nichts passiert. Ich konnte keine Verzögerungen in den Dokumenten finden. Irgendwelche Ideen, was passiert und wie das Klick-Event funktioniert?

Antwort

14

Das Problem, das Sie beschreiben, ist einfach zu reproduzieren. Das Ergebnis, das Sie erhalten, ist kein Fehler oder eine falsche Implementierung auf Ihrer Seite, aber es ist das erwartete Ergebnis in Bezug auf die aktuelle Art, wie Electron diese Klickereignisse auf einem Tray-Element behandelt.

Die Klasse Tray zeigt 3 Ereignisse relativ zum Klick an: click, double-click und right-click.

Wenn Sie das Ereignis right-click verwenden, haben Sie dieses Problem nicht, Sie können so schnell klicken, wie Sie möchten, Sie erhalten Ihren Rückruf immer wieder.

Der Electron Code für Mac OS zum Beispiel dieses Ereignis zu behandeln ist the following:

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

Für jedes der rechten Maustaste, sind Brennen sie die right-click Ereignis und das ist es.

Nun, wenn wir einen Blick auf, wie die linke Maustaste nehmen behandelt werden, the code ist etwas anders:

- (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]; 
} 

Wenn das Tray-Icon mehrere Male angeklickt erhalten, wird die event.clickCount nicht immer 1 zurück. Stattdessen wird ein Wert zurückgegeben, der die Klicks zählt.

Also, wenn Sie den Tray-Icon sehr schnell sind klicken, wird event.clickCount einen Wert größer als 2 haben und sie emittiert nur ein Ereignis, wenn der Wert 1 oder 2 ist und wenn es nicht der Fall ist, sie es nicht tun Sie haben keinen Fallback, sie geben einfach kein Ereignis aus. Das ist das Ergebnis, das Sie in Ihren Tests sehen, wenn Sie schnell genug klicken.

Also, ohne die Electron-Implementierung selbst zu ändern, ein Problem oder eine Pull-Anforderung zu senden, können Sie dieses Verhalten im Moment nicht vermeiden.