gtk_window_set_title(GTK_WINDOW(window),
  'Выберите дистрибутив');
 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
 box1 = gtk_vbox_new(FALSE, 0);
 gtk_container_add(GTK_CONTAINER(window), box1);
 gtk_widget_show(box1);
 box2 = gtk_vbox_new(FALSE, 10);
 gtk_container_set_border_width(GTK_CONTAINER (box2), 10);
 gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
 gtk_widget_show(box2);
 button = gtk_radio_button_new_with_label(NULL, 'Red Hat');
 gtk_box_pack_start(GTK_BOX(box2), button,
  TRUE, TRUE, 0);
 gtk_widget_show(button);
 group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
 button =
  gtk_radio_button_new_with_label(group, 'Mandrake');
 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
  TRUE);
 gtk_box_pack_start(GTK_BOX(box2), button,
  TRUE, TRUE, 0);
 gtk_widget_show(button);
 button = gtk_radio_button_new_with_label(
  gtk_radio_button_group(GTK_RADIO_BUTTON(button)),
  'ALT Linux');
 gtk_box_pack_start(GTK_BOX(box2), button,
  TRUE, TRUE, 0);
 gtk_widget_show(button);
 separator = gtk_hseparator_new();
 gtk_box_pack_start(GTK_BOX(box1), separator,
  FALSE, TRUE, 0);
 gtk_widget_show(separator);
 box2 = gtk_vbox_new(FALSE, 10);
 gtk_container_set_border_width(GTK_CONTAINER(box2), 10);
 gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, TRUE, 0);
 gtk_widget_show(box2);
 button = gtk_button_new_with_label('OK');
 gtk_signal_connect_object(GTK_OBJECT (button),
  'clicked', GTK_SIGNAL_FUNC(close_application),
  GTK_OBJECT(window));
 gtk_box_pack_start(GTK_BOX (box2), button,
  TRUE, TRUE, 0);
 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
 gtk_widget_grab_default(button);
 gtk_widget_show(button);
 gtk_widget_show(window);
 gtk_main();
 return(0);
}
 Рис. 23.4. Зависимые переключатели
23.4.4. Список
Виджит CList представляет собой список, состоящий из нескольких колонок. Ячейки такого списка могут содержать текстовые значения. Мы можем обратиться отдельно к каждой ячейке списка. Создать список можно одной из функций:
GtkWidget *gtk_clist_new(gint columns);
GtkWidget *gtk_clist_new_with_titles(gint columns,
 gchar *titles[]);
Первая функция создает список без заголовков, а вторая с заголовками. Параметр columns задает число колонок.
Добавить элемент в список позволяют функции:
gint gtk_clist_prepend(GtkCList *clist, gchar *text[]);
gint gtk_clist_append(GtkCList *clist, gchar *text[]);
Первая функция добавляет новый элемент в начало списка, а вторая — в его конец. Если вам необходимо вставить элемент в определенную позицию, вам нужно использовать функцию:
void gtk_clist_insert(GtkCList *clist, gint row, gchar *text[]);
Она позволяет вставить новый элемент в строку row. Нумерация строк списка начинается с 0.
Для удаления элементов списка можно использовать одну из функций:
void gtk_clist_remove(GtkCList *clist, gint row);
void gtk_clist_clear(GtkCList *clist);
Первая удаляет строку row, а вторая очищает весь список.
Рассмотрим листинг 23.8, в котором демонстрируется работа со списком CList. Программа снабжена подробными комментариями, поэтому рекомендую внимательно читать исходный код.
Листинг 23.8. Применение виджита CList
#include <gtk/gtk.h>
/* Нужен для функции setlocale() */
#include <locale.h>
/* Добавляет список - обработчик кнопки Добавить */
void button_add_clicked(gpointer data) {
 int indx;
 /* Простой список */
 gchar *dist[4][2] = { { '1', 'Red Hat Linux' },
  { '2', 'Mandrake Linux' },
  { '3', 'ALT Linux' },
  { '4', 'ASP Linux' } };
