Fix macOS traffic light vertical alignment

This commit is contained in:
Yuri Karamian
2026-07-24 16:38:06 +02:00
parent 6b5e923e8e
commit 461001442a
4 changed files with 78 additions and 1 deletions
+1
View File
@@ -1860,6 +1860,7 @@ dependencies = [
"image", "image",
"log", "log",
"notify", "notify",
"objc2-app-kit",
"png 0.17.16", "png 0.17.16",
"quick-xml 0.36.2", "quick-xml 0.36.2",
"rayon", "rayon",
+3
View File
@@ -42,6 +42,9 @@ quick-xml = "0.36"
urlencoding = "2" urlencoding = "2"
sha2 = "0.10" sha2 = "0.10"
rustls = { version = "0.23", default-features = false, features = ["ring", "logging", "std", "tls12"] } rustls = { version = "0.23", default-features = false, features = ["ring", "logging", "std", "tls12"] }
[target.'cfg(target_os = "macos")'.dependencies]
objc2-app-kit = "0.3.2"
[target.'cfg(target_os = "ios")'.dependencies] [target.'cfg(target_os = "ios")'.dependencies]
tauri-plugin-ios-vault-access = { path = "plugins/ios-vault-access" } tauri-plugin-ios-vault-access = { path = "plugins/ios-vault-access" }
+73
View File
@@ -56,6 +56,23 @@ pub fn run() {
.plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_fs::init())
.plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_opener::init())
.on_page_load(|webview, payload| {
#[cfg(target_os = "macos")]
if webview.label() == "main"
&& matches!(
payload.event(),
tauri::webview::PageLoadEvent::Finished
)
{
let window = webview.window();
let window_on_main = window.clone();
let _ = window.run_on_main_thread(move || {
fix_macos_traffic_lights(&window_on_main);
});
}
#[cfg(not(target_os = "macos"))]
let _ = (webview, payload);
})
.setup(move |app| { .setup(move |app| {
#[cfg(target_os = "ios")] #[cfg(target_os = "ios")]
app.handle().plugin(tauri_plugin_ios_vault_access::init())?; app.handle().plugin(tauri_plugin_ios_vault_access::init())?;
@@ -392,3 +409,59 @@ fn percent_decode(input: &str) -> String {
} }
String::from_utf8_lossy(&output).to_string() String::from_utf8_lossy(&output).to_string()
} }
#[cfg(target_os = "macos")]
fn fix_macos_traffic_lights(window: &tauri::Window) {
use objc2_app_kit::{NSView, NSWindow, NSWindowButton};
const TITLEBAR_HEIGHT: f64 = 34.0;
const LEFT_INSET: f64 = 12.0;
let ns_window_ptr = match window.ns_window() {
Ok(ptr) => ptr,
Err(_) => return,
};
let ns_window: &NSWindow = unsafe { &*(ns_window_ptr as *const NSWindow) };
let close = match ns_window.standardWindowButton(NSWindowButton::CloseButton) {
Some(button) => button,
None => return,
};
let miniaturize = match ns_window.standardWindowButton(NSWindowButton::MiniaturizeButton) {
Some(button) => button,
None => return,
};
let zoom = match ns_window.standardWindowButton(NSWindowButton::ZoomButton) {
Some(button) => button,
None => return,
};
let titlebar_container = match unsafe {
close
.superview()
.and_then(|titlebar| titlebar.superview())
} {
Some(container) => container,
None => return,
};
let close_frame = NSView::frame(&close);
let top_inset = ((TITLEBAR_HEIGHT - close_frame.size.height) / 2.0).max(0.0);
let container_height = close_frame.size.height + top_inset;
let window_height = ns_window.frame().size.height;
if container_height <= 0.0 || window_height <= 0.0 {
return;
}
let mut container_frame = NSView::frame(&titlebar_container);
container_frame.size.height = container_height;
container_frame.origin.y = window_height - container_height;
NSView::setFrame(&titlebar_container, container_frame);
let button_spacing = NSView::frame(&miniaturize).origin.x - close_frame.origin.x;
for (index, button) in [&close, &miniaturize, &zoom].into_iter().enumerate() {
let mut frame = NSView::frame(button);
frame.origin.x = LEFT_INSET + index as f64 * button_spacing;
button.setFrameOrigin(frame.origin);
}
}
+1 -1
View File
@@ -9,7 +9,7 @@
"hiddenTitle": true, "hiddenTitle": true,
"trafficLightPosition": { "trafficLightPosition": {
"x": 12, "x": 12,
"y": 12 "y": 10
} }
} }
] ]