g_print('ERR: Cannot open resolve.conf file ');

  gtk_main_quit();

 }

 /* Запись в файл */

 fprintf(resolv,'domain %s ',domain);

 fprintf(resolv, 'nameserver %s ',dns1);

 fprintf(resolv,'nameserver %s *,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 ', domain);

 g_print('DNS1 %s ', dns1);

 g_print('DNS2 %s ', dns2);

 /* Перезаписываем файл resolv.conf в текущем каталоге */

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

  /* Наверное, нет места на диске или прав маловато... */

  g_print('ERR: Cannot open resolve.conf file ');

  gtk_main_quit();

 }

 /* Запись в файл */

 fprintf(resolv,'domain %s ',domain);

 fprintf(resolv,'nameserver %s ',dns1);

 fprintf(resolv,'nameserver %s ',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 ', domain);

}

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

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

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

 GtkWidget *table; /* Таблица для размещения виджитов */

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

 /* Как видите, все виджиты одного типа — GtkWidget,

  поэтому мы могли бы обойтись даже тремя виджитами — для

  окна, таблицы и для всех остальных элементов GUI*/

 int i;

 /* Инициализация любой GTK-программы */

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату