# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1035270597 0 # Node ID e0e73b4372a6a9704b1fdd9cde22522813db6d01 # Parent ccf210251c996bc311399f06182ab24ed32fb717 GTK 2.0 tree control is now fully functional. I just need to check for leaks. diff -r ccf210251c99 -r e0e73b4372a6 dw.h --- a/dw.h Tue Oct 22 01:59:52 2002 +0000 +++ b/dw.h Tue Oct 22 07:09:57 2002 +0000 @@ -380,7 +380,6 @@ void dw_box_pack_end_stub(HWND box, HWND item, int width, int height, int hsize, int vsize, int pad); #else /* GTK */ -#define GTK_ENABLE_BROKEN 1 #include #include #include diff -r ccf210251c99 -r e0e73b4372a6 gtk/dw.c --- a/gtk/dw.c Tue Oct 22 01:59:52 2002 +0000 +++ b/gtk/dw.c Tue Oct 22 07:09:57 2002 +0000 @@ -88,9 +88,13 @@ gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data); gint _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data); gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); -gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data); gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data); gint _value_changed_event(GtkAdjustment *adjustment, gpointer user_data); +#if GTK_MAJOR_VERSION > 1 +gint _tree_select_event(GtkTreeSelection *sel, gpointer data); +#else +gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data); +#endif void msleep(long period); @@ -400,6 +404,25 @@ { if(event->button == 3) { +#if GTK_MAJOR_VERSION > 1 + int (*contextfunc)(HWND, char *, int, int, void *, void *) = work->func; + char *text = NULL; + void *itemdata = NULL; + + if(widget && GTK_IS_TREE_VIEW(widget)) + { + GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + GtkTreeIter iter; + + if(sel && gtk_tree_selection_get_selected(sel, NULL, &iter)) + { + GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_tree_store"); + gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1); + } + } + + retval = contextfunc(work->window, text, event->x, event->y, work->data, itemdata); +#else int (*contextfunc)(HWND, char *, int, int, void *, void *) = work->func; char *text = (char *)gtk_object_get_data(GTK_OBJECT(widget), "text"); void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(widget), "itemdata"); @@ -421,11 +444,37 @@ } retval = contextfunc(work->window, text, event->x, event->y, work->data, itemdata); +#endif } } return retval; } +#if GTK_MAJOR_VERSION > 1 +gint _tree_select_event(GtkTreeSelection *sel, gpointer data) +{ + SignalHandler *work = (SignalHandler *)data; + int retval = FALSE; + + if(work) + { + int (*treeselectfunc)(HWND, HWND, char *, void *, void *) = work->func; + GtkTreeIter iter; + char *text = NULL; + void *itemdata = NULL; + GtkWidget *item, *widget = (GtkWidget *)gtk_tree_selection_get_tree_view(sel); + + if(widget && gtk_tree_selection_get_selected(sel, NULL, &iter)) + { + GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_tree_store"); + gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); + } + + retval = treeselectfunc(work->window, item, text, itemdata, work->data); + } + return retval; +} +#else gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data) { SignalHandler *work = (SignalHandler *)data; @@ -449,6 +498,7 @@ } return retval; } +#endif gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data) { @@ -1923,6 +1973,7 @@ GtkTreeStore *store; GtkTreeViewColumn *col; GtkCellRenderer *rend; + GtkTreeSelection *sel; #endif int _locked_by_me = FALSE; @@ -1934,7 +1985,7 @@ gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id); gtk_widget_show(tmp); #if GTK_MAJOR_VERSION > 1 - store = gtk_tree_store_new(2, G_TYPE_STRING, GDK_TYPE_PIXBUF); + store = gtk_tree_store_new(4, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_POINTER); tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); gtk_object_set_data(GTK_OBJECT(tree), "_dw_tree_store", (gpointer)store); col = gtk_tree_view_column_new(); @@ -1949,6 +2000,9 @@ gtk_tree_view_append_column(GTK_TREE_VIEW (tree), col); gtk_tree_view_set_expander_column(GTK_TREE_VIEW(tree), col); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); + + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); #else tree = gtk_tree_new(); #endif @@ -3196,7 +3250,7 @@ { #if GTK_MAJOR_VERSION > 1 GtkWidget *tree; - GtkTreeIter iter; + GtkTreeIter *iter; GtkTreeStore *store; GdkPixbuf *pixbuf; HWND retval = 0; @@ -3210,12 +3264,14 @@ && GTK_IS_TREE_VIEW(tree) && (store = (GtkTreeStore *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) { + iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter)); + pixbuf = _find_pixbuf(icon); - gtk_tree_store_insert_after(store, &iter, (GtkTreeIter *)parent, (GtkTreeIter *)item); - gtk_tree_store_set (store, &iter, 0, title, 1, pixbuf, -1); + gtk_tree_store_insert_after(store, iter, (GtkTreeIter *)parent, (GtkTreeIter *)item); + gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, -1); g_object_unref(pixbuf); - retval = (HWND)gtk_tree_iter_copy(&iter); + retval = (HWND)iter; } DW_MUTEX_UNLOCK; @@ -3320,7 +3376,7 @@ { #if GTK_MAJOR_VERSION > 1 GtkWidget *tree; - GtkTreeIter iter; + GtkTreeIter *iter; GtkTreeStore *store; GdkPixbuf *pixbuf; HWND retval = 0; @@ -3334,12 +3390,14 @@ && GTK_IS_TREE_VIEW(tree) && (store = (GtkTreeStore *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) { + iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter)); + pixbuf = _find_pixbuf(icon); - gtk_tree_store_append (store, &iter, (GtkTreeIter *)parent); - gtk_tree_store_set (store, &iter, 0, title, 1, pixbuf, -1); + gtk_tree_store_append (store, iter, (GtkTreeIter *)parent); + gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, -1); g_object_unref(pixbuf); - retval = (HWND)gtk_tree_iter_copy(&iter); + retval = (HWND)iter; } DW_MUTEX_UNLOCK; @@ -3499,6 +3557,21 @@ */ void dw_tree_set_data(HWND handle, HWND item, void *itemdata) { +#if GTK_MAJOR_VERSION > 1 + GtkWidget *tree; + GtkTreeStore *store; + int _locked_by_me = FALSE; + + if(!handle || !item) + return; + + DW_MUTEX_LOCK; + if((tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle))) + && GTK_IS_TREE_VIEW(tree) && + (store = (GtkTreeStore *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) + gtk_tree_store_set(store, (GtkTreeIter *)item, 2, itemdata, -1); + DW_MUTEX_UNLOCK; +#else int _locked_by_me = FALSE; if(!handle || !item) @@ -3507,6 +3580,7 @@ DW_MUTEX_LOCK; gtk_object_set_data(GTK_OBJECT(item), "itemdata", (gpointer)itemdata); DW_MUTEX_UNLOCK; +#endif } /* @@ -3531,7 +3605,10 @@ (store = (GtkTreeStore *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) { GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), (GtkTreeIter *)item); + GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree), path, NULL, FALSE); + gtk_tree_selection_select_iter(sel, (GtkTreeIter *)item); gtk_tree_path_free(path); } DW_MUTEX_UNLOCK; @@ -3694,7 +3771,7 @@ (store = (GtkTreeStore *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) { gtk_tree_store_remove(store, (GtkTreeIter *)item); - gtk_tree_iter_free((GtkTreeIter *)item); + free(item); } DW_MUTEX_UNLOCK; #else @@ -6530,6 +6607,34 @@ thisname = "button_press_event"; thisfunc = _findsigfunc("container-context"); } +#if GTK_MAJOR_VERSION > 1 + else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, "container-context") == 0) + { + thisfunc = _findsigfunc("tree-context"); + + work->window = window; + work->data = data; + work->func = sigfunc; + + gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work); + gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work); + DW_MUTEX_UNLOCK; + return; + } + else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, "tree-select") == 0) + { + work->window = window; + work->data = data; + work->func = sigfunc; + + thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow)); + thisname = "changed"; + + g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, work); + DW_MUTEX_UNLOCK; + return; + } +#else else if(GTK_IS_TREE(thiswindow) && strcmp(signame, "container-context") == 0) { thisfunc = _findsigfunc("tree-context"); @@ -6545,6 +6650,16 @@ DW_MUTEX_UNLOCK; return; } + else if(GTK_IS_TREE(thiswindow) && strcmp(signame, "tree-select") == 0) + { + if(thisfunc) + { + gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-func", (gpointer)thisfunc); + gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-data", (gpointer)work); + } + thisname = "select-child"; + } +#endif else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, "container-select") == 0) { thisname = "button_press_event"; @@ -6571,15 +6686,6 @@ if(GTK_IS_COMBO(thiswindow)) thiswindow = GTK_COMBO(thiswindow)->entry; } - else if(GTK_IS_TREE(thiswindow) && strcmp(signame, "tree-select") == 0) - { - if(thisfunc) - { - gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-func", (gpointer)thisfunc); - gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-data", (gpointer)work); - } - thisname = "select-child"; - } else if(GTK_IS_VSCALE(thiswindow) || GTK_IS_HSCALE(thiswindow)) { thiswindow = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(thiswindow), "adjustment");