Skip to content

fix(linux): la tira y el detalle se ajustan a su contenido en Hyprland (#250) - #251

Open
DonatoSilva wants to merge 4 commits into
egdev6:mainfrom
DonatoSilva:fix/250-hyprland-window-fit
Open

DonatoSilva wants to merge 4 commits into
egdev6:mainfrom
DonatoSilva:fix/250-hyprland-window-fit

Conversation

@DonatoSilva

Copy link
Copy Markdown
Contributor

Related issue / Issue relacionada

Issue: Closes #250
ODD: odd/tasks/250-hyprland-window-fit.md — alcance propuesto en la propia issue y asignado por el mantenedor (status:approved, type:bug).

Scope / Alcance

En Hyprland la ventana no se ajusta a la tira en los dos backends (medido con hyprctl clients -j):

  • Wayland nativo: la ventana nace flotante y de 1270×1026 cuando la tira pide 61×181; la ruta sin ciclo de place() no manda la petición de tamaño ni las pistas min == max (solo las manda el ciclo X11) y no verifica. El fix manda set_size_constraints en esa ruta, antes de apply_widget, cuando el perfil del compositor lo pide (medido: 61×181 a los 69–83 ms; 5/5 corridas de la medición).
  • XWayland: Hyprland coloca la ventana en mosaico y el layout fija su tamaño (SizeRefused, 2/2). El fix declara _NET_WM_WINDOW_TYPE_UTILITY antes del primer show (medido: flotante, 61×181 y sin foco al mapearse; 4/4; dialog también flota pero toma foco).

Ambos efectos son banderas de un perfil por compositor (window_fit.rs, módulo nuevo, funciones puras sobre la detección de wm_compat.rs): solo Hyprland las activa; GNOME/Ubuntu y el resto conservan el comportamiento de siempre, con un test que fija que la fila por defecto no pide ningún ajuste ni emite llamadas nativas nuevas. La conversión física→lógica de las pistas está probada a escala ×2 (el hallazgo HiDPI de #224).

Cuatro commits: código nativo (ceb9c9f), código XWayland (958e055), inventario i18n regenerado (c1b1094; fija también el hash de src-tauri/src) y la fila de Hyprland de la matriz de docs/build-linux.md con la evidencia (9d4c88f).

Fuera de alcance (declarado en la issue): la posición en Wayland nativo (#180; el arrastre nativo sigue siendo el gesto del compositor, sin imán ni persistencia, que ahora es visible porque la ventana ya tiene el tamaño de la tira), el borde/blur/redondeo del compositor, la ventana «Ajustes» en mosaico en nativo (observada durante la validación) y el falso PositionRefused del ciclo X11.

Coordination / Coordinación

  • Para ODD: asignaciones y solapamientos revisados; toma verificada o acuerdo explícito del mantenedor enlazado.

Contributor / Contribuidor: @DonatoSilva
Claim or agreement evidence / Evidencia de asignación o acuerdo: asignación del mantenedor en la issue (#250), con status:approved y type:bug.

Acceptance and validation / Aceptación y validación

  • Criteria satisfied / Criterios cumplidos: la tira y el detalle se ajustan a su contenido en Hyprland, en Wayland nativo y XWayland; Ubuntu/GNOME y el resto de entornos sin cambios (por la fila por defecto del perfil); al salir de la tira el detalle se cierra, porque la ventana ya no la excede (comprobado a mano en XWayland).
  • Checks actually run and results / Comprobaciones ejecutadas y resultados:
    • Tests nuevos observados en rojo antes de implementar (el perfil y la bandera x11_float_hint con stubs) y en verde después.
    • cargo fmt --check y cargo test --locked: 520 tests, 515 pasan, 5 ignorados en vivo, 0 fallos.
    • npm test (vitest y node --test 298), npm run typecheck y npm run build: sin errores.
    • node scripts/i18n-inventory.mjs --check: correcto (inventario regenerado en su propio commit).
    • Validación manual en Hyprland 0.57.0 (CachyOS): con el fix, la tira queda flotante y de 61×181 en nativo y en XWayland (corridas instrumentadas con pids propios), y el detalle flota y se ajusta a su contenido (nativo: 314×379; XWayland: 314×379→506 siguiendo el contenido).
  • Checks not run and why / Comprobaciones no ejecutadas y motivo: no hay GNOME/Mutter a mano, así que la garantía de Ubuntu descansa en la fila por defecto del perfil y su test, no en una medición real. Los controles con entorno GNOME simulado en esta máquina (el compositor sigue siendo Hyprland) quedaron sin correr porque la instancia de desarrollo del propio contributor ocupaba el puerto 1430 durante la medición. El cableado del type hint en start_main_ui no tiene test unitario (declarado en el ODD); su efecto está validado a mano en XWayland.
  • Remaining blockers / Bloqueos pendientes: ninguno.

An open PR does not mean integration. Release, secrets and signing operations require separate authorization.
Una PR abierta no implica integración. Release, secretos y firma requieren autorización separada.

…gdev6#250)

Los compositores que no respetan el tamaño de la ventana (Hyprland en
Wayland nativo, medido: 1270x1026 cuando se pide 61x181) reciben ahora,
antes de aplicar la petición, la petición de tamaño y las pistas
min == max que el ciclo X11 ya mandaba. Sin ellas la ruta sin ciclo no
toca la geometría y la ventana queda con el tamaño con el que el
compositor la mapeó.

El efecto es una bandera del perfil por compositor (window_fit.rs,
módulo nuevo): sólo Hyprland la activa; GNOME/Ubuntu y el resto
conservan el comportamiento de siempre (test que fija que su fila no
pide ninguna llamada). La conversión a píxeles lógicos (hint_size)
queda probada a escala x2, como el hallazgo HiDPI de egdev6#224.
…ev6#250)

Hyprland coloca la ventana en mosaico bajo XWayland (medido:
floating=false, 1262x1022) y el layout fija el tamaño de una ventana en
mosaico: el ciclo X11 informa SizeRefused aunque mande las pistas. Con
el tipo de ventana Utility declarado antes del primer show, Hyprland la
flota y las pistas se respetan (medido: 61x181 y sin foco al mapearse;
Dialog también flota pero toma foco).

La bandera es del perfil por compositor y el type hint se aplica sólo
con transporte X11 real (en Wayland nativo no hay tipo de ventana:
medido, sin efecto). El cableado en start_main_ui no tiene test
unitario: se declara en el PR y se valida a mano en Hyprland.
El inventario fija el hash de src-tauri/src además de src/: los dos
commits de egdev6#250 lo invalidan aunque no cambien textos de interfaz.
…#250)

La fila deja de estar pendiente de contribuidor: install y app:dev
medidos en Wayland nativo y XWayland, y el widget ajustado a la tira
con el fix (61x181). Nota en §6.1 con la causa medida por backend y la
puerta por perfil. Registro honesto de los controles invalidados por el
entorno de medición (L7) y de la ventana Ajustes en mosaico (L8).

@egdev6 egdev6 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gracias por el diagnóstico y las mediciones, @DonatoSilva. Antes de integrar, ¿puedes revisar estos puntos?

  • Corregir o revalidar la escala del detalle al abrirlo oculto: src-tauri/src/detail_placement.rs:330-336 convierte los bounds con la escala de una ventana aún no mostrada, que en monitores con DPI mixto puede diferir de la del monitor seleccionado. Añadir una prueba de regresión.
  • Añadir pruebas del cableado real: pistas en ambas ventanas, Utility antes de mostrar y ausencia de llamadas nuevas fuera de Hyprland. Ahora mismo los tests de window_fit_test.rs seguirían pasando si se eliminaran esas llamadas.
  • Tratar el fallo o timeout de on_ui en lugar de descartarlo, y cubrir la cancelación de una colocación pendiente.
  • Confirmar manualmente el cierre por hover en Wayland nativo, como se pidió en #250.
  • Precisar en la matriz (docs/build-linux.md:188) qué instalación se probó y separar Omarchy de lo medido en CachyOS.

¡Gracias!

@egdev6

egdev6 commented Nov 9, 2026

Copy link
Copy Markdown
Owner

@DonatoSilva, he hecho otra pasada y añado algunos puntos a la revisión anterior. Los pendientes de esa revisión siguen en pie.

  1. Las pistas en Wayland nativo no descartan colocaciones obsoletas: en widget_placement.rs:531 y detail_placement.rs:327 el cierre que llama a set_size_constraints no comprueba superseded(generation), y el camino X11 (UiSurface::set_size_constraints, widget_placement.rs:733-749) sí lo hace. Como las pistas fijan min == max, si dos colocaciones se solapan la antigua puede dejar su tamaño bloqueado y el apply_widget siguiente queda limitado a él. Afecta sobre todo al detalle, que crece con el contenido. Propuesta: capturar generation y salir antes si está superada, igual que UiSurface. Esto concreta el punto de la cancelación de la revisión anterior.
  2. Detección de Hyprland: ahora depende solo de XDG_CURRENT_DESKTOP y DESKTOP_SESSION. Si un lanzador o un servicio de systemd las limpia, el arreglo se desactiva sin avisar. Se podría añadir HYPRLAND_INSTANCE_SIGNATURE como señal en wm_compat::is_hyprland_signal, con su test.

Menores:

  • Errata en window_fit.rs:23: «que colo la ventana» debería ser «que colocan la ventana».
  • other_desktops_do_not_ask_for_the_float_hint es un subconjunto de other_desktops_keep_the_current_behavior. Sobra, o puede cubrir un caso nuevo (por ejemplo, una señal vacía que normalize_env deba rechazar).
  • odd/tasks/250-hyprland-window-fit.md está desactualizado: la cabecera sigue diciendo «sin push ni PR» y T4 aparece sin marcar aunque L6 registra la validación.

¡Gracias!

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(linux): en Hyprland la ventana de la tira no se ajusta a su contenido (Wayland nativo y XWayland)

2 participants