# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1066285559 0 # Node ID 1cb1b87bbd30039ce7c5c201f6b3976ff6b91440 # Parent 89b1b40d7e124604b52d55ae93139fa93b7333ff Fixes for the Unix file browser... seems to have revealed a problem in dw_tree_delete(). Deleting the temporary tree item on GTK 1.x seems to cause the subtree it sits on to become corrupt. I will look into this more but I just spent about 8 hours looking for the bug with no luck. So deleting of the item is currently disabled for GTK 1.x. diff -r 89b1b40d7e12 -r 1cb1b87bbd30 gtk/dw.c --- a/gtk/dw.c Wed Oct 15 21:31:14 2003 +0000 +++ b/gtk/dw.c Thu Oct 16 06:25:59 2003 +0000 @@ -74,7 +74,7 @@ GtkWidget *last_window = NULL, *popup = NULL; -static int _dw_file_active = 0, _dw_ignore_click = 0; +static int _dw_file_active = 0, _dw_ignore_click = 0, _dw_ignore_expand = 0; static pthread_t _dw_thread = (pthread_t)-1; static int _dw_mutex_locked[DW_THREAD_LIMIT]; /* Use default border size for the default enlightenment theme */ @@ -601,7 +601,7 @@ SignalHandler work = _get_signal_handler((GtkWidget *)widget, data); int retval = FALSE; - if(work.window) + if(!_dw_ignore_expand && work.window) { int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func; retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data); @@ -638,7 +638,7 @@ SignalHandler work = _get_signal_handler((GtkWidget *)treeitem, data); int retval = FALSE; - if(work.window) + if(!_dw_ignore_expand && work.window) { int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func; retval = treeexpandfunc(work.window, (HTREEITEM)treeitem, work.data); @@ -3985,10 +3985,24 @@ gtk_widget_show(label); gtk_widget_show(hbox); + { + void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_func"); + void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_data"); + SignalHandler work = _get_signal_handler(tree, mydata); + + if(thisfunc && work.window) + { + int sigid = _set_signal_handler(newitem, work.window, work.func, work.data, thisfunc); + gint cid =gtk_signal_connect(GTK_OBJECT(newitem), "expand", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid); + _set_signal_handler_id(newitem, sigid, cid); + } + } + + _dw_ignore_expand = 1; if(parent) { subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); - if(!subtree) + if(!subtree || !GTK_IS_TREE(subtree)) { void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func"); void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data"); @@ -4018,6 +4032,7 @@ gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); + gtk_object_set_data(GTK_OBJECT(subtree), "_dw_parentitem", (gpointer)parent); gtk_tree_item_collapse(GTK_TREE_ITEM(parent)); gtk_widget_show(subtree); gtk_tree_item_expand(GTK_TREE_ITEM(parent)); @@ -4034,6 +4049,7 @@ gtk_tree_item_expand(GTK_TREE_ITEM(newitem)); gtk_tree_item_collapse(GTK_TREE_ITEM(newitem)); gtk_widget_show(newitem); + _dw_ignore_expand = 0; DW_MUTEX_UNLOCK; return (HTREEITEM)newitem; #endif @@ -4071,7 +4087,7 @@ pixbuf = _find_pixbuf(icon); gtk_tree_store_append (store, iter, (GtkTreeIter *)parent); - gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, 4, NULL, -1); + gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, 4, parent, -1); if(pixbuf && !(icon & (1 << 31))) g_object_unref(pixbuf); retval = (HTREEITEM)iter; @@ -4100,6 +4116,7 @@ gtk_object_set_data(GTK_OBJECT(item), "_dw_text", (gpointer)strdup(title)); gtk_object_set_data(GTK_OBJECT(item), "_dw_itemdata", (gpointer)itemdata); gtk_object_set_data(GTK_OBJECT(item), "_dw_tree", (gpointer)tree); + gtk_object_set_data(GTK_OBJECT(item), "_dw_parent", (gpointer)parent); hbox = gtk_hbox_new(FALSE, 2); gtk_object_set_data(GTK_OBJECT(item), "_dw_hbox", (gpointer)hbox); gdkpix = _find_pixmap(&gdkbmp, icon, hbox, NULL, NULL); @@ -4114,10 +4131,24 @@ gtk_widget_show(label); gtk_widget_show(hbox); + { + void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_func"); + void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_data"); + SignalHandler work = _get_signal_handler(tree, mydata); + + if(thisfunc && work.window) + { + int sigid = _set_signal_handler(item, work.window, work.func, work.data, thisfunc); + gint cid =gtk_signal_connect(GTK_OBJECT(item), "expand", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid); + _set_signal_handler_id(item, sigid, cid); + } + } + + _dw_ignore_expand = 1; if(parent) { subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); - if(!subtree) + if(!subtree || !GTK_IS_TREE(subtree)) { void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func"); void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data"); @@ -4147,6 +4178,7 @@ gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); + gtk_object_set_data(GTK_OBJECT(subtree), "_dw_parentitem", (gpointer)parent); gtk_tree_item_collapse(GTK_TREE_ITEM(parent)); gtk_widget_show(subtree); gtk_tree_item_expand(GTK_TREE_ITEM(parent)); @@ -4163,6 +4195,7 @@ gtk_tree_item_expand(GTK_TREE_ITEM(item)); gtk_tree_item_collapse(GTK_TREE_ITEM(item)); gtk_widget_show(item); + _dw_ignore_expand = 0; DW_MUTEX_UNLOCK; return (HTREEITEM)item; #endif @@ -4516,8 +4549,10 @@ return; DW_MUTEX_LOCK; + _dw_ignore_expand = 1; if(GTK_IS_TREE_ITEM(item)) gtk_tree_item_expand(GTK_TREE_ITEM(item)); + _dw_ignore_expand = 0; DW_MUTEX_UNLOCK; #endif } @@ -7863,10 +7898,18 @@ char *folder = _tree_folder(tree, item); dw_tree_set_data(tree, item, 0); +#if GTK_MAJOR_VERSION > 1 + /* FIXME: GTK 1.x tree control goes crazy when + * I delete the temporary item. The subtree + * it sits on ceases to be valid and attempts + * to delete or recreate it fail horribly. + */ dw_tree_delete(tree, tempitem); +#endif if(*folder) _populate_directory(tree, item, folder); + free(folder); } @@ -8279,6 +8322,17 @@ } thisname = "select-child"; } + else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0) + { + if(thisfunc) + { + sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc); + gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_tree_expand_func", (gpointer)thisfunc); + gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_tree_expand_data", (gpointer)sigid); + } + DW_MUTEX_UNLOCK; + return; + } #endif else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) {