My-library.info
Все категории

Денис Колисниченко - Linux: Полное руководство

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Денис Колисниченко - Linux: Полное руководство. Жанр: Программное обеспечение издательство -, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Linux: Полное руководство
Издательство:
-
ISBN:
-
Год:
-
Дата добавления:
17 сентябрь 2019
Количество просмотров:
474
Читать онлайн
Денис Колисниченко - Linux: Полное руководство

Денис Колисниченко - Linux: Полное руководство краткое содержание

Денис Колисниченко - Linux: Полное руководство - описание и краткое содержание, автор Денис Колисниченко, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info
Данная книга представляет собой великолепное руководство по Linux, позволяющее получить наиболее полное представление об этой операционной системе. Книга состоит из трех частей, каждая из которых раскрывает один из трех основных аспектов работы с Linux: Linux для пользователя, сетевые технологии Linux (и методика настройки Linux-сервера), программирование Linux. В книге охвачен очень широкий круг вопросов, начиная с установки и использования Linux «в обычной жизни» (офисные пакеты, игры, видео, Интернет), и заканчивая описанием внутренних процессов Linux, секретами и трюками настройки, особенностями программирования под Linux, созданием сетевых приложений, оптимизацией ядра и др.Изложение материала ведется в основном на базе дистрибутивов Fedora Cora (Red Hat) и Mandriva (Mandrake). Однако не оставлены без внимания и другие дистрибутивы SuSe, Slackware, Gentoo, Alt Linux, Knоppix. Дается их сравнительное описание, a по ходу изложения всего материала указываются их особенности.Книга написана известными специалистами и консультантами по использованию Linux, авторами многих статей и книг по Linux, заслуживших свое признание в самых широких Linux-кругах. Если вы желаете разобраться в особенностях Linux и познать ее внутренний мир, эта книга — ваш лучший выбор.

Linux: Полное руководство читать онлайн бесплатно

Linux: Полное руководство - читать книгу онлайн бесплатно, автор Денис Колисниченко

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 %sn", domain);

 g_print("DNS1 %sn", dns1);

 g_print("DNS2 %sn", dns2);


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

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

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

  g_print("ERR: Cannot open resolve.conf filen");

  gtk_main_quit();

 }


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

 fprintf(resolv,"domain %sn",domain);

 fprintf(resolv, "nameserver %sn",dns1);

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

 g_print("DNS1 %sn", dns1);

 g_print("DNS2 %sn", dns2);


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

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

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

  g_print("ERR: Cannot open resolve.conf filen");

  gtk_main_quit();

 }


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

 fprintf(resolv,"domain %sn",domain);

 fprintf(resolv,"nameserver %sn",dns1);

 fprintf(resolv,"nameserver %sn",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: %sn", 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: ");


 /* О координатах ячеек поговорим после этого листинга */


Денис Колисниченко читать все книги автора по порядку

Денис Колисниченко - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


Linux: Полное руководство отзывы

Отзывы читателей о книге Linux: Полное руководство, автор: Денис Колисниченко. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.