ImageForge 1.3.1: uma janela e uma só lista
O mesmo sintoma nas duas plataformas — dá várias imagens à app e ela abre vazia — tinha afinal duas causas sem nada em comum. Eis o que era cada uma.
O mesmo sintoma nas duas plataformas — dá várias imagens à app e ela abre vazia — tinha afinal duas causas sem nada em comum. Eis o que era cada uma.
Um aviso de um utilizador, dois sistemas operativos, duas causas sem nada em comum. No Mac, largar quatro imagens no ícone da Dock abria quatro janelas e metia o lote numa delas. No Windows, “Abrir com o ImageForge” abria a app com a lista vazia, por muitos ficheiros que lhe desses. A 1.3.1 corrige as duas — e vale a pena contar como cada uma se partia.
Largavas quatro imagens no ícone da Dock e apareciam quatro janelas, cada uma com a sua lista vazia, todas a disputar o lote. A causa não estava no nosso código: a janela principal era um WindowGroup do SwiftUI, e um WindowGroup abre uma janela por documento quando o macOS entrega o Apple Event de abertura. O rasto do sistema mostra-o sem ambiguidade: um único evento com quatro ficheiros e, a seguir, quatro janelas criadas, tudo antes de o nosso código ter visto um único caminho. O lote entrava numa delas e não havia como controlar qual ficava à frente, pelo que muitas vezes parecia que a app tinha aberto sem nada para comprimir, e tentar de novo só acrescentava janelas vazias.
A solução não foi rodear o problema de código defensivo, mas declarar o que a app sempre foi: uma janela com uma só lista. A cena é agora um Window do SwiftUI, uma instância única que nem o Apple Event nem mais nada consegue duplicar. Pelo mesmo motivo, “Nova janela” desaparece do menu Ficheiro: se fechar a janela, recupere-a em Janela ▸ Janela do ImageForge (⌘0), clicando no ícone da Dock ou a partir do ícone na barra de menus.
A app de Windows declarava a sua associação de tipos de ficheiro desde a primeira versão, pelo que o Windows oferecia “Abrir com o ImageForge” e aceitava ficheiros largados no seu ícone. Só que nunca os lia: o WinUI encaminha todas as ativações por um único método de arranque, e o nosso criava a janela e deitava fora os argumentos. A associação era decorativa — a app abria com a lista vazia, quer lhe desses uma imagem quer vinte.
Corrigi-lo destapou algo que tínhamos assumido mal. Numa app de ambiente de trabalho empacotada, a shell do Windows não entrega uma seleção como uma única ativação: arranca um processo por ficheiro, cada um com um só caminho na linha de comandos. Quatro imagens eram quatro processos. A correção tem, por isso, duas metades: ler os caminhos da linha de comandos e eleger um processo principal a quem os outros passam os seus ficheiros antes de sair. O resultado é o que se esperava desde o início: uma janela e uma só lista, por muitos ficheiros que selecione.
Ambos os erros viviam na fronteira entre a app e o sistema operativo — a parte que nenhum teste unitário cobre, porque a única forma de saber o que o sistema faz mesmo é vê-lo a fazê-lo. Os dois foram encontrados a ler rastos do sistema, não a raciocinar sobre o código, e em ambos os casos o código fazia exatamente o que lhe tínhamos dito. A 1.3.1 já está na Mac App Store e na Microsoft Store; como sempre, tudo acontece no teu equipamento e nunca é enviado nada.
Grátis na Mac App Store e na Microsoft Store — o mesmo motor local nas duas. A 1.3.1 já está disponível.