Skip to content

bug(linux): degradaciones informadas como éxito o con indicaciones que no resuelven (atajos, bandeja, auto-hide) #181

Open

Description

@SrStamm

Pre-flight checks

  • I searched existing issues and found no duplicate.
  • I understand that this report enters review before implementation.

What happened?

Tres superficies muestran el mismo patrón en Ubuntu 26.04 + GNOME Wayland: la
app no informa que algo falló, o informa una indicación que no puede
resolverse. Es la clase de fallo que #107 prohíbe explícitamente
(«los fallos no se presentan como activación exitosa»).

1. Atajos globales: silencio total.
En «Ajustes › Atajos» cambié el atajo de mostrar/ocultar la tira y lo ejecuté:
sin efecto y sin mensaje de ningún tipo. Volví al valor anterior: idéntico.
Mientras tanto config.json persiste shortcuts.enabled: true con
toggle: "Ctrl+Shift+U", es decir la configuración afirma que los atajos están
activos. En el log de la app aparece únicamente
Couldn't get key from code: AudioVolumeUp (x2), que viene de
tao-0.37.1 src/platform_impl/linux/keyboard.rs:248 y no es un reporte de
fallo de registro. En Wayland el portal de atajos puede denegar el registro;
que lo deniegue es un límite aceptable, que pase en silencio no.

2. Bandeja: instrucción incumplible.
«Sesión de escritorio» indica: «GNOME oculta la bandeja por defecto: instala la
extensión «AppIndicator»». La extensión ya está instalada
([email protected]), y el icono no aparece porque la sesión no
tiene ningún host StatusNotifier (verificado por D-Bus: no existe
org.kde.StatusNotifierWatcher; el dock estándar fue reemplazado por otra
extensión). Quorb crea el indicador (se ve en el log:
libayatana-appindicator se inicializa) pero no hay dónde mostrarlo. El aviso
debe verificar la existencia del host, no solo sugerir instalar una extensión
que ya está presente.

3. «Ocultar sola» recomendada pero incumplible.
El mismo bloque recomienda «si la tira se oculta tras ventanas, usa
Auto-hide». Con autoHide: true ya activo no ocurre nada: no hay franja en el
borde que retraer (por la causa de posicionamiento descrita en el otro
reporte) y al revelarse la ventana queda por debajo de las demás. La
recomendación no cumple lo que promete en este compositor.

Steps to reproduce

  1. Ejecutar Quorb en Ubuntu 26.04 + GNOME Wayland (npm run app:dev).
  2. Atajos: Ajustes › Atajos, cambiar el atajo de la tira, pulsarlo. Observar
    ausencia total de efecto y de mensaje. Inspeccionar config.json
    (shortcuts.enabled sigue en true).
  3. Bandeja: verificar en Ajustes el consejo de «AppIndicator», comprobar con
    gnome-extensions list que la extensión ya está instalada y con un gdbus
    call a ListNames que no hay ningún StatusNotifierWatcher.
  4. Auto-hide: con «Ocultar sola» activa y Firefox encima de la tira, acercar el
    ratón al borde: no se revela ninguna franja y la tira sigue tapada.

Expected behavior

  1. Si el registro de un atajo falla o no está disponible en la sesión, Ajustes ›
    Atajos muestra un estado de error accionable y shortcuts.enabled no queda
    en true.
  2. El consejo de bandeja se emite solo cuando realmente falta la extensión; si
    la extensión existe y no hay host StatusNotifier, informa esa causa.
  3. Las recomendaciones de mitigación se ofrecen solo si pueden surtir efecto en
    el compositor detectado, o declaran su alcance real.

Environment

OS: Ubuntu 26.04.1 LTS (Resolute Raccoon), x86_64
Session: XDG_SESSION_TYPE=wayland, XDG_CURRENT_DESKTOP=ubuntu:GNOME (Mutter)
Tray host: sin org.kde.StatusNotifierWatcher (D-Bus ListNames verificado)
Extensions: [email protected] instalada, dock reemplazado por el del usuario
Quorb: main @ 404dca5 (post #169), ejecutado con `npm run app:dev`
Config: shortcuts.enabled=true, shortcuts.toggle=Ctrl+Shift+U, autoHide=true

Affected area

Application behavior

Agent or client (for MCP or headless incidents)

No response

Shell (for MCP or headless incidents)

No response


Anexo: límites y contexto

  • Medido en GNOME/Mutter; KDE no se probó en esta sesión.
  • El sonido de alertas no está probado (requiere personalización con vídeo):
    queda fuera de este reporte, declarado como no cubierto.
  • Relación con feat(linux): hacer funcional el escritorio y widget nativos #107: esta clase es el criterio 4 de aceptación de esa issue
    («notificaciones, atajos y autostart se verifican o se declaran limitaciones
    claras; fallos no se presentan como activación exitosa»). Publicar aquí
    permite que feat(linux): hacer funcional el escritorio y widget nativos #107 se cierre con evidencia por criterio y este trabajo quede
    con su propio ciclo de revisión.

Activity

  1. egdev6 commented on Oct 25, 2026

    @egdev6
    Owner

    @SrStamm gracias por el reporte — el patrón que describes (fallos que no se presentan como fallos) es exactamente lo que el criterio 4 de #107 prohíbe, y lo documentas con la evidencia justa. Triaje hecho: type:bug + status:approved — los tres puntos son accionables sin más decisiones de producto.

    Verificación y plan por punto

    1 · Atajos: silencio total ✅ real, con un matiz que tu reporte intuye. El código sí tiene canal de errores: apply_shortcuts() (lib.rs:84) captura fallos de register() y los muestra como avisos rojos en Ajustes › Atajos (vía shortcut_errors). Que no vieras nada apunta a la peor variante: register() devolvió Ok (GTK registró un acelerador local que no es global) — «éxito» sin funcionalidad, y por eso shortcuts.enabled queda en true. La nota de wm_compat.rs («el error se muestra en Ajustes › Atajos») queda en evidencia: asume que denegación = error, pero existe el camino sin denegación y sin efecto.

    Fix planificado: (a) probe de lab que determine qué ocurre exactamente bajo GNOME Wayland (¿portal GlobalShortcuts? ¿acelerador local silencioso?) — mismo método F1–F14 del lab de #90; (b) diferenciar «registrado» de «funcional»: sin host del portal o sin X11, el estado va a «limitado» con mensaje accionable y no se afirma activación; (c) decidir qué hace shortcuts.enabled en ese caso (mantener la intención del usuario pero reflejar el estado real, no mentir).

    2 · Bandeja: consejo incumplible ✅ verificado en código: wm_compat.rs:250 emite el texto estático «instala la extensión «AppIndicator»» para todo GNOME, sin comprobar el host. Tu verificación por D-Bus (extensión instalada, sin org.kde.StatusNotifierWatcher) es el caso que el aviso no contempla.

    Fix planificado: sondear org.kde.StatusNotifierWatcher en ListNames antes de emitir el consejo, con tres mensajes según la causa real: extensión ausente / extensión presente sin host / host presente (y entonces el problema es otro). Sondeo barato, ya tenemos el patrón de sondas en wm_compat.rs.

    3 · Auto-hide recomendado sin efecto ✅ — consecuencia directa de #180 (sin posicionamiento no hay franja que retraer ni ventana sobre la que revelar). Fix: condicionar ese consejo al estado real del posicionamiento (el gate de #180 o el modo X11). Va en el mismo ciclo que #180, no antes.

    Orden

    Si te apetece tomar los puntos 1–2 como tu primer PR en el proyecto, dime y te abro el ODD correspondiente — el flujo de siempre: plan en la issue, revisión, y a implementar.

  2. SrStamm commented on Oct 25, 2026

    @SrStamm
    ContributorAuthor

    ¡Hola! La verdad es que me gustaría contribuir con esto. Confirmo: tomo los puntos 1–2 como mi primer PR.

    Como no tengo permiso de escritura en el repo, ¿te puedo pedir que me abras el ODD correspondiente y me asignes la issue (o me digas cómo lo manejás vos)? Quedo atento al flujo que uses para el ODD y sigo el plan de siempre: plan en la issue, revisión y a implementar.

    El punto 3 lo dejo fuera de mi alcance, en el ciclo de #180 como marcaste en el triaje.

  3. egdev6 commented on Oct 25, 2026

    @egdev6
    Owner

    @SrStamm por supuesto! todo tuyo! dale candela...te los asigno <3

  4. egdev6 commented on Oct 25, 2026

    @egdev6
    Owner

    Con ODD las issues sirven como punto de definición. El repo lleva una skill que te ayudará a entender el flujo de github. Pregunta a tu orchestrator. Cualquier duda en la comunidad tenemos foros dedicados al proyecto. Aquí tienes todas mis redes y enlace al dicord si gustas :D

    https://www.egdev.es

  5. SrStamm commented on Oct 25, 2026

    @SrStamm
    ContributorAuthor

    ODD — Plan de implementación (puntos 1 y 2)

    Tomo los puntos 1–2 según el triaje (el punto 3 queda en el ciclo de #180).

    Lab/probe del punto 1 — causa raíz confirmada

    • tauri-plugin-global-shortcut 2.4.0 depende de global-hotkey 0.8.0, que en Linux solo compila el backend X11 (src/platform_impl/mod.rs mapea todo Linux a x11/mod.rs); no existe backend Wayland en la crate.
    • register() es un XGrabKey pasivo sobre la root de XWayland. Con foco en ventanas Wayland, Mutter no entrega las teclas → register() devuelve Ok sin efecto global. Por eso no aparece ningún error en Ajustes › Atajos y shortcuts.enabled queda en true: «éxito» sin funcionalidad, exactamente el patrón reportado.
    • En la sesión de prueba (Ubuntu 26.04 + GNOME Wayland) el portal org.freedesktop.portal.GlobalShortcuts existe (xdg-desktop-portal-gnome), pero el plugin no lo usa. Migrar al portal queda como mejora posterior, fuera de este alcance.

    Punto 1 — atajos: diferenciar «registrado» de «funcional»

    1. En apply_shortcuts (src-tauri/src/lib.rs): si la sesión es Wayland, los atajos registrados vía X11/XWayland pasan a un estado «limitado» con mensaje accionable, en un canal de avisos junto a los errores existentes (el registro X11 se conserva como best-effort).
    2. Ajustes › Atajos muestra el aviso sin afirmar activación.
    3. shortcuts.enabled conserva la intención del usuario; el estado real se refleja en la UI, no en la config.

    Punto 2 — bandeja: consejo según la causa real

    1. Sondear org.kde.StatusNotifierWatcher en ListNames (D-Bus) y la extensión AppIndicator antes de emitir el consejo (wm_compat.rs).
    2. Tres mensajes según la causa real: extensión ausente / extensión presente sin host / host presente (y entonces la causa es otra). Sin dependencias nuevas; sondas inyectables para tests deterministas, mismo patrón que surfaces_for.

    Verificación prevista

    npm test, npm run typecheck, cargo test + comprobación en la sesión GNOME Wayland real.

  6. egdev6 commented on Oct 25, 2026

    @egdev6
    Owner

    @SrStamm gracias por el probe y por separar la presencia del portal de su uso real por el plugin. Ese hallazgo corrige nuestra hipótesis anterior: que exista GlobalShortcuts no hace que un backend basado en XGrabKey lo utilice.

    Plan aprobado con dos ajustes al contrato antes de implementar. La explicación del backend está bien detallada; este visto bueno es sobre el plan, no una reproducción independiente de tu lab ni una revisión de las fuentes de esas dependencias.

    Punto 1 — conforme ✅

    • Mantener shortcuts.enabled como intención del usuario y mostrar el estado efectivo por separado.
    • En sesión Wayland, advertir que el registro X11/XWayland no garantiza funcionamiento con foco en aplicaciones Wayland, aunque register() devuelva Ok.
    • Conservar el registro como best-effort, sin migrar al portal en esta issue.
    • El aviso debe diferenciarse de un error efectivo de registro; no perder los errores existentes ni presentar «limitado» como funcionalidad global comprobada.

    Ajuste 1 — bandeja: no confundir observaciones con causas

    La ausencia de org.kde.StatusNotifierWatcher no demuestra que falte una extensión, y una extensión instalada tampoco demuestra que esté habilitada o funcionando.

    El estado principal debe distinguir host presente / host ausente / sondeo fallido o desconocido. La información de la extensión es complementaria, con estado instalado/habilitado/desconocido cuando pueda determinarse de forma fiable. Si no hay host, explicar que no se detectó dónde mostrar el indicador; no recomendar reinstalar una extensión que ya existe. Si hay host, no afirmar que el icono es visible sin comprobarlo: solo se acredita la disponibilidad del host.

    Ajuste 2 — sondas acotadas y controles negativos

    Las consultas a D-Bus y al estado de extensiones deben tener timeout, no bloquear la UI y degradar a «desconocido» cuando fallen. No convertir un error de diagnóstico en «extensión ausente».

    Añadir tests deterministas para:

    • Wayland con registro Ok, pero aviso de alcance limitado.
    • X11 sin ese aviso; atajos desactivados sin falso aviso de registro.
    • Errores reales de registro conservados junto al diagnóstico de capacidad.
    • Host presente, ausente y fallo/timeout del sondeo.
    • Extensión ausente, deshabilitada y estado desconocido, sin consejos contradictorios.

    Con esos ajustes, adelante con la implementación de los puntos 1–2 y la verificación prevista, incluida la sesión GNOME Wayland real. El punto 3 sigue coordinado con #180, fuera de esta entrega. Gracias por mantener el alcance acotado y el diagnóstico honesto.

  7. SrStamm commented on Oct 25, 2026

    @SrStamm
    ContributorAuthor

    Evidencia de implementación y verificación (puntos 1–2)

    Implementado en SrStamm/quorb rama fix/181-wayland-degradation-reporting; PR a continuación con el detalle.

    Punto 1 — atajos (conforme, con la matriz de tests pedida)

    • Decisión extraída a función pura compute_shortcuts (lib.rs): cubre los caminos que antes quedaban dentro de apply_shortcuts (que necesita AppHandle y no es testeable).
    • Matriz de tests deterministas: Wayland+Ok → aviso de capacidad; X11+Ok → nada; deshabilitado → sin falso aviso; error real de registro → error conservado, sin aviso de capacidad; combinación no válida → error, no aviso.
    • UI: avisos como eg-notice--warning con role="status", distinguidos de los errores rojos (role="alert"); badge de «Atajos» cuenta ambos; shortcuts.enabled intacto como intención.

    Punto 2 — bandeja (ajustes 1 y 2 aplicados)

    • Diagnóstico inyectable en surfaces_for: estado primario del host (org.kde.StatusNotifierWatcher sondeado vía gdbus ListNames) y extensión AppIndicator complementaria vía gnome-extensions list (salida por UUIDs, independiente del locale — info está traducido y no es parseable de forma fiable).
    • Sondas con timeout de 750 ms, fuera del hilo de UI, degradan a «desconocido»; un fallo de sondeo nunca se reporta como ausencia; sin host nunca se recomienda reinstalar una extensión existente; con host solo se acredita disponibilidad, no visibilidad.
    • Sin dependencias nuevas; 12 combinaciones host × extensión con tests deterministas + smoke real #[ignore] (mismo patrón que el smoke de Secret Service).

    Comprobación en la sesión real del reporte (Ubuntu 26.04 + GNOME Wayland)

    • cargo test --lib -- --ignored --nocapture: host ausente + extensión instalada pero deshabilitada (el dock fue reemplazado por aztaskbar) → nota: «No se detectó ningún host StatusNotifier en la sesión: no hay dónde mostrar el icono. La extensión «AppIndicator» está instalada pero deshabilitada: habilitala.»
    • Control positivo: gnome-extensions enable [email protected] + reinicio → la fila pasa a «sin límites conocidos: Host StatusNotifier detectado y extensión «AppIndicator» habilitada: hay dónde mostrar el icono. Si no aparece, la causa está en la barra, no en la sesión.» Sin afirmar visibilidad.
    • Verificación visual de Ajustes › Atajos: los 3 avisos Wayland en amarillo, errores rojos arriba cuando existen, badge con contador, avisos desaparecen al deshabilitar atajos y persisten tras reabrir Ajustes.

    Checks

  8. added a commit that references this issue on Oct 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

status:approvedApproved for implementation by the repository ownertype:bugBug fix

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions