# Spotlight Dimmer
## Visão Geral
Uma aplicação leve para Windows que escurece displays inativos para destacar o ativo. Construído com Rust puro e Windows API para máximo desempenho e uso mínimo de recursos.
> For the English version go to: [README.md](README.md)
Spotlight Dimmer é um programa para Windows que escurece todos os monitores exceto o monitor que possui o programa em foco no momento.
É destinado a ajudar pessoas que usam múltiplos monitores a focar e auxiliar em notar rapidamente qual janela tem o foco atual ao trocar de foco com atalhos como `alt + tab`. É especialmente útil para usuários que navegam principalmente com o teclado. Ajuda a evitar situações como digitar comandos de terminal no Teams porque você está olhando para uma tela enquanto o foco está em outra tela.
## Funcionalidades
- **Ultra-leve**: Apenas ~7.6 MB de uso de RAM, ~561 KB de tamanho binário
- **Windows API nativo**: Sem sobrecarga de mecanismo de navegador, inicialização instantânea
- **Transparência perfeita**: Escurecimento suave de 50% (customizável) em displays inativos
- **Sobreposições click-through**: Sobreposições não interferem com entrada de mouse/teclado
- **Rastreamento automático de foco**: Detecta mudanças de janela ativa e display em tempo real (polling de 100ms)
- **Suporte a hotplug de displays**: Recria automaticamente sobreposições quando displays são conectados/desconectados
- **Configuração persistente**: Configurações salvas em formato TOML em `%APPDATA%\spotlight-dimmer\config.toml`
- **Ferramenta CLI de configuração**: Gerencie configurações sem executar a aplicação principal
## Instalação
### Opção 1: Instalador para Windows (Recomendado)
1. Baixe o arquivo `spotlight-dimmer-v*-installer.exe` mais recente na [página de releases do GitHub](https://github.com/thomazmoura/spotlight-dimmer/releases).
2. Execute o instalador e siga o assistente. Ele irá:
- Instalar o aplicativo principal e o CLI de configuração
- Copiar automaticamente os arquivos de ícone necessários
- Criar atalhos no Menu Iniciar (opcionalmente na área de trabalho)
- Adicionar uma entrada de desinstalação em Configurações do Windows > Aplicativos
**Desinstalar:** Abra Configurações do Windows → Aplicativos → Aplicativos instalados, procure por "Spotlight Dimmer" e clique em Desinstalar (ou execute o desinstalador na pasta do Menu Iniciar).
### Opção 2: Instalar via npm (Alternativa)
A maneira mais simples de instalar o Spotlight Dimmer via linha de comando é usando npm:
```bash
npm install -g spotlight-dimmer
```
**Requisitos:**
- Node.js 14 ou superior
- Windows x64
O pacote inclui binários pré-compilados - sem necessidade de compilação! Após a instalação, os comandos `spotlight-dimmer` e `spotlight-dimmer-config` ficarão disponíveis globalmente.
**Desinstalar:**
```bash
npm uninstall -g spotlight-dimmer
```
### Opção 3: Construir a Partir do Código-Fonte
```bash
cargo build --release --bin spotlight-dimmer --bin spotlight-dimmer-config
```
Os binários estarão em `target\release\`:
- `spotlight-dimmer.exe` - Aplicação principal
- `spotlight-dimmer-config.exe` - Ferramenta de configuração
### Uso
#### Executando a Aplicação
Simplesmente execute `spotlight-dimmer.exe`:
```cmd
spotlight-dimmer.exe
```
A aplicação irá:
1. Carregar configuração de `%APPDATA%\spotlight-dimmer\config.toml` (ou criar padrão)
2. Detectar todos os displays conectados
3. Criar janelas de sobreposição semi-transparentes em cada display
4. Monitorar foco da janela ativa e esconder sobreposição no display ativo
5. Executar indefinidamente até ser terminado
#### Parando a Aplicação
Para parar a aplicação em execução, use PowerShell:
```powershell
Ou use o Gerenciador de Tarefas para encerrar o processo `spotlight-dimmer.exe`.
#### Ferramenta de Configuração
Use `spotlight-dimmer-config.exe` para gerenciar configurações:
```cmd
# Mostrar configuração atual
spotlight-dimmer-config status
# Habilitar/desabilitar escurecimento
spotlight-dimmer-config enable
spotlight-dimmer-config disable
# Definir cor da sobreposição (RGB 0-255, alfa 0.0-1.0)
spotlight-dimmer-config color 0 0 0 0.7 # Sobreposição preta 70%
spotlight-dimmer-config color 50 50 50 0.3 # Sobreposição cinza 30%
# Resetar para padrões
spotlight-dimmer-config reset
```
**Nota**: Mudanças de configuração são detectadas e recarregadas automaticamente em até 2 segundos. Não é necessário reiniciar!
## Arquivo de Configuração
A configuração é armazenada em `%APPDATA%\spotlight-dimmer\config.toml`:
```toml
is_dimming_enabled = true
[overlay_color]
r = 0
g = 0
b = 0
a = 0.5
```
## Arquitetura
### Aplicação Principal (`spotlight-dimmer.exe`)
- **Uso de memória**: ~7.6 MB
- **Tamanho binário**: 561 KB
- **Implementação**: Windows API puro com crate Rust `winapi`
- **Tecnologia de sobreposição**: Janelas em camadas (`WS_EX_LAYERED`) com mistura alfa
- **Monitoramento de foco**: Polling de 100ms usando `GetForegroundWindow()` e `MonitorFromWindow()`
### Ferramenta de Configuração (`spotlight-dimmer-config.exe`)
- **Tamanho binário**: 627 KB
- **Implementação**: Ferramenta CLI usando `clap` para parsing de argumentos
- **Configuração**: Formato TOML via crate `toml`
### Detalhes Técnicos Principais
- **Click-through**: Flag `WS_EX_TRANSPARENT` garante que sobreposições não capturem entrada
- **Sempre no topo**: `WS_EX_TOPMOST` mantém sobreposições acima de outras janelas
- **Sem barra de tarefas**: `WS_EX_TOOLWINDOW` previne sobreposições de aparecerem no Alt+Tab
- **Sem foco**: `WS_EX_NOACTIVATE` previne sobreposições de roubar foco
- **Transparência**: `SetLayeredWindowAttributes()` com `LWA_ALPHA` para escurecimento suave
## Comparação com Versão Tauri
| Tamanho Binário | 10.1 MB | 561 KB | ~95% redução |
| Uso de Memória | ~200 MB | ~7.6 MB | ~96% redução |
| Tempo de Inicialização | ~400ms | Instantâneo | N/A |
| Dependências | 30+ crates | 3 crates | Mínimo |
| Deps. Runtime | WebView2 | Nenhuma | Auto-contido |
## Desenvolvimento
### Estrutura do Projeto
```
.
├── src/
│ ├── main_new.rs # Ponto de entrada da aplicação principal
│ ├── config_cli.rs # Ferramenta CLI de configuração
│ ├── config.rs # Sistema de configuração (TOML)
│ ├── overlay.rs # Implementação WinAPI de sobreposição
│ └── platform/
│ ├── mod.rs # Traits multiplataforma
│ └── windows.rs # Gerenciamento de display/janela do Windows
├── Cargo.toml # Dependências Rust
└── target/release/ # Saída do build
```
### Construindo
```bash
cargo build --release
```
### Dependências
- `serde` - Serialização de configuração
- `toml` - Parsing de configuração TOML
- `winapi` - Bindings da Windows API
## Limitações Conhecidas
### Comportamento ao Arrastar Janelas
Ao arrastar janelas entre monitores com o mouse, as sobreposições são temporariamente ocultadas para prevenir instabilidade do sistema:
- **Durante o arraste**: Todas as sobreposições desaparecem quando o botão esquerdo do mouse é pressionado
- **Após o arraste**: Sobreposições reaparecem com visibilidade correta quando o botão do mouse é solto
- **Por quê**: O loop de mensagens de arrastar e soltar do Windows conflita com atualizações de visibilidade de sobreposição, causando instabilidade do sistema se as sobreposições permanecerem visíveis
- **Solução alternativa**: Use atalhos de teclado (teclas Win+Seta) para atualizações instantâneas de sobreposição sem ocultação
Esta é uma limitação da API do Windows, não um bug. Mudanças de foco e movimentação de janelas baseada em teclado funcionam instantaneamente sem ocultar sobreposições.
## Roadmap
- [ ] Ícone na bandeja do sistema (opcional, usando crate `trayicon`)
- [x] Hot reload de configuração sem reiniciar (janela de detecção de 2 segundos)
- [ ] Customização de cor por display
- [ ] Suporte a Linux (usando X11/Wayland)
## Licença
MIT
## Créditos
Construído com Rust e Windows API para máximo desempenho.