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