ElectronのBrowserWindowを閉じた時に、closeでなく非表示にして、次回の再表示を早くする
ElectronのBrowserWindowのインスタンスを画面表示のたびに作り直すのは重い。
ので、閉じたり開いたりを繰り返す、サブのウィンドウでは、
- BrowserWindowを破棄して、再度作るのではなく
- いったん隠して、必要になったらウィンドウを再表示する
ように変えると少し早くなる。
実装
実現するには、closeイベントでevent.preventDefault()しておいて、
BrowserWindowをhide()すれば良い。
subwindow.on('close', (event) => { event.preventDefault(); subwindow.hide(); });
ウィンドウ表示部分のコードはこうなった。
var mainwindow = ...; var subwindow; function showSubWindow(): void { if (subwindow && !subwindow.isDestroyed()) { subwindow.show(); subwindow.focus(); return; } subwindow = new BrowserWindow({ parent: mainwindow, show: false }); subwindow.loadFile('./subwindow.html'); subwindow.webContents.on('did-finish-load', () => { subwindow.show(); subwindow.focus(); }); subwindow.on('close', (event) => { event.preventDefault(); subwindow.hide(); }); subwindow.on('closed', () => { subwindow = null; }); }
BrowserWindowの初期化処理が走らなくなるので
この実装だと、BrowserWindowの再表示時に初期化処理が走らない、
テキストフィールドへのautofocusとか動作しないので、
<!DOCTYPE html> <html> <head> </head> <body> <form> <label>検索する文字列:</label> <input id="search-text" class="form-control" type="search" autofocus> </form> </body> </html>
うまいこと誤魔化す必要があると思う。
こんな感じに。
window.onfocus = function(){ document.getElementById('search-text').focus(); }
終わり
おわりじゃ!