# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1300739709 0 # Node ID 9ef49898a5e6da15768eab2f31b0984f7587aeba # Parent 5a4bfe989f504c06b8debc34fa5c4b0db8bf9602 Container events now working except for column-click. diff -r 5a4bfe989f50 -r 9ef49898a5e6 gtk3/dw.c --- a/gtk3/dw.c Mon Mar 21 07:19:33 2011 +0000 +++ b/gtk3/dw.c Mon Mar 21 20:35:09 2011 +0000 @@ -156,7 +156,7 @@ static gint _generic_event(GtkWidget *widget, gpointer data); static gint _configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); static gint _activate_event(GtkWidget *widget, gpointer data); -static gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data); +static gint _container_enter_event(GtkWidget *widget, GdkEventAny *event, gpointer data); static gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data); static gint _expose_event(GtkWidget *widget, cairo_t *cr, gpointer data); static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); @@ -253,7 +253,7 @@ { _expose_event, DW_SIGNAL_EXPOSE }, { _activate_event, "activate" }, { _generic_event, DW_SIGNAL_CLICKED }, - { _container_select_event, DW_SIGNAL_ITEM_ENTER }, + { _container_enter_event, DW_SIGNAL_ITEM_ENTER }, { _tree_context_event, DW_SIGNAL_ITEM_CONTEXT }, { _item_select_event, DW_SIGNAL_LIST_SELECT }, { _tree_select_event, DW_SIGNAL_ITEM_SELECT }, @@ -1523,13 +1523,12 @@ if(widget && GTK_IS_TREE_VIEW(widget)) { GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); GtkTreeIter iter; if(sel && gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE && gtk_tree_selection_get_selected(sel, NULL, &iter)) { - GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); - if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) { gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1); @@ -1539,6 +1538,29 @@ gtk_tree_model_get(store, &iter, 0, &text, -1); } } + else + { + GtkTreePath *path; + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL); + if(path) + { + GtkTreeIter iter; + + if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) + { + if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) + { + gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1); + } + else + { + gtk_tree_model_get(store, &iter, 0, &text, -1); + } + } + gtk_tree_path_free(path); + } + } } retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata); @@ -1563,12 +1585,17 @@ GtkTreeIter iter; char *text = NULL; void *itemdata = NULL; + GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); + + if(g_object_get_data(G_OBJECT(widget), "_dw_double_click")) + { + g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(0)); + return TRUE; + } if(gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE && gtk_tree_selection_get_selected(sel, NULL, &iter)) { - GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); - if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) { gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); @@ -1579,6 +1606,30 @@ } retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata); } + else + { + GtkTreePath *path; + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL); + if(path) + { + GtkTreeIter iter; + + if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) + { + if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) + { + gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); + } + else + { + gtk_tree_model_get(store, &iter, 0, &text, -1); + } + retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata); + } + gtk_tree_path_free(path); + } + } } } return retval; @@ -1598,48 +1649,53 @@ return retval; } -static gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data) +static gint _container_enter_event(GtkWidget *widget, GdkEventAny *event, gpointer data) { SignalHandler work = _get_signal_handler(widget, data); + GdkEventKey *keyevent = (GdkEventKey *)event; + GdkEventButton *buttonevent = (GdkEventButton *)event; int retval = FALSE; -#if 0 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__); if(work.window) { - if(event->button == 1 && event->type == GDK_2BUTTON_PRESS) + /* Handle both key and button events together */ + if((event->type == GDK_2BUTTON_PRESS && buttonevent->button == 1) || + (event->type == GDK_KEY_PRESS && keyevent->keyval == VK_RETURN)) { int (*contextfunc)(HWND, char *, void *) = work.func; - char *text; - int row, col; - - gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col); - - text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row); - retval = contextfunc(work.window, text, work.data); - g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(1)); - } - } -#endif - return retval; -} - -static gint _container_enter_event(GtkWidget *widget, GdkEventKey *event, gpointer data) -{ - SignalHandler work = _get_signal_handler(widget, data); - int retval = FALSE; - -#if 0 - if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__); - if(work.window && event->keyval == VK_RETURN) - { - int (*contextfunc)(HWND, char *, void *) = work.func; - char *text; - - text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), GTK_CLIST(widget)->focus_row); - retval = contextfunc(work.window, text, work.data); - } -#endif + char *text = NULL; + + /* Prevent some double events from happening */ + if(event->type == GDK_2BUTTON_PRESS) + { + g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(1)); + } + + /* Sanity check */ + if(GTK_IS_TREE_VIEW(widget)) + { + GtkTreePath *path; + GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL); + if(path) + { + GtkTreeIter iter; + + if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) + { + if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_CONTAINER)) + { + gtk_tree_model_get(store, &iter, 0, &text, -1); + retval = contextfunc(work.window, text, work.data); + } + } + gtk_tree_path_free(path); + } + } + } + } return retval; } @@ -1690,27 +1746,6 @@ return retval; } -static gint _container_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) -{ -#if 0 - SignalHandler work = _get_signal_handler(widget, data); - char *rowdata = gtk_clist_get_row_data(GTK_CLIST(widget), row); - int (*contextfunc)(HWND, HWND, char *, void *, void *) = work.func; - - if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__); - if(!work.window) - return TRUE; - - if(g_object_get_data(G_OBJECT(widget), "_dw_double_click")) - { - g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(0)); - return TRUE; - } - return contextfunc(work.window, 0, rowdata, work.data, 0);; -#endif - return TRUE; -} - static int _round_value(gfloat val) { int newval = (int)val; @@ -3739,6 +3774,7 @@ store = gtk_list_store_new(1, G_TYPE_STRING); tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store)); gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(tmp), 0); + gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(tmp))), text); gtk_widget_show(tmp); g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_COMBOBOX); g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); @@ -4250,10 +4286,8 @@ handle = tmp; if(GTK_IS_ENTRY(handle)) gtk_entry_set_text(GTK_ENTRY(handle), text); -#if 0 else if(GTK_IS_COMBO_BOX(handle)) - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO_BOX(handle)->entry), text); -#endif + gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(handle))), text); else if(GTK_IS_LABEL(handle)) gtk_label_set_text(GTK_LABEL(handle), text); else if(GTK_IS_BUTTON(handle)) @@ -4291,10 +4325,8 @@ DW_MUTEX_LOCK; if(GTK_IS_ENTRY(handle)) possible = gtk_entry_get_text(GTK_ENTRY(handle)); -#if 0 else if(GTK_IS_COMBO_BOX(handle)) - possible = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO_BOX(handle)->entry)); -#endif + possible = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(handle)))); DW_MUTEX_UNLOCK; return strdup(possible); @@ -10289,26 +10321,16 @@ { thisname = "row-expanded"; } -#if 0 - else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) + else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) { sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event); - cid = g_signal_connect(G_OBJECT(thiswindow), "key_press_event", GTK_SIGNAL_FUNC(_container_enter_event), (gpointer)sigid); + cid = g_signal_connect(G_OBJECT(thiswindow), "key_press_event", G_CALLBACK(_container_enter_event), (gpointer)sigid); _set_signal_handler_id(thiswindow, sigid, cid); thisname = "button_press_event"; thisfunc = _findsigfunc(DW_SIGNAL_ITEM_ENTER); } - else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) - { - thisname = "select_row"; - thisfunc = (void *)_container_select_row; - } - else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) - { - thisname = "button_press_event"; - thisfunc = _findsigfunc(DW_SIGNAL_ITEM_CONTEXT); - } +#if 0 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_COLUMN_CLICK) == 0) { thisname = "click-column";