Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Возможности тулкита GTK+ и сопутствующих библиотек

Автор: A. Панин
Дата публикации: 10 июня 2015 г.

Механизм загрузки ресурсов приложений

3. Пример использования ресурсов в приложении

Рассмотрим в качестве примера незначительно модифицированную версию приложения gwhois, которое подробно описывалось в предыдущей статье серии с названием "Низкоуровневые функции для работы с сетью". При рассмотрении исходного кода приложения следует обратить особое внимание на директиву #include "gwhois-resources.h", предназначенную для подключения файла исходного кода с массивом данных ресурсов к исходному коду приложения, функцию application_parse_servers_xml(), в рамках которой осуществляется доступ к данным документа XML со списком серверов whois с помощью функции g_resources_lookup_data(), а также функцию application_activate(), в рамках которой производится загрузка сжатой каскадной таблицы стилей из ресурса. Объекты типа GBytes используются для установки ссылок на существующие фрагменты памяти с данными несжатых ресурсов, а также резервируемые в процессе исполнения приложения фрагменты памяти с данными ресурсов, записанными в результате декомпрессии. Из-за того, что метод gtk_css_provider_load_from_resource() появился лишь в GTK+ 3.16, в рамках функции application_activate() также реализован код для загрузки каскадной таблицы стилей в более ранних версиях GTK+ с использованием функции g_resources_lookup_data(). Для проверки версии GTK+ на этапе компиляции приложения используется макрос GTK_CHECK_VERSION(<основная версия>, <подверсия>, <номер выпуска>). В файле каскадной таблицы стилей gwhois.css приводится ссылка на графический файл alnilam-Stars-Pattern.png, который используется в качестве фонового изображения поля для редактирования текста.

Полный код рассматриваемого приложения приведен в Листинге 3, а также в архиве gwhois_with_resources вместе с файлом Makefile для упрощения сборки, файлом описания ресурсов приложения gwhois.gresource.xml, файлом каскадной таблицы стилей для стилизации поля редактирования текста gwhois.css, графическим файлом alnilam-Stars-Pattern.png, а также файлом whois-server-list.xml, являющимся списком серверов whois. Содержимое файла каскадной таблицы стилей приведено в Листинге 4. Для лучшего понимания в коде приложения используются комментарии. После распаковки архива исходный код может быть скомпилирован либо с помощью команды make, либо с помощью следующих команд:

glib-compile-resources --target=gwhois-resources.c --sourcedir=. --generate-source --c-name gwhois gwhois.gresource.xml
glib-compile-resources --target=gwhois-resources.h --sourcedir=. --generate-header --c-name gwhois gwhois.gresource.xml
gcc `pkg-config --cflags --libs gtk+-3.0` `pkg-config --cflags --libs gio-2.0` gwhois-resources.c gwhois-resources.h gwhois.c -o gwhois

При необходимости использованные в приложении функции для работы с ресурсами могут быть применены и в не использующем GTK+ консольном приложении, которое может компилироваться с помощью следующей команды:

Листинг 3 - Код приложения gwhois

Листинг 4 - Каскадная таблица стилей для стилизации поля редактирования текста

На Рисунке 1 представлен снимок окна модифицированного приложения gwhois после получения информации о доменном имени kernel.org.

Окно модифицированного приложения gwhois
Рисунок 1 - Окно модифицированного приложения gwhois

Проведем сравнение размеров бинарных файлов оригинального приложения gwhois из предыдущей статьи серии и модифицированного приложения gwhois. Размер бинарного файла оригинального приложения gwhois при сборке с помощью инструментов из комплекта поставки дистрибутива Fedora 21 составляет 43287 байт, а модифицированного приложения gwhois - 777836 байт. Очевидно, что данные из файлов ресурсов добавлены в бинарный файл приложения (а именно, в его секцию .gresource.gwhois). Для того, чтобы убедиться в истинности данного утверждения воспользуемся утилитой objdump. Вывод утилиты представлен в Листинге 5.

Листинг 5 - Вывод утилиты objdump

В конце вывода несложно обнаружить заголовок документа формата XML, содержащего список серверов whois.

Наконец, вы можете убедиться в том, что данные из всех файлов ресурсов были добавлены в бинарный файл приложения, просто скопировав этот бинарный файл в другую директорию и исполнив его.

Заключение

Реализация механизма загрузки ресурсов, появившаяся не так давно в библиотеке GIO, на данный момент используется лишь в приложениях из комплекта поставки окружения рабочего стола GNOME, хотя может оказаться полезной и в других проектах на основе библиотек GLib/GIO и тулктиа GTK. Она позволяет снизить время загрузки приложения и упростить его код, но не предназначена для создания автономных сборок приложений (о которых, мы поговорим в одной из следующих статей серии). Благодаря простому API и возможности загрузки бинарных файлов наборов ресурсов, применимость описанной технологии не ограничивается рамками языка программирования C.


Следующая статья серии : Низкоуровневые функции для работы с сетью.