static int load_project_file(GraceApp *gapp, const char *fn, int as_template) { GProject *gp; Quark *project, *gr, **graphs; int i, ngraphs; AMem *amem; if (gapp->gp && gproject_get_top(gapp->gp) && quark_dirtystate_get(gproject_get_top(gapp->gp)) && !yesno("Abandon unsaved changes?", NULL, NULL, NULL)) { return RETURN_FAILURE; } gproject_free(gapp->gp); gp = load_any_project(gapp, fn); if (!gp) { errmsg("Failed loading project file"); return RETURN_FAILURE; } project = gproject_get_top(gp); gapp->rt->print_file[0] = '\0'; gapp_set_project(gapp, gp); if (as_template) { grfile_free(gp->grf); gp->grf = NULL; } amem = quark_get_amem(project); /* Set undo limit of 16MB */ amem_set_undo_limit(amem, 0x1000000L); /* Get initial memory snapshot */ amem_snapshot(amem); /* try to switch to the first active graph */ ngraphs = project_get_graphs(project, &graphs); for (i = 0; i < ngraphs; i++) { gr = graphs[i]; if (select_graph(gr) == RETURN_SUCCESS) { break; } } xfree(graphs); #ifndef NONE_GUI select_quark_explorer(project); update_all(); #endif if (project) { return RETURN_SUCCESS; } else { return RETURN_FAILURE; } }
GProject *gproject_new(Quark *parent, const Grace *grace, int mmodel) { GProject *gp = xmalloc(sizeof(GProject)); if (gp) { memset(gp, 0, sizeof(GProject)); gp->q = project_new(parent, grace->qfactory, mmodel); if (!gp->q) { gproject_free(gp); return NULL; } } return gp; }
void gapp_free(GraceApp *gapp) { unsigned int i; if (!gapp) { return; } for (i = 0; i < gapp->gpcount; i++) { gproject_free(gapp->gplist[i]); } xfree(gapp->gplist); quark_free(gapp->pc); gui_free(gapp->gui); runtime_free(gapp->rt); grace_free(gapp->grace); xfree(gapp); }
int gapp_delete_gproject(GraceApp *gapp, GProject *gp) { unsigned int i, j = 0; GProject **p; GProject *gpr; if (!gapp || !gp) { return RETURN_FAILURE; } p = xmalloc((gapp->gpcount - 1)*sizeof(GProject)); if (!p) { return RETURN_FAILURE; } for (i = 0; i < gapp->gpcount; i++) { gpr = gapp->gplist[i]; if (gpr != gp) { p[j] = gpr; j++; } } xfree(gapp->gplist); gapp->gplist = p; gapp->gpcount--; if (gapp->gp == gp) { gapp->gp = NULL; } gproject_free(gp); return RETURN_SUCCESS; }