私のOSXElectronアプリには、Electronアプリウィンドウの開閉を切り替えるトレイアイコンがあります。 OSX Dropboxトレイアイコンをクリックすると、トレイアイコンをクリックした速度に関係なく、Dropboxトレイメニューが開いたり閉じたりするのと同じです。
これが私が使用しているコードです:
tray.on('click', function(e){
if (mainWindow.isVisible()) {
mainWindow.hide()
} else {
mainWindow.show()
}
});
これは、ゆっくりクリックすると(クリックの間に1秒待つ)機能しますが、1秒間に1回以上繰り返しクリックすると、クリックが失敗し、何も起こりません。ドキュメントに遅延のタイプは見つかりませんでした。何が起こっているのか、クリックイベントを確実に機能させる方法についてのアイデアはありますか?
Electron 3.0は、ダブルクリックを待たないようにするAPIを導入しました。
// Ignore double click events for the tray icon
tray.setIgnoreDoubleClickEvents(true)
「ダブルクリックイベントを無視するオプションを設定します。これらのイベントを無視すると、トレイアイコンの個々のクリックをすべて検出できます。この値はデフォルトでfalseに設定されています。」
あなたが説明している問題は簡単に再現できます。あなたが得ている結果はあなたの側のバグや間違った実装ではありませんが、それはElectronがトレイ要素でこれらのクリックイベントを処理している現在の方法に関して期待される結果です。
クラスTray
は、クリックに関連する3つのイベントclick
、double-click
、およびright-click
を公開します。
right-click
イベントを使用する場合、この問題は発生しません。必要なだけ速くクリックでき、毎回コールバックが呼び出されます。
たとえば、このイベントを処理するためのmacOSのElectronコードは 以下 :
- (void)rightMouseUp:(NSEvent*)event {
trayIcon_->NotifyRightClicked(
[self getBoundsFromEvent:event],
ui::EventFlagsFromModifiers([event modifierFlags]));
}
右クリックするたびに、right-click
イベントが発生し、それだけです。
ここで、左クリックがどのように処理されるかを見てみると、 コード は少し異なります。
- (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];
}
トレイアイコンが複数回クリックされた場合、event.clickCount
は常に1を返すとは限りません。代わりに、クリックされた回数をカウントする値を返します。
したがって、トレイアイコンを非常に速くクリックすると、event.clickCount
の値は2
より大きくなり、値が1
または2
の場合にのみイベントが発行されます。そうでない場合、フォールバックはありません。それらは単にイベントを発行しません。これは、十分に速くクリックしたときにテストで表示される結果です。
したがって、Electronの実装を自分で変更したり、問題やプルリクエストを送信したりしない限り、現時点ではこの動作を回避することはできません。