Repository navigation
DPI e Limitacoes
English · Português (Brasil)
Com set_dpi_awareness() no início do processo (feito pelo CLI e pela GUI), pywinctl e mss ficam
no mesmo espaço físico — medido em 15/15 janelas (pywinctl == GetWindowRect). Por isso o
resolver usa o conversor identidade e não há drift no caminho de monitoramento, mesmo no
monitor de 125%. O device_pixel_ratio do Qt (1.25 no primário) é do espaço lógico do Qt.
O overlay, por outro lado, recebe o arrasto em coordenadas lógicas do Qt e converte para físico com
gui/overlay_geometry.to_physical antes de gravar a seleção.
O localizador de mouse ("Localizar posição do mouse…" no editor de ações) e o realce da ROI
("Ver local") ficam na mesma fronteira Qt ↔ físico: desde a v0.10.1 eles também convertem — o
localizador devolve o ponto físico (QCursor.pos() é lógico; a conversão ancora no monitor sob
o cursor, origem + dpr) e o realce converte o retângulo físico para lógico antes de pintar. Antes
dessa correção, ações criadas pelo localizador clicavam em coordenadas lógicas em monitores com
escala (ex.: ~192×120 px de erro no centro de uma tela 1920×1200 a 125%, crescendo até o canto
inferior direito).
Ao iniciar run, o app verifica cada monitor, marca os adequados (OK, 100%) e avisa se a janela do
target estiver num monitor com escala. probe-dpi e scripts/probe_dpi.py mostram a matriz
(mss físico × Qt lógico × escala).
Se um teste falhar em 125% ou 150% de escala no Windows, esse é o bug mais importante do projeto — priorize antes de qualquer feature.
-
Wayland:
mssnão captura. O app avisa e encerra orun; não há backend Wayland no protótipo. Rode em X11. -
Janela ocluída:
msscaptura pixels da tela, não a superfície da janela. Se outra janela cobrir a ROI, o frame conterá a janela sobreposta. Não é bug a corrigir — é limitação fundamental das APIs de captura. -
Múltiplas ROIs (só na GUI): cada sessão tem a própria thread, backend de captura e buffers de
preview/calibração, e o modo
advanced(OCR) multiplica a CPU por sessão. Oui.max_sessions(padrão 4, faixa 1..16) limita; orundo CLI monitora uma única seleção. - macOS e ARM fora do build: não há instalador nem validação; o build é Windows x64 + Linux amd64.
- Tray no GNOME: pode não aparecer sem extensão de tray; a janela continua funcional.
-
Som no Linux: o CLI/
runtoca WAV/MP3/OGG/FLAC pelominiaudioempacotado; a GUI depende dos plugins do GStreamer; formatos sem decoder (M4A/AAC no CLI) caem para um player externo (paplay/aplay/ffplay) e, sem ele, para obeep(o alerta nunca quebra). - SmartScreen: os instaladores não são assinados; o Windows vai avisar (assinatura fora de escopo).
- Elevação (UAC): as ações não contornam elevação; para interagir com apps elevados, rode o app em contexto equivalente.
-
Janela minimizada ou fechada: o loop emite
target_unavailablee segue tentando quando ela voltar.
-
Coordenadas negativas/fora da tela: a ROI é recortada contra o desktop virtual
(
mss.monitors[0]). Quando há recorte, o loop emitecapture_clipped; quando a ROI cai 100% fora, emiteroi_off_screene pula o tick — sem quebrar o loop. - Falhas repetidas: erros consecutivos idênticos (ex.: Tesseract ausente, token ausente) são reportados uma vez, não a cada tick.
-
Parada:
stop()sinaliza o evento e fazjoin; obackend.close()roda nofinallydo worker. -
Backend na thread certa:
mssnão é thread-safe; a instância é criada e fechada dentro da thread do loop.
-
Uso (CLI) —
probe-dpi, eventos do loop - doc/00 §5.1 e §7.6 — decisões de design