/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void x_window_close(GschemToplevel *w_current) { TOPLEVEL *toplevel = gschem_toplevel_get_toplevel (w_current); gboolean last_window = FALSE; /* If we're closing whilst inside an action, re-wind the * page contents back to their state before we started */ if (w_current->inside_action) { i_callback_cancel (w_current, 0, NULL); } /* last chance to save possible unsaved pages */ if (!x_dialog_close_window (w_current)) { /* user somehow cancelled the close */ return; } x_clipboard_finish (w_current); #if DEBUG o_conn_print_hash(w_current->page_current->conn_table); #endif w_current->dont_invalidate = TRUE; /* close all the dialog boxes */ if (w_current->sowindow) gtk_widget_destroy(w_current->sowindow); if (w_current->cswindow) gtk_widget_destroy(w_current->cswindow); if (w_current->tiwindow) gtk_widget_destroy(w_current->tiwindow); if (w_current->tewindow) gtk_widget_destroy(w_current->tewindow); if (w_current->aawindow) gtk_widget_destroy(w_current->aawindow); x_multiattrib_close (w_current); if (w_current->aewindow) gtk_widget_destroy(w_current->aewindow); if (w_current->trwindow) gtk_widget_destroy(w_current->trwindow); x_pagesel_close (w_current); if (w_current->sswindow) gtk_widget_destroy(w_current->sswindow); if (w_current->iwindow) gtk_widget_destroy(w_current->iwindow); if (w_current->hkwindow) gtk_widget_destroy(w_current->hkwindow); if (w_current->cowindow) gtk_widget_destroy(w_current->cowindow); if (w_current->sewindow) gtk_widget_destroy(w_current->sewindow); if (g_list_length (global_window_list) == 1) { /* no more window after this one, remember to quit */ last_window = TRUE; } if (toplevel->major_changed_refdes) { GList* current = toplevel->major_changed_refdes; while (current) { /* printf("yeah freeing: %s\n", (char*) current->data); */ g_free(current->data); current = g_list_next(current); } g_list_free(toplevel->major_changed_refdes); } /* stuff that has to be done before we free w_current */ if (last_window) { /* close the log file */ s_log_close (); /* free the buffers */ o_buffer_free (w_current); } x_window_free_gc(w_current); /* Clear Guile smob weak ref */ if (w_current->smob != SCM_UNDEFINED) { SCM_SET_SMOB_DATA (w_current->smob, NULL); w_current->smob = SCM_UNDEFINED; } /* finally close the main window */ gtk_widget_destroy(w_current->main_window); global_window_list = g_list_remove (global_window_list, w_current); gschem_toplevel_free (w_current); /* just closed last window, so quit */ if (last_window) { gschem_quit(); } }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void x_window_close(GSCHEM_TOPLEVEL *w_current) { TOPLEVEL *toplevel = w_current->toplevel; gboolean last_window = FALSE; /* If we're closing whilst inside a move action, re-wind the * page contents back to their state before we started */ if (w_current->inside_action && (w_current->event_state == MOVE || w_current->event_state == ENDMOVE)) { o_move_cancel (w_current); } /* last chance to save possible unsaved pages */ if (!x_dialog_close_window (w_current)) { /* user somehow cancelled the close */ return; } x_clipboard_finish (w_current); #if DEBUG o_conn_print_hash(w_current->page_current->conn_table); #endif /* close all the dialog boxes */ if (w_current->sowindow) gtk_widget_destroy(w_current->sowindow); if (w_current->cswindow) gtk_widget_destroy(w_current->cswindow); if (w_current->tiwindow) gtk_widget_destroy(w_current->tiwindow); if (w_current->tewindow) gtk_widget_destroy(w_current->tewindow); if (w_current->aawindow) gtk_widget_destroy(w_current->aawindow); x_multiattrib_close (w_current); if (w_current->aewindow) gtk_widget_destroy(w_current->aewindow); if (w_current->trwindow) gtk_widget_destroy(w_current->trwindow); x_pagesel_close (w_current); if (w_current->tswindow) gtk_widget_destroy(w_current->tswindow); if (w_current->iwindow) gtk_widget_destroy(w_current->iwindow); if (w_current->hkwindow) gtk_widget_destroy(w_current->hkwindow); if (w_current->cowindow) gtk_widget_destroy(w_current->cowindow); if (w_current->clwindow) gtk_widget_destroy(w_current->clwindow); if (w_current->sewindow) gtk_widget_destroy(w_current->sewindow); if (g_list_length (global_window_list) == 1) { /* no more window after this one, remember to quit */ last_window = TRUE; } if (toplevel->major_changed_refdes) { GList* current = toplevel->major_changed_refdes; while (current) { /* printf("yeah freeing: %s\n", (char*) current->data); */ g_free(current->data); current = g_list_next(current); } g_list_free(toplevel->major_changed_refdes); } /* stuff that has to be done before we free w_current */ if (last_window) { /* close the log file */ s_log_close (); /* free the buffers */ o_buffer_free (w_current); } x_window_free_gc(w_current); /* finally close the main window */ gtk_widget_destroy(w_current->main_window); s_toplevel_delete (toplevel); global_window_list = g_list_remove (global_window_list, w_current); g_free (w_current); /* just closed last window, so quit */ if (last_window) { gschem_quit(); } }