No hay una "ley" técnica que requiera que todo esto sea de una manera u otra, por lo que todo se reduce a cómo los desarrolladores de macOS eligieron construir el sistema. Por lo tanto, cualquier explicación o explicación solo puede explicarse por esa fuente, todo lo demás es especulación.
¡Sin embargo, trataré de especular por qué macOS se comporta de esta manera!
Para comprender la lógica, debe comprender cómo funcionan los programas gráficos de macOS. Muy similar a Windows, cada aplicación en ejecución tiene lo que se llama un "bucle de eventos".
Básicamente, las partes del sistema operativo responsables de crear la interfaz gráfica de usuario se comunican con cada aplicación en ejecución mediante el envío de mensajes ("eventos") a la aplicación. Las aplicaciones funcionan al leer continuamente estos mensajes de una cola en lo que se conoce como un bucle de eventos.
Los mensajes pueden ser cosas como "El usuario movió el mouse", "El usuario hizo clic en el botón X", "El usuario desea cerrar la ventana Y", etc. ".
Cuando la interfaz gráfica de usuario para una aplicación en ejecución se cuelga y usted obtiene el control de giro, esto solo significa que la aplicación ha dejado de procesar estos eventos. Puede que haya dejado de hacerlo porque se ha estrellado, se ha quedado atascado en un bucle infinito o porque está realmente ocupado haciendo otra cosa (que podría ser completamente productivo).
El sistema operativo realmente no tiene forma de saber si la aplicación no responde porque ha fallado, porque está ocupado haciendo cosas o porque la computadora está lenta. La única heurística que tienen es cronometrarlo: si ha pasado demasiado tiempo, mostramos el girador.
Ahora podría argumentar que el sistema operativo podría simplemente cerrar el programa, pero podría perder datos valiosos. Si sabe que el programa está ocupado haciendo algo por usted, puede esperar unos segundos o lo que sea, el programa está procesando eventos y puede guardar sus datos.
Probablemente sea por eso que el usuario debe decidir cuándo "ya es suficiente" y desea finalizar el programa.
Ahora estos eventos que son procesados por programa en términos modernos a menudo serán procesados por los delegados. Para su pregunta, gira en torno al NSWindowDelegate, que básicamente maneja varias cosas que pueden suceder en una ventana. Tenga en cuenta que una ventana no es la aplicación en macOS; cerrar la ventana solo cierra esa ventana, no todo el programa.
Si nos fijamos en NSWindowDelegate:
enlace
encontrará que los programas pueden responder a eventos como "windowWillMiniaturize" (es decir, el usuario ha solicitado que esta ventana debería minimizar) y "windowShouldClose" (es decir, el usuario ha solicitado que esta ventana se cierre). El programa puede hacer algo importante cuando recibe estos eventos, algo importante que debe hacer antes de que se cierre o minimice.
¿Pero qué sucede cuando el programa no está procesando estos eventos? - El sistema simplemente tiene que detener estas operaciones para garantizar que el programa tenga la oportunidad de reaccionar a los eventos antes de que sucedan las cosas. Por lo tanto, no puede minimizar y cerrar ventanas mientras el girador está visible.
Sin embargo, tenga en cuenta que el delegado no contiene un "windowWillDeminiaturize" - solo "windowDidDeminiaturize". Por lo tanto, macOS no tiene que detener la minimización de una ventana, ya que no tiene la obligación de indicar al programa antes de minimizar la ventana. ¡Sólo hay que decirlo después!