Mercurial > dwindows
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); |