Skip to content

fix(projection): Linux — projeção abre no segundo monitor - #141

Merged
pianolouvorja merged 1 commit into
stagingfrom
fix/projection-linux-second-monitor
Sep 1, 2026
Merged

fix(projection): Linux — projeção abre no segundo monitor#141
pianolouvorja merged 1 commit into
stagingfrom
fix/projection-linux-second-monitor

Conversation

@rafaumeu

Copy link
Copy Markdown
Collaborator

Problema relatado pelo usuário

No Linux, a projeção nunca abre no segundo monitor, não importa a configuração. Só aparece no monitor 2 arrastando a janela de projeção (ou a principal) para lá. Presente em 1.8.9, 1.22.1 e 1.28 — ou seja, desde sempre, não é regressão. Windows não é afetado.

Causa raiz

applyProjectionDisplayMode (electron/main.mjs) usava caminhos diferentes por plataforma:

  • win32: setFullScreen(false) + setBounds(display.bounds) + alwaysOnTop → funciona
  • linux: apenas setFullScreen(true)

A janela era criada nos bounds do monitor alvo (o renderer manda monitor=<id> corretamente), mas no Linux o fullscreen é EWMH (_NET_WM_STATE_FULLSCREEN): o window manager decide o monitor, e vários WMs (Cinnamon/GNOME/XFCE) ignoram o posicionamento pré-show e jogam no primário. Arrastar a janela funciona porque o WM faz fullscreen onde ela está — exatamente o workaround que o usuário descreveu.

Bug secundário: modo janela (fullscreen=false) nunca posicionava no monitor escolhido — buildPopupWindowOptions retornava 800x600 sem x/y.

Correção

  1. Linux usa a estratégia do win32: borderless + setBounds(bounds do monitor alvo) + alwaysOnTop (fullscreen fake, imune ao comportamento do WM)
  2. Modo janela com monitor explícito agora posiciona 800x600 centrado no workArea do monitor alvo
  3. Lógica de display extraída para electron/projection-display.mjs (funções puras, testáveis): resolveProjectionDisplay + buildProjectionWindowBounds

Evidência

  • 8 testes novos em electron/__tests__/projection-display.test.mjs (fallback monitor desconectado, bounds fullscreen/janela, etc.)
  • Suite electron completa: 43/43 verdes
  • npm run build ok
  • Validação em hardware com 2 monitores (Mint/Cinnamon) — pendente

Notas

  • macOS mantém setFullScreen nativo (não há relatos do bug lá; setSimpleFullScreen respeita o monitor da janela)
  • Sem monitor explícito no modo janela: comportamento inalterado (posição livre, WM decide)

No Linux, setFullScreen(true) é EWMH: o window manager decide o monitor e
vários WMs (Cinnamon/GNOME/XFCE) jogam o fullscreen no primário, ignorando
o monitor alvo passado via window.open (monitor=<id>). Usuário relatou que
a projeção nunca abria no monitor 2 em nenhuma versão Linux (1.8.9, 1.22.1,
1.28) — só arrastando a janela.

- Linux agora usa a estratégia do win32: borderless + setBounds(bounds do
  monitor alvo) + alwaysOnTop (fullscreen fake, imune ao WM)
- Modo janela com monitor explícito passa a posicionar 800x600 centrado no
  workArea do monitor alvo (antes ignorava o monitor completamente)
- Lógica de display extraída p/ electron/projection-display.mjs (pura,
  testável): resolveProjectionDisplay + buildProjectionWindowBounds
- 8 testes novos (43/43 verdes); npm run build ok
@pianolouvorja
pianolouvorja merged commit bbb1ee5 into staging Sep 1, 2026
15 checks passed
@pianolouvorja
pianolouvorja deleted the fix/projection-linux-second-monitor branch September 1, 2026 21:29
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.

2 participants