Comparar commits

...

1 Commits

Autor SHA1 Mensaje Fecha
Jonathan David Florez Salomón
bfc4e1172c La barra de pestanas ya no queda debajo del titulo nativo (macOS)
La barra existia pero estaba DIBUJADA DETRAS de la barra de titulo de macOS:
solo asomaban ~12 px por debajo, y como el titulo nativo es translucido hasta
se tenia del color de la barra. Con el rediseno estilo Chrome el sintoma se
volvio evidente (no se veian ni las pestanas ni los controles), pero el fallo
venia de antes: no lo causo el CSS.

Causa (medida en vivo con instrumentacion): en macOS las coordenadas de los
webviews HIJOS son relativas al MARCO de la ventana (incluye el titulo) y
ademas `inner_size()` devuelve el marco, no el area de contenido
(inner_size == outer_size e inner_position == outer_position). Al colocar la
barra en y=0 quedaba bajo el titulo, y el contenido en y=40 arrancaba 12 px
por debajo, tapando el resto.

Arreglo: `top_offset()` compensa el alto del titulo (28 pt) SOLO cuando hace
falta. La deteccion es en caliente -- si el marco y el interior miden lo mismo
hay que compensar; el dia que Tauri lo corrija la resta dejara de ser 0 y no se
compensara nada -- y en Windows/Linux devuelve 0 (ahi las coordenadas ya son
del area de cliente). Se aplica en los tres sitios que colocan webviews:
layout_all, la creacion de la barra y la creacion de cada pestana.

Verificado en el Mac con la app real: barra completa y alineada bajo el
titulo, redimensionado, pestana nueva, cierre de pestana y cambio de pestana.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 08:55:56 -05:00
Se han modificado 4 ficheros con 34 adiciones y 9 borrados

Ver fichero

@@ -1946,7 +1946,7 @@ dependencies = [
[[package]]
name = "labstream-desktop"
version = "1.4.1"
version = "1.4.2"
dependencies = [
"serde",
"serde_json",

Ver fichero

@@ -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"

Ver fichero

@@ -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<R: Runtime>(app: &AppHandle<R>, label: &str) -> Option<Webview<R>
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<R: Runtime>(win: &Window<R>, scale: f64) -> f64 {
#[cfg(target_os = "macos")]
if let (Ok(outer), Ok(inner)) = (win.outer_size(), win.inner_size()) {
let o = outer.to_logical::<f64>(scale).height;
let i = inner.to_logical::<f64>(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<R: Runtime>(app: &AppHandle<R>) {
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::<f64>(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<R: Runtime>(app: &AppHandle<R>, url: Option<String>, 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::<f64>(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),
)?;

Ver fichero

@@ -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"