Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux: ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 133

Автор ДСнис ΠšΠΎΠ»ΠΈΡΠ½ΠΈΡ‡Π΅Π½ΠΊΠΎ

ΠŸΠ΅Ρ€Π²Π°Ρ функция добавляСт Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² Π½Π°Ρ‡Π°Π»ΠΎ списка, Π° вторая β€” Π² Π΅Π³ΠΎ ΠΊΠΎΠ½Π΅Ρ†. Если Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

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" } };

 for(indx=0; indx < 4; indx++)

  gtk_clist_append((GtkCList *) data, dist[indx]);

 return;

}


/* ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ */

void button_clear_clicked(gpointer data) {

 /* ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ список */

 gtk_clist_clear((GtkCList *)data);

 return;

}


/* Ѐункция прячСт/ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ */

void button_hide_show_clicked(gpointer data) {

 /* 0 = сСйчас Π²ΠΈΠ΄ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ */

 static short int flag = 0;

 if (flag == 0) {

  /* прячСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ */

  gtk_clist_column_titles_hide((GtkCList *)data);

  flag++;

 } else {

  /* ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ */

  gtk_clist_column_titles_show((GtkCList *)data);

 }

 return;

}


/* Данная функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚

 ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ */

void selection_made(GtkWidget *clist, gint row,

 gint column, GdkEventButton *event, gpointer data) {

 gchar *text;


 /* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ тСкст (элСмСнт списка) */

 gtk_clist_get_text(GTK_CLIST(clist), row, column, &text);

 /* ΠŸΡ€ΠΎΡΡ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π° консоль */

 g_print(

  "Π’Ρ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ ряд %d. Колонка %d, тСкст Π² ячСйкС %s\n\n",

  row, column, text);

 return;

}


int main(int argc, gchar *argv[]) {

 GtkWidget *window;

 GtkWidget *vbox, *hbox;

 GtkWidget *scrolled_window, *clist;

 GtkWidget *button_add, *button_clear, *button_hide_show;

 gchar *titles[2] = { "НомСр", "Дистрибутив" };


 setlocale(LC_ALL, "ru_RU.KOI8-R");


 // НуТно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π”Πž gtk_init()

 gtk_init(&argc, &argv);


 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_set_usize(GTK_WIDGET(window), 300, 150);


 gtk_window_set_title(GTK_WINDOW(window), "Бписок");

 gtk_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

 vbox=gtk_vbox_new(FALSE, 5);

 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);

 gtk_container_add(GTK_CONTAINER(window), vbox);

 gtk_widget_show(vbox);


 /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ с полосками ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ Π²

  Π½Π΅Π³ΠΎ список */

 scrolled_window = gtk_scrolled_window_new(NULL, NULL);

 gtk_scrolled_window_set_policy(

  GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC,

  GTK_POLIΠ‘Y_ALWAYS);

 gtk_box_pack_start(GTK_BOX(vbox), scrolled_window,

  TRUE, TRUE, 0);

 gtk_widget_show(scrolled_window);


 /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ список с двумя ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌΠΈ */

 clist = gtk_clist_new_with_titles(2, titles);


 /* ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° выдСлСния */

 gtk_signal_connect(GTK_OBJECT(clist), "select_row",

  GTK_SIGNAL_FUNC(selection_made), NULL);


 /* УстанавливаСм Ρ‚Π΅Π½ΡŒ для Ρ€Π°ΠΌΠΊΠΈ списка */

 gtk_clist_set_shadow_type(GTK_CLIST(clist),

  GTK_SHADOW_OUT);

 /* УстанавливаСм ΡˆΠΈΡ€ΠΈΠ½Ρƒ для ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ. Колонки Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ

  с 0 */

 gtk_clist_set_column_width(GTK_CLIST(clist), 0, 150);


 /* ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ список Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ */

 gtk_container_add(GTK_CONTAINER(scrolled_window), clist);

 gtk_widget_show(clist);


 /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ список,

  ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ, Π‘ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ/ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ */

 hbox = gtk_hbox_new(FALSE, 0);

 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);

 gtk_widget_show(hbox);


 button_add = gtk_button_new_with_label("Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ");

 button_clear = gtk_button_new_with_label("ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ");

 button_hide_show = gtk_button_new_with_label("Π‘ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ/ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ");


 gtk_box_pack_start(GTK_BOX(hbox), button_add,

  TRUE, TRUE, 0);

 gtk_box_pack_start(GTK_BOX(hbox), button_clear,

  TRUE, TRUE, 0);

 gtk_box_pack_start(GTK_BOX(hbox), button_hide_show,

  TRUE, TRUE, 0);


 /* БвязываСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ */

 gtk_signal_connect_object(GTK_OBJECT(button_add),

  "clicked",

  GTK_SIGNAL_FUNC(button_add_clicked), (gpointer) clist);

  gtk_signal_connect_object(GTK_OBJECT(button_clear),

  "clicked",

  GTK_SIGNAL_FUNC(button_clear_clicked),(gpointer)clist);

 gtk_signal_connect_object(GTK_OBJECT(button_hide_show),

  "clicked", GTK_SIGNAL_FUNC(button_hide_show_clicked),

  (gpointer)clist);


 gtk_widget_show(button_add);

 gtk_widget_show(button_clear);

 gtk_widget_show(button_hide_show);

 gtk_widget_show(window);

 gtk_main();

 return(0);

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ: ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ создаСтся список, состоящий ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΠΉ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… популярных дистрибутивов Linux. Кнопка ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ список, Π° Π‘ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ/ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ прячСт ΠΈΠ»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ списка. ΠŸΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ячСйкС списка Π½Π° консоль выводится ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС β€” ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ячСйки ΠΈ Π΅Π΅ тСкст.

Рис 23.5.

< … стр. 639–640 … >

void destroy(GtkWidget *widget, gpointer data);

static void button_click(GtkWidget *widget, gpointer data);


int main(int argc, char *argv[]) {

 GtkWidget *window;

 GtkWidget *button;

 GtkWidget *label;

 w_ctrl ctrl;

 gchar *caption;


 setlocale(LC_ALL, "ru_RU.KOI8-R");

 caption = g_strdup_printf("Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток!");

 gtk_init(&argc, &argv);


 window = gtk_window_new( GTK_WINDOW_TOPLEVEL);


 gtk_signal_connect(GTK_OBJECT(window), "delete_event",

  GTK_SIGNAL_FUNC(delete_event), NULL);

 gtk_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(destroy), &ctrl);


 gtk_window_set_title(GTK_WINDOW(window), caption);


 gtk_container_set_border_width(GTK_CONTAINER(window), 10);


 button = gtk_button_new();

 label = gtk_label_new(" -== НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ ==- " );


 ctrl.app_window = window;

 ctrl.label = label;


 gtk_container_add(GTK_CONTAINER(button), label);

 gtk_container_add(GTK_CONTAINER(window), button);


 gtk_signal_connect(GTK_OBJECT(button), "clicked",

  GTK_SIGNAL_FUNC(button_click), &ctrl);


 gtk_widget_show_all(window);

 gtk_main();

 return(0);

}


// ****************************************************


void quit_confirm(GtkWidget *widget) {

 GtkWidget *quit_form;

 GtkWidget *label;

 GtkWidget *yes_button, *no_button;


 quit_form = gtk_dialog_new();

 gtk_window_set_position(GTK_WINDOW(quit_form),

  GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(quit_form),

  10);


 label =

  gtk_label_new("\n Π’Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΉΡ‚ΠΈ? \n*);

 yes_button = gtk_button_new_with_label("Π”Π°");

 no_button = gtk_button_new_with_label("НСт");


 gtk_signal_connect_object(GTK_OBJECT(yes_button),

  "clicked",

  GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)widget);


 gtk_container_add(

  GTK_CONTAINER(GTK_DIALOG(quit_form)->action_area), yes_button);


 gtk_signal_connect_object(GTK_OBJECT(no_button),

  "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),

  (gpointer)quit_form);


 gtk_container_add(

  GTK_CONTAINER(GTK_DIALOG(quit_form)->action_area), no_button);


 gtk_container_add(

  GTK_CONTAINER(GTK_DIALOG(quit_form)->vbox), label);


 gtk_window_set_modal(GTK_WINDOW(quit_form), TRUE);


 gtk_widget_show_all(quit_form);

}


gint delete_event(GtkWidget *widget, GdkEvent *event,

 gpointer data) {

 quit_confirm(widget);

 return(TRUE);

}


void destroy(GtkWidget *widget, gpointer data) {

 printf{"GOOD-BYE!");

 gtk_main_quit();

}


static void button_click(GtkWidget *widget,

 gpointer data ) {

 static gint i = 0;

 GtkWidget *app_window;

 GtkWidget *label;

 gchar msg[256];

 app_window = GTK_WIDGET(((w_ctrl *)data)->app_window);

 label = GTK_WIDGET(((w_ctrl*)data)->label);

 i++;

 sprintf(msg, "Π’Ρ‹ Π½Π°ΠΆΠ°Π»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ: %d Ρ€Π°Π·(Π°)", i);