From 5be04ceea60edca1e77ace8e88b6be74f95027da Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Wed, 17 Jan 2024 09:34:47 -0800 Subject: [PATCH] Fix header in fullscreen mode on Mac --- src-web/components/SettingsDialog.tsx | 7 ++++++- src-web/components/Workspace.tsx | 8 ++++++-- src-web/hooks/useIsFullscreen.ts | 26 ++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src-web/hooks/useIsFullscreen.ts diff --git a/src-web/components/SettingsDialog.tsx b/src-web/components/SettingsDialog.tsx index 883c8493..3faff84f 100644 --- a/src-web/components/SettingsDialog.tsx +++ b/src-web/components/SettingsDialog.tsx @@ -40,7 +40,12 @@ export const SettingsDialog = () => { - Workspace ({workspace.name}) + + Workspace{' '} +
+ {workspace.name} +
+
{ function HeaderSize({ className, ...props }: HeaderSizeProps) { const platform = useOsInfo(); + const fullscreen = useIsFullscreen(); + const stoplightsVisible = platform?.osType === 'Darwin' && !fullscreen; return (
diff --git a/src-web/hooks/useIsFullscreen.ts b/src-web/hooks/useIsFullscreen.ts new file mode 100644 index 00000000..1937e4ea --- /dev/null +++ b/src-web/hooks/useIsFullscreen.ts @@ -0,0 +1,26 @@ +import { appWindow } from '@tauri-apps/api/window'; +import { useEffect, useState } from 'react'; +import { useWindowSize } from 'react-use'; + +export function useIsFullscreen() { + const [isFullscreen, setIsFullscreen] = useState(false); + const windowSize = useWindowSize(); + + useEffect(() => { + (async function () { + // Fullscreen state isn't updated right after resize event on Mac (needs to wait for animation) so + // we'll poll for 10 seconds to see if it changes. Hopefully Tauri eventually adds a way to listen + // for this. + for (let i = 0; i < 100; i++) { + await new Promise((resolve) => setTimeout(resolve, 100)); + const newIsFullscreen = await appWindow.isFullscreen(); + if (newIsFullscreen !== isFullscreen) { + setIsFullscreen(newIsFullscreen); + break; + } + } + })(); + }, [windowSize, isFullscreen]); + + return isFullscreen; +}