electron - tutorial - ¿Cómo hacer que los eventos de clics de la bandeja electrónica funcionen de manera confiable?
electron js tutorial (1)
En mi aplicación OSX Electron tengo un ícono de bandeja que me gustaría alternar entre abrir y cerrar la ventana de la aplicación Electron. De manera similar, al hacer clic en el icono de la bandeja de Dropbox de OSX se abrirá y cerrará el menú de la bandeja de Dropbox, sin importar qué tan rápido haga clic en el icono de la bandeja.
Aquí está el código que estoy usando:
tray.on(''click'', function(e){
if (mainWindow.isVisible()) {
mainWindow.hide()
} else {
mainWindow.show()
}
});
Esto funciona si hace clic lentamente (espere un segundo entre clics); sin embargo, si hace clic repetidamente, más de 1 vez en un segundo, el clic falla y no sucede nada. No pude encontrar ningún tipo de retrasos en los documentos. ¿Alguna idea sobre lo que está pasando y cómo hacer que el evento de clic funcione de manera confiable?
El problema que estás describiendo es fácil de reproducir. El resultado que está obteniendo no es un error o una implementación incorrecta de su lado, pero es el resultado esperado con respecto a la forma actual en que Electron está manejando estos eventos de clic en un elemento de bandeja.
La clase Tray
expone 3 eventos relativos al clic: click
, double-click
y double-click
right-click
.
Si usa el evento de right-click
, no va a tener este problema, puede hacer clic tan rápido como lo desee, recibirá una llamada de devolución de llamada cada vez.
El código electrónico para macOS, por ejemplo, para manejar este evento es el siguiente :
- (void)rightMouseUp:(NSEvent*)event {
trayIcon_->NotifyRightClicked(
[self getBoundsFromEvent:event],
ui::EventFlagsFromModifiers([event modifierFlags]));
}
Por cada clic derecho, están disparando el evento del right-click
y eso es todo.
Ahora, si echamos un vistazo a cómo se maneja el clic izquierdo, el código es ligeramente diferente:
- (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];
}
Cuando se hace clic en el icono de la bandeja varias veces, el event.clickCount
no siempre devuelve 1. En su lugar, devuelve un valor que cuenta los tiempos en los que se hizo clic.
Entonces, cuando haga clic en el ícono de la bandeja muy rápido, event.clickCount
tendrá un valor mayor que 2
y solo emitirán un evento cuando el valor sea 1
o 2
y, si no es así, no tendrán ningún Fallback, simplemente no emiten ningún evento. Ese es el resultado que está viendo en sus pruebas cuando hace clic lo suficientemente rápido.
Por lo tanto, sin modificar la implementación de Electron, enviar un problema o una solicitud de extracción, no puede evitar este comportamiento en este momento.