diff options
Diffstat (limited to 'ui/gtk/uat_gui.c')
-rw-r--r-- | ui/gtk/uat_gui.c | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/ui/gtk/uat_gui.c b/ui/gtk/uat_gui.c index 038a5eb81e..9c39de68b8 100644 --- a/ui/gtk/uat_gui.c +++ b/ui/gtk/uat_gui.c @@ -114,6 +114,7 @@ struct _uat_dlg_data { GPtrArray *tobe_freed; }; +struct _uat_del *current_ud = NULL; static gboolean unsaved_dialog(GtkWindow *w, GdkEvent *e, gpointer u); static gboolean uat_window_delete_event_cb(GtkWindow *w, GdkEvent *e, gpointer u); @@ -549,39 +550,43 @@ struct _uat_del { gint idx; }; -static void uat_del_cb(GtkButton *button _U_, gpointer u) { - struct _uat_del *ud = (struct _uat_del *)u; +static void uat_del_cb(GtkButton *button _U_, gpointer u _U_) { GtkTreeIter iter; GtkTreePath *path; - uat_remove_record_idx(ud->uat, ud->idx); + g_assert(current_ud); - if (ud->uat->rep) { - path = gtk_tree_path_new_from_indices(ud->idx, -1); - if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(ud->uat->rep->list_store), &iter, path)) { - gtk_list_store_remove(ud->uat->rep->list_store, &iter); + uat_remove_record_idx(current_ud->uat, current_ud->idx); + + if (current_ud->uat->rep) { + path = gtk_tree_path_new_from_indices(current_ud->idx, -1); + if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(current_ud->uat->rep->list_store), &iter, path)) { + gtk_list_store_remove(current_ud->uat->rep->list_store, &iter); } } - ud->uat->changed = TRUE; - set_buttons(ud->uat, -1); + current_ud->uat->changed = TRUE; + set_buttons(current_ud->uat, -1); - window_destroy(GTK_WIDGET(ud->win)); + window_destroy(GTK_WIDGET(current_ud->win)); - if (ud->uat->rep) - window_present(GTK_WIDGET(ud->uat->rep->window)); + if (current_ud->uat->rep) + window_present(GTK_WIDGET(current_ud->uat->rep->window)); - g_free(ud); + g_free(current_ud); + current_ud = NULL; } -static void uat_cancel_del_cb(GtkButton *button _U_, gpointer u) { - struct _uat_del *ud = (struct _uat_del *)u; +static void uat_cancel_del_cb(GtkButton *button _U_, gpointer u _U_) { + + g_assert(current_ud); - window_destroy(GTK_WIDGET(ud->win)); + window_destroy(GTK_WIDGET(current_ud->win)); - if (ud->uat->rep) - window_present(GTK_WIDGET(ud->uat->rep->window)); - g_free(ud); + if (current_ud->uat->rep) + window_present(GTK_WIDGET(current_ud->uat->rep->window)); + g_free(current_ud); + current_ud = NULL; } static void uat_del_dlg(uat_t *uat, int idx) { @@ -589,11 +594,17 @@ static void uat_del_dlg(uat_t *uat, int idx) { uat_field_t *f = uat->fields; guint colnum; void *rec = UAT_INDEX_PTR(uat, idx); - struct _uat_del *ud = (struct _uat_del *)g_malloc(sizeof(struct _uat_del)); - ud->uat = uat; - ud->idx = idx; - ud->win = win = dlg_conf_window_new(ep_strdup_printf("%s: Confirm Delete", uat->name)); + /* we can only ever display one "confirm deletion" dialogue + at the same time */ + if (current_ud) { + window_destroy(GTK_WIDGET(current_ud->win)); + g_free(current_ud); + } + current_ud = (struct _uat_del *)g_malloc(sizeof(struct _uat_del)); + current_ud->uat = uat; + current_ud->idx = idx; + current_ud->win = win = dlg_conf_window_new(ep_strdup_printf("%s: Confirm Delete", uat->name)); gtk_window_set_resizable(GTK_WINDOW(win), FALSE); gtk_window_resize(GTK_WINDOW(win), 400, 25*(uat->ncols+2)); @@ -624,10 +635,10 @@ static void uat_del_dlg(uat_t *uat, int idx) { gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0); bt_ok = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_DELETE); - g_signal_connect(bt_ok, "clicked", G_CALLBACK(uat_del_cb), ud); + g_signal_connect(bt_ok, "clicked", G_CALLBACK(uat_del_cb), NULL); bt_cancel = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL); - g_signal_connect(bt_cancel, "clicked", G_CALLBACK(uat_cancel_del_cb), ud); + g_signal_connect(bt_cancel, "clicked", G_CALLBACK(uat_cancel_del_cb), NULL); window_set_cancel_button( win, bt_cancel, NULL); gtk_widget_show_all(win); |