Кроссплатформенная библиотека GTK+: взгляд новичка

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

В своей статье Джон Рамсдел (John D. Ramsdell) рассказывает об опыте разработки кроссплатформенного приложения на GTK+.

Содержание

[править] Введение

Чтобы отточить свои навыки программирования, я решил написать игру с использованием GUI библиотеки, с которой я раньше не был знаком, после чего портировать ее на несколько платформ. Была выбрана GIMP Toolkit, в качестве графического инструментария, а в качестве игры, головоломка, названная мной GTK Sudoku. В этой статье я опишу путь, которую был выбран, чтобы использовать этот прекрасный набор инструментов.

[править] Требования к GUI инструментарию.

При выборе GUI инструментария я руководствовался четырьмя критериями:

  1. инструментарий должен поддерживать кроссплатформенную разработку
  2. инструментарий должен быть тем, который я не использовал. Что исключает FLTK и WxWidgets
  3. для моих экспериментов С предпочтительней, чем C++
  4. Я хотел, чтобы GTK Sudoku был масштабируемым, а именно, чтобы не размеры экрана, а размер шрифта по умолчанию, определял размер каждого окна и виджета.

Решение логической головоломки Sudoku заключается в заполнениии цифрами всех клеток доски, причем каждая строка и колонка, квадрат 3х3, должны содержать цифры от 1 до 9. GTK Sudoku устраняет большую часть тяжелой работы решения головоломки и обеспечивает подсказками, которые помогают при решинии неясностей.

[править] Lua, GTK+, Import/Export ... Ого-го!

Прежде, чем я перечисляю уроки, полученные при выполнении этого проекта, позвольте мне устанавливать контекст. GTK Sudoku создавалась как GUI оболочка консольной программы, написанной на [http://www.lua.org/ Lua. Lua – легкий и легко встраиваемый скриптовый язык, чем популярнен среди разработчиков игр. Интерпретатор Lua также доступен как автономная программа, и пользователи могут взаимодействовать со сценариями, используя цикл read-eval-print. Я использовал и переодически переделывал мой Lua Sudoku сценарий в течение более чем года, но нашлось слишком мало людей, которые захотели его использовать для игры. Требовалась GUI оболочка для того, чтобы игра пользовалась популярностью.

Встраивание Lua-скрипта прошло быстро и легко. Он был естественно инкапсулирован в модуле C, который экспортирует четыре функции и импортирует три. Главным изменением в Lua-скрипте было добавление системы помощи, которая была ненужна, когда я был единственным пользователем.

Единственная хитрым местом GUI, была часть, которая отображает игровую доску. В Sudoku - игровая доска 9?9 содержащая ячейки сгруппированные квадратами 3?3. Предпочтительный способом рисования игровой доски, состоит в том, чтобы чертить линию по краю каждой клетки, а затем рисовать границы 3?3 квадратов с более толстыми линиями, чтобы отличить их от других границ клетки.

В качестве игровой доски был выбран виджет, в унаследованный от GtkTable, который предоставляет таблицу с ячейками 9?9. Каждая ячейка виджета унаследована от GtkDrawingArea. Виджет игровой доски гарантирует, что нет растояния между виджетами ячейки и все ячейки имеют один размер. Cairo используется для того, чтобы каждая ячейка могла динамически менять размер и для отрисовки границ. Линии границ каждой ячейки зависят от положения. Пришлось исследовать альтернативы прежде, чем прийти к этому решение.

Первый проблемой был поиск документации к версии GTK+, которая включает в себя Cairo. В три шага эта проблема была решена. Сначала, я нашел и тщательно изучил статью Давида Мейдлей о написании виджетов с использованием Cairo. Затем я сделал много закладок в HTML документации по GTK+ в /usr/share/gtk-doc/html и регулярно к ней обращался. Наконец, ключевым моментом стала распаковка трех архивов с GTK + и создание файла с тэгами Emacs для всех С файлов и заголовочных. Я посчитал исходники чрезвычайно полезными, так как они придерживаются последовательного стиля фоматирования кода, который облегчает навигацию в них.

[править] Портирование GTK Sudoku

GTK Sudoku собран с использованием GNU Build Tools (также известным как Autotools). Практически все что вам надо сделать чтобы ваша система узнала о GTK+ это добавить следующую строку в файл configure.ac:

   AM_PATH_GTK_2_0(2.8.0,, [AC_MSG_ERROR([Cannot find GTK+])])

а также добавить

   @GTK_CFLAGS@ and @GTK_LIBS@

в файл Makefile.am.

The use of the GNU Build Tools made it trivial to move GTK Sudoku to different GNU/Linux distributions, including one that runs on an Intel Mac. On the Mac I installed the version of X11 that came with the machine and used DarwinPorts to install GTK2. GTK Sudoku then builds as it does on GNU/Linux. Writing one’s own portfile is also quite easy. In addition to filling in the required fields one only need add:

depends_lib port:gtk2 Porting GTK Sudoku to Windows was challenging. Creating a GTK+ development environment on top of MinGW and MSYS is quite different than doing so for the other GUI frameworks that I have used. For example, with FLTK one can download the sources and easily build and install the framework. Being able to build from the sources allows you to statically link your application, easing deployment. In constrast, GTK+ depends on a number of packages that are not part of the standard MinGW or MSYS runtime environment. Assembling a development environment from precompiled binaries is painful enough to cause one to avoid using the sources. Additionally, there are technical reasons that make it very difficult to build an environment that allows static linking of GTK+ applications. As a result many developers simply download the collection of archives made available by Tor Lillqvist. This distribution is of great use to newcomers, and is something that I am thankful for. There are, however, difficulties to be overcome when using this distribution.

When moving to Windows, it is more difficult to port a GTK+ application than it is to port an FLTK or wxWindows application. If you follow the recommendations in the FLTK and wxWidgets documentation, your build system will work unmodified on all systems, including MSYS. On MSYS the link command requires the -mwindows option, which is added by the GUI framework’s configure script; however, the GTK+ configure script omits the -mwindows option on MSYS. I dealt with this problem by simply adding the flag to my local copy of /usr/local/lib/pkgconfig/gdk-2.0.pc.

Packaging GTK Sudoku for Windows presented the greatest challenge. For Windows, there is an installer for GTK+ version 2.8.18, which places a collection of DLLs and support files in C:Program FilesCommon FilesGTK2.0. The current Windows development environment provides version 2.8.20. It turns out you can run a GTK Sudoku binary created with GTK+ 2.8.20 using a GTK+ 2.8.18 runtime if you add to your source file a definition of the function g_type_register_static_simple, a function added to GTK+ after version 2.8.18. What a hack, no?

The GTK Sudoku Windows installer is close to the LuaForge 10MB limit in file size. This is because I had to include all the files in the GTK+ 2.8.18 installer into the GTK Sudoku installer. If you install GTK+ 2.8.18 into the Common File area, some other GTK applications, for example Gaim, stop working.

Once you place the runtime in your installer you can change its components. Tor Lillqvist tells me that the better solution to my runtime linking problem would have been to update its version of GLib to 2.12.

[править] Final Remarks

In summary I was very impressed with GTK+ and especially with Cairo; however, porting the GTK+ application to Windows proved challenging, but not insurmountable. It just takes perseverance.

Источник: [1] 4 марта 2007, Джон Рамсдел (John D. Ramsdell)