Perché le finestre impiccate sono deminimizable ma non minimizzabili?

-3

Vedo che ogni volta che un'app come Mac Chrome si blocca, l'app mostrerà uno spinner e smetterà di rispondere. Quindi questo è lo stesso comportamento di Windows, ma ho realizzato una stranezza per Mac:

Perché le finestre Mac impiccate possono ancora essere spostate e deminimate, ma non possono essere ridotte a icona o chiuse?

C'è un motivo tecnico / logica / spiegazione per questo strano comportamento?

    
posta Pacerier 22.01.2018 - 21:15
fonte

1 risposta

1

Non esiste una "legge" tecnica che richiede che tutto ciò sia in un modo o nell'altro, quindi tutto si riduce a come gli sviluppatori macOS hanno scelto di costruire il sistema. Pertanto qualsiasi motivazione o spiegazione può essere spiegata solo da quella fonte - qualsiasi altra cosa è la speculazione.

Tuttavia, cercherò di speculare perché macOS si comporta in questo modo!

Per capire la logica, è necessario capire come funzionano i programmi grafici macOS. Molto simile a Windows, ogni applicazione in esecuzione ha quello che viene definito un "ciclo di eventi".

In sostanza, le parti del sistema operativo responsabile della creazione dell'interfaccia utente grafica comunicano con ciascuna applicazione in esecuzione tramite l'invio di messaggi ("eventi") all'applicazione. Le applicazioni funzionano leggendo continuamente questi messaggi da una coda in quello che è noto come un ciclo di eventi.

I messaggi potrebbero essere cose come "L'utente ha spostato il mouse", "L'utente ha fatto clic sul pulsante X", "L'utente desidera chiudere la finestra Y" e così via.

Quando l'interfaccia grafica utente per un'applicazione in esecuzione si blocca e si ottiene lo spinner, ciò significa solo che l'applicazione ha interrotto l'elaborazione di questi eventi. Potrebbe aver smesso di farlo perché si è bloccato, è bloccato in un ciclo infinito o perché è molto impegnato a fare qualcos'altro (che potrebbe essere pienamente produttivo).

Il sistema operativo non ha davvero modo di dire se l'applicazione non risponde perché ha fallito, perché è impegnata a fare cose, o perché il computer è lento. L'unica euristica che hanno è quella di cronometrare - se è trascorso troppo tempo, mostriamo lo spinner.

Ora potresti obiettare che il sistema operativo potrebbe semplicemente chiudere il programma, ma potresti perdere dati preziosi. Se sai che il programma è impegnato a fare qualcosa per te, potresti aspettare qualche secondo o qualsiasi altra cosa - il programma sta tornando ad elaborare gli eventi, e puoi salvare i tuoi dati.

Questo è probabilmente il motivo per cui è lasciato all'utente decidere quando "abbastanza è abbastanza" e si desidera terminare il programma.

Ora questi eventi elaborati dal programma in termini moderni spesso vengono elaborati dai delegati. Per la tua domanda ruota attorno a NSWindowDelegate, che in pratica gestisce varie cose che possono accadere ad una finestra. Nota che una finestra non è l'applicazione su macOS - chiudendo la finestra si chiude solo quella finestra, non l'intero programma.

Se si guarda NSWindowDelegate:

link

scoprirai che i programmi possono rispondere a eventi come "windowWillMiniaturize" (ad esempio, l'utente ha richiesto che questa finestra sia ridotta a icona) e "windowShouldClose" (ad esempio, l'utente ha richiesto che questa finestra venga chiusa). Il programma potrebbe fare qualcosa di importante quando riceve questi eventi - qualcosa di importante che deve fare prima che sia effettivamente chiuso o minimizzato.

Ma cosa succede quando il programma non sta elaborando questi eventi? - Il sistema deve semplicemente bloccare queste operazioni per garantire che il programma abbia la possibilità di reagire agli eventi prima che le cose accadano. Pertanto, non è possibile ridurre a icona e chiudere le finestre mentre lo spinner è visibile.

Tuttavia, si noti che il delegato non contiene una "windowWillDeminiaturize" - solo "windowDidDeminiaturize". Pertanto macOS non deve stoppare la minimizzazione di una finestra, in quanto non ha l'obbligo di comunicare al programma prima di minimizzare una finestra. Deve solo dirlo dopo!

    
risposta data 25.01.2018 - 21:07
fonte

Leggi altre domande sui tag