From 2a4889bc01ee37feee3c0553cd2f20ed4ce231c4 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Thu, 27 Apr 2023 10:19:49 -0700 Subject: [PATCH] Cross platform window controls --- src-tauri/Cargo.lock | 12 ++++++++++++ src-tauri/Cargo.toml | 2 +- src-tauri/src/main.rs | 3 --- src-tauri/src/window_ext.rs | 7 ++++++- src-tauri/tauri.conf.json | 3 +++ src-web/components/Workspace.tsx | 5 +++++ src-web/hooks/useOsInfo.ts | 12 ++++++++++++ 7 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src-web/hooks/useOsInfo.ts diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6569d46b..0ccb88ce 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2320,6 +2320,17 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "os_info" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +dependencies = [ + "log", + "serde", + "winapi", +] + [[package]] name = "overload" version = "0.1.1" @@ -4025,6 +4036,7 @@ dependencies = [ "objc", "once_cell", "open", + "os_info", "percent-encoding", "rand 0.8.5", "raw-window-handle", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 301e6660..53b4432b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,7 +20,7 @@ cocoa = "0.24.1" [dependencies] serde_json = { version = "1.0", features = ["raw_value"] } serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.2", features = ["config-toml", "devtools", "fs-read-file", "protocol-asset", "shell-open", "system-tray", "updater", "window-start-dragging"] } +tauri = { version = "1.2", features = ["config-toml", "devtools", "fs-read-file", "os-all", "protocol-asset", "shell-open", "system-tray", "updater", "window-start-dragging"] } http = "0.2.8" reqwest = { version = "0.11.14", features = ["json"] } tokio = { version = "1.25.0", features = ["sync"] } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 8aea05b8..46baa9c2 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -750,7 +750,6 @@ fn create_window(handle: &AppHandle, url: Option<&str>) -> Window { let win3 = win.clone(); win.on_window_event(move |e| { let apply_offset = || { - #[cfg(target_os = "macos")] win3.position_traffic_lights(); }; @@ -765,9 +764,7 @@ fn create_window(handle: &AppHandle, url: Option<&str>) -> Window { } }); - #[cfg(target_os = "macos")] win.position_traffic_lights(); - win } diff --git a/src-tauri/src/window_ext.rs b/src-tauri/src/window_ext.rs index d3f072d3..9db8e34e 100644 --- a/src-tauri/src/window_ext.rs +++ b/src-tauri/src/window_ext.rs @@ -1,6 +1,6 @@ use tauri::{Runtime, Window}; -const TRAFFIC_LIGHT_OFFSET_X: f64 = 10.0; +const TRAFFIC_LIGHT_OFFSET_X: f64 = 13.0; const TRAFFIC_LIGHT_OFFSET_Y: f64 = 18.0; pub trait WindowExt { @@ -8,6 +8,11 @@ pub trait WindowExt { } impl WindowExt for Window { + #[cfg(not(target_os = "macos"))] + fn position_traffic_lights(&self) { + // No-op + } + #[cfg(target_os = "macos")] fn position_traffic_lights(&self) { use cocoa::appkit::{NSView, NSWindow, NSWindowButton}; diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 2a1771d3..511f94ef 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -14,6 +14,9 @@ "windows": [], "allowlist": { "all": false, + "os": { + "all": true + }, "protocol": { "assetScope": ["$APPDATA/responses/*"], "asset": true diff --git a/src-web/components/Workspace.tsx b/src-web/components/Workspace.tsx index 6240143a..d69e1219 100644 --- a/src-web/components/Workspace.tsx +++ b/src-web/components/Workspace.tsx @@ -8,6 +8,7 @@ import type { } from 'react'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useWindowSize } from 'react-use'; +import { useOsInfo } from '../hooks/useOsInfo'; import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { useSidebarWidth } from '../hooks/useSidebarWidth'; import { useTauriEvent } from '../hooks/useTauriEvent'; @@ -169,11 +170,15 @@ interface HeaderSizeProps extends HTMLAttributes { } function HeaderSize({ className, ...props }: HeaderSizeProps) { + const platform = useOsInfo(); return (
diff --git a/src-web/hooks/useOsInfo.ts b/src-web/hooks/useOsInfo.ts new file mode 100644 index 00000000..66129c5b --- /dev/null +++ b/src-web/hooks/useOsInfo.ts @@ -0,0 +1,12 @@ +import { useQuery } from '@tanstack/react-query'; +import type { OsType } from '@tauri-apps/api/os'; +import { type } from '@tauri-apps/api/os'; + +export function useOsInfo() { + return useQuery<{ osType: OsType }>({ + queryKey: ['platform'], + queryFn: async () => { + return { osType: await type() }; + }, + }).data; +}