GObject
+---GInitiallyUnowned
+----GtkObject
+----GtkWidget
+----GtkContainer
+----GtkBin
+----GtkWindow
Этот список объектов говорит о том, что объект GtkWindow
— потомок GtkBin
, и, следовательно, любую функцию, которую вы вызываете с объектом GtkBin
, вы можете вызвать и с объектом GtkWindow
. Точно так же объект GtkWindow
наследует из объекта GtkContainer
, который в свою очередь наследует из объекта GtkWidget
.
Для удобства все функции создания виджетов возвращают тип GtkWidget
. Например,
GtkWidget* gtk_window_new(GtkWindowType type);
Предположим, что вы создаете объект GtkWindow
и хотите передать возвращенное значение в функцию, ожидающую объект типа GtkContainer
, например, такую, как gtk_container_add
:
void gtk_container_add(GtkContainer* container, GtkWidget *widget);
Вы применяете макрос GTK_CONTAINER
для приведения типов GtkWidget
и GtkContainer
:
GtkWidget * window = gtk_window_new(GTK GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(window), awidget);
Назначение этих функций вы узнаете позже; сейчас просто отметьте для себя частое применение макросов. Для каждого возможного приведения типа существует макрос.
Примечание
Не беспокойтесь, если вам все это не очень понятно; вам не нужно разбираться в подробностях ООП для того, чтобы освоить GNOME/GTK+. На самом деле это безболезненный способ усвоить идеи и преимущества ООП на базе знакомого вам языка С.
GNOME — имя, данное проекту, начатому в 1997 г. программистами, работавшими в проекте GNU Image Manipulation Program (GIMP) над созданием унифицированного рабочего стола для Linux. Все были согласны с тем, что выбор ОС Linux как платформы рабочего стола тормозился отсутствием согласованной стратегии. В то время рабочий стол Linux напоминал Дикий Запад без общих стандартов или выработанных на практике приемов, и программисты могли делать все, что вздумается. Без сводной группы, контролирующей меню рабочего стола, согласованное представление и отображение, документацию, трансляцию и т.д., освоение рабочего стола новичком было в лучшем случае путанным, а в худшем — непригодным.
Группа GNOME намеревалась создать рабочий стол для ОС Linux с лицензией GPL, разрабатывая утилиты и программы настройки в едином согласованном стиле, одновременно способствуя развитию стандартов для взаимодействия приложений, печати, управления сеансами и лучших приемов в программировании GUI приложений.
Результаты их стараний очевидны: среда GNOME — основа стандартного рабочего стола Linux в дистрибутивах Fedora, Red Hat, Ubuntu, openSUSE и др. (рис. 16.1).
Первоначально название GNOME означало GNU Network Object Model Environment (среда сетевых объектных моделей GNU), что отражает одну из ранее поставленных задач, внедрение в систему Linux объектной интегрированной системы, такой как Microsoft OLE, для того, чтобы вы могли, например, встроить электронную таблицу в документ текстового процессора. Теперь поставлены новые задачи, и то, что сегодня нам известно как GNOME, — это законченная среда рабочего стола, содержащая панель для запуска приложений, комплект программ и утилит, библиотеки программирования и средства поддержки разработчиков.
Перед тем как начать программировать, следует убедиться в том, что все библиотеки установлены.
Рис. 16.1
Установка библиотек разработки GNOME/GTK+
Полный рабочий стол GNOME со своими стандартными приложениями и библиотеками разработки GNOME/GTK+ включает в себя более 60 пакетов, поэтому установка GNOME с нуля вручную или из исходного кода — устрашающая перспектива. К счастью, в современных дистрибутивах Linux есть отличные утилиты управления пакетами, превращающие установку GNOME/GTK+ и библиотек разработки в пустяковое дело.
В дистрибутивах Linux Red Hat и Fedora вы открываете средство Package Management(Управление пакетами), щелкнув мышью кнопку меню Applications(Приложения) и выбрав команду Add/Remove Software(Добавить/удалить программы). Когда появится Package Management(рис. 16.2), убедитесь в том, что установлен флажок GNOME Software Development(Разработка программ GNOME). Загляните в область Development(Разработка) для этого установочного параметра.
В этой главе вы будете работать с GNOME/GTK+ 2, поэтому убедитесь в том, что установлены библиотеки версии 2 .x. Рис. 16.2
В случае дистрибутивов, применяющих RPM-пакеты, у вас должны быть установлены как минимум следующие RPM-пакеты:
Читать дальше