Skip to content

feat(widget): dockear al monitor principal por defecto y avisar si el widget queda en otro display #113

Open

Description

@barbatdev

Pre-flight checks

  • Busqué issues existentes y no encontré duplicados.
  • Entiendo que esta propuesta requiere revisión de producto antes de implementarse.

Problem to solve

Descubierto durante el port a macOS (#69, verificación M3): con dockMonitor: null, el frontend resuelve la posición del widget con currentMonitor() (el monitor "actual", que depende de dónde esté el cursor/foco) en vez del monitor principal. En un setup multi-display el widget puede dockearse al borde de un monitor externo — incluso uno ubicado fuera de la vista natural del usuario (arriba del principal) — y como la tira en modo peek es una franja fina (~210 px), el widget parece "desaparecido".

Reproducción real: macOS multi-display (Retina principal + externos, uno de 3008×1692 arriba del principal), dockEdge: "top", dockOffset: 0.53, dockMonitor: null → la ventana del widget quedó en y = -1692 (borde superior del externo). En Windows no se nota porque la taskbar vive en el display principal; el dockeo actual nunca tuvo este caso a la vista.

Proposed solution

Dos cambios de comportamiento (ambos acotados al frontend/Rust de geometría ya existente):

  1. Con dockMonitor: null, resolver la geometría contra el monitor principal (primaryMonitor()) por defecto, no contra currentMonitor(). El "actual" queda solo cuando el usuario fijó explícitamente un monitor en Ajustes.
  2. Al mostrar la tira en un display no principal, emitir una notificación/aviso breve ("Quorb está en el monitor X") o re-dockear al principal si el elegido no está visible.

Affected area

Application behavior

Scope and non-goals

Incluye: default de monitor para el dockeo, aviso/redock de seguridad. No incluye: soporte de widget simultáneo en varios displays, gestión de perfiles por display, cambios de estilo del widget, ni la validación del port macOS (eso sigue en #69 / PR #112).

Alternatives considered

  • Dejar el comportamiento actual y solo documentarlo: descartado, el "widget invisible" es una mala primera experiencia en multi-display.
  • Recordar el último monitor por coordenadas de ventana en vez de por nombre: frágil si cambia la disposición de displays; el nombre + fallback a principal es más estable.

Activity

  1. egdev6 commented on Oct 14, 2026

    @egdev6
    Owner

    @barbatdev, gracias por la reproducción concreta. El problema está respaldado por src/Widget.tsx:55–62: resolveGeo prioriza currentMonitor() sobre primaryMonitor() cuando no hay monitor fijado, y también cuando el nombre guardado ya no está disponible. Una precisión para el diagnóstico: currentMonitor() devuelve el monitor donde está la ventana, no el del cursor/foco; las coordenadas negativas son válidas en una disposición con pantallas arriba o a la izquierda.

    Propongo acotar los criterios antes de implementar:

    • dockMonitor: null: usar el principal por defecto.
    • Monitor explícito disponible: respetar la elección, aunque sea externo; no recolocar ni avisar solo por no ser el principal.
    • Monitor guardado desconectado/no disponible: fallback al principal y, si se añade un aviso, una sola vez por transición, no en cada sondeo.
    • Si no se detecta principal: fallback defensivo al actual y después al primero disponible, sin fallar si no hay ninguno.
    • Cubrir selección automática y explícita, desconexión/reconexión, coordenadas negativas y escalas Retina diferentes.

    Separaría el fix del default de la política opcional de avisos/recuperación. “No visible” necesita una definición comprobable: una pantalla desconectada no es lo mismo que una conectada que el usuario no está mirando. Esta revisión no implica todavía aprobación de producto para implementar ni cierra la validación macOS de #69/#112; he contrastado el código y el contrato de la API, sin reproducir personalmente el escenario multipantalla.

  2. barbatdev commented on Oct 14, 2026

    @barbatdev
    ContributorAuthor

    Gracias por la precisión — acepto la corrección del diagnóstico: currentMonitor() devuelve el monitor donde está la ventana, no el del cursor/foco, y las coordenadas negativas son válidas en disposiciones con pantallas arriba/izquierda (en mi máquina el -1692 era exactamente eso).

    Los criterios acotados me parecen bien y los acepto como base de diseño:

    • dockMonitor: null → principal por defecto.
    • Monitor explícito disponible → se respeta, externo incluido, sin recolocar ni avisar.
    • Monitor guardado no disponible → fallback al principal; aviso, si existe, una sola vez por transición.
    • Sin principal detectado → actual y luego el primero disponible, sin fallar.
    • Cobertura: selección automática/explícita, desconexión/reconexión, coordenadas negativas, escalas Retina distintas.

    Y coincido en separar el fix del default (esta issue, comportamiento) de la política opcional de avisos (separate decision), y en que «no visible» necesita definición comprobable — «monitor no disponible» es el criterio operativo, no «el usuario no lo está mirando».

    Quedo a la espera de la aprobación de producto antes de implementar; cuando la haya, propongo entregarlo como PR acotada separada de #112 con tests de geometría deterministas sobre resolveGeo.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions