61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
// The name of the ipc channel over which state changes are communicated.
|
|
export const windowStateChannelName = 'window-state-changed';
|
|
|
|
export type WindowState =
|
|
| 'minimized'
|
|
| 'normal'
|
|
| 'maximized'
|
|
| 'full-screen'
|
|
| 'hidden';
|
|
|
|
export function getWindowState(window: Electron.BrowserWindow): WindowState {
|
|
if (window.isFullScreen()) {
|
|
return 'full-screen';
|
|
} else if (window.isMaximized()) {
|
|
return 'maximized';
|
|
} else if (window.isMinimized()) {
|
|
return 'minimized';
|
|
} else if (!window.isVisible()) {
|
|
return 'hidden';
|
|
} else {
|
|
return 'normal';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers event handlers for all window state transition events and
|
|
* forwards those to the renderer process for a given window.
|
|
*/
|
|
export function registerWindowStateChangedEvents(
|
|
window: Electron.BrowserWindow
|
|
) {
|
|
window.on('enter-full-screen', () =>
|
|
sendWindowStateEvent(window, 'full-screen')
|
|
);
|
|
|
|
// So this is a bit of a hack. If we call window.isFullScreen directly after
|
|
// receiving the leave-full-screen event it'll return true which isn't what
|
|
// we're after. So we'll say that we're transitioning to 'normal' even though
|
|
// we might be maximized. This works because electron will emit a 'maximized'
|
|
// event after 'leave-full-screen' if the state prior to full-screen was maximized.
|
|
window.on('leave-full-screen', () => sendWindowStateEvent(window, 'normal'));
|
|
|
|
window.on('maximize', () => sendWindowStateEvent(window, 'maximized'));
|
|
window.on('minimize', () => sendWindowStateEvent(window, 'minimized'));
|
|
window.on('unmaximize', () => sendWindowStateEvent(window, 'normal'));
|
|
window.on('restore', () => sendWindowStateEvent(window, 'normal'));
|
|
window.on('hide', () => sendWindowStateEvent(window, 'hidden'));
|
|
window.on('show', () => sendWindowStateEvent(window, 'normal'));
|
|
}
|
|
|
|
/**
|
|
* Short hand convenience function for sending a window state change event
|
|
* over the window-state-changed channel to the render process.
|
|
*/
|
|
function sendWindowStateEvent(
|
|
window: Electron.BrowserWindow,
|
|
state: WindowState
|
|
) {
|
|
window.webContents.send(windowStateChannelName, state);
|
|
}
|