Skip to content

fix(linux/x11): reintento silencioso de not_viewable y comentarios honestos (#212) - #225

Closed
sosan wants to merge 1 commit into
egdev6:mainfrom
sosan:fix/wsl-212-placement
Closed

sosan wants to merge 1 commit into
egdev6:mainfrom
sosan:fix/wsl-212-placement

Conversation

@sosan

@sosan sosan commented Oct 31, 2026

Copy link
Copy Markdown
Contributor

Resuelve los tres puntos de #212 (sobre el main vigente).

1. not_viewable ya no es un fallo de colocación

El show() es asíncrono y el gestor puede tardar más que su presupuesto de lectura (READS × SETTLE = 4 × 15 ms) en mapear la ventana — con animaciones (GNOME/Mutter) es normal que la lectura siguiente aún no la vea. Antes, ese not_viewable se traducía en placementFailed con un botón de reintentar, sin que hubiera fallo real.

Ahora el not_viewable posterior al show() se reintenta en silencio con un presupuesto acotado (retryNotViewable, NOT_VIEWABLE_RETRIES = 3, con la misma espera entre lecturas que el backend) y sólo se marca el fallo si se agota:

  • lectura posterior con éxito → no hay fallo (era "todavía no");
  • presupuesto agotado → se informa not_viewable y la tira ofrece el reintento manual;
  • un motivo que no sea not_viewable (p. ej. size_refused) no se reintenta.

Tests deterministas en src/lib/widget-placement.test.ts (32/32).

2. apply_size deja de fingir que confirma el resize

gtk_window_set_resizable es void (no puede fallar) y gtk_window_get_resizable lee la propiedad local que la llamada anterior acaba de escribir. El !is_resizable() era un tautograma, no una confirmación del gestor, y el ciclo lo usaba como si lo fuera.

Ahora apply_size no devuelve confirmación: el doc y el call site dicen que la confirmación real es el read-back posterior del compositor (el tamaño y la posición que quedaron en pantalla). El test en vivo observa tamaño y permiso tras la llamada, en vez del retorno.

3. rooted_origin documenta lo que GDK3 garantiza

gdk_window_get_origin documenta su valor de retorno como "Not meaningful, ignore": sólo distingue la ventana destruida (0) de la viva (≠ 0), y no valida que la traducción de coordenadas haya funcionado. El comentario decía que "si esa llamada falla, la lectura no es utilizable" y el call site que su返回值 "dice si la llamada tuvo éxito".

Ahora ambos describen lo que la API garantiza: ok distingue ventana destruida/viva y el origen reportado es el del último GdkEventConfigure procesado (puede ir retrasado respecto al servidor); la geometría que se informa se valida contra el read-back del compositor.

Comprobaciones

  • npx vitest run src/lib/widget-placement.test.ts → 32 passed
  • npx tsc --noEmit → verde
  • cargo fmt --check → limpio

El smoke en vivo de GTK+/WebKit2 (X11) es el que cubre la ruta nativa del read-back; lo corre el CI de Linux.

🤖 Generated with Claude Code

…nestos (egdev6#212)

Tres correcciones de la issue egdev6#212 (review de egdev6#205):

1. El `not_viewable` tras el `show()` ya no marca `placementFailed` de
   inmediato: se reintenta en silencio con un presupuesto acotado
   (`retryNotViewable`, `NOT_VIEWABLE_RETRIES=3` con la misma espera del
   backend) y solo si se agota se informa del fallo. El `show()` es
   asíncrono y con gestores con animaciones (GNOME/Mutter) el mapeo puede
   tardar más del presupuesto de lectura del backend: un `not_viewable`
   seguido de una lectura correcta es normal, no un error. Tests
   deterministas: lectura posterior con éxito → no fallo; presupuesto
   agotado → fallo; un `size_refused` no se reintenta.

2. `apply_size` deja de fingir que confirma el resize: `set_resizable` es
   `void` (no puede fallar) y `is_resizable()` relee la propiedad local
   que acabamos de escribir — un tautograma, no una confirmación del
   gestor. El doc y el call site ahora dicen que la confirmación real es
   el read-back posterior del compositor. El test en vivo observa tamaño
   y permiso tras la llamada, no el retorno.

3. `rooted_origin` documenta lo que GDK3 garantiza: el retorno de
   `gdk_window_get_origin` es "Not meaningful, ignore" — solo distingue
   la ventana destruida (0) de la viva (≠0), no valida la traducción de
   coordenadas. El call site ya no dice que "si falla, no hay lectura".

Co-Authored-By: Claude Code <noreply@anthropic.com>
@sosan

sosan commented Oct 31, 2026

Copy link
Copy Markdown
Contributor Author

Cierro esta PR porque duplica la #221, que cubre exactamente los tres puntos de la #212 con el mismo título y un alcance mayor:

  • not_viewable tras show() se reintenta en silencio (presupuesto acotado),
  • apply_size y rooted_origin documentan lo que el código garantiza de verdad,
  • además cancela los reintentos si el usuario oculta la tira mientras la lectura está en vuelo (que mi versión no cubría).

No aporta nada nuevo: es el mismo trabajo con menos robustez. Cierro en favor de #221.

@sosan sosan closed this Oct 31, 2026
@sosan
sosan deleted the fix/wsl-212-placement branch October 31, 2026 16:26
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.

1 participant