/** We might just have change the diagrams modified status. * This doesn't set the status, but merely updates the display. */ void diagram_modified(Diagram *dia) { GSList *displays; gchar *dia_name = diagram_get_name(dia); gchar *extra = g_path_get_dirname (dia->filename); gchar *title = g_strdup_printf ("%s%s (%s)", diagram_is_modified(dia) ? "*" : "", dia_name, extra ? extra : " "); g_free (dia_name); g_free (extra); displays = dia->displays; while (displays!=NULL) { DDisplay *ddisp = (DDisplay *) displays->data; ddisplay_set_title(ddisp, title); displays = g_slist_next(displays); } if (diagram_is_modified(dia)) { dia->autosaved = FALSE; dia->is_default = FALSE; } /* diagram_set_modified(dia, TRUE);*/ g_free (title); }
void ddisplay_close(DDisplay *ddisp) { Diagram *dia; GtkWidget *dialog, *button; gchar *fname; g_return_if_fail(ddisp != NULL); dia = ddisp->diagram; if ( (g_slist_length(dia->displays) > 1) || (!diagram_is_modified(dia)) ) { ddisp_destroy(ddisp); return; } fname = dia->filename; if (!fname) fname = _("<unnamed>"); dialog = gtk_message_dialog_new(GTK_WINDOW (ddisp->shell), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, /* no standard buttons */ _("Closing diagram without saving")); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), _("The diagram '%s'\n" "has not been saved. Save changes now?"), fname); gtk_window_set_title (GTK_WINDOW(dialog), _("Close Diagram")); button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); button = gtk_button_new_with_mnemonic (_("_Discard Changes")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_NO); /* button = gtk_button_new_with_label (_("Save and Close")); */ button = gtk_button_new_from_stock (GTK_STOCK_SAVE); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_YES); #if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); #else GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); #endif gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_YES); g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK(are_you_sure_close_dialog_respond), ddisp); gtk_widget_show_all(dialog); }
int diagram_modified_exists(void) { GList *list; Diagram *dia; list = open_diagrams; while (list != NULL) { dia = (Diagram *) list->data; if (diagram_is_modified(dia)) return TRUE; list = g_list_next(list); } return FALSE; }
static PyObject * PyDiaDiagram_GetAttr(PyDiaDiagram *self, gchar *attr) { if (!strcmp(attr, "__members__")) return Py_BuildValue("[sssss]", "data", "displays", "filename", "modified", "selected", "unsaved"); else if (!strcmp(attr, "data")) return PyDiaDiagramData_New (self->dia->data); else if (!strcmp(attr, "filename")) return PyString_FromString(self->dia->filename); else if (!strcmp(attr, "unsaved")) return PyInt_FromLong(self->dia->unsaved); else if (!strcmp(attr, "modified")) return PyInt_FromLong(diagram_is_modified(self->dia)); else if (!strcmp(attr, "selected")) { guint i, len = g_list_length (self->dia->data->selected); PyObject *ret = PyTuple_New(len); GList *tmp; for (i = 0, tmp = self->dia->data->selected; tmp; i++, tmp = tmp->next) PyTuple_SetItem(ret, i, PyDiaObject_New((DiaObject *)tmp->data)); return ret; } else if (!strcmp(attr, "displays")) { PyObject *ret; GSList *tmp; gint i; ret = PyTuple_New(g_slist_length(self->dia->displays)); for (i = 0, tmp = self->dia->displays; tmp; i++, tmp = tmp->next) PyTuple_SetItem(ret, i, PyDiaDisplay_New((DDisplay *)tmp->data)); return ret; } return Py_FindMethod(PyDiaDiagram_Methods, (PyObject *)self, attr); }
gboolean app_exit(void) { GList *list; GSList *slist; /* * The following "solves" a crash related to a second call of app_exit, * after gtk_main_quit was called. It may be a win32 gtk-1.3.x bug only * but the check shouldn't hurt on *ix either. --hb */ static gboolean app_exit_once = FALSE; if (app_exit_once) { g_error(_("This shouldn't happen. Please file a bug report at bugzilla.gnome.org\n" "describing how you caused this message to appear.\n")); return FALSE; } if (diagram_modified_exists()) { if (is_integrated_ui ()) { GtkWidget *dialog; int result; exit_dialog_item_array_t *items = NULL; GList * list; Diagram * diagram; dialog = exit_dialog_make (GTK_WINDOW (interface_get_toolbox_shell ()), _("Exiting Dia")); list = dia_open_diagrams(); while (list) { diagram = list->data; if (diagram_is_modified (diagram)) { const gchar * name = diagram_get_name (diagram); const gchar * path = diagram->filename; exit_dialog_add_item (dialog, name, path, diagram); } list = g_list_next (list); } result = exit_dialog_run (dialog, &items); gtk_widget_destroy (dialog); if (result == EXIT_DIALOG_EXIT_CANCEL) { return FALSE; } else if (result == EXIT_DIALOG_EXIT_SAVE_SELECTED) { DiaContext *ctx = dia_context_new(_("Save")); int i; for (i = 0 ; i < items->array_size ; i++) { gchar *filename; diagram = items->array[i].data; filename = g_filename_from_utf8 (diagram->filename, -1, NULL, NULL, NULL); diagram_update_extents (diagram); dia_context_set_filename (ctx, filename); if (!diagram_save (diagram, filename, ctx)) { exit_dialog_free_items (items); dia_context_release (ctx); return FALSE; } else { dia_context_reset (ctx); } g_free (filename); } dia_context_release (ctx); exit_dialog_free_items (items); } else if (result == EXIT_DIALOG_EXIT_NO_SAVE) { list = dia_open_diagrams(); while (list) { diagram = list->data; /* slight hack: don't ask again */ diagram_set_modified (diagram, FALSE); undo_clear(diagram->undo); list = g_list_next (list); } } } else { GtkWidget *dialog; GtkWidget *button; dialog = gtk_message_dialog_new( NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, /* no standard buttons */ _("Quitting without saving modified diagrams")); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), _("Modified diagrams exist. " "Are you sure you want to quit Dia " "without saving them?")); gtk_window_set_title (GTK_WINDOW(dialog), _("Quit Dia")); button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); #if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); #else GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); #endif gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); button = gtk_button_new_from_stock (GTK_STOCK_QUIT); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_OK); gtk_widget_show_all (dialog); if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { gtk_widget_destroy(dialog); return FALSE; } gtk_widget_destroy(dialog); } } prefs_save(); persistence_save(); dynobj_refresh_finish(); { DiaContext *ctx = dia_context_new (_("Exit")); dia_object_defaults_save (NULL, ctx); dia_context_release (ctx); } /* Free loads of stuff (toolbox) */ list = dia_open_diagrams(); while (list!=NULL) { Diagram *dia = (Diagram *)list->data; list = g_list_next(list); slist = dia->displays; while (slist!=NULL) { DDisplay *ddisp = (DDisplay *)slist->data; slist = g_slist_next(slist); gtk_widget_destroy(ddisp->shell); } /* The diagram is freed when the last display is destroyed */ } /* save pluginrc */ if (dia_is_interactive) dia_pluginrc_write(); gtk_main_quit(); /* This printf seems to prevent a race condition with unrefs. */ /* Yuck. -Lars */ /* Trying to live without it. -Lars 10/8/07*/ /* g_print(_("Thank you for using Dia.\n")); */ app_exit_once = TRUE; return TRUE; }