Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

Давайте рассмотрим программу, применяющую средства 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,

NULL, NULL, 0, NULL, 0, 0, NULL}

Поделиться:
Популярные книги

Перестройка миров. Тетралогия

Греков Сергей
Перестройка миров
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Перестройка миров. Тетралогия

Пятничная я. Умереть, чтобы жить

Это Хорошо
Фантастика:
детективная фантастика
6.25
рейтинг книги
Пятничная я. Умереть, чтобы жить

Внешники

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Внешники

Барон ненавидит правила

Ренгач Евгений
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон ненавидит правила

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Релокант 9

Flow Ascold
9. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант 9

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Я тебя не предавал

Бигси Анна
2. Ворон
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не предавал

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Лорд Системы 7

Токсик Саша
7. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 7

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2