X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-data-window.c;h=ad967b3256c7578860236c8eed1e79cf9d2bbf1f;hb=a0bac37037e42c7c9b90cb702866b297dbcab79e;hp=8ef17fae00f8340c9d405c6ca0c164f25eb4c3fe;hpb=0fe886a656b0ee57b4d542b7c16b3c56288b6fc6;p=pspp diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index 8ef17fae00..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; @@ -201,13 +203,11 @@ on_filter_change (GObject *o, gint filter_index, gpointer data) } else { - PsppireVarStore *vs = NULL; PsppireDict *dict = NULL; struct variable *var ; gchar *text ; - g_object_get (de->data_editor, "var-store", &vs, NULL); - g_object_get (vs, "dictionary", &dict, NULL); + g_object_get (de->data_editor, "dictionary", &dict, NULL); var = psppire_dict_get_variable (dict, filter_index); @@ -274,12 +274,10 @@ on_weight_change (GObject *o, gint weight_index, gpointer data) else { struct variable *var ; - PsppireVarStore *vs = NULL; PsppireDict *dict = NULL; gchar *text; - g_object_get (de->data_editor, "var-store", &vs, NULL); - g_object_get (vs, "dictionary", &dict, NULL); + g_object_get (de->data_editor, "dictionary", &dict, NULL); var = psppire_dict_get_variable (dict, weight_index); @@ -868,8 +866,6 @@ psppire_data_window_finish_init (PsppireDataWindow *de, transformation_change_callback, /* transformations_changed */ }; - PsppireDict *dict; - GtkWidget *menubar; GtkWidget *hb ; GtkWidget *sb ; @@ -877,9 +873,8 @@ psppire_data_window_finish_init (PsppireDataWindow *de, GtkWidget *box = gtk_vbox_new (FALSE, 0); de->dataset = ds; - dict = psppire_dict_new_from_dict (dataset_dict (ds)); - de->var_store = psppire_var_store_new (dict); - de->data_store = psppire_data_store_new (dict); + de->dict = psppire_dict_new_from_dict (dataset_dict (ds)); + de->data_store = psppire_data_store_new (de->dict); psppire_data_store_set_reader (de->data_store, NULL); menubar = get_widget_assert (de->builder, "menubar"); @@ -890,8 +885,7 @@ psppire_data_window_finish_init (PsppireDataWindow *de, de->merge_id = 0; de->data_editor = - PSPPIRE_DATA_EDITOR (psppire_data_editor_new (de->var_store, - de->data_store)); + PSPPIRE_DATA_EDITOR (psppire_data_editor_new (de->dict, de->data_store)); g_signal_connect (de->data_editor, "switch-page", G_CALLBACK (on_switch_page), de); @@ -915,15 +909,15 @@ psppire_data_window_finish_init (PsppireDataWindow *de, gtk_container_add (GTK_CONTAINER (de), box); - g_signal_connect (dict, "weight-changed", + g_signal_connect (de->dict, "weight-changed", G_CALLBACK (on_weight_change), de); - g_signal_connect (dict, "filter-changed", + g_signal_connect (de->dict, "filter-changed", G_CALLBACK (on_filter_change), de); - g_signal_connect (dict, "split-changed", + g_signal_connect (de->dict, "split-changed", G_CALLBACK (on_split_change), de); @@ -1061,16 +1055,23 @@ 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); dw->builder = NULL; } - if (dw->var_store) + if (dw->dict) { - g_object_unref (dw->var_store); - dw->var_store = NULL; + g_object_unref (dw->dict); + dw->dict = NULL; } if (dw->data_store) @@ -1089,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, @@ -1184,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* @@ -1202,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); } @@ -1227,7 +1240,7 @@ psppire_data_window_new (struct dataset *ds) bool psppire_data_window_is_empty (PsppireDataWindow *dw) { - return psppire_var_store_get_var_cnt (dw->var_store) == 0; + return psppire_dict_get_var_cnt (dw->dict) == 0; } static void