feat: windows support

This commit is contained in:
Miguel da Mota 2024-01-14 23:16:45 +01:00
parent 7a265704e8
commit 5c0034aabd
9 changed files with 242 additions and 31 deletions

View file

@ -3,6 +3,7 @@ root = true
[*] [*]
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
end_of_line = lf
[*.{js,ts,jsx,tsx,cjs}] [*.{js,ts,jsx,tsx,cjs}]
indent_style = tab indent_style = tab

113
src-tauri/Cargo.lock generated
View file

@ -119,6 +119,15 @@ version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "bincode"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -309,8 +318,24 @@ dependencies = [
"block", "block",
"cocoa-foundation", "cocoa-foundation",
"core-foundation", "core-foundation",
"core-graphics", "core-graphics 0.22.3",
"foreign-types", "foreign-types 0.3.2",
"libc",
"objc",
]
[[package]]
name = "cocoa"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c"
dependencies = [
"bitflags 1.3.2",
"block",
"cocoa-foundation",
"core-foundation",
"core-graphics 0.23.1",
"foreign-types 0.5.0",
"libc", "libc",
"objc", "objc",
] ]
@ -376,7 +401,20 @@ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"core-foundation", "core-foundation",
"core-graphics-types", "core-graphics-types",
"foreign-types", "foreign-types 0.3.2",
"libc",
]
[[package]]
name = "core-graphics"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212"
dependencies = [
"bitflags 1.3.2",
"core-foundation",
"core-graphics-types",
"foreign-types 0.5.0",
"libc", "libc",
] ]
@ -710,7 +748,28 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
dependencies = [ dependencies = [
"foreign-types-shared", "foreign-types-shared 0.1.1",
]
[[package]]
name = "foreign-types"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
dependencies = [
"foreign-types-macros",
"foreign-types-shared 0.3.1",
]
[[package]]
name = "foreign-types-macros"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.48",
] ]
[[package]] [[package]]
@ -719,6 +778,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "foreign-types-shared"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
[[package]] [[package]]
name = "form_urlencoded" name = "form_urlencoded"
version = "1.2.1" version = "1.2.1"
@ -2532,9 +2597,9 @@ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"cairo-rs", "cairo-rs",
"cc", "cc",
"cocoa", "cocoa 0.24.1",
"core-foundation", "core-foundation",
"core-graphics", "core-graphics 0.22.3",
"crossbeam-channel", "crossbeam-channel",
"dispatch", "dispatch",
"gdk", "gdk",
@ -2605,7 +2670,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af" checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cocoa", "cocoa 0.24.1",
"dirs-next", "dirs-next",
"embed_plist", "embed_plist",
"encoding_rs", "encoding_rs",
@ -2653,6 +2718,8 @@ dependencies = [
"serde_json", "serde_json",
"tauri", "tauri",
"tauri-build", "tauri-build",
"tauri-plugin-window-state",
"window-shadows",
] ]
[[package]] [[package]]
@ -2714,6 +2781,20 @@ dependencies = [
"tauri-utils", "tauri-utils",
] ]
[[package]]
name = "tauri-plugin-window-state"
version = "0.1.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#c5e8cd31ec86ba7ddcd524f1377a5bf09229fb9e"
dependencies = [
"bincode",
"bitflags 2.4.1",
"log",
"serde",
"serde_json",
"tauri",
"thiserror",
]
[[package]] [[package]]
name = "tauri-runtime" name = "tauri-runtime"
version = "0.14.2" version = "0.14.2"
@ -2741,7 +2822,7 @@ version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158" checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158"
dependencies = [ dependencies = [
"cocoa", "cocoa 0.24.1",
"gtk", "gtk",
"percent-encoding", "percent-encoding",
"rand 0.8.5", "rand 0.8.5",
@ -3345,6 +3426,18 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "window-shadows"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67ff424735b1ac21293b0492b069394b0a189c8a463fb015a16dea7c2e221c08"
dependencies = [
"cocoa 0.25.0",
"objc",
"raw-window-handle",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "windows" name = "windows"
version = "0.39.0" version = "0.39.0"
@ -3664,8 +3757,8 @@ checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4"
dependencies = [ dependencies = [
"base64 0.13.1", "base64 0.13.1",
"block", "block",
"cocoa", "cocoa 0.24.1",
"core-graphics", "core-graphics 0.22.3",
"crossbeam-channel", "crossbeam-channel",
"dunce", "dunce",
"gdk", "gdk",

View file

@ -14,8 +14,10 @@ tauri-build = { version = "1.5", features = [] }
[dependencies] [dependencies]
tauri = { version = "1.5", features = [ "macos-private-api", "window-minimize", "window-maximize", "window-hide", "window-unminimize", "window-unmaximize", "window-start-dragging", "window-close", "window-show", "shell-open"] } tauri = { version = "1.5", features = [ "macos-private-api", "window-minimize", "window-maximize", "window-hide", "window-unminimize", "window-unmaximize", "window-start-dragging", "window-close", "window-show", "shell-open"] }
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
window-shadows = "0.2"
[features] [features]
# this feature is used for production builds or when `devPath` points to the filesystem # this feature is used for production builds or when `devPath` points to the filesystem

View file

@ -2,10 +2,17 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use tauri::Manager; use tauri::Manager;
use window_shadows::set_shadow;
fn main() { fn main() {
tauri::Builder::default() tauri::Builder::default()
.invoke_handler(tauri::generate_handler![close_splashscreen]) .invoke_handler(tauri::generate_handler![close_splashscreen])
.setup(|app| {
let window = app.get_window("main").unwrap();
set_shadow(&window, true).expect("Unsupported platform!");
Ok(())
})
.run(tauri::generate_context!()) .run(tauri::generate_context!())
.expect("error while running tauri application"); .expect("error while running tauri application");
} }
@ -13,6 +20,7 @@ fn main() {
#[tauri::command] #[tauri::command]
async fn close_splashscreen(window: tauri::Window) { async fn close_splashscreen(window: tauri::Window) {
if let Some(splashscreen) = window.get_window("splashscreen") { if let Some(splashscreen) = window.get_window("splashscreen") {
println!("Closing splashscreen");
splashscreen.close().unwrap(); splashscreen.close().unwrap();
} }
window.get_window("main").unwrap().show().unwrap(); window.get_window("main").unwrap().show().unwrap();

View file

@ -43,27 +43,6 @@
"security": { "security": {
"csp": null "csp": null
}, },
"windows": [
{
"fullscreen": false,
"resizable": true,
"title": "Vybr",
"width": 800,
"height": 600,
"decorations": true,
"hiddenTitle": true,
"titleBarStyle": "Overlay",
"visible": false,
"userAgent": "Vybr-App"
},
{
"width": 300,
"height": 400,
"decorations": false,
"url": "splashscreen.html",
"label": "splashscreen"
}
],
"macOSPrivateApi": true "macOSPrivateApi": true
} }
} }

View file

@ -0,0 +1,24 @@
{
"tauri": {
"windows": [
{
"fullscreen": false,
"resizable": true,
"title": "Vybr (MacOS)",
"width": 800,
"height": 600,
"decorations": true,
"hiddenTitle": true,
"titleBarStyle": "Overlay",
"visible": false
},
{
"width": 300,
"height": 400,
"decorations": false,
"url": "splashscreen.html",
"label": "splashscreen"
}
]
}
}

View file

@ -0,0 +1,22 @@
{
"tauri": {
"windows": [
{
"fullscreen": false,
"resizable": true,
"title": "Vybr (Windows)",
"width": 800,
"height": 600,
"decorations": false,
"visible": false
},
{
"width": 300,
"height": 400,
"decorations": false,
"url": "splashscreen.html",
"label": "splashscreen"
}
]
}
}

View file

@ -1,8 +1,10 @@
import { isWindows } from "@tauri-apps/api/helpers/os-check";
import Sidebar from "./components/sidebar"; import Sidebar from "./components/sidebar";
import { cn } from "./lib/utils"; import { cn } from "./lib/utils";
import { dragging } from "./store"; import { dragging } from "./store";
import TitleBar from "./components/title-bar";
export default function App() { export default function App() {
return ( return (
@ -11,6 +13,8 @@ export default function App() {
"cursor-col-resize": dragging.value.isDragging, "cursor-col-resize": dragging.value.isDragging,
})} })}
> >
{isWindows() && <TitleBar />}
<div className="grid grid-cols-[max-content,1fr]"> <div className="grid grid-cols-[max-content,1fr]">
<Sidebar /> <Sidebar />
</div> </div>

View file

@ -0,0 +1,78 @@
import { isWindows } from "@tauri-apps/api/helpers/os-check";
import { appWindow } from "@tauri-apps/api/window";
export default function TitleBar() {
return (
<div
data-tauri-drag-region
className="flex h-8 w-full select-none border-b bg-primary"
>
{isWindows() && <Windows />}
</div>
);
}
function Windows() {
return (
<div className="ml-auto flex">
<button
className="flex w-12 items-center justify-center transition-colors hover:bg-tertiary"
onClick={() => appWindow.minimize()}
>
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M20 12L4 12"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</button>
<button
className="flex w-12 items-center justify-center transition-colors hover:bg-tertiary"
onClick={() => appWindow.toggleMaximize()}
>
<svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z"
stroke="currentColor"
strokeWidth="2"
/>
</svg>
</button>
<button
className="flex w-12 items-center justify-center transition-colors hover:bg-red-500"
onClick={() => appWindow.close()}
>
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M19 5L5 19M5 5L19 19"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</button>
</div>
);
}