/*! \brief Copy data from gtksheet into TOPLEVEL struct * * Called when the user invokes "save". It first * places all data from gtksheet into SHEET_DATA. Then it * loops through all pages & calls s_toplevel_sheetdata_to_toplevel() * to place all * stuff in SHEET_DATA into the libgeda TOPLEVEL structure. */ void s_toplevel_gtksheet_to_toplevel(TOPLEVEL *toplevel) { GList *iter; PAGE *p_current; #if DEBUG printf("--------------------- Entering s_toplevel_gtksheet_to_toplevel -------------------\n"); #endif s_sheet_data_gtksheet_to_sheetdata(); /* read data from gtksheet into SHEET_DATA */ #if DEBUG printf("In s_toplevel_gtksheet_to_toplevel -- done writing stuff from gtksheet into SHEET_DATA.\n"); #endif /* must iterate over all pages in design */ for ( iter = geda_list_get_glist( toplevel->pages ); iter != NULL; iter = g_list_next( iter ) ) { p_current = (PAGE *)iter->data; s_toplevel_set_page_current (toplevel, p_current); /* only traverse pages which are toplevel */ if (p_current->page_control == 0) { s_toplevel_sheetdata_to_toplevel (toplevel, p_current); /* adds all objects from page */ } } #if DEBUG printf("In s_toplevel_gtksheet_to_toplevel -- done writing SHEEET_DATA text back into pr_currnet.\n"); #endif return; }
/*! \brief changes the current page in toplevel * \par Function Description * Changes the current page in \a toplevel to the page \a p_new. * * \param toplevel The TOPLEVEL object * \param p_new The PAGE to go to */ void s_page_goto (TOPLEVEL *toplevel, PAGE *p_new) { gchar *dirname; s_toplevel_set_page_current (toplevel, p_new); dirname = g_dirname (p_new->page_filename); if (chdir (dirname)) { /* An error occured with chdir */ #warning FIXME: What do we do? } g_free (dirname); }
/*! \brief Deletes the list of pages of <B>toplevel</B>. * \par Function Description * Deletes the list of pages of <B>toplevel</B>. * This function should only be called when you are finishing up. * * \param toplevel The TOPLEVEL object. */ void s_page_delete_list(TOPLEVEL *toplevel) { GList *list_copy, *iter; PAGE *page; /* s_page_delete removes items from the page list, so make a copy */ list_copy = g_list_copy (geda_list_get_glist (toplevel->pages)); for (iter = list_copy; iter != NULL; iter = g_list_next (iter)) { page = (PAGE *)iter->data; s_page_delete (toplevel, page); } g_list_free (list_copy); /* reset toplevel fields */ s_toplevel_set_page_current (toplevel, NULL); }
/*! \brief delete a page and it's contents * \par Function Description * Deletes a single page <B>page</B> from <B>toplevel</B>'s list of pages. * * See #s_page_delete_list() to delete all pages of a <B>toplevel</B> * * If the current page of toplevel is given as parameter <B>page</B>, * the function sets the field <B>page_current</B> of the TOPLEVEL * struct to NULL. */ void s_page_delete (TOPLEVEL *toplevel, PAGE *page) { PAGE *tmp; gchar *backup_filename; gchar *real_filename; /* We need to temporarily make the page being deleted current because * various functions called below (some indirectly) assume they are * deleting objects from the current page. * * These functions are known to include: * s_delete_object () */ /* save page_current and switch to page */ if (page == toplevel->page_current) { tmp = NULL; } else { tmp = toplevel->page_current; s_page_goto (toplevel, page); } /* Get the real filename and file permissions */ real_filename = follow_symlinks (page->page_filename, NULL); if (real_filename == NULL) { s_log_message (_("s_page_delete: Can't get the real filename of %s."), page->page_filename); } else { backup_filename = f_get_autosave_filename (real_filename); /* Delete the backup file */ if ( (g_file_test (backup_filename, G_FILE_TEST_EXISTS)) && (!g_file_test(backup_filename, G_FILE_TEST_IS_DIR)) ) { if (unlink(backup_filename) != 0) { s_log_message(_("s_page_delete: Unable to delete backup file %s."), backup_filename); } } g_free (backup_filename); } g_free(real_filename); /* Free the selection object */ g_object_unref( page->selection_list ); /* then delete objects of page */ s_page_delete_objects (toplevel, page); /* Free the objects in the place list. */ s_delete_object_glist (toplevel, page->place_list); page->place_list = NULL; /* This removes all objects from the list of connectible objects * of the given \a page. */ if (g_list_length (page->connectible_list) != 0) { fprintf (stderr, "OOPS! page->connectible_list had something in it when it was freed!\n"); fprintf (stderr, "Length: %d\n", g_list_length (page->connectible_list)); } g_list_free (page->connectible_list); page->connectible_list = NULL; /* free current page undo structs */ s_undo_free_all (toplevel, page); /* ouch, deal with parents going away and the children still around */ page->up = -2; g_free (page->page_filename); geda_list_remove( toplevel->pages, page ); s_weakref_notify (page, page->weak_refs); g_free (page); /* restore page_current */ if (tmp != NULL) { s_page_goto (toplevel, tmp); } else { /* page was page_current */ s_toplevel_set_page_current (toplevel, NULL); /* page_current must be updated by calling function */ } }