From 044bfd7d985c152a4d2350f3d7d51f8302ec49c9 Mon Sep 17 00:00:00 2001 From: Alan F Date: Mon, 3 Feb 2014 15:32:34 +0000 Subject: GTK seems to be destroyingt and recreating columns in some circumstances (I don't think it used to do this), which means binding it as an argument on a button signal causes a crash. Workaround by searching for the column by title. --- src/trg-tree-view.c | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 1be9dad..7585180 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -332,18 +332,12 @@ view_popup_menu(GtkButton * button, GdkEventButton * event, TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); GtkWidget *menu, *menuitem; trg_column_description *desc; + guint n_showing = 0; GList *li; menu = gtk_menu_new(); desc = g_object_get_data(G_OBJECT(column), GDATA_KEY_COLUMN_DESC); - menuitem = gtk_check_menu_item_new_with_label(desc->header); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); - g_signal_connect(menuitem, "activate", - G_CALLBACK(trg_tree_view_hide_column), column); - gtk_widget_set_sensitive(menuitem, - !(desc->flags & TRG_COLUMN_UNREMOVABLE)); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); for (li = priv->columns; li; li = g_list_next(li)) { trg_column_description *desc = (trg_column_description *) li->data; @@ -354,8 +348,19 @@ view_popup_menu(GtkButton * button, GdkEventButton * event, G_CALLBACK(trg_tree_view_user_add_column_cb), desc); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } else { + n_showing++; } } + + menuitem = gtk_check_menu_item_new_with_label(desc->header); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); + g_signal_connect(menuitem, "activate", + G_CALLBACK(trg_tree_view_hide_column), column); + gtk_widget_set_sensitive(menuitem, + !(desc->flags & TRG_COLUMN_UNREMOVABLE) && n_showing > 1); + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, @@ -363,12 +368,28 @@ view_popup_menu(GtkButton * button, GdkEventButton * event, gdk_event_get_time((GdkEvent *) event)); } +/* This used to get the column as an argument binded when the signal was + * created, but it seems GTK now destroys and recreates them in some + * circumstances. So bind the column description instead and search for the + * column by its title. + */ static gboolean col_onButtonPressed(GtkButton * button, - GdkEventButton * event, GtkTreeViewColumn * col) + GdkEventButton * event, trg_column_description *desc) { if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - view_popup_menu(button, event, col); + GtkTreeView *gtv = GTK_TREE_VIEW(gtk_widget_get_parent(GTK_WIDGET(button))); + GList *cols = gtk_tree_view_get_columns(gtv); + GList *li; + for (li = cols; li; li = g_list_next(li)) { + GtkTreeViewColumn *col = GTK_TREE_VIEW_COLUMN(li->data); + if (!g_strcmp0(desc->header, gtk_tree_view_column_get_title(col))) { + view_popup_menu(button, event, col); + break; + } + } + g_list_free(cols); + return TRUE; } @@ -564,11 +585,11 @@ trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_move_column_after(GTK_TREE_VIEW(tv), column, after_col); - column_button = gtk_tree_view_column_get_button(column); + column_button = GTK_BUTTON(gtk_tree_view_column_get_button(column)); g_signal_connect(column_button, "button-press-event", G_CALLBACK(col_onButtonPressed), - column); + desc); if (desc->out) *(desc->out) = column; -- cgit v1.2.3