Библиотека сайта 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.
Рисунок 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.
Следующая статья серии : Низкоуровневые функции для работы с сетью.