comparison gtk3/dw.c @ 785:a86c54519de0

Implemented list select event for both combobox and listbox (implemented via the tree view).
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 22 Mar 2011 00:33:55 +0000
parents fb21fdd6b839
children 0e251c2f5d08
comparison
equal deleted inserted replaced
784:fb21fdd6b839 785:a86c54519de0
155 static gint _key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data); 155 static gint _key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data);
156 static gint _generic_event(GtkWidget *widget, gpointer data); 156 static gint _generic_event(GtkWidget *widget, gpointer data);
157 static gint _configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); 157 static gint _configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data);
158 static gint _activate_event(GtkWidget *widget, gpointer data); 158 static gint _activate_event(GtkWidget *widget, gpointer data);
159 static gint _container_enter_event(GtkWidget *widget, GdkEventAny *event, gpointer data); 159 static gint _container_enter_event(GtkWidget *widget, GdkEventAny *event, gpointer data);
160 static gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data); 160 static gint _combobox_select_event(GtkWidget *widget, gpointer data);
161 static gint _expose_event(GtkWidget *widget, cairo_t *cr, gpointer data); 161 static gint _expose_event(GtkWidget *widget, cairo_t *cr, gpointer data);
162 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); 162 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
163 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 163 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
164 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer user_data); 164 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer user_data);
165 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data); 165 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data);
253 { _expose_event, DW_SIGNAL_EXPOSE }, 253 { _expose_event, DW_SIGNAL_EXPOSE },
254 { _activate_event, "activate" }, 254 { _activate_event, "activate" },
255 { _generic_event, DW_SIGNAL_CLICKED }, 255 { _generic_event, DW_SIGNAL_CLICKED },
256 { _container_enter_event, DW_SIGNAL_ITEM_ENTER }, 256 { _container_enter_event, DW_SIGNAL_ITEM_ENTER },
257 { _tree_context_event, DW_SIGNAL_ITEM_CONTEXT }, 257 { _tree_context_event, DW_SIGNAL_ITEM_CONTEXT },
258 { _item_select_event, DW_SIGNAL_LIST_SELECT }, 258 { _combobox_select_event, DW_SIGNAL_LIST_SELECT },
259 { _tree_select_event, DW_SIGNAL_ITEM_SELECT }, 259 { _tree_select_event, DW_SIGNAL_ITEM_SELECT },
260 { _set_focus_event, DW_SIGNAL_SET_FOCUS }, 260 { _set_focus_event, DW_SIGNAL_SET_FOCUS },
261 { _value_changed_event, DW_SIGNAL_VALUE_CHANGED }, 261 { _value_changed_event, DW_SIGNAL_VALUE_CHANGED },
262 { _switch_page_event, DW_SIGNAL_SWITCH_PAGE }, 262 { _switch_page_event, DW_SIGNAL_SWITCH_PAGE },
263 { _column_click_event, DW_SIGNAL_COLUMN_CLICK }, 263 { _column_click_event, DW_SIGNAL_COLUMN_CLICK },
1457 retval = exposefunc(work.window, &exp, work.data); 1457 retval = exposefunc(work.window, &exp, work.data);
1458 } 1458 }
1459 return retval; 1459 return retval;
1460 } 1460 }
1461 1461
1462 static gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data) 1462 static gint _combobox_select_event(GtkWidget *widget, gpointer data)
1463 { 1463 {
1464 SignalHandler work = _get_signal_handler(widget, data); 1464 SignalHandler work = _get_signal_handler(widget, data);
1465 static int _dw_recursing = 0; 1465 static int _dw_recursing = 0;
1466 int retval = FALSE; 1466 int retval = FALSE;
1467 1467
1468 #if 0
1469 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__); 1468 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
1470 if(_dw_recursing) 1469 if(_dw_recursing)
1471 return FALSE; 1470 return FALSE;
1472 1471
1473 if(work.window) 1472 if(work.window && GTK_IS_COMBO_BOX(widget))
1474 { 1473 {
1475 int (*selectfunc)(HWND, int, void *) = work.func; 1474 GtkTreeModel *store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
1476 GList *list; 1475
1477 int item = 0; 1476 if(store)
1478 1477 {
1479 _dw_recursing = 1; 1478 GtkTreeIter iter;
1480 1479 GtkTreePath *path;
1481 if(GTK_IS_COMBO_BOX(work.window)) 1480
1482 list = GTK_LIST(GTK_COMBO_BOX(work.window)->list)->children; 1481 _dw_recursing = 1;
1483 else if(GTK_IS_LIST(widget)) 1482
1484 list = GTK_LIST(widget)->children; 1483 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter);
1485 else 1484 path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
1486 return FALSE; 1485
1487 1486 if(path)
1488 while(list)
1489 {
1490 if(list->data == (gpointer)child)
1491 { 1487 {
1492 if(!g_object_get_data(G_OBJECT(work.window), "_dw_appending")) 1488 gint *indices = gtk_tree_path_get_indices(path);
1489
1490 if(indices)
1493 { 1491 {
1494 g_object_set_data(G_OBJECT(work.window), "_dw_item", GINT_TO_POINTER(item)); 1492 int (*selectfunc)(HWND, int, void *) = work.func;
1495 if(selectfunc) 1493
1496 retval = selectfunc(work.window, item, work.data); 1494 retval = selectfunc(work.window, indices[0], work.data);
1497 } 1495 }
1498 break; 1496 gtk_tree_path_free(path);
1499 } 1497 }
1500 item++; 1498
1501 list = list->next; 1499 _dw_recursing = 0;
1502 } 1500 }
1503 _dw_recursing = 0; 1501 }
1504 }
1505 #endif
1506 return retval; 1502 return retval;
1507 } 1503 }
1508 1504
1509 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 1505 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
1510 { 1506 {
1597 gtk_tree_selection_get_selected(sel, NULL, &iter)) 1593 gtk_tree_selection_get_selected(sel, NULL, &iter))
1598 { 1594 {
1599 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) 1595 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1600 { 1596 {
1601 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); 1597 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1);
1598 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1599 }
1600 else if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_CONTAINER))
1601 {
1602 gtk_tree_model_get(store, &iter, 0, &text, -1);
1603 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1602 } 1604 }
1603 else 1605 else
1604 { 1606 {
1605 gtk_tree_model_get(store, &iter, 0, &text, -1); 1607 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
1608
1609 if(path)
1610 {
1611 gint *indices = gtk_tree_path_get_indices(path);
1612
1613 if(indices)
1614 {
1615 int (*selectfunc)(HWND, int, void *) = work.func;
1616
1617 retval = selectfunc(work.window, indices[0], work.data);
1618 }
1619 gtk_tree_path_free(path);
1620 }
1606 } 1621 }
1607 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1608 } 1622 }
1609 else 1623 else
1610 { 1624 {
1611 GtkTreePath *path; 1625 GtkTreePath *path;
1612 1626
1618 if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) 1632 if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
1619 { 1633 {
1620 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) 1634 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1621 { 1635 {
1622 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); 1636 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1);
1637 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1638 }
1639 else if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_CONTAINER))
1640 {
1641 gtk_tree_model_get(store, &iter, 0, &text, -1);
1642 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1623 } 1643 }
1624 else 1644 else
1625 { 1645 {
1626 gtk_tree_model_get(store, &iter, 0, &text, -1); 1646 gint *indices = gtk_tree_path_get_indices(path);
1647
1648 if(indices)
1649 {
1650 int (*selectfunc)(HWND, int, void *) = work.func;
1651
1652 retval = selectfunc(work.window, indices[0], work.data);
1653 }
1627 } 1654 }
1628 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1629 } 1655 }
1630 gtk_tree_path_free(path); 1656 gtk_tree_path_free(path);
1631 } 1657 }
1632 } 1658 }
1633 } 1659 }
10274 _set_signal_handler_id(thiswindow, sigid, cid); 10300 _set_signal_handler_id(thiswindow, sigid, cid);
10275 10301
10276 DW_MUTEX_UNLOCK; 10302 DW_MUTEX_UNLOCK;
10277 return; 10303 return;
10278 } 10304 }
10279 else if ((GTK_IS_TREE_VIEW(thiswindow) || GTK_IS_COMBO_BOX(thiswindow)) 10305 else if ((GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) ||
10280 && (strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0 || strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0)) 10306 (GTK_IS_COMBO_BOX(thiswindow) && strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0))
10281 { 10307 {
10282 GtkWidget *widget = thiswindow; 10308 GtkWidget *widget = thiswindow;
10283 10309
10284 thisname = "changed"; 10310 thisname = "changed";
10285 10311
10286 sigid = _set_signal_handler(widget, window, sigfunc, data, thisfunc); 10312 sigid = _set_signal_handler(widget, window, sigfunc, data, thisfunc);
10287 if(GTK_IS_TREE_VIEW(thiswindow)) 10313 if(GTK_IS_TREE_VIEW(thiswindow))
10288 { 10314 {
10289 thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow)); 10315 thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow));
10290 cid = g_signal_connect(G_OBJECT(thiswindow), thisname, G_CALLBACK(thisfunc), (gpointer)sigid); 10316 cid = g_signal_connect(G_OBJECT(thiswindow), thisname, G_CALLBACK(thisfunc), (gpointer)sigid);
10291 _set_signal_handler_id(widget, sigid, cid); 10317 }
10292 } 10318 else
10319 {
10320 cid = g_signal_connect(G_OBJECT(thiswindow), thisname, G_CALLBACK(_combobox_select_event), (gpointer)sigid);
10321 }
10322 _set_signal_handler_id(widget, sigid, cid);
10293 10323
10294 DW_MUTEX_UNLOCK; 10324 DW_MUTEX_UNLOCK;
10295 return; 10325 return;
10296 } 10326 }
10297 else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0) 10327 else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0)
10309 } 10339 }
10310 #if 0 10340 #if 0
10311 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_COLUMN_CLICK) == 0) 10341 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_COLUMN_CLICK) == 0)
10312 { 10342 {
10313 thisname = "click-column"; 10343 thisname = "click-column";
10314 }
10315 else if (GTK_IS_COMBO_BOX(thiswindow) && strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0)
10316 {
10317 thisname = "select_child";
10318 thiswindow = GTK_COMBO_BOX(thiswindow)->list;
10319 }
10320 else if (GTK_IS_LIST(thiswindow) && strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0)
10321 {
10322 thisname = "select_child";
10323 } 10344 }
10324 else if (strcmp(signame, DW_SIGNAL_SET_FOCUS) == 0) 10345 else if (strcmp(signame, DW_SIGNAL_SET_FOCUS) == 0)
10325 { 10346 {
10326 thisname = "focus-in-event"; 10347 thisname = "focus-in-event";
10327 if (GTK_IS_COMBO_BOX(thiswindow)) 10348 if (GTK_IS_COMBO_BOX(thiswindow))