Fix lack of window rounding on macOS

Fixes #449
This commit is contained in:
Wyvest 2025-12-27 20:46:00 +09:00
parent de153a3188
commit 9edabd9508
7 changed files with 224 additions and 103 deletions

179
Cargo.lock generated
View file

@ -158,11 +158,11 @@ dependencies = [
"clipboard-win",
"image",
"log",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"parking_lot",
"percent-encoding",
"windows-sys 0.59.0",
@ -553,7 +553,7 @@ version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2"
dependencies = [
"objc2 0.6.1",
"objc2 0.6.3",
]
[[package]]
@ -1340,7 +1340,7 @@ dependencies = [
"bitflags 2.6.0",
"block2 0.6.1",
"libc",
"objc2 0.6.1",
"objc2 0.6.3",
]
[[package]]
@ -1350,7 +1350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.1",
"objc2 0.6.3",
]
[[package]]
@ -3096,10 +3096,10 @@ dependencies = [
"dpi",
"gtk",
"keyboard-types",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"once_cell",
"png",
"serde",
@ -3341,9 +3341,9 @@ dependencies = [
[[package]]
name = "objc2"
version = "0.6.1"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551"
checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
dependencies = [
"objc2-encode",
"objc2-exception-helper",
@ -3351,77 +3351,79 @@ dependencies = [
[[package]]
name = "objc2-app-kit"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc"
checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
dependencies = [
"bitflags 2.6.0",
"block2 0.6.1",
"libc",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-cloud-kit",
"objc2-core-data",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-core-image",
"objc2-foundation 0.3.1",
"objc2-quartz-core 0.3.1",
"objc2-core-text",
"objc2-core-video",
"objc2-foundation 0.3.2",
"objc2-quartz-core 0.3.2",
]
[[package]]
name = "objc2-cloud-kit"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d"
checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
]
[[package]]
name = "objc2-core-data"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d"
checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
]
[[package]]
name = "objc2-core-foundation"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
dependencies = [
"bitflags 2.6.0",
"dispatch2 0.3.0",
"objc2 0.6.1",
"objc2 0.6.3",
]
[[package]]
name = "objc2-core-graphics"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4"
checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
dependencies = [
"bitflags 2.6.0",
"dispatch2 0.3.0",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-core-foundation",
"objc2-io-surface",
]
[[package]]
name = "objc2-core-image"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e"
checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
dependencies = [
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
]
[[package]]
@ -3430,8 +3432,33 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac0f75792558aa9d618443bbb5db7426a7a0b6fddf96903f86ef9ad02e135740"
dependencies = [
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
]
[[package]]
name = "objc2-core-text"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.3",
"objc2-core-foundation",
"objc2-core-graphics",
]
[[package]]
name = "objc2-core-video"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.3",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-io-surface",
]
[[package]]
@ -3463,25 +3490,25 @@ dependencies = [
[[package]]
name = "objc2-foundation"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
dependencies = [
"bitflags 2.6.0",
"block2 0.6.1",
"libc",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-core-foundation",
]
[[package]]
name = "objc2-io-surface"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c"
checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-core-foundation",
]
@ -3504,9 +3531,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26bb88504b5a050dbba515d2414607bf5e57dd56b107bc5f0351197a3e7bdc5d"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
]
[[package]]
@ -3524,14 +3551,14 @@ dependencies = [
[[package]]
name = "objc2-quartz-core"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5"
checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
dependencies = [
"bitflags 2.6.0",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-core-foundation",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
]
[[package]]
@ -3542,15 +3569,15 @@ checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed"
dependencies = [
"bitflags 2.6.0",
"block2 0.6.1",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-cloud-kit",
"objc2-core-data",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-core-image",
"objc2-core-location",
"objc2-foundation 0.3.1",
"objc2-quartz-core 0.3.1",
"objc2-foundation 0.3.2",
"objc2-quartz-core 0.3.2",
"objc2-user-notifications",
]
@ -3560,8 +3587,8 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a3f5ec77a81d9e0c5a0b32159b0cb143d7086165e79708351e02bf37dfc65cd"
dependencies = [
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
]
[[package]]
@ -3572,10 +3599,10 @@ checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad"
dependencies = [
"bitflags 2.6.0",
"block2 0.6.1",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
]
[[package]]
@ -3600,6 +3627,9 @@ dependencies = [
"anyhow",
"chrono",
"interpulse",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.2",
"onelauncher_core",
"reqwest",
"serde",
@ -3720,6 +3750,9 @@ dependencies = [
"anyhow",
"chrono",
"interpulse",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.2",
"onelauncher_core",
"serde",
"serde_json",
@ -3830,8 +3863,8 @@ dependencies = [
"android_system_properties",
"log",
"nix 0.30.1",
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
"objc2-ui-kit",
"serde",
"windows-sys 0.61.2",
@ -3853,8 +3886,8 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b"
dependencies = [
"objc2 0.6.1",
"objc2-foundation 0.3.1",
"objc2 0.6.3",
"objc2-foundation 0.3.2",
"objc2-osa-kit",
"serde",
"serde_json",
@ -4780,10 +4813,10 @@ dependencies = [
"gtk-sys",
"js-sys",
"log",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"raw-window-handle",
"wasm-bindgen",
"wasm-bindgen-futures",
@ -6099,9 +6132,9 @@ dependencies = [
"ndk",
"ndk-context",
"ndk-sys",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"once_cell",
"parking_lot",
"raw-window-handle",
@ -6173,9 +6206,9 @@ dependencies = [
"log",
"mime",
"muda",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"objc2-ui-kit",
"percent-encoding",
"plist",
@ -6370,7 +6403,7 @@ dependencies = [
"dunce",
"glob",
"objc2-app-kit",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"open",
"schemars",
"serde",
@ -6474,7 +6507,7 @@ dependencies = [
"gtk",
"http",
"jni",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-ui-kit",
"raw-window-handle",
"serde",
@ -6495,9 +6528,9 @@ dependencies = [
"http",
"jni",
"log",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"once_cell",
"percent-encoding",
"raw-window-handle",
@ -6973,11 +7006,11 @@ dependencies = [
"dirs",
"libappindicator",
"muda",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"once_cell",
"png",
"serde",
@ -7608,10 +7641,10 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
dependencies = [
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"raw-window-handle",
"windows-sys 0.59.0",
"windows-version",
@ -8136,10 +8169,10 @@ dependencies = [
"kuchikiki",
"libc",
"ndk",
"objc2 0.6.1",
"objc2 0.6.3",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation 0.3.1",
"objc2-foundation 0.3.2",
"objc2-ui-kit",
"objc2-web-kit",
"once_cell",

View file

@ -81,3 +81,8 @@ default = [
]
devtools = [ "tauri/devtools" ]
custom-protocol = [ "tauri/custom-protocol" ]
[target.'cfg(target_os = "macos")'.dependencies]
objc2 = "0.6.3"
objc2-app-kit = { version = "0.3.2", features = ["NSWindow", "NSButton", "NSControl", "NSView"] }
objc2-foundation = { version = "0.3.2", features = ["NSObject"] }

View file

@ -123,13 +123,54 @@ fn setup_window(handle: &tauri::AppHandle) -> Result<(), Box<dyn std::error::Err
ext::updater::init(handle)?;
// tokio::task::spawn(async move {
// // let state = State::get().await.expect("failed to get state");
// // let settings = state.settings.read().await;
// // win.set_decorations(settings.);
// });
let win_clone = win.clone();
let app_handle = handle.clone();
tokio::task::spawn(async move {
if let Ok(state) = State::get().await {
let settings = state.settings.read().await;
// native_window_frame=true means use native decorations
// native_window_frame=false means use custom frame (no decorations)
#[cfg(target_os = "macos")]
{
win_clone.set_decorations(true).ok();
let win_weak = win_clone.clone();
app_handle
.run_on_main_thread(move || {
#[cfg(target_os = "macos")]
{
use objc2_app_kit::{NSWindow, NSWindowButton};
win.show()?;
if let Ok(ns_window_ptr) = win_weak.ns_window() {
let ns_window = ns_window_ptr as *mut NSWindow;
unsafe {
let ns_window = &*ns_window;
if let Some(btn) =
ns_window.standardWindowButton(NSWindowButton::CloseButton)
{
btn.setHidden(true);
}
if let Some(btn) = ns_window
.standardWindowButton(NSWindowButton::MiniaturizeButton)
{
btn.setHidden(true);
}
if let Some(btn) =
ns_window.standardWindowButton(NSWindowButton::ZoomButton)
{
btn.setHidden(true);
}
}
}
}
})
.ok();
}
#[cfg(not(target_os = "macos"))]
win_clone.set_decorations(settings.native_window_frame).ok();
}
win_clone.show().ok();
});
Ok(())
}

View file

@ -29,7 +29,7 @@
"minHeight": 600,
"resizable": true,
"center": true,
"decorations": false,
"decorations": true,
"fullscreen": false,
"shadow": true,
"visible": false

View file

@ -303,23 +303,10 @@ export type VersionType =
*/
"old_beta"
const ARGS_MAP = { 'debug':'{"getPackageVersion":[],"getPlatform":[],"getLocale":[],"openDevTools":[],"getGitCommitHash":[],"getFamily":[],"getArch":[],"getType":[],"getOsVersion":[],"isInDev":[],"getBuildTimestamp":[]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'oneclient':'{"installUpdate":[],"getClustersGroupedByMajor":[],"getVersions":[],"getBundlesFor":["cluster_id"],"checkForUpdate":[]}', 'core':'{"readSettings":[],"getLinkedPackages":["cluster_id"],"createSettingsProfile":["name"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getMultiplePackages":["provider","slugs"],"searchPackages":["provider","query"],"isClusterRunning":["cluster_id"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getUsersFromAuthor":["provider","author"],"getProfileOrDefault":["name"],"createCluster":["options"],"getLoadersForVersion":["mc_version"],"getGlobalProfile":[],"getWorlds":["id"],"fetchMinecraftProfile":["uuid"],"getLogs":["id"],"fetchLoggedInProfile":["access_token"],"changeCape":["access_token","cape_uuid"],"launchCluster":["id","uuid","search_for_java"],"getUsers":[],"getGameVersions":[],"removePackage":["cluster_id","package_hash"],"removeCape":["access_token"],"convertUsernameUUID":["username_uuid"],"getRunningProcesses":[],"removeCluster":["id"],"getRunningProcessesByClusterId":["cluster_id"],"getClusters":[],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"setDefaultUser":["uuid"],"getUser":["uuid"],"getLogByName":["id","name"],"changeSkin":["access_token","skin_url","skin_variant"],"removeUser":["uuid"],"getScreenshots":["id"],"setClusterStage":["id","stage"],"setDiscordRPCMessage":["message"],"open":["input"],"updateClusterById":["id","request"],"installModpack":["modpack","cluster_id"],"getPackage":["provider","slug"],"getDefaultUser":["fallback"],"openMsaLogin":[],"writeSettings":["setting"],"getClusterById":["id"],"killProcess":["pid"],"updateClusterProfile":["name","profile"],"getPackageBody":["provider","body"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"]}', 'events':'{"message":["event"],"process":["event"],"ingress":["event"]}' }
export type Router = { 'debug': { openDevTools: () => Promise<void>,
isInDev: () => Promise<boolean>,
getArch: () => Promise<string>,
getFamily: () => Promise<string>,
getLocale: () => Promise<string | null>,
getType: () => Promise<string>,
getPlatform: () => Promise<string>,
getOsVersion: () => Promise<string>,
getGitCommitHash: () => Promise<string>,
getBuildTimestamp: () => Promise<string>,
getPackageVersion: () => Promise<string> },
'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]>,
getVersions: () => Promise<OnlineClusterManifest>,
checkForUpdate: () => Promise<Update | null>,
installUpdate: () => Promise<null> },
const ARGS_MAP = { 'debug':'{"getGitCommitHash":[],"isInDev":[],"getArch":[],"getLocale":[],"getBuildTimestamp":[],"openDevTools":[],"getPackageVersion":[],"getType":[],"getOsVersion":[],"getPlatform":[],"getFamily":[]}', 'oneclient':'{"getBundlesFor":["cluster_id"],"installUpdate":[],"getClustersGroupedByMajor":[],"getVersions":[],"checkForUpdate":[]}', 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}', 'events':'{"ingress":["event"],"process":["event"],"message":["event"]}', 'core':'{"changeSkin":["access_token","skin_url","skin_variant"],"isClusterRunning":["cluster_id"],"removeUser":["uuid"],"getUsers":[],"getClusterById":["id"],"getScreenshots":["id"],"createCluster":["options"],"getLogByName":["id","name"],"getRunningProcesses":[],"fetchMinecraftProfile":["uuid"],"getGameVersions":[],"getLinkedPackages":["cluster_id"],"readSettings":[],"createSettingsProfile":["name"],"removeCape":["access_token"],"setDiscordRPCMessage":["message"],"open":["input"],"getPackageBody":["provider","body"],"setClusterStage":["id","stage"],"searchPackages":["provider","query"],"getLogs":["id"],"writeSettings":["setting"],"installModpack":["modpack","cluster_id"],"fetchLoggedInProfile":["access_token"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"setDefaultUser":["uuid"],"convertUsernameUUID":["username_uuid"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"killProcess":["pid"],"getDefaultUser":["fallback"],"getGlobalProfile":[],"getProfileOrDefault":["name"],"removeCluster":["id"],"removePackage":["cluster_id","package_hash"],"changeCape":["access_token","cape_uuid"],"getWorlds":["id"],"getClusters":[],"updateClusterById":["id","request"],"getRunningProcessesByClusterId":["cluster_id"],"getUser":["uuid"],"launchCluster":["id","uuid","search_for_java"],"getLoadersForVersion":["mc_version"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"updateClusterProfile":["name","profile"],"openMsaLogin":[],"getPackage":["provider","slug"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getMultiplePackages":["provider","slugs"],"getUsersFromAuthor":["provider","author"]}' }
export type Router = { 'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> },
'core': { getClusters: () => Promise<ClusterModel[]>,
getClusterById: (id: number) => Promise<ClusterModel | null>,
removeCluster: (id: number) => Promise<null>,
@ -369,11 +356,24 @@ removeCape: (accessToken: string) => Promise<MojangFullPlayerProfile>,
convertUsernameUUID: (usernameUuid: string) => Promise<MowojangProfile>,
setDiscordRPCMessage: (message: string) => Promise<null>,
open: (input: string) => Promise<null> },
'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> },
'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]>,
getVersions: () => Promise<OnlineClusterManifest>,
checkForUpdate: () => Promise<Update | null>,
installUpdate: () => Promise<null> },
'folders': { fromCluster: (folderName: string) => Promise<string>,
openCluster: (folderName: string) => Promise<null> } };
openCluster: (folderName: string) => Promise<null> },
'debug': { openDevTools: () => Promise<void>,
isInDev: () => Promise<boolean>,
getArch: () => Promise<string>,
getFamily: () => Promise<string>,
getLocale: () => Promise<string | null>,
getType: () => Promise<string>,
getPlatform: () => Promise<string>,
getOsVersion: () => Promise<string>,
getGitCommitHash: () => Promise<string>,
getBuildTimestamp: () => Promise<string>,
getPackageVersion: () => Promise<string> } };
export type { InferCommandOutput }

View file

@ -80,3 +80,8 @@ default = [
]
devtools = [ "tauri/devtools" ]
custom-protocol = [ "tauri/custom-protocol" ]
[target.'cfg(target_os = "macos")'.dependencies]
objc2 = "0.6.3"
objc2-app-kit = { version = "0.3.2", features = ["NSWindow", "NSButton", "NSControl", "NSView"] }
objc2-foundation = { version = "0.3.2", features = ["NSObject"] }

View file

@ -124,16 +124,53 @@ fn setup_window(handle: &tauri::AppHandle) -> Result<(), Box<dyn std::error::Err
// Initialize window decorations based on settings
let win_clone = win.clone();
let app_handle = handle.clone();
tokio::task::spawn(async move {
if let Ok(state) = State::get().await {
let settings = state.settings.read().await;
// native_window_frame=true means use native decorations
// native_window_frame=false means use custom frame (no decorations)
#[cfg(target_os = "macos")]
{
win_clone.set_decorations(true).ok();
let win_weak = win_clone.clone();
app_handle
.run_on_main_thread(move || {
#[cfg(target_os = "macos")]
{
use objc2_app_kit::{NSWindow, NSWindowButton};
if let Ok(ns_window_ptr) = win_weak.ns_window() {
let ns_window = ns_window_ptr as *mut NSWindow;
unsafe {
let ns_window = &*ns_window;
if let Some(btn) =
ns_window.standardWindowButton(NSWindowButton::CloseButton)
{
btn.setHidden(true);
}
if let Some(btn) = ns_window
.standardWindowButton(NSWindowButton::MiniaturizeButton)
{
btn.setHidden(true);
}
if let Some(btn) =
ns_window.standardWindowButton(NSWindowButton::ZoomButton)
{
btn.setHidden(true);
}
}
}
}
})
.ok();
}
#[cfg(not(target_os = "macos"))]
win_clone.set_decorations(settings.native_window_frame).ok();
}
win_clone.show().ok();
});
win.show()?;
Ok(())
}