Основы программирования в Linux - Нейл Мэтью
Шрифт:
Интервал:
Закладка:
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_TITLE, "Title", renderer, "text",
COLUMN_TITLE, NULL);
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_ARTIST, "Artist", renderer, "text",
COLUMN_ARTIST, NULL);
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_CATALOGUE, "Catalogue", renderer, "text",
COLUMN_CATALOGUE, NULL);
gtk_container_add(GTK_CONTAINER(window), view);
gtk_widget_show_all(window); gtk_main();
return 0;
}
Вы будете применять GtkTreeView как основной объект вашего приложения для работы с компакт-дисками, когда будете модифицировать содержимое GtkTreeView в соответствии с запросами к базе данных компакт-дисков.
Мы завершили обзор виджетов GTK+ и теперь обратим наше внимание на другую половину: среду GNOME. Вы увидите, как вставлять меню в ваше приложение с помощью библиотек GNOME и как виджеты GNOME облегчают программирование для рабочего стола GNOME.
Виджеты GNOME
Комплект GTK+ спроектирован как нейтральный по отношению к рабочему столу, т.е. GTK+ не делает никаких допущений о том, что он выполняется в среде GNOME или даже в системе Linux. Причина заключается в том, что комплект инструментов GTK+ можно с относительной легкостью перенести для выполнения в ОС Windows или любой другой оконной системе. В результате GTK+ не хватает средств для связывания программы с рабочим столом, таких как средства сохранения настройки программы, отображение файлов помощи или программные апплеты (апплеты — это небольшие утилиты, выполняющиеся на краевых панелях (edge panels)).
Библиотеки среды включают виджеты GNOME, расширяющие комплект GTK+ и замещающие его части более легкими в применении виджетами. В этом разделе мы расскажем, как программировать с помощью виджетов GNOME.
Перед использованием библиотек GNOME их следует инициализировать при запуске ваших программ точно так же, как вы поступали с библиотеками GTK+. Вы вызываете функцию gnome_program_init также, как вы вызывали функцию gtk_init в чистых программах GTK+.
Эта функция принимает параметры app_id и арр_version, применяемые для описания вашей программы в среде GNOME, module_info, сообщающий GNOME о том, какой библиотечный модуль инициализировать, параметры командной строки и свойства приложения, заданные как NULL-терминированный список пар "имя/значение".
GnomeProgram* gnome_program_init(const char *app_id,
const char *app_version, const GnomeModuleInfо *module_infо,
int argc, char **argv, const char *first_property_name, ...);
Необязательный список свойств позволяет задать такие характеристики, как, например, каталог для поиска растровой графики.
Выполните упражнение 16.8.
Упражнение 16.8. Окно GNOMEДавайте рассмотрим программу, применяющую средства GNOME, в которой выполняется GNOME-замещение объекта GtkWindow виджетом GnomeApp.
Введите эту программу и назовите ее gnome1.c:
#include <gnome.h>
int main(int argc, char* argv[]) {
GtkWidget *app;
gnome_program_init("gnome1", "1.0", MODULE, argc, argv, NULL);
app = gnome_app_new("gnome1", "The Window Title");
gtk_widget_show(app);
gtk_main();
return 0;
}
Для компиляции вам необходимо включить заголовочные файлы GNOME, поэтому передайте библиотеки libgnomeui и libgnome в команду pkg-config:
$ gcc gnome1.с -о gnome1 `pkg-config --cflags --libs libgnome-2.0 libgnomeui-2.0`
Виджет GnomeApp расширяет возможности GtkWindow и облегчает вставку меню, панелей инструментов и строки состояния вдоль нижнего края окна. Поскольку он потомок GtkWindow, вы можете применять к виджету GnomeApp любую функцию виджета GtkWindow. Далее вы познакомитесь с созданием меню и добавите строку состояния в ваш финальный пример.
ПримечаниеВы можете использовать комплект инструментов GTK+ для создания меню, но среда GNOME предоставляет полезные структуры и макросы, которые существенно облегчают эту задачу. В интерактивной документации описывается, как создавать меню средствами GTK+.
Меню GNOME
Создание строки раскрывающихся меню в среде GNOME на удивление просто. Каждый пункт в строке меню представляется как массив структур GNOMEUIInfo, причем каждый элемент массива соответствует одному пункту меню. Например, если у вас есть меню File (Файл), Edit (Правка) и View (Вид), то у вас будут три массива, описывающих содержимое каждого меню.
После определения отдельных меню создается строка меню как таковая с помощью ссылок на эти массивы в еще одном массиве структур GNOMEUIInfo.
Структура GNOMEUIInfo немного сложна и нуждается в дополнительных пояснениях.
typedef struct {
GnomeUIInfoType type;
gchar const *label;
gchar const *hint;
gpointer moreinfо;
gpointer user_data;
gpointer unused_data;
GnomeUIPixmapType pixmap_type;
gconstpointer pixmap_info;
guint accelerator_key;
GdkModifierType ac_mods;
GtkWidget *widget;
} GnomeUIInfo;
Первый элемент в структуре, type, определяет тип элемента меню, который описывается далее. Он может быть одним из 11 типов GnomeUIInfоТуре, определяемых средой GNOME и приведенных в табл. 16.3.
Таблица 16.3
Типы GnomeUIInfоТуре Описание GNOME_APP_UI_ENDOFINFO Означает, что этот элемент — последний пункт меню в массиве GNOME_APP_UI_ITEM Обычный пункт меню или переключатель, если ему предшествует элемент GNOME_APP_UI_RADIOITEMS GNOME_APP_UI_TOGGLEITEM Пункт меню в виде кнопки-переключателя или кнопки-флажка GNOME_APP_UI_RADIOITEMS Группа переключателей или зависимых переключателей GNOME_APP_UI_SUBTREE Означает, что данный элемент представляет собой подменю. Задайте moreinfo для указания на массив подменю GNOME_APP_UI_SEPARATOR Вставляет разделительную линию в меню GNOME_APP_UI_HELP Создает список тем справки для использования в меню Help (Справка) GNOME_APP_UI_BUILDER_DATA Задает данные построения (builder data) для следующих элементов GNOME_APP_UI_ITEM_CONFIGURABLE Настраиваемый пункт меню GNOME_APP_UI_SUBTREE_STOCK Такой же, как GNOME_APP_UI_SUBTREE за исключением того, что надписи следует искать в каталоге gnome-libs GNOME_APP_UI_INCLUDE Такой же, как GNOME_APP_UI_SUBTREE за исключением того, что пункты включены в текущее меню, а не в подменюВторой и третий элементы структуры определяют текст пункта меню и всплывающей подсказки. (Подсказка выводится в строке состояния, у нижнего края окна.)
Назначение элемента moreinfo зависит от типа. В случае ITEM и TOGGLEITEM он указывает на функцию обратного вызова, которую следует вызвать при активации пункта меню. Для RADIOITEMS он указывает на массив структур GnomeUIInfo, в которых группируются переключатели.
user_data — произвольный указатель, передаваемый в функцию обратного вызова. Элементы pixmap_type и pixmap_info позволяют добавить к пункту меню растровую пиктограмму, a accelerator_key и ac_mods помогут определить клавиатурный эквивалент пункта меню.
И наконец, элемент widget применяется для внутреннего хранения указателя на виджет пункта меню функцией создания меню.
Выполните упражнение 16.9.
Упражнение 16.9. Меню GNOMEВы сможете опробовать меню с помощью данной короткой программы. Назовите ее menu1.с.
#include <gnome.h>
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
1. Определите для пунктов меню функцию обратного вызова, названную item_clicked:
void item clicked(GtkWidget *widget, gpointer user_data) {
printf("Item Clicked!n");
}
2. Далее следуют определения меню. У вас есть подменю, меню верхнего уровня и массив строки меню:
static GnomeUIInfo submenu[] = {
{GNOME_APP_UI_ITEM, "SubMenu", "SubMenu Hint",
GTK_SIGNAL_FUNC(item_clicked), NULL, NULL, 0, NULL, 0, 0, NULL},
{GNOME_APP_UI_ENDOFINFO, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0,
NULL}
};
static GnomeUIInfo menu[] = {
{GNOME_APP_UI_ITEM, "Menu Item 1", "Menu Hint",
NULL, NULL, NULL, 0, NULL, 0, 0, NULL},
{GNOME_APP_UI_SUBTREE, "Menu Item 2", "Menu Hint",
submenu, NULL, NULL, 0, NULL, 0, 0, NULL},
{GNOME_APP_UI_ENDOFINFO, NULL, NULL, null,