Blog · Producto

ImageForge 1.3.1: una ventana y una sola cola

El mismo síntoma en las dos plataformas —le pasas varias imágenes a la app y se abre vacía— resultó tener dos causas que no tienen nada que ver entre sí. Esto es lo que era cada una.

v1.3.1 · Mac + Windows

Un aviso de un usuario, dos sistemas operativos, dos causas raíz que no tienen nada en común. En el Mac, soltar cuatro imágenes en el icono del Dock abría cuatro ventanas y metía el lote en una de ellas. En Windows, «Abrir con ImageForge» abría la app con la lista vacía, por muchos archivos que le pasaras. La 1.3.1 arregla las dos, y cómo se rompía cada una merece contarse.

El Mac abría una ventana por imagen

Soltabas cuatro imágenes en el icono del Dock y aparecían cuatro ventanas, cada una con su lista vacía, compitiendo todas por recibir el lote. La causa no estaba en nuestro código: la ventana principal era un WindowGroup de SwiftUI, y un WindowGroup abre una ventana por documento cuando macOS entrega el Apple Event de apertura. La traza del sistema lo enseña sin ambigüedad: un único evento con cuatro archivos y, a continuación, cuatro ventanas creadas, todo antes de que nuestro código hubiera visto una sola ruta. El lote entraba en una de ellas y no había forma de controlar cuál quedaba delante, así que muchas veces parecía que la app se había abierto sin nada que comprimir, y volver a intentarlo solo añadía más ventanas vacías.

La solución no fue rodear el problema de código defensivo, sino declarar lo que la app siempre fue: una ventana con una sola cola. La escena es ahora un Window de SwiftUI, una instancia única que ni el Apple Event ni nada más puede duplicar. Por lo mismo, «Nueva ventana» desaparece del menú Archivo: si cierras la ventana, la recuperas con Ventana ▸ Ventana de ImageForge (⌘0), pulsando el icono del Dock o desde el icono de la barra de menús.

Windows ni siquiera leía los archivos

La app de Windows declaraba su asociación de tipos de archivo desde la primera versión, así que Windows ofrecía «Abrir con ImageForge» y aceptaba archivos soltados sobre su icono. Solo que nunca los leía: WinUI canaliza todas las activaciones por un único método de arranque, y el nuestro creaba la ventana y tiraba los argumentos. La asociación era decorativa: la app abría con la lista vacía tanto si le pasabas una imagen como veinte.

Arreglarlo destapó algo que habíamos supuesto mal. Para una app de escritorio empaquetada, la shell de Windows no entrega una selección como una sola activación: arranca un proceso por archivo, cada uno con una única ruta en su línea de comandos. Cuatro imágenes eran cuatro procesos. Así que el arreglo tiene dos mitades: leer las rutas de la línea de comandos y elegir un proceso principal al que los demás le pasan sus archivos antes de salir. El resultado es lo que cabía esperar desde el principio: una ventana y una sola cola, por muchos archivos que selecciones.

Dos fallos, una lección

Los dos fallos vivían en la frontera entre la app y el sistema operativo — la parte que no se puede cubrir con tests unitarios, porque la única forma de saber qué hace de verdad el sistema es verlo hacerlo. Los dos se encontraron leyendo trazas del sistema, no razonando sobre el código, y en ambos casos el código hacía exactamente lo que le habíamos dicho. La 1.3.1 ya está en la Mac App Store y en la Microsoft Store; como siempre, todo ocurre en tu equipo y nunca se sube nada.

Consigue ImageForge.

Gratis en la Mac App Store y en la Microsoft Store — el mismo motor local en las dos. La 1.3.1 ya está disponible.

Sigue leyendo