comparison gtk3/dw.c @ 783:9ef49898a5e6

Container events now working except for column-click.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 21 Mar 2011 20:35:09 +0000
parents 5a4bfe989f50
children fb21fdd6b839
comparison
equal deleted inserted replaced
782:5a4bfe989f50 783:9ef49898a5e6
154 static gint _delete_event(GtkWidget *widget, GdkEvent *event, gpointer data); 154 static gint _delete_event(GtkWidget *widget, GdkEvent *event, gpointer data);
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_select_event(GtkWidget *widget, GdkEventButton *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 _item_select_event(GtkWidget *widget, GtkWidget *child, 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);
251 { _motion_notify_event, DW_SIGNAL_MOTION_NOTIFY }, 251 { _motion_notify_event, DW_SIGNAL_MOTION_NOTIFY },
252 { _delete_event, DW_SIGNAL_DELETE }, 252 { _delete_event, DW_SIGNAL_DELETE },
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_select_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 { _item_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 },
1521 void *itemdata = NULL; 1521 void *itemdata = NULL;
1522 1522
1523 if(widget && GTK_IS_TREE_VIEW(widget)) 1523 if(widget && GTK_IS_TREE_VIEW(widget))
1524 { 1524 {
1525 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); 1525 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
1526 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1526 GtkTreeIter iter; 1527 GtkTreeIter iter;
1527 1528
1528 if(sel && gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE && 1529 if(sel && gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE &&
1529 gtk_tree_selection_get_selected(sel, NULL, &iter)) 1530 gtk_tree_selection_get_selected(sel, NULL, &iter))
1530 { 1531 {
1531 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1532
1533 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) 1532 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1534 { 1533 {
1535 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1); 1534 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1);
1536 } 1535 }
1537 else 1536 else
1538 { 1537 {
1539 gtk_tree_model_get(store, &iter, 0, &text, -1); 1538 gtk_tree_model_get(store, &iter, 0, &text, -1);
1540 } 1539 }
1541 } 1540 }
1541 else
1542 {
1543 GtkTreePath *path;
1544
1545 gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL);
1546 if(path)
1547 {
1548 GtkTreeIter iter;
1549
1550 if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
1551 {
1552 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1553 {
1554 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1);
1555 }
1556 else
1557 {
1558 gtk_tree_model_get(store, &iter, 0, &text, -1);
1559 }
1560 }
1561 gtk_tree_path_free(path);
1562 }
1563 }
1542 } 1564 }
1543 1565
1544 retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata); 1566 retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata);
1545 } 1567 }
1546 } 1568 }
1561 { 1583 {
1562 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func; 1584 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func;
1563 GtkTreeIter iter; 1585 GtkTreeIter iter;
1564 char *text = NULL; 1586 char *text = NULL;
1565 void *itemdata = NULL; 1587 void *itemdata = NULL;
1588 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1589
1590 if(g_object_get_data(G_OBJECT(widget), "_dw_double_click"))
1591 {
1592 g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(0));
1593 return TRUE;
1594 }
1566 1595
1567 if(gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE && 1596 if(gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE &&
1568 gtk_tree_selection_get_selected(sel, NULL, &iter)) 1597 gtk_tree_selection_get_selected(sel, NULL, &iter))
1569 { 1598 {
1570 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1571
1572 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE)) 1599 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1573 { 1600 {
1574 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); 1601 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1);
1575 } 1602 }
1576 else 1603 else
1577 { 1604 {
1578 gtk_tree_model_get(store, &iter, 0, &text, -1); 1605 gtk_tree_model_get(store, &iter, 0, &text, -1);
1579 } 1606 }
1580 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata); 1607 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1581 } 1608 }
1609 else
1610 {
1611 GtkTreePath *path;
1612
1613 gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL);
1614 if(path)
1615 {
1616 GtkTreeIter iter;
1617
1618 if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
1619 {
1620 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1621 {
1622 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1);
1623 }
1624 else
1625 {
1626 gtk_tree_model_get(store, &iter, 0, &text, -1);
1627 }
1628 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
1629 }
1630 gtk_tree_path_free(path);
1631 }
1632 }
1582 } 1633 }
1583 } 1634 }
1584 return retval; 1635 return retval;
1585 } 1636 }
1586 1637
1596 retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data); 1647 retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data);
1597 } 1648 }
1598 return retval; 1649 return retval;
1599 } 1650 }
1600 1651
1601 static gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 1652 static gint _container_enter_event(GtkWidget *widget, GdkEventAny *event, gpointer data)
1602 { 1653 {
1603 SignalHandler work = _get_signal_handler(widget, data); 1654 SignalHandler work = _get_signal_handler(widget, data);
1655 GdkEventKey *keyevent = (GdkEventKey *)event;
1656 GdkEventButton *buttonevent = (GdkEventButton *)event;
1604 int retval = FALSE; 1657 int retval = FALSE;
1605 1658
1606 #if 0
1607 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__); 1659 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
1608 if(work.window) 1660 if(work.window)
1609 { 1661 {
1610 if(event->button == 1 && event->type == GDK_2BUTTON_PRESS) 1662 /* Handle both key and button events together */
1663 if((event->type == GDK_2BUTTON_PRESS && buttonevent->button == 1) ||
1664 (event->type == GDK_KEY_PRESS && keyevent->keyval == VK_RETURN))
1611 { 1665 {
1612 int (*contextfunc)(HWND, char *, void *) = work.func; 1666 int (*contextfunc)(HWND, char *, void *) = work.func;
1613 char *text; 1667 char *text = NULL;
1614 int row, col; 1668
1615 1669 /* Prevent some double events from happening */
1616 gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col); 1670 if(event->type == GDK_2BUTTON_PRESS)
1617 1671 {
1618 text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row); 1672 g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(1));
1619 retval = contextfunc(work.window, text, work.data); 1673 }
1620 g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(1)); 1674
1621 } 1675 /* Sanity check */
1622 } 1676 if(GTK_IS_TREE_VIEW(widget))
1623 #endif 1677 {
1624 return retval; 1678 GtkTreePath *path;
1625 } 1679 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1626 1680
1627 static gint _container_enter_event(GtkWidget *widget, GdkEventKey *event, gpointer data) 1681 gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL);
1628 { 1682 if(path)
1629 SignalHandler work = _get_signal_handler(widget, data); 1683 {
1630 int retval = FALSE; 1684 GtkTreeIter iter;
1631 1685
1632 #if 0 1686 if(gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
1633 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__); 1687 {
1634 if(work.window && event->keyval == VK_RETURN) 1688 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_CONTAINER))
1635 { 1689 {
1636 int (*contextfunc)(HWND, char *, void *) = work.func; 1690 gtk_tree_model_get(store, &iter, 0, &text, -1);
1637 char *text; 1691 retval = contextfunc(work.window, text, work.data);
1638 1692 }
1639 text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), GTK_CLIST(widget)->focus_row); 1693 }
1640 retval = contextfunc(work.window, text, work.data); 1694 gtk_tree_path_free(path);
1641 } 1695 }
1642 #endif 1696 }
1697 }
1698 }
1643 return retval; 1699 return retval;
1644 } 1700 }
1645 1701
1646 /* Return the logical page id from the physical page id */ 1702 /* Return the logical page id from the physical page id */
1647 int _get_logical_page(HWND handle, unsigned long pageid) 1703 int _get_logical_page(HWND handle, unsigned long pageid)
1686 { 1742 {
1687 int (*clickcolumnfunc)(HWND, int, void *) = work.func; 1743 int (*clickcolumnfunc)(HWND, int, void *) = work.func;
1688 retval = clickcolumnfunc(work.window, column_num, work.data); 1744 retval = clickcolumnfunc(work.window, column_num, work.data);
1689 } 1745 }
1690 return retval; 1746 return retval;
1691 }
1692
1693 static gint _container_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data)
1694 {
1695 #if 0
1696 SignalHandler work = _get_signal_handler(widget, data);
1697 char *rowdata = gtk_clist_get_row_data(GTK_CLIST(widget), row);
1698 int (*contextfunc)(HWND, HWND, char *, void *, void *) = work.func;
1699
1700 if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
1701 if(!work.window)
1702 return TRUE;
1703
1704 if(g_object_get_data(G_OBJECT(widget), "_dw_double_click"))
1705 {
1706 g_object_set_data(G_OBJECT(widget), "_dw_double_click", GINT_TO_POINTER(0));
1707 return TRUE;
1708 }
1709 return contextfunc(work.window, 0, rowdata, work.data, 0);;
1710 #endif
1711 return TRUE;
1712 } 1747 }
1713 1748
1714 static int _round_value(gfloat val) 1749 static int _round_value(gfloat val)
1715 { 1750 {
1716 int newval = (int)val; 1751 int newval = (int)val;
3737 3772
3738 DW_MUTEX_LOCK; 3773 DW_MUTEX_LOCK;
3739 store = gtk_list_store_new(1, G_TYPE_STRING); 3774 store = gtk_list_store_new(1, G_TYPE_STRING);
3740 tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store)); 3775 tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
3741 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(tmp), 0); 3776 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(tmp), 0);
3777 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(tmp))), text);
3742 gtk_widget_show(tmp); 3778 gtk_widget_show(tmp);
3743 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_COMBOBOX); 3779 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_COMBOBOX);
3744 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 3780 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
3745 DW_MUTEX_UNLOCK; 3781 DW_MUTEX_UNLOCK;
3746 return tmp; 3782 return tmp;
4248 DW_MUTEX_LOCK; 4284 DW_MUTEX_LOCK;
4249 if((tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_mdi_title"))) 4285 if((tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_mdi_title")))
4250 handle = tmp; 4286 handle = tmp;
4251 if(GTK_IS_ENTRY(handle)) 4287 if(GTK_IS_ENTRY(handle))
4252 gtk_entry_set_text(GTK_ENTRY(handle), text); 4288 gtk_entry_set_text(GTK_ENTRY(handle), text);
4253 #if 0
4254 else if(GTK_IS_COMBO_BOX(handle)) 4289 else if(GTK_IS_COMBO_BOX(handle))
4255 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO_BOX(handle)->entry), text); 4290 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(handle))), text);
4256 #endif
4257 else if(GTK_IS_LABEL(handle)) 4291 else if(GTK_IS_LABEL(handle))
4258 gtk_label_set_text(GTK_LABEL(handle), text); 4292 gtk_label_set_text(GTK_LABEL(handle), text);
4259 else if(GTK_IS_BUTTON(handle)) 4293 else if(GTK_IS_BUTTON(handle))
4260 { 4294 {
4261 gtk_button_set_label(GTK_BUTTON(handle), text); 4295 gtk_button_set_label(GTK_BUTTON(handle), text);
4289 int _locked_by_me = FALSE; 4323 int _locked_by_me = FALSE;
4290 4324
4291 DW_MUTEX_LOCK; 4325 DW_MUTEX_LOCK;
4292 if(GTK_IS_ENTRY(handle)) 4326 if(GTK_IS_ENTRY(handle))
4293 possible = gtk_entry_get_text(GTK_ENTRY(handle)); 4327 possible = gtk_entry_get_text(GTK_ENTRY(handle));
4294 #if 0
4295 else if(GTK_IS_COMBO_BOX(handle)) 4328 else if(GTK_IS_COMBO_BOX(handle))
4296 possible = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO_BOX(handle)->entry)); 4329 possible = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(handle))));
4297 #endif
4298 4330
4299 DW_MUTEX_UNLOCK; 4331 DW_MUTEX_UNLOCK;
4300 return strdup(possible); 4332 return strdup(possible);
4301 } 4333 }
4302 4334
10287 } 10319 }
10288 else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0) 10320 else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0)
10289 { 10321 {
10290 thisname = "row-expanded"; 10322 thisname = "row-expanded";
10291 } 10323 }
10292 #if 0 10324 else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0)
10293 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0)
10294 { 10325 {
10295 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event); 10326 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event);
10296 cid = g_signal_connect(G_OBJECT(thiswindow), "key_press_event", GTK_SIGNAL_FUNC(_container_enter_event), (gpointer)sigid); 10327 cid = g_signal_connect(G_OBJECT(thiswindow), "key_press_event", G_CALLBACK(_container_enter_event), (gpointer)sigid);
10297 _set_signal_handler_id(thiswindow, sigid, cid); 10328 _set_signal_handler_id(thiswindow, sigid, cid);
10298 10329
10299 thisname = "button_press_event"; 10330 thisname = "button_press_event";
10300 thisfunc = _findsigfunc(DW_SIGNAL_ITEM_ENTER); 10331 thisfunc = _findsigfunc(DW_SIGNAL_ITEM_ENTER);
10301 } 10332 }
10302 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) 10333 #if 0
10303 {
10304 thisname = "select_row";
10305 thisfunc = (void *)_container_select_row;
10306 }
10307 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
10308 {
10309 thisname = "button_press_event";
10310 thisfunc = _findsigfunc(DW_SIGNAL_ITEM_CONTEXT);
10311 }
10312 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_COLUMN_CLICK) == 0) 10334 else if (GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_COLUMN_CLICK) == 0)
10313 { 10335 {
10314 thisname = "click-column"; 10336 thisname = "click-column";
10315 } 10337 }
10316 else if (GTK_IS_COMBO_BOX(thiswindow) && strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0) 10338 else if (GTK_IS_COMBO_BOX(thiswindow) && strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0)