Skip to content

About

Cross-platform ZoomIt alternative: screen zoom, drawing and annotation for presentations with global hotkeys on Linux (X11 and Wayland), Windows and macOS. Native AOT .NET, SDL3 and SkiaSharp. Alternativa ao ZoomIt compatível com múltiplas plataformas: zoom de tela, desenho e anotação para apresentações, com teclas de atalho globais no Linux (X11 e

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

73 Commits

Folders and files

Repository files navigation

PixelPointer — zoom e anotação de tela para apresentações

Português (Brasil) · English · Español

CI Release Licença MIT Plataformas: Linux, Windows e macOS

Ferramenta Native AOT (pixelpointer) para quem apresenta, grava ou ensina: amplia a tela com o mouse, desenha e destaca por cima e volta ao trabalho com um toque, acionada por atalhos globais no Linux (X11 e Wayland), no Windows e no macOS. Um único pacote, sem .NET instalado.

Para quem é: palestrantes, professores, criadores de vídeos e equipes que fazem demonstrações ao vivo e querem o fluxo do ZoomIt (Sysinternals/PowerToys) em qualquer sistema operacional, inclusive em desktops Wayland como GNOME e KDE. O PixelPointer é um projeto independente, não é um produto da Microsoft e não usa o código, a marca ou os ícones do ZoomIt.

Instalação

Pacotes para linux-x64, linux-arm64 (glibc 2.34+: Ubuntu 22.04, Debian 12, RHEL/Rocky 9 ou mais novos), win-x64, win-arm64, osx-arm64 e osx-x64. Os instaladores conferem o SHA-256 com o SHA256SUMS da release, não se autoelevam e não alteram perfis nem o PATH:

Para testar uma preview, escolha a versão marcada Pre-release em Releases e siga o guia de pacotes preview, com comandos para Linux/Wayland e Windows. Os instaladores abaixo são da versão estável; previews usam pacotes portáteis e não são distribuídas por Homebrew/winget.

# Linux e macOS: aplicativo em ~/.local/lib/pixelpointer, comando em ~/.local/bin
curl -fsSL https://github.com/lzocateli/PixelPointer/releases/latest/download/install.sh | sh
# Windows (PowerShell 5.1+): instala em %LOCALAPPDATA%\Programs\pixelpointer
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072
& ([scriptblock]::Create((Invoke-RestMethod https://github.com/lzocateli/PixelPointer/releases/latest/download/install.ps1)))

No Windows, se o diretório não estiver no PATH, o install.ps1 sugere duas opções; use apenas uma. A recomendada grava o PATH do usuário no registro, mas só vale para processos novos: no mesmo PowerShell, pixelpointer continua "não reconhecido" até abrir outro terminal ou atualizar a sessão:

$env:Path = [Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [Environment]::GetEnvironmentVariable('Path', 'User')

A alternativa pelo perfil grava $PROFILE.CurrentUserAllHosts (profile.ps1), que o Windows PowerShell só carrega quando a política de execução permite scripts. Com a política padrão Restricted, todo terminal novo mostra "profile.ps1 não pode ser carregado porque a execução de scripts foi desabilitada". Se já gravou o PATH no registro, remova do perfil a linha $env:PATH = ...pixelpointer...; o perfil é desnecessário. Para manter o perfil, permita scripts locais somente para o seu usuário, ciente de que isso relaxa a política (uma política imposta por GPO prevalece; confira com Get-ExecutionPolicy -List):

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
# Homebrew (macOS e Linux)
brew install lzocateli/tap/pixelpointer

# winget (Windows), após a moderação da versão no microsoft/winget-pkgs
winget install lzocateli.PixelPointer

# Debian/Ubuntu (amd64 ou arm64), a partir do asset da release
curl -fsSLO https://github.com/lzocateli/PixelPointer/releases/latest/download/pixelpointer-linux-x64.deb
sudo apt install ./pixelpointer-linux-x64.deb

Cada pacote traz o SBOM SPDX e atestações de proveniência: gh attestation verify <arquivo> --repo lzocateli/PixelPointer (verificação).

Atualizar

O PixelPointer não consulta a rede por padrão. Em instalações feitas por install.sh ou install.ps1 no diretório do usuário, pixelpointer update install baixa a release estável mais recente, confere o SHA-256 e a proveniência Sigstore no próprio aplicativo, executa a versão nova (--version e selftest) e só então troca os arquivos, preservando a versão anterior em falha. Com o daemon em execução, a troca ocorre quando ele encerra. Verificação e instalação automáticas são opcionais e começam desativadas (pixelpointer update auto-check on, pixelpointer update auto-install on ou o submenu Atualizações da tray). .deb, Homebrew, winget, instalações globais e cópias portáteis apenas avisam e indicam o comando do respectivo canal. Instalações anteriores a este recurso precisam reexecutar o instalador uma vez. Detalhes e limitações no guia de uso.

Desinstalar

Para a remoção manual, encerre primeiro o daemon com pixelpointer quit. Os modos --uninstall e -Uninstall dos instaladores tentam encerrá-lo automaticamente. Depois, remova o PixelPointer pelo mesmo método usado para instalá-lo:

Instalação Comando ou ação
install.sh (Linux/macOS, prefixo padrão) sh install.sh --uninstall; para instalação global, encerre o daemon e remova a integração desktop como usuário antes de executar sudo sh install.sh --uninstall --global
install.sh --prefix <dir> Remova <dir>/bin/pixelpointer e <dir>/lib/pixelpointer; substitua <dir> pelo prefixo usado na instalação
install.sh --global Remova /usr/local/bin/pixelpointer e /usr/local/lib/pixelpointer com sudo; antes, remova a entrada desktop no Linux pelo próprio binário
install.ps1 PowerShell: install.ps1 -Uninstall
.deb sudo apt remove pixelpointer
Homebrew brew uninstall lzocateli/tap/pixelpointer
winget winget uninstall lzocateli.PixelPointer

Limpeza completa opcional

Para instalações de usuário feitas por install.sh ou install.ps1, execute o instalador da release com a opção explícita de limpeza completa:

# Linux
curl -fsSL https://github.com/lzocateli/PixelPointer/releases/latest/download/install.sh | sh -s -- --uninstall --purge
# Windows PowerShell 5.1+
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072
& ([scriptblock]::Create((Invoke-RestMethod https://github.com/lzocateli/PixelPointer/releases/latest/download/install.ps1))) -Uninstall -Purge

O purge apaga configurações, cache e todos os arquivos da pasta Screenshots; no Linux também remove da Lixeira somente itens com pixelpointer no nome. No Windows, a Lixeira é preservada. O script encerra o daemon se estiver ativo. A operação é permanente: confira a pasta de capturas antes de executá-la. O purge exige uma instalação de usuário sem elevação e um recibo válido; se a instalação for anterior ao recibo, execute o instalador uma vez antes. No macOS, use --uninstall sem --purge, pois as capturas podem estar em uma pasta escolhida pelo usuário. Para instalações globais, .deb, Homebrew ou winget, use o método correspondente da tabela.

Se adicionou manualmente a linha de inicialização ao perfil do PowerShell, remova essa linha do $PROFILE.CurrentUserAllHosts. A integração desktop Linux deve ser removida antes do executável com pixelpointer uninstall-desktop-file, usando o mesmo XDG_DATA_HOME; o comando preserva arquivos modificados. A desinstalação padrão não apaga capturas PNG ou GIF; a limpeza opcional pode removê-las. Ela não remove anexos do VS Code nem caches de build e testes do .NET. Detalhes e limites por método estão no guia de uso.

Primeiros passos

pixelpointer install-desktop-file   # Linux: registra o app id usado pelos portais
pixelpointer grant                  # Linux: autoriza captura pelo portal (uma vez)
pixelpointer daemon                 # Ctrl+1 zoom, Ctrl+2 desenho, Ctrl+3 timer, Ctrl+4 Live Zoom, Ctrl+5 gravação, Ctrl+6 recorte

O comando daemon permanece em primeiro plano: mantém os atalhos e o IPC ativos, mas não libera o terminal automaticamente. Isso é esperado, não um travamento; Ctrl+C encerra o processo. No Linux, para liberar o prompt:

pixelpointer daemon &

O & coloca o processo em segundo plano, mas ele ainda pode escrever no terminal e encerrar quando a janela do terminal for fechada. Para usar sem terminal no Linux, execute pixelpointer install-desktop-file e abra PixelPointer pelo menu de aplicativos. Encerre por Sair na tray ou por pixelpointer quit. Essa integração não configura início automático com a sessão.

No Windows (PowerShell), inicie o daemon em um processo separado, sem janela:

Start-Process pixelpointer -ArgumentList daemon -WindowStyle Hidden
pixelpointer status

O prompt é liberado na hora e o daemon continua ativo mesmo após fechar o PowerShell. Encerre por Sair na tray ou por pixelpointer quit. Nessa forma as mensagens do daemon não aparecem; para diagnosticar conflitos de atalho, execute pixelpointer daemon em primeiro plano.

Atalho ou tecla Ação
Ctrl+1 Zoom: congela a tela ampliada; o mouse percorre a imagem
Ctrl+2 Desenho sem zoom
Ctrl+3 Timer de intervalo (10 min; setas ou roda ajustam e reiniciam)
Ctrl+4 Live Zoom: amplia a tela ao vivo seguindo o cursor, sem congelar; repita para sair (Windows em tela cheia; macOS e X11 como lupa em janela; Wayland best effort quando o portal oferece cursor metadata; GNOME desabilitado)
Ctrl+5 Inicia ou salva GIF (até 5 min); X11/Windows: monitor sob o cursor ao iniciar; Wayland: monitor autorizado no portal
Ctrl+6 Recorte: X11/Windows abrem no monitor sob o cursor; arraste para copiar; com Shift ao soltar, salva PNG
pixelpointer status Consulta se o daemon está em execução
pixelpointer quit Encerra o daemon e a sobreposição ativa
Roda do mouse / setas Mais ou menos zoom
Clique e arraste Desenhar (caneta com pressão é suportada)
Shift + arrastar Linha reta
Ctrl + arrastar Retângulo
Ctrl+Shift + arrastar Seta
Tab + arrastar Elipse
R G B Y O P Vermelho, verde, azul, amarelo, laranja, rosa
Shift + R G B Y O P Marca-texto translúcido na cor
X / Shift+X Desfoque / desfoque forte (retângulo e elipse preenchidos)
T Texto no ponteiro (Enter quebra a linha, Esc ou clique termina)
Ctrl+roda Espessura da caneta
Ctrl+Z / E Desfazer / apagar tudo
W / K Quadro branco / quadro preto
Ctrl+S Salvar PNG
Ctrl+C Copiar a imagem para a área de transferência
Esc ou botão direito Sair

No Wayland, o primeiro daemon pede a confirmação dos atalhos ao desktop. Sem o portal de atalhos, use um atalho do próprio desktop chamando pixelpointer zoom ou pixelpointer draw. Detalhes, permissões por sistema e solução de problemas: guia de uso. Esc fecha somente a sobreposição; o menu da tray oferece Sair quando disponível, e pixelpointer quit encerra o daemon. O aplicativo não inicia automaticamente com a sessão. O desenho ao vivo requer compositor X11; no Wayland usa captura congelada.

Ctrl+S respeita a pasta de capturas do usuário: Imagens/Screenshots no Windows, preferência de captura ou Área de Trabalho no macOS e PICTURES/Screenshots conforme XDG no Linux. Não sobrescreve arquivos e informa o destino na sobreposição. Detalhes e exportação com alfa: onde o Ctrl+S salva.

Como funciona

Camada Tecnologia
Janela, entrada e caneta SDL3 (Wayland nativo, X11, Win32, Cocoa)
Desenho e zoom SkiaSharp
Captura e atalhos no Wayland Portais XDG (Screenshot, GlobalShortcuts) via D-Bus
Captura e atalhos no X11, Windows e macOS XGetImage/XGrabKey, GDI/RegisterHotKey, screencapture
Distribuição .NET 10 Native AOT, ~19 MB com as bibliotecas nativas

Desenvolvimento

  • .NET 10 (SDK do global.json) com Native AOT; testes com xUnit v3 sobre Microsoft Testing Platform: dotnet test --solution PixelPointer.slnx.

  • Valide como no CI (PowerShell 7 e Docker ou Podman; -Aot publica e executa o selftest do binário nativo linux-x64):

    pwsh ./tools/scripts/Invoke-Validation.ps1 -Aot
  • Pacotes de release, smoke em distribuições limpas e testes dos instaladores: processo de release.

  • No Windows e no macOS: pwsh ./tools/scripts/Invoke-Validation.ps1 -Native -Aot.

  • Instale o hook de detecção de secrets: pwsh ./tools/scripts/install-gitleaks-hook.ps1.

  • Leia CONTRIBUTING, a convenção de commits e a política de segurança.

Comunidade e contribuições

Contribuições por fork e pull request são bem-vindas. Comece por bugs, melhorias ou dúvidas e aguarde o alinhamento de escopo antes de implementar.

A infraestrutura gerenciada (workflows gw-*, .githooks/, tools/scripts/ci/, templates e políticas em .github/) foi gerada pelo Altivy.Groundwork; .groundwork/manifest.json lista esses arquivos e groundwork status confere sua integridade. Os workflows e scripts de build, publicação e distribuição (ci.yml, publish.yml, post-release.yml, winget.yml, tools/scripts/*.ps1, install/) e os documentos de governança foram adaptados do DotnetScope e pertencem ao projeto.

Licença

MIT. Componentes redistribuídos (SDL3, SkiaSharp/Skia, Tmds.DBus): THIRD-PARTY-NOTICES.md.

About

Cross-platform ZoomIt alternative: screen zoom, drawing and annotation for presentations with global hotkeys on Linux (X11 and Wayland), Windows and macOS. Native AOT .NET, SDL3 and SkiaSharp. Alternativa ao ZoomIt compatível com múltiplas plataformas: zoom de tela, desenho e anotação para apresentações, com teclas de atalho globais no Linux (X11 e

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages