Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

GTK-Rus - все о программировании с использованием GTK


GTK-Rus
Выпуск 2
I. Введение

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

II. Теория

По традиции, начну с самого главного - с названия. GTK является сокращение от GIMP Toolkit. Связано это тем, что GTK изначально разрабатывался в рамках именно этого графического редактора. В настоящее время GTK является самостоятельным проектом, состоящим из нескольких библиотек, целью которых является облегчение создания графического пользовательского интерфейса (GUI)

На самом деле можно обойтись и без использования GTK, при этом у вас возникает два пути: либо использовать что-то подобное GTK (например QT), либо напрямую общаться с системой X Window. Что касается первого варианта, то здесь без комментариев. Работать же напрямую с X Window по крайней мере не рационально. Во-первых, вам придется реализовать кучу, на первый взгляд элементарных вещей (которые, скорее всего, уже давно есть в GTK), на что вы потратите уйму времени и сил. Во-вторых, все ваши программы заметно потолстеют, так как им придется таскать за собой весь тот код, над которым вы бились бессонными ночами, и, который, скорее всего уже есть в пользовательской системе. Кроме того, такой подход сильно снижает переносимость ваших творений.

Ну вот, теперь я считаю, что применение нами GTK вполне обосновано, а, значит, можно перейти к его изучению.

III. Практика

Так уж сложилось в истории программирования, что знакомство с чем либо мы начинаем с маленькой программки "Hello World!", я думаю, что в данном случае нам тоже не стоит отступат от это правила. Итак, "Hello,world!" (точнее не совсем, но не важно):

#include <gtk/gtk.h>

int main ( int argc, char *argv[] ){

gtk_init( &argc, &argv );

/* Наш код */

gtk_main();

return 0;

}

Текст этой маленькой программки можно набрать в любом текстовом редакторе и сохранить, например, под именем first.c. Для компиляции необходимо в консоли, находясь в директории с ее исходником дать команду:

gcc first.c -o first `pkg-config --cflags --libs gtk+-2.0`

или

gcc first.c -o first `gtk-config --cflags --libs`

И в том и в другом случае вместо текста в кавычках будут подставлены пути к заголовочным файлам и библиотекам GTK, которые соответствуют вашей системе, только в первом случае это сделает утилита pkg-config (здесь, кстати, я предполагаю что у вас GTK второй версии), а в другом gtk-config. Замечание: здесь необходимо использовать "обратные" апострофы, которые находятся на клавиатуре на одной клавише с буквой "ё".

Запустив ее вы не увидите ничего, вы даже не сможете ее закрыть, кроме как убив процесс. Тем не менее, в ней есть моменты на которые стоит обратить внимание.

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

Далее управление попадает на функцию gtk_init():

void gtk_init ( int *argc, char ***argv );

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

--gtk-module
--g-fatal-warnings
--gtk-debug
--gtk-no-debug
--gdk-debug
--gdk-no-debug
--display
--sync
--name
--class

Так как gtk_init() производит инициализацию всего GTK перед использованием в нашей пограмме, она должна вызываться перед большинством других функций библиотеки. Если же инициализация прошла неудачно происходит немедленных выход из программы.

После инициализации мы вызываем gtk_main(), при этом наша программа попадает в главный цикл. Она "засыпает" и "просыпается" только тогда, когда происходит что-нибудь интересное, например, нажатие пользователем на какую-нибудь кнопку.

Хочу сразу обратить выше внимание на один достаточно существенных недостаток, характерный для программы с подобной структурой. Если по каким-то причинам инициализация GTK не удалась (например ее пытались запустить из чистой консоли), то ваше творение "вылетит" не сказав пользователю ни слова. Нехорошо. Решение же этой поблемы очень просто: достаточно вместо gtk_init() применить функцию gtk_init_check():

gboolean gtk_init_check ( int *argc, char ***argv );

Она ничем не отличается от gtk_init(), кроме того что в случае удачной инициализации возвращает TRUE, а в противном FALSE.

Стоит также отметить что простые питы данных в GTK имеют свои аналоги: int -> gint, char -> gchar и т.д., сделано это в целях переносимости, так как несоответствие типов является большой проблемой при портировании на другие платформы.

Таким образом, после устранения замеченного недостатка, код программы примет примерно такой вид:

#include <gtk/gtk.h>

int main( int argc, char *argv[] ){

if( !gtk_init_check( &argc, &argv ) ){

/* Код консольного варианта программы */

}
else{

/* Код оконного варианта */

}

return 0;

}

При этом на место консольного варианта можно поставить что-нибудь вроде:

g_print( "Can't initialize GTK\n" );

Функция g_print является аналогом printf(), созданным в целях все той же переносимости.

IV. Заключение

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


© 2006 Алексей Сафонов

В избранное