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-программы */