GTK+ FAQ
<<< Previous |  | Next >>>

# Development with GTK+: widget specific questions

# How do I find out about the selection of a GtkList?

Get the selection something like this:

    GList *sel;
    sel = GTK_LIST(list)->selection;

This is how GList is defined (quoting glist.h):

    typedef struct _GList GList;

    struct _GList
    {
      gpointer data;
      GList *next;
      GList *prev;
    };

A GList structure is just a simple structure for doubly linked lists. There exist several g_list_*() functions to modify a linked list in glib.h. However the GTK_LIST(MyGtkList)->selection is maintained by the gtk_list_*() functions and should not be modified.

The selection_mode of the GtkList determines the selection facilities of a GtkList and therefore the contents of GTK_LIST(AnyGtkList)->selection:

`selection_mode` | `GTK_LIST()->selection` contents
--- | ---
`GTK_SELECTION_SINGLE` | selection is either NULL or contains a GList* pointer for a single selected item.
`GTK_SELECTION_BROWSE` | selection is NULL if the list contains no widgets, otherwise it contains a GList* pointer for one GList structure.
`GTK_SELECTION_MULTIPLE` | selection is NULL if no listitems are selected or a a GList* pointer for the first selected item. that in turn points to a GList structure for the second selected item and so on.
`GTK_SELECTION_EXTENDED` | selection is NULL.

The data field of the GList structure GTK_LIST(MyGtkList)->selection points to the first GtkListItem that is selected. So if you would like to determine which listitems are selected you should go like this:

    {
            gchar           *list_items[]={
                                    "Item0",
                                    "Item1",
                                    "foo",
                                    "last Item",
                            };
            guint           nlist_items=sizeof(list_items)/sizeof(list_items[0]);
            GtkWidget       *list_item;
            guint           i;

            list=gtk_list_new();
            gtk_list_set_selection_mode(GTK_LIST(list), GTK_SELECTION_MULTIPLE);
            gtk_container_add(GTK_CONTAINER(AnyGtkContainer), list);
            gtk_widget_show (list);

            for (i = 0; i < nlist_items; i++)
            {
                    list_item=gtk_list_item_new_with_label(list_items[i]);
                    gtk_object_set_user_data(GTK_OBJECT(list_item), (gpointer)i);
                    gtk_container_add(GTK_CONTAINER(list), list_item);
                    gtk_widget_show(list_item);
            }
    }

To get known about the selection:

    {
            GList   *items;

            items=GTK_LIST(list)->selection;

            printf("Selected Items: ");
            while (items) {
                    if (GTK_IS_LIST_ITEM(items->data))
                            printf("%d ", (guint)
                    gtk_object_get_user_data(items->data));
                    items=items->next;
            }
            printf("\n");
    }

<<< Previous | Home | Next >>>
Why does GTK+/GLib leak memory? |  | How do I stop the column headings of a GtkCList disappearing when the list is scrolled?