From fe43e45693b9792bcf21450548303d4d3b41ee93 Mon Sep 17 00:00:00 2001 From: me Date: Sat, 8 Nov 2025 14:43:35 -0500 Subject: [PATCH] Use traffic lights on mac instead of windows-like titlebar --- .../src/common/constants/ipcChannels.json | 3 +- apps/desktop/src/main/index.ts | 3 + apps/desktop/src/renderer/App.tsx | 6 ++ .../components/general/DashboardSidebar.tsx | 2 +- .../renderer/components/general/Titlebar.tsx | 59 +++++++++++-------- .../components/reader/ReaderSidebar.tsx | 21 ++++--- .../src/renderer/state/applicationStates.ts | 6 ++ 7 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 apps/desktop/src/renderer/state/applicationStates.ts diff --git a/apps/desktop/src/common/constants/ipcChannels.json b/apps/desktop/src/common/constants/ipcChannels.json index c3f1434b4..dcb38c73b 100644 --- a/apps/desktop/src/common/constants/ipcChannels.json +++ b/apps/desktop/src/common/constants/ipcChannels.json @@ -75,5 +75,6 @@ }, "INTEGRATION": { "DISCORD_SET_ACTIVITY": "integration-discordSetActivity" - } + }, + "GET_PLATFORM": "getPlatform" } diff --git a/apps/desktop/src/main/index.ts b/apps/desktop/src/main/index.ts index 33413fd54..bb2260734 100644 --- a/apps/desktop/src/main/index.ts +++ b/apps/desktop/src/main/index.ts @@ -63,6 +63,7 @@ const createWindows = async () => { minWidth: 250, minHeight: 150, frame: false, + titleBarStyle: "hiddenInset", icon: getAssetPath('icon.png'), webPreferences: { nodeIntegration: true, @@ -228,6 +229,8 @@ ipcMain.handle(ipcChannels.APP.READ_ENTIRE_FILE, (_event, filepath: string) => { return fs.readFileSync(filepath).toString(); }); +ipcMain.handle(ipcChannels.GET_PLATFORM, () => process.platform); + if (process.platform === 'win32') { app.commandLine.appendSwitch('high-dpi-support', '1'); app.commandLine.appendSwitch('force-device-scale-factor', '1'); diff --git a/apps/desktop/src/renderer/App.tsx b/apps/desktop/src/renderer/App.tsx index e3ca2a071..b8cf01fe4 100644 --- a/apps/desktop/src/renderer/App.tsx +++ b/apps/desktop/src/renderer/App.tsx @@ -18,6 +18,7 @@ import { runningState, } from './state/downloaderStates'; import { autoCheckForUpdatesState } from './state/settingStates'; +import { platformState } from './state/applicationStates'; import library from './services/library'; import { createRendererIpcHandlers, @@ -51,6 +52,7 @@ export default function App() { const setCurrentTask = useSetRecoilState(currentTaskState); const setDownloadErrors = useSetRecoilState(downloadErrorsState); const autoCheckForUpdates = useRecoilValue(autoCheckForUpdatesState); + const setPlatform = useSetRecoilState(platformState); useEffect(() => { if (loading) { @@ -60,6 +62,10 @@ export default function App() { * Add any additional preload steps here (e.g. data migration, verifications, etc) */ + ipcRenderer.invoke(ipcChannels.GET_PLATFORM).then((p) => { + setPlatform(p); + }); + createRendererIpcHandlers( (updateInfo) => { setUpdateInfo(updateInfo); diff --git a/apps/desktop/src/renderer/components/general/DashboardSidebar.tsx b/apps/desktop/src/renderer/components/general/DashboardSidebar.tsx index 83fc1095b..c97706d1e 100644 --- a/apps/desktop/src/renderer/components/general/DashboardSidebar.tsx +++ b/apps/desktop/src/renderer/components/general/DashboardSidebar.tsx @@ -91,7 +91,7 @@ export function DashboardSidebar({ ...props }: React.ComponentProps - + { const text = useRecoilValue(titlebarTextState); + const platform = useRecoilValue(platformState); + + if (platform === null) { + return null; + } const formattedText = text ? `${packageJson.productName} - ${text}` : packageJson.productName; return ( -
-
- {formattedText} -
-
- - - -
+
+ { platform !== "darwin" && ( + <> +
+ {formattedText} +
+
+ + + +
+ + )}
); }; diff --git a/apps/desktop/src/renderer/components/reader/ReaderSidebar.tsx b/apps/desktop/src/renderer/components/reader/ReaderSidebar.tsx index b6bac457c..9aa82e14d 100644 --- a/apps/desktop/src/renderer/components/reader/ReaderSidebar.tsx +++ b/apps/desktop/src/renderer/components/reader/ReaderSidebar.tsx @@ -112,15 +112,18 @@ export const ReaderSidebar: React.FC = (props: Props) => { return ( - - props.exitPage()} - > - -

{readerSeries.title}

-
-
+
+ + + props.exitPage()} + > + +

{readerSeries.title}

+
+
+
diff --git a/apps/desktop/src/renderer/state/applicationStates.ts b/apps/desktop/src/renderer/state/applicationStates.ts new file mode 100644 index 000000000..fd91df917 --- /dev/null +++ b/apps/desktop/src/renderer/state/applicationStates.ts @@ -0,0 +1,6 @@ +import { atom } from 'recoil'; + +export const platformState = atom({ + key: 'platformState', + default: undefined +});