ing
This commit is contained in:
10
@overflow/core/merge.ts
Normal file
10
@overflow/core/merge.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/** Create a copy of an object by merging it with a subset of its properties. */
|
||||
export function merge<T, K extends keyof T>(obj: T, subset: Pick<T, K>): T {
|
||||
const copy = Object.assign({}, obj);
|
||||
for (const k in subset) {
|
||||
if (subset[k]) {
|
||||
copy[k] = subset[k];
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
// 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);
|
||||
}
|
||||
Reference in New Issue
Block a user