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

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

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

gtk_widget_grab_focus(widget);

23.4.2. Π£ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠ², поля Π²Π²ΠΎΠ΄Π° ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ

Для размСщСния (ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ) Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° Π² ΠΎΠΊΠ½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° основных Π²ΠΈΠ΄Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²ΠΈΠ΄ Π² качСствС прародитСля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса GtkBin, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса GtkContainer. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π²ΠΈΠ΄ΠΆΠΈΡ‚, поэтому ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для создания спСцифичСских интСрфСйсов: ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ρ€Π°ΠΌΠΊΠΈ, ΠΎΠΊΠ½Π°.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ β€” ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠ². Π§Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹:

♦ GtkHBox β€” позволяСт Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ;

♦ GtkVBox β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ размСщСния Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠ²;

♦ GtkFixed β€” позволяСт Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ Π² фиксированных ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ…;

♦ GtkTable β€” позволяСт ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

НаиболСС ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Π½Π° ΠΌΠΎΠΉ взгляд, являСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ GtkTable, поэтому Π² этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ ΠΌΡ‹ рассмотрим ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π³ΠΎ. GtkTable ΠΌΠΎΠΆΠ΅Ρ‚ с успСхом Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ, ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ β€” Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ стоит Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ столбца?

ΠšΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° GtkTable, Π² этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны:

♦ ΠΏΠΎΠ»Ρ для Π²Π²ΠΎΠ΄Π° тСкста ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ;

♦ ΠΊΠ½ΠΎΠΏΠΊΠΈ;

♦ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄.

БСйчас ΠΌΡ‹ напишСм нСбольшой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² Ρ„Π°ΠΉΠ» /etc/resolv.conf. Напомню Π²Π°ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ этого Ρ„Π°ΠΉΠ»Π°:

domain firma.ru

nameserver 192.168.0.1

nameserver 192.168.0.2

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° domain опрСдСляСт наш Π΄ΠΎΠΌΠ΅Π½, Π° Π΄Π²Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ nameserver β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ DNS-сСрвСры, соотвСтствСнно. Наш ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² настоящий Ρ„Π°ΠΉΠ» /etc/resolv.conf β€” для этого Π½ΡƒΠΆΠ½Ρ‹ ΠΏΡ€Π°Π²Π° ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» resolv.conf, сгСнСрированный нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /etc.

На рисункС 23.2 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° ΡƒΠΆΠ΅ готовая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ½Π° Ρ‚Π°ΠΊ. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π΄Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° ΠΈ Π½Π°ΠΆΠΌΠ΅Ρ‚ Enter, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΈΠΌ тСкст Π½Π° консоли. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΌΠ΅Ρ‚ OK, ввСдСнная ΠΈΠΌ информация Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ Ρ€Π°Π· Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° Π½Π° консоль ΠΈ записана Π² Ρ„Π°ΠΉΠ». ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Quit ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Она Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ закрытия ΠΎΠΊΠ½Π° β€” Π² GTK программист сам опрСдСляСт Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° стандартныС ΠΊΠ½ΠΎΠΏΠΊΠΈ.

Рис. 23.3. Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚ΠΎΡ€

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· рисунка, Π½Π°ΠΌ понадобятся Ρ‚Ρ€ΠΈ поля Π²Π²ΠΎΠ΄Π°, Ρ‚Ρ€ΠΈ надписи ΠΈ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Поля Π²Π²ΠΎΠ΄Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² массивС:

GtkWidget *edit[3];

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ для Π²Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_entry_new():

edit[i] = gtk_entry_new();

ПослС создания поля Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_entry_set_editable(), ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ смоТСт ввСсти Π² это ΠΏΠΎΠ»Π΅.

gtk_entry_set_editable(GTK_ENTRY(edit[i]), 1);

Ну ΠΈ, само собой разумССтся, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши Enter β€” сигнал activate:

gtk_signal_connect(GTK_OBJECT(edit[i]), "activate",

GTK_SIGNAL_FUNC(enter_callback), edit[i]);

Π’Π΅ΡΡŒΠΌΠ° ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° этапС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π° консоли. Для этого Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ enter_callback(), которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»Π° Π±Ρ‹ содСрТимоС поля Π½Π° консоль. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ:

domain = gtk_entry_get_text(GTK_ENTRY(edit[0]));

dns1 = gtk_entry_get_text(GTK_ENTRY(edit[1]));

dns2 = gtk_entry_get_text(GTK_ENTRY(edit[2]))?

РСакция Π½Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ OK Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

void writetofile(GtkWidget *widget, gpointer data) {

 /* Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_entry_get_text() ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ

  Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ тСкст ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π° */

 domain = gtk_entry_get_text(GTK_ENTRY(edit[0]));

 dns1 = gtk_entry_get_text(GTK_ENTRY(edit[1]));

 dns2 = gtk_entry_get_text(GTK_ENTRY(edit[2]));


 /* Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹ΠΉ тСкст Π½Π° консоль */

 g_print("Domain %s\n", domain);

 g_print("DNS1 %s\n", dns1);

 g_print("DNS2 %s\n", dns2);


 /* ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» resolv.conf Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ */

 if ((resolv = fopen("resolv.conf","w")) == NULL) {

  /* НавСрноС, Π½Π΅Ρ‚ мСста Π½Π° дискС ΠΈΠ»ΠΈ ΠΏΡ€Π°Π² ΠΌΠ°Π»ΠΎΠ²Π°Ρ‚ΠΎ... */

  g_print("ERR: Cannot open resolve.conf file\n");

  gtk_main_quit();

 }


 /* Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ» */

 fprintf(resolv,"domain %s\n",domain);

 fprintf(resolv, "nameserver %s\n",dns1);

 fprintf(resolv,"nameserver %s\n*,dns2);

 fclose(resolv);

}

Если вашС ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ надписСй, Ρ‚ΠΎ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ: ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ всСго ΠΎΠ΄Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ надпись, ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ надпись с использованиСм этой ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ Ρ‚.Π΄. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

label = gtk_label_new("Domain: ");


gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);

gtk_widget_show(label);


label = gtk_label_new("DNS #1; ");

gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);

gtk_widget_show (label);


label = gtk_label_new("DNS #2: ");

gtk_table_attach_defaults (GTK_TABLE(table), label, 0, 1, 2, 3);

gtk_widget_show (label);

Листинг 23.6 содСрТит ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚ΠΎΡ€Π° Resolver.

Листинг 23.6. Π€Π°ΠΉΠ» resolver.c

#include <gtk/gtk.h>

#include <stdlib.h>

#include <stdio.h>


gchar *domain, *dns1, *dns2;


/* Массив ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π°. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для

 Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎΠΌΠ΅Π½Π°, Π΄Π²Π° Π²Ρ‚ΠΎΡ€Ρ‹Ρ… - [1] ΠΈ [2] - для Π²Π²ΠΎΠ΄Π°

 IP-адрСсов сСрвСров DNS */

GtkWidget *edit[3];


/* Наш Ρ„Π°ΠΉΠ» */

FILE *resolv;


/* Ѐункция записи Π² Ρ„Π°ΠΉΠ» */

void writetofile(GtkWidget *widget, gpointer data) {

 /* Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_entry_get_text() ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ

  Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ тСкст ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π° */

 domain = gtk_entry_get_text(GTK_ENTRY(edit[0]));

 dns1 = gtk_entry_get_text(GTK_ENTRY(edit[1]));

 dns2 = gtk_entry_get_text(GTK_ENTRY(edit[2]));


 /* Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹ΠΉ тСкст Π½Π° консоль */

 g_print("Domain %s\n", domain);

 g_print("DNS1 %s\n", dns1);

 g_print("DNS2 %s\n", dns2);


 /* ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» resolv.conf Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ */

 if ((resolv = fopen("resolv.conf","w")) == NULL) {

  /* НавСрноС, Π½Π΅Ρ‚ мСста Π½Π° дискС ΠΈΠ»ΠΈ ΠΏΡ€Π°Π² ΠΌΠ°Π»ΠΎΠ²Π°Ρ‚ΠΎ... */

  g_print("ERR: Cannot open resolve.conf file\n");

  gtk_main_quit();

 }


 /* Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ» */

 fprintf(resolv,"domain %s\n",domain);

 fprintf(resolv,"nameserver %s\n",dns1);

 fprintf(resolv,"nameserver %s\n",dns2);

 fclose(resolv);

}


/* Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΌΠ΅Ρ‚

ΠΊΠ½ΠΎΠΏΠΊΡƒ закрытия ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ Quit */

gint delete_event(GtkWidget *widget, GdkEvent *event,

 gpointer data) {

 /* Ѐункция gtk_main_quit() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ

  Ρ€Π°Π±ΠΎΡ‚Ρ‹ GTK-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НС Π½ΡƒΠΆΠ½ΠΎ для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

 exit() */

 gtk_main_quit();

 return(FALSE);

}


/* Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π΄Π΅Ρ‚ тСкст ΠΈ Π½Π°ΠΆΠΌΠ΅Ρ‚ Enter,

 Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΈΠΌ тСкст Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ Π½Π° консоль */

void enter_callback(GtkWidget *widget,

 GtkWidget *entry) {

 domain = gtk_entry_get_text(GTK_ENTRY(entry));

 printf("Domain: %s\n", domain);

}


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

 GtkWidget *window; /* Окно */

 GtkWidget *button; /* Кнопка */

 GtkWidget *table; /* Π’Π°Π±Π»ΠΈΡ†Π° для размСщСния Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠ² */

 GtkWidget *label; /* Надпись */


 /* Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, всС Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° β€” GtkWidget,

  поэтому ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π΄Π°ΠΆΠ΅ трСмя Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°ΠΌΠΈ β€” для

  ΠΎΠΊΠ½Π°, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов GUI*/

 int i;


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ любой GTK-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

 gtk_init (&argc, &argv);


 /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ */

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);


 /* УстанавливаСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° */

 gtk_window_set_title (GTK_WINDOW(window), "Resolver");


 /* УстанавливаСм Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ закрытия ΠΎΠΊΠ½Π°.

  Π‘ΠΈΠ³Π½Π°Π» - delete_event. Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ delete_event(),

  которая описана Π²Ρ‹ΡˆΠ΅ */

 gtk_signal_connect (GTK_OBJECT (window), "delete_event",

  GTK_SIGNAL_FUNC(delete_event), NULL);


 /* УстанавливаСм Ρ€Π°ΠΌΠΊΡƒ ΠΎΠΊΠ½Π° */

 gtk_container_set_border_width(GTK_CONTAINER (window), 20);


 /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ 3x3 */

 table = gtk_table_new (3, 3, TRUE);


 /* ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ! */

 gtk_container_add(GTK_CONTAINER (window), table);


 /* РисуСм надписи, ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΈΡ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ.

  ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этом случаС Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ

  ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ надписи */

 label = gtk_label_new("Domain: ");


 /* О ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… ячССк ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ послС этого листинга */