X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire-data-window.c;h=ad967b3256c7578860236c8eed1e79cf9d2bbf1f;hb=refs%2Fbuilds%2F20121121031958%2Fpspp;hp=3d9774579adead051376234fe0d4d5b63d426954;hpb=d4ae90b2fe74d2d1427afad35d32c9e5584211ed;p=pspp diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index 3d9774579a..ad967b3256 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -78,6 +78,7 @@ static void psppire_data_window_init (PsppireDataWindow *data_edit static void psppire_data_window_iface_init (PsppireWindowIface *iface); static void psppire_data_window_dispose (GObject *object); +static void psppire_data_window_finalize (GObject *object); static void psppire_data_window_set_property (GObject *object, guint prop_id, const GValue *value, @@ -145,6 +146,7 @@ psppire_data_window_class_init (PsppireDataWindowClass *class) parent_class = g_type_class_peek_parent (class); object_class->dispose = psppire_data_window_dispose; + object_class->finalize = psppire_data_window_finalize; object_class->set_property = psppire_data_window_set_property; object_class->get_property = psppire_data_window_get_property; @@ -1053,6 +1055,13 @@ psppire_data_window_dispose (GObject *object) { PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (object); + if (dw->uim) + { + psppire_data_window_remove_ui (dw, dw->uim, dw->merge_id); + g_object_unref (dw->uim); + dw->uim = NULL; + } + if (dw->builder != NULL) { g_object_unref (dw->builder); @@ -1081,6 +1090,27 @@ psppire_data_window_dispose (GObject *object) G_OBJECT_CLASS (parent_class)->dispose (object); } +static void +psppire_data_window_finalize (GObject *object) +{ + PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (object); + + if (dw->dataset) + { + struct dataset *dataset = dw->dataset; + struct session *session = dataset_session (dataset); + + dw->dataset = NULL; + + dataset_set_callbacks (dataset, NULL, NULL); + session_set_active_dataset (session, NULL); + dataset_destroy (dataset); + } + + if (G_OBJECT_CLASS (parent_class)->finalize) + G_OBJECT_CLASS (parent_class)->finalize (object); +} + static void psppire_data_window_set_property (GObject *object, guint prop_id, @@ -1176,12 +1206,6 @@ psppire_data_window_remove_ui (PsppireDataWindow *pdw, gtk_window_remove_accel_group (GTK_WINDOW (pdw), gtk_ui_manager_get_accel_group (uim)); - - /* Our caller unrefs 'uim', possibly causing 'uim' to be freed. The - following call appears to be necessary to ensure that pdw->ui_manager - drops all references to 'uim'. Otherwise, I get valgrind complaints about - access to freed memory (and segfaults) on e.g. Windows|Split View. */ - gtk_ui_manager_ensure_update (pdw->ui_manager); } GtkWidget* @@ -1194,10 +1218,7 @@ psppire_data_window_new (struct dataset *ds) if (ds == NULL) { - static int n_datasets; - char *dataset_name; - - dataset_name = xasprintf ("DataSet%d", ++n_datasets); + char *dataset_name = session_generate_dataset_name (the_session); ds = dataset_create (the_session, dataset_name); free (dataset_name); }