comparison gtk/dw.c @ 483:1cb1b87bbd30

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.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 16 Oct 2003 06:25:59 +0000
parents 89b1b40d7e12
children f18c70cb3e38
comparison
equal deleted inserted replaced
482:89b1b40d7e12 483:1cb1b87bbd30
72 GdkColor _background[DW_THREAD_LIMIT]; 72 GdkColor _background[DW_THREAD_LIMIT];
73 int _transparent[DW_THREAD_LIMIT]; 73 int _transparent[DW_THREAD_LIMIT];
74 74
75 GtkWidget *last_window = NULL, *popup = NULL; 75 GtkWidget *last_window = NULL, *popup = NULL;
76 76
77 static int _dw_file_active = 0, _dw_ignore_click = 0; 77 static int _dw_file_active = 0, _dw_ignore_click = 0, _dw_ignore_expand = 0;
78 static pthread_t _dw_thread = (pthread_t)-1; 78 static pthread_t _dw_thread = (pthread_t)-1;
79 static int _dw_mutex_locked[DW_THREAD_LIMIT]; 79 static int _dw_mutex_locked[DW_THREAD_LIMIT];
80 /* Use default border size for the default enlightenment theme */ 80 /* Use default border size for the default enlightenment theme */
81 static int _dw_border_width = 12, _dw_border_height = 28; 81 static int _dw_border_width = 12, _dw_border_height = 28;
82 82
599 static gint _tree_expand_event(GtkTreeView *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer data) 599 static gint _tree_expand_event(GtkTreeView *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer data)
600 { 600 {
601 SignalHandler work = _get_signal_handler((GtkWidget *)widget, data); 601 SignalHandler work = _get_signal_handler((GtkWidget *)widget, data);
602 int retval = FALSE; 602 int retval = FALSE;
603 603
604 if(work.window) 604 if(!_dw_ignore_expand && work.window)
605 { 605 {
606 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func; 606 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func;
607 retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data); 607 retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data);
608 } 608 }
609 return retval; 609 return retval;
636 static gint _tree_expand_event(GtkTreeItem *treeitem, gpointer data) 636 static gint _tree_expand_event(GtkTreeItem *treeitem, gpointer data)
637 { 637 {
638 SignalHandler work = _get_signal_handler((GtkWidget *)treeitem, data); 638 SignalHandler work = _get_signal_handler((GtkWidget *)treeitem, data);
639 int retval = FALSE; 639 int retval = FALSE;
640 640
641 if(work.window) 641 if(!_dw_ignore_expand && work.window)
642 { 642 {
643 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func; 643 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func;
644 retval = treeexpandfunc(work.window, (HTREEITEM)treeitem, work.data); 644 retval = treeexpandfunc(work.window, (HTREEITEM)treeitem, work.data);
645 } 645 }
646 return retval; 646 return retval;
3983 } 3983 }
3984 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); 3984 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
3985 gtk_widget_show(label); 3985 gtk_widget_show(label);
3986 gtk_widget_show(hbox); 3986 gtk_widget_show(hbox);
3987 3987
3988 {
3989 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_func");
3990 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_data");
3991 SignalHandler work = _get_signal_handler(tree, mydata);
3992
3993 if(thisfunc && work.window)
3994 {
3995 int sigid = _set_signal_handler(newitem, work.window, work.func, work.data, thisfunc);
3996 gint cid =gtk_signal_connect(GTK_OBJECT(newitem), "expand", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
3997 _set_signal_handler_id(newitem, sigid, cid);
3998 }
3999 }
4000
4001 _dw_ignore_expand = 1;
3988 if(parent) 4002 if(parent)
3989 { 4003 {
3990 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); 4004 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent));
3991 if(!subtree) 4005 if(!subtree || !GTK_IS_TREE(subtree))
3992 { 4006 {
3993 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func"); 4007 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func");
3994 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data"); 4008 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data");
3995 SignalHandler work = _get_signal_handler(tree, mydata); 4009 SignalHandler work = _get_signal_handler(tree, mydata);
3996 4010
4016 4030
4017 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); 4031 gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
4018 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); 4032 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
4019 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); 4033 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
4020 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); 4034 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree);
4035 gtk_object_set_data(GTK_OBJECT(subtree), "_dw_parentitem", (gpointer)parent);
4021 gtk_tree_item_collapse(GTK_TREE_ITEM(parent)); 4036 gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
4022 gtk_widget_show(subtree); 4037 gtk_widget_show(subtree);
4023 gtk_tree_item_expand(GTK_TREE_ITEM(parent)); 4038 gtk_tree_item_expand(GTK_TREE_ITEM(parent));
4024 gtk_tree_item_collapse(GTK_TREE_ITEM(parent)); 4039 gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
4025 } 4040 }
4032 gtk_tree_insert(GTK_TREE(tree), newitem, position); 4047 gtk_tree_insert(GTK_TREE(tree), newitem, position);
4033 } 4048 }
4034 gtk_tree_item_expand(GTK_TREE_ITEM(newitem)); 4049 gtk_tree_item_expand(GTK_TREE_ITEM(newitem));
4035 gtk_tree_item_collapse(GTK_TREE_ITEM(newitem)); 4050 gtk_tree_item_collapse(GTK_TREE_ITEM(newitem));
4036 gtk_widget_show(newitem); 4051 gtk_widget_show(newitem);
4052 _dw_ignore_expand = 0;
4037 DW_MUTEX_UNLOCK; 4053 DW_MUTEX_UNLOCK;
4038 return (HTREEITEM)newitem; 4054 return (HTREEITEM)newitem;
4039 #endif 4055 #endif
4040 } 4056 }
4041 4057
4069 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter)); 4085 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
4070 4086
4071 pixbuf = _find_pixbuf(icon); 4087 pixbuf = _find_pixbuf(icon);
4072 4088
4073 gtk_tree_store_append (store, iter, (GtkTreeIter *)parent); 4089 gtk_tree_store_append (store, iter, (GtkTreeIter *)parent);
4074 gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, 4, NULL, -1); 4090 gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, 4, parent, -1);
4075 if(pixbuf && !(icon & (1 << 31))) 4091 if(pixbuf && !(icon & (1 << 31)))
4076 g_object_unref(pixbuf); 4092 g_object_unref(pixbuf);
4077 retval = (HTREEITEM)iter; 4093 retval = (HTREEITEM)iter;
4078 } 4094 }
4079 DW_MUTEX_UNLOCK; 4095 DW_MUTEX_UNLOCK;
4098 item = gtk_tree_item_new(); 4114 item = gtk_tree_item_new();
4099 label = gtk_label_new(title); 4115 label = gtk_label_new(title);
4100 gtk_object_set_data(GTK_OBJECT(item), "_dw_text", (gpointer)strdup(title)); 4116 gtk_object_set_data(GTK_OBJECT(item), "_dw_text", (gpointer)strdup(title));
4101 gtk_object_set_data(GTK_OBJECT(item), "_dw_itemdata", (gpointer)itemdata); 4117 gtk_object_set_data(GTK_OBJECT(item), "_dw_itemdata", (gpointer)itemdata);
4102 gtk_object_set_data(GTK_OBJECT(item), "_dw_tree", (gpointer)tree); 4118 gtk_object_set_data(GTK_OBJECT(item), "_dw_tree", (gpointer)tree);
4119 gtk_object_set_data(GTK_OBJECT(item), "_dw_parent", (gpointer)parent);
4103 hbox = gtk_hbox_new(FALSE, 2); 4120 hbox = gtk_hbox_new(FALSE, 2);
4104 gtk_object_set_data(GTK_OBJECT(item), "_dw_hbox", (gpointer)hbox); 4121 gtk_object_set_data(GTK_OBJECT(item), "_dw_hbox", (gpointer)hbox);
4105 gdkpix = _find_pixmap(&gdkbmp, icon, hbox, NULL, NULL); 4122 gdkpix = _find_pixmap(&gdkbmp, icon, hbox, NULL, NULL);
4106 gtk_container_add(GTK_CONTAINER(item), hbox); 4123 gtk_container_add(GTK_CONTAINER(item), hbox);
4107 if(gdkpix) 4124 if(gdkpix)
4112 } 4129 }
4113 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); 4130 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
4114 gtk_widget_show(label); 4131 gtk_widget_show(label);
4115 gtk_widget_show(hbox); 4132 gtk_widget_show(hbox);
4116 4133
4134 {
4135 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_func");
4136 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_expand_data");
4137 SignalHandler work = _get_signal_handler(tree, mydata);
4138
4139 if(thisfunc && work.window)
4140 {
4141 int sigid = _set_signal_handler(item, work.window, work.func, work.data, thisfunc);
4142 gint cid =gtk_signal_connect(GTK_OBJECT(item), "expand", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
4143 _set_signal_handler_id(item, sigid, cid);
4144 }
4145 }
4146
4147 _dw_ignore_expand = 1;
4117 if(parent) 4148 if(parent)
4118 { 4149 {
4119 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); 4150 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent));
4120 if(!subtree) 4151 if(!subtree || !GTK_IS_TREE(subtree))
4121 { 4152 {
4122 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func"); 4153 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func");
4123 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data"); 4154 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data");
4124 SignalHandler work = _get_signal_handler(tree, mydata); 4155 SignalHandler work = _get_signal_handler(tree, mydata);
4125 4156
4145 4176
4146 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); 4177 gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
4147 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); 4178 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
4148 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); 4179 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
4149 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); 4180 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree);
4181 gtk_object_set_data(GTK_OBJECT(subtree), "_dw_parentitem", (gpointer)parent);
4150 gtk_tree_item_collapse(GTK_TREE_ITEM(parent)); 4182 gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
4151 gtk_widget_show(subtree); 4183 gtk_widget_show(subtree);
4152 gtk_tree_item_expand(GTK_TREE_ITEM(parent)); 4184 gtk_tree_item_expand(GTK_TREE_ITEM(parent));
4153 gtk_tree_item_collapse(GTK_TREE_ITEM(parent)); 4185 gtk_tree_item_collapse(GTK_TREE_ITEM(parent));
4154 } 4186 }
4161 gtk_tree_append(GTK_TREE(tree), item); 4193 gtk_tree_append(GTK_TREE(tree), item);
4162 } 4194 }
4163 gtk_tree_item_expand(GTK_TREE_ITEM(item)); 4195 gtk_tree_item_expand(GTK_TREE_ITEM(item));
4164 gtk_tree_item_collapse(GTK_TREE_ITEM(item)); 4196 gtk_tree_item_collapse(GTK_TREE_ITEM(item));
4165 gtk_widget_show(item); 4197 gtk_widget_show(item);
4198 _dw_ignore_expand = 0;
4166 DW_MUTEX_UNLOCK; 4199 DW_MUTEX_UNLOCK;
4167 return (HTREEITEM)item; 4200 return (HTREEITEM)item;
4168 #endif 4201 #endif
4169 } 4202 }
4170 4203
4514 4547
4515 if(!handle || !item) 4548 if(!handle || !item)
4516 return; 4549 return;
4517 4550
4518 DW_MUTEX_LOCK; 4551 DW_MUTEX_LOCK;
4552 _dw_ignore_expand = 1;
4519 if(GTK_IS_TREE_ITEM(item)) 4553 if(GTK_IS_TREE_ITEM(item))
4520 gtk_tree_item_expand(GTK_TREE_ITEM(item)); 4554 gtk_tree_item_expand(GTK_TREE_ITEM(item));
4555 _dw_ignore_expand = 0;
4521 DW_MUTEX_UNLOCK; 4556 DW_MUTEX_UNLOCK;
4522 #endif 4557 #endif
4523 } 4558 }
4524 4559
4525 /* 4560 /*
7861 if(tempitem) 7896 if(tempitem)
7862 { 7897 {
7863 char *folder = _tree_folder(tree, item); 7898 char *folder = _tree_folder(tree, item);
7864 7899
7865 dw_tree_set_data(tree, item, 0); 7900 dw_tree_set_data(tree, item, 0);
7901 #if GTK_MAJOR_VERSION > 1
7902 /* FIXME: GTK 1.x tree control goes crazy when
7903 * I delete the temporary item. The subtree
7904 * it sits on ceases to be valid and attempts
7905 * to delete or recreate it fail horribly.
7906 */
7866 dw_tree_delete(tree, tempitem); 7907 dw_tree_delete(tree, tempitem);
7908 #endif
7867 7909
7868 if(*folder) 7910 if(*folder)
7869 _populate_directory(tree, item, folder); 7911 _populate_directory(tree, item, folder);
7912
7870 free(folder); 7913 free(folder);
7871 } 7914 }
7872 7915
7873 return FALSE; 7916 return FALSE;
7874 } 7917 }
8277 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_func", (gpointer)thisfunc); 8320 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_func", (gpointer)thisfunc);
8278 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_data", (gpointer)sigid); 8321 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_data", (gpointer)sigid);
8279 } 8322 }
8280 thisname = "select-child"; 8323 thisname = "select-child";
8281 } 8324 }
8325 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0)
8326 {
8327 if(thisfunc)
8328 {
8329 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);
8330 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_tree_expand_func", (gpointer)thisfunc);
8331 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_tree_expand_data", (gpointer)sigid);
8332 }
8333 DW_MUTEX_UNLOCK;
8334 return;
8335 }
8282 #endif 8336 #endif
8283 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) 8337 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0)
8284 { 8338 {
8285 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event); 8339 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event);
8286 cid = gtk_signal_connect(GTK_OBJECT(thiswindow), "key_press_event", GTK_SIGNAL_FUNC(_container_enter_event), (gpointer)sigid); 8340 cid = gtk_signal_connect(GTK_OBJECT(thiswindow), "key_press_event", GTK_SIGNAL_FUNC(_container_enter_event), (gpointer)sigid);