Index: work/gtk/propedit.c =================================================================== --- work/gtk/propedit.c (revision 2751) +++ work/gtk/propedit.c (revision 2752) @@ -3,16 +3,34 @@ #include typedef struct { - GtkWidget *entry_val; - GtkListStore *vals; + + /* value entry */ + GtkWidget *entry_val; /* text entry */ + GtkWidget *val_box; /* combo box */ + GtkListStore *vals; /* model of the combo box */ + int stock_val; /* 1 if the value in the entry box is being edited from the combo */ } propedit_dialog_t; static void val_combo_changed_cb(GtkComboBox * combo, propedit_dialog_t *dlg) { - gtk_entry_set_text(GTK_ENTRY(dlg->entry_val), "wohoo"); + char *cval; + GtkTreeIter iter; + if (gtk_combo_box_get_active_iter(combo, &iter)) { + gtk_tree_model_get(GTK_TREE_MODEL(dlg->vals), &iter, 0, &cval, -1); + dlg->stock_val = 1; + gtk_entry_set_text(GTK_ENTRY(dlg->entry_val), cval); + } } +static void val_entry_changed_cb(GtkComboBox * combo, propedit_dialog_t *dlg) +{ + if (dlg->stock_val == 0) + gtk_combo_box_set_active(GTK_COMBO_BOX(dlg->val_box), -1); + else + dlg->stock_val = 0; +} + static void add_hdr(GtkWidget *tree, const char *name) { GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); @@ -22,7 +40,7 @@ int main(int argc, char *argv[]) { static propedit_dialog_t dlg; - GtkWidget *window, *vbox_tree, *vbox_edit, *hbox_win, *label, *tree, *val_box; + GtkWidget *window, *vbox_tree, *vbox_edit, *hbox_win, *label, *tree; gtk_init(&argc, &argv); @@ -66,7 +84,7 @@ label = gtk_label_new("(preview)"); gtk_box_pack_start(GTK_BOX(vbox_edit), label, TRUE, TRUE, 4); - label = gtk_label_new("(edit)"); + label = gtk_label_new("Change value"); gtk_box_pack_start(GTK_BOX(vbox_edit), label, FALSE, TRUE, 4); @@ -74,6 +92,7 @@ GtkWidget *hbox_val_edit; GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); + dlg.stock_val = 0; dlg.vals = gtk_list_store_new(1, G_TYPE_STRING); hbox_val_edit = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_edit), hbox_val_edit, FALSE, TRUE, 4); @@ -82,19 +101,21 @@ gtk_list_store_insert_with_values(dlg.vals, NULL, -1, 0, "val0", -1); gtk_list_store_insert_with_values(dlg.vals, NULL, -1, 0, "val1", -1); - val_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(dlg.vals)); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(val_box), renderer, TRUE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(val_box), renderer, "text", 0, NULL); - gtk_box_pack_start(GTK_BOX(hbox_val_edit), val_box, FALSE, TRUE, 4); + dlg.val_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(dlg.vals)); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dlg.val_box), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dlg.val_box), renderer, "text", 0, NULL); + gtk_box_pack_start(GTK_BOX(hbox_val_edit), dlg.val_box, FALSE, TRUE, 4); - g_signal_connect(G_OBJECT(val_box), "changed", G_CALLBACK(val_combo_changed_cb), &dlg); + g_signal_connect(G_OBJECT(dlg.val_box), "changed", G_CALLBACK(val_combo_changed_cb), &dlg); - /* entry */ dlg.entry_val = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox_val_edit), dlg.entry_val, TRUE, TRUE, 4); + g_signal_connect(G_OBJECT(dlg.entry_val), "changed", G_CALLBACK(val_entry_changed_cb), &dlg); + + gtk_widget_show_all(window); gtk_main();