42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
/**
|
|
* HUD overlay adapters.
|
|
*
|
|
* Electron `alwaysOnTop` is the generic ask. Some compositors ignore it
|
|
* (Hyprland tiles the toplevel; COSMIC drops z-order). Each adapter speaks
|
|
* that compositor's dialect; `promoteHudOverlay` is the one call site.
|
|
*/
|
|
|
|
import { promoteHudOnHyprland } from './hud-hyprland'
|
|
|
|
export interface HudElectronOverlayWindow {
|
|
setAlwaysOnTop(flag: boolean, level?: string): void
|
|
setVisibleOnAllWorkspaces?(
|
|
visible: boolean,
|
|
options?: { skipTransformProcessType?: boolean; visibleOnFullScreen?: boolean }
|
|
): void
|
|
}
|
|
|
|
/** Chrome Electron itself can honour. Compositor IPC is `promoteHudOverlay`. */
|
|
export function applyHudElectronOverlay(win: HudElectronOverlayWindow, platform: string): void {
|
|
win.setAlwaysOnTop(true, platform === 'darwin' ? 'floating' : 'screen-saver')
|
|
|
|
if (platform !== 'darwin') {
|
|
return
|
|
}
|
|
|
|
try {
|
|
win.setVisibleOnAllWorkspaces?.(true, { visibleOnFullScreen: true, skipTransformProcessType: true })
|
|
} catch {
|
|
// Not supported everywhere — best effort.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ask the running compositor to treat the HUD as an overlay. Hyprland is the
|
|
* first adapter (float + pin). Sway/niri hang off this same function later.
|
|
* Returns true when an adapter applied; false is "nothing to do / not that WM".
|
|
*/
|
|
export async function promoteHudOverlay(options: { title: string }): Promise<boolean> {
|
|
return promoteHudOnHyprland(options)
|
|
}
|