#include #include void on_cursor_changed(GtkTreeView *tree_view, gpointer data); int main(int argc, char *argv[]) { gtk_init(&argc, &argv); // Creating visual elements GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL), *tree_view = gtk_tree_view_new(); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes( "title", renderer, "text", 0, NULL); gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column, 0); // Creating model GtkTreeStore *model = gtk_tree_store_new(1, G_TYPE_STRING); // Adding toplevel rows GtkTreeIter iter; gtk_tree_store_append(model, &iter, NULL); gtk_tree_store_set(model, &iter, 0, "line 0", -1); gtk_tree_store_append(model, &iter, NULL); gtk_tree_store_set(model, &iter, 0, "line 1", -1); gtk_tree_store_append(model, &iter, NULL); gtk_tree_store_set(model, &iter, 0, "line 2 with children", -1); // Adding children rows GtkTreeIter child; gtk_tree_store_append(model, &child, &iter); gtk_tree_store_set(model, &child, 0, "child line 1", -1); gtk_tree_store_append(model, &child, &iter); gtk_tree_store_set(model, &child, 0, "child line 2", -1); // Binding model to view gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(model)); // Selecting a line gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, "0"); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); gtk_tree_selection_select_iter(selection, &iter); // Connecting selection callback to view g_signal_connect(G_OBJECT(tree_view), "cursor-changed", G_CALLBACK(on_cursor_changed), NULL); gtk_widget_show(tree_view); // Gran finale gtk_container_add(GTK_CONTAINER(window), tree_view); gtk_widget_show(window); gtk_main(); return 0; } void on_cursor_changed(GtkTreeView *tree_view, gpointer data) { GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view); GtkTreeIter iter; GtkTreeModel *model; bool has_selection = gtk_tree_selection_get_selected( selection, &model, &iter); //if (!has_selection) return; gchar *path_str = gtk_tree_model_get_string_from_iter(model, &iter); if (strncmp(path_str, "0", 2) == 0) { g_print("1st line selected\n"); } else if (strncmp(path_str, "1", 2) == 0) { g_print("2nd line selected\n"); } else if (strncmp(path_str, "2", 2) == 0) { g_print("3rd line selected\n"); } else if (strncmp(path_str, "2:", 2) == 0) { GtkTreePath *path = gtk_tree_path_new_from_string(path_str); gint *indices = gtk_tree_path_get_indices(path); g_print("Child #%d from 3rd line selected\n", indices[1]); } g_free(path_str); }