super-productivity/electron/various-shared.ts
Johannes Millan 8d41a79150 fix(electron): address review feedback for keyboard focus fix
- Gate blur() to Windows only (not supported on Wayland, limited on macOS)
- Add setTimeout delay in ready-to-show to match showOrFocus pattern
- Add webContents.focus() in ready-to-show for renderer-level focus
- Add isDestroyed() guards in setTimeout callbacks
- Only restore focus on resume/unlock if window was visible before
  suspend/lock to avoid surfacing hidden/minimized windows
2026-03-01 13:03:01 +01:00

47 lines
1.4 KiB
TypeScript

import { app, BrowserWindow } from 'electron';
import { info } from 'electron-log/main';
import { getWin, getWasMaximizedBeforeHide } from './main-window';
import { hideOverlayWindow } from './overlay-indicator/overlay-indicator';
import { setIsQuiting } from './shared-state';
// eslint-disable-next-line prefer-arrow/prefer-arrow-functions
export function quitApp(): void {
setIsQuiting(true);
app.quit();
}
// eslint-disable-next-line prefer-arrow/prefer-arrow-functions
export function showOrFocus(passedWin: BrowserWindow): void {
// default to main winpc
const win = passedWin || getWin();
// sometimes when starting a second instance we get here although we don't want to
if (!win) {
info(
'special case occurred when showOrFocus is called even though, this is a second instance of the app',
);
return;
}
if (win.isVisible()) {
win.focus();
} else {
// restore explicitly
if (win.isMinimized()) win.restore();
win.show();
if (getWasMaximizedBeforeHide()) win.maximize();
}
// Hide overlay when main window is shown
hideOverlayWindow();
// focus window afterwards always
setTimeout(() => {
if (win.isDestroyed()) return;
win.focus();
// Ensure Chromium renderer also gets keyboard focus (electron#20464)
if (!win.webContents.isDestroyed()) {
win.webContents.focus();
}
}, 60);
}