Skip to content

feat(desktop): contexto visual no chat flutuante e captura sem fantasma - #14

Merged
RenanMev merged 2 commits into
mainfrom
feat/floating-chat-context-capture
Aug 13, 2026
Merged

feat(desktop): contexto visual no chat flutuante e captura sem fantasma#14
RenanMev merged 2 commits into
mainfrom
feat/floating-chat-context-capture

Conversation

@RenanMev

Copy link
Copy Markdown
Owner

Summary

  • Leva a selecao de contexto visual para o chat flutuante, reutilizando o seletor nativo e o chip de anexo do painel.
  • Reescreve o recorte magnetico: coordenadas absolutas do desktop, magnetismo enumerado no Rust antes do overlay, e captura so da regiao escolhida via IPC binario.
  • Elimina o fantasma do Linvo no print com WDA_EXCLUDEFROMCAPTURE e move o restore das janelas para depois de capture_overlay_region, para o chat nao reaparecer dentro da propria captura.

Test plan

  • Abrir captura pelo chat flutuante e pelo painel; confirmar que so a janela que pediu recebe o anexo
  • Recorte magnetico com DPI != 100% e monitor a esquerda do primario
  • Confirmar que o chat/pilula nao aparece no print apos confirmar a regiao
  • Cancelar com Esc e falhar o crop: janelas voltam e o foco retorna
  • pnpm --filter @linvo/desktop test -- src/CaptureOverlayApp.test.tsx src/hooks/use-display-snapshot.test.tsx

Made with Cursor

Renan Mello and others added 2 commits August 12, 2026 17:50
…e magnetico

Leva a selecao de contexto do chat do painel para o chat flutuante, com o
mesmo seletor nativo de janelas e telas listado pelo Rust. O gatilho e o chip
do anexo viraram componentes compartilhados para as duas telas nao divergirem.

O recorte magnetico estava quebrado em quatro frentes:

- Escala: o overlay misturava pixels fisicos (Rust) com pixels CSS (webview),
  entao a imagem aparecia ampliada e cortada em monitor com DPI != 100% e a
  selecao caia na regiao errada. A conversao agora sai da medida real do palco,
  via ResizeObserver -- medir uma vez so pegava o tamanho anterior, porque a
  janela e redimensionada antes de o webview acompanhar.

- Magnetismo: consultava ElementFromPoint a cada movimento do mouse com o
  proprio overlay na frente de tudo, logo respondia sempre "o overlay" e nunca
  distinguia janela nem monitor. O Rust passa a enumerar os retangulos antes de
  o overlay subir (EnumWindows, sem as nossas janelas, ignorando cloaked e tool
  windows, usando o frame estendido do DWM) e o hit-test e local. Mesma
  estrategia do WindowsRectangleList do ShareX.

- Peso: o frame congelado (~15 MB crus) atravessava o barramento de eventos em
  base64, duas vezes -- na abertura e de novo na confirmacao. Isso deixava a
  captura lenta e travava o emit do resultado, e como o closeCaptureOverlay
  vinha logo abaixo, o overlay nao fechava e a janela nunca voltava. Agora o
  frame fica no Rust, so a regiao trafega e o recorte vem pronto por IPC
  binario. O overlay deixou de desenhar o frame: mostra a tela ao vivo
  escurecida, como a Ferramenta de Captura do Windows.

- Fantasma: esconder a janela pelo front nao esperava o compositor, entao ela
  entrava na propria captura. Esconder, aguardar e congelar agora acontece todo
  no Rust, em ordem, e cobre tambem a pilula flutuante durante captura no painel.

Enter sem selecao captura a tela inteira, em vez de nao fazer nada e deixar o
usuario preso com a tela tomada pelo overlay.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Usa WDA_EXCLUDEFROMCAPTURE para tirar as janelas do Linvo da superficie
que o BitBlt le, e deixa o restore com capture_overlay_region depois da
captura. Fechar o overlay no confirm com restore imediato devolvia o chat
a tempo de ele sair dentro do proprio print.

Co-authored-by: Cursor <cursoragent@cursor.com>
@cursor

cursor Bot commented Aug 13, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_8e1f6809-1204-4801-9626-c6f097c87f78)

@RenanMev
RenanMev merged commit 34736d5 into main Aug 13, 2026
3 checks passed
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