intro: ----- Quando la sessione viene chiusa gedit deve comportarsi nel seguente modo: - offrire un confirm dialog analogo a quello di quit/close all - in caso di Annulla, annullare il session_shutdown - salvare tutti i file specificati nel dialog - lockkare la finestra in modo che non siano possibili ulteriori modifiche - aspettare che le operazioni di save vengano completate o falliscano (save async) - ripetere per ogni finestra - quando tutte le finestre sono confermate, serializzare a xml - chiudere le finestre e procedere con lo shutdown Notare che ci sono alcune sostanziali differenze rispetto al normale close all: - l'operazione riguarda tutte le finestre - le tabs non possono essere chiuse asap perche bisogna poi serializzare patch: ----- file-commands.c: fattorizza una funzione per salvare una lista di docs (che viene poi usata per il session save) e la usa per save_all. Si noti che dobbiamo rivedere alcune api perche abbiamo conflitti GList vs GSList, ad es il confirmation dialog ritorna una SList, mentre window_get_docs una List. session.c: (descrivo la patch dal fondo verso l'alto, visto che e' la call chain) interaction_function: a differenza di 2.12 la risposta ad una interaction function e' asincrona e viene data nella funzione finish_interaction. Qui inizano gia subito gli 'orrori': la interaction key che viene poi usata per emettere la risposta e' messa in una var globale. Ho assunto che non sia possibile avere piu di una interaction contemporaneamente. Inoltre il client passato come arg viene trascurato nella serializzazione vera e propria usiamo master_client (che comunque e' un singleton, quindi questo non dovrebbe essere un prob). In caso non si stia facendo uno shutdown si serializza e si risponde, altrimenti scatta il caso "complicato". save_all_docs_and_save_session: crea una lista di tutte le window che hanno doc non salvati (anche questa lista e' una global :/ ). Nel caso la lista sia vuota, finish_interaction, altrimenti si chiama session_close_all per ogni finestra che mostra il confirmation dialog. close_confirmation_dialog_response_handler: -> annulla: finish_interacion e cancella lo shutdown della sessione -> Don't save: rimuovi questa window dalla dirty list -> Save selected: si connette a state::notify della window per sapere quando e' chiudibile e procede a salvare i doc scelti usando close_discarded_and_save_the_rest. Noto ora che sono caduto nel solito errore :(( Tale funzione chiude le tab non selezionate che e' sbagliato perche' vengono omesse dalla serializzazione... window_state_change: ad ogni cambio di state controlla se la window puo essere tolta dalla dirty list. quando la dirty list e vuota si procede alla serializzazione. PROBLEMI: - assenza di locking dei doc per evitare ulteriori modifiche - cosa succede se una tab e' in printing etc? (in file-commands asseriamo che questo non puo succedere perche il button e' insensitive, ma il session shutdown puo avvenire sempre) - code duplication - globals