diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 9afbda6..cf6741c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1946,7 +1946,7 @@ dependencies = [ [[package]] name = "labstream-desktop" -version = "1.4.1" +version = "1.4.2" dependencies = [ "serde", "serde_json", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index eeca9cc..4d31bce 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "labstream-desktop" -version = "1.4.1" +version = "1.4.2" description = "Cliente de escritorio de Labstream OS" authors = ["Labstream SAS"] edition = "2021" diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6469dfc..6b8011a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -51,6 +51,9 @@ use tauri_plugin_opener::OpenerExt; const SERVER_URL: &str = "https://os.labstreamsas.com"; const TAB_BAR_H: f64 = 40.0; // alto lógico de la barra de pestañas (chrome) const CHROME: &str = "chrome"; +// Alto de la barra de título nativa de macOS (ventana estándar). Ver `top_offset`. +#[cfg(target_os = "macos")] +const MACOS_TITLEBAR_H: f64 = 28.0; // Escalones de zoom (como un navegador). 1.0 = 100%. const ZOOM_STEPS: &[f64] = &[0.5, 0.67, 0.75, 0.8, 0.9, 1.0, 1.1, 1.25, 1.5, 1.75, 2.0, 2.5]; @@ -268,19 +271,40 @@ fn get_webview(app: &AppHandle, label: &str) -> Option main_window(app).and_then(|w| w.webviews().into_iter().find(|v| v.label() == label)) } +// En macOS las coordenadas de los webviews HIJOS son relativas al MARCO de la ventana +// (incluye la barra de título) y `inner_size()` devuelve también el marco. Sin compensar, +// la barra de pestañas se dibuja DEBAJO del título nativo y solo asoman ~12 px (además el +// título translúcido se teñía del color de la barra). Se detecta en caliente: si el marco y +// el interior miden lo mismo hay que compensar; si Tauri lo corrige, la resta deja de ser 0 +// y no se compensa nada. En Windows/Linux siempre es 0 (ahí las coordenadas ya son del área +// de cliente). +fn top_offset(win: &Window, scale: f64) -> f64 { + #[cfg(target_os = "macos")] + if let (Ok(outer), Ok(inner)) = (win.outer_size(), win.inner_size()) { + let o = outer.to_logical::(scale).height; + let i = inner.to_logical::(scale).height; + if (o - i).abs() < 1.0 { + return MACOS_TITLEBAR_H; + } + } + let _ = (win, scale); + 0.0 +} + // Geometría: barra arriba (alto fijo), contenido debajo ocupando el resto. fn layout_all(app: &AppHandle) { let Some(win) = main_window(app) else { return }; let scale = win.scale_factor().unwrap_or(1.0); let Ok(size) = win.inner_size() else { return }; let size = size.to_logical::(scale); - let content_h = (size.height - TAB_BAR_H).max(0.0); + let top = top_offset(&win, scale); + let content_h = (size.height - top - TAB_BAR_H).max(0.0); for wv in win.webviews() { if wv.label() == CHROME { - let _ = wv.set_position(LogicalPosition::new(0.0, 0.0)); + let _ = wv.set_position(LogicalPosition::new(0.0, top)); let _ = wv.set_size(LogicalSize::new(size.width, TAB_BAR_H)); } else { - let _ = wv.set_position(LogicalPosition::new(0.0, TAB_BAR_H)); + let _ = wv.set_position(LogicalPosition::new(0.0, top + TAB_BAR_H)); let _ = wv.set_size(LogicalSize::new(size.width, content_h)); } } @@ -375,10 +399,11 @@ fn create_tab(app: &AppHandle, url: Option, activate: boo } }); + let top = top_offset(&win, scale); let created = win.add_child( builder, - LogicalPosition::new(0.0, TAB_BAR_H), - LogicalSize::new(size.width, (size.height - TAB_BAR_H).max(0.0)), + LogicalPosition::new(0.0, top + TAB_BAR_H), + LogicalSize::new(size.width, (size.height - top - TAB_BAR_H).max(0.0)), ); match created { @@ -892,7 +917,7 @@ pub fn run() { let size = win.inner_size()?.to_logical::(scale); win.add_child( WebviewBuilder::new(CHROME, WebviewUrl::App("index.html".into())), - LogicalPosition::new(0.0, 0.0), + LogicalPosition::new(0.0, top_offset(&win, scale)), LogicalSize::new(size.width, TAB_BAR_H), )?; diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 63395b7..cf106ca 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Labstream OS", - "version": "1.4.1", + "version": "1.4.2", "identifier": "co.labstream.os", "build": { "frontendDist": "../dist"