+static gboolean
+on_delete (PsppireWindow *w, GdkEvent *event, gpointer user_data)
+{
+ PsppireWindowRegister *reg = psppire_window_register_new ();
+
+ const gchar *base = G_OBJECT_TYPE_NAME (w);
+
+ PsppireConf *conf = psppire_conf_new ();
+
+ psppire_conf_save_window_geometry (conf, base, GTK_WINDOW (w));
+
+
+ if ( w->dirty )
+ {
+ gint response = psppire_window_query_save (w);
+
+ switch (response)
+ {
+ default:
+ case GTK_RESPONSE_CANCEL:
+ return TRUE;
+ break;
+ case GTK_RESPONSE_APPLY:
+ psppire_window_save (w);
+ if (w->dirty)
+ {
+ /* Save failed, or user exited Save As dialog with Cancel. */
+ return TRUE;
+ }
+ break;
+ case GTK_RESPONSE_REJECT:
+ break;
+ }
+ }
+
+ if ( 1 == psppire_window_register_n_items (reg))
+ gtk_main_quit ();
+
+ return FALSE;
+}
+
+
+static void
+psppire_window_init (PsppireWindow *window)
+{
+ window->menu = NULL;
+ window->filename = NULL;
+ window->basename = NULL;
+ window->id = NULL;
+ window->description = NULL;
+ window->list_name = NULL;
+
+ window->menuitem_table = g_hash_table_new (g_str_hash, g_str_equal);
+
+
+ g_signal_connect (window, "realize", G_CALLBACK (insert_existing_items), NULL);
+
+ window->insert_handler = g_signal_connect (psppire_window_register_new (),
+ "inserted",
+ G_CALLBACK (insert_menuitem),
+ window);
+
+ window->remove_handler = g_signal_connect (psppire_window_register_new (),
+ "removed",
+ G_CALLBACK (remove_menuitem),
+ window);
+
+ window->dirty = FALSE;
+
+ g_signal_connect_swapped (window, "delete-event", G_CALLBACK (on_delete), window);
+
+ g_object_set (window, "icon-name", "pspp", NULL);
+
+ g_signal_connect (window, "realize",
+ G_CALLBACK (on_realize), window);
+}
+
+/*
+ Ask the user if the buffer should be saved.
+ Return the response.
+*/
+gint
+psppire_window_query_save (PsppireWindow *se)
+{
+ gint response;
+ GtkWidget *dialog;
+ GtkWidget *cancel_button;
+
+ gchar *description;
+
+ GTimeVal time;
+
+ g_get_current_time (&time);
+
+ if (se->filename)
+ description = g_filename_display_basename (se->filename);
+ else if (se->id)
+ description = g_strdup (se->id);
+ else
+ description = g_strdup (se->description);
+ dialog =
+ gtk_message_dialog_new (GTK_WINDOW (se),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_WARNING,
+ GTK_BUTTONS_NONE,
+ _("Save the changes to `%s' before closing?"),
+ description);
+ g_free (description);
+
+ g_object_set (dialog, "icon-name", "pspp", NULL);
+
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("If you don't save, changes from the last %ld seconds will be permanently lost."),
+ time.tv_sec - se->savetime.tv_sec);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ _("Close _without saving"),
+ GTK_RESPONSE_REJECT);
+
+ cancel_button = gtk_dialog_add_button (GTK_DIALOG (dialog),
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_APPLY);
+
+ gtk_widget_grab_focus (cancel_button);
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ gtk_widget_destroy (dialog);
+
+ return response;
+}
+
+
+/* The return value is encoded in the glib filename encoding. */