Setting up GTK for Windows
Note: These instructions are intended for developers wanting to create Windows applications based on GTK, not for end-users. On Windows, GTK applications are typically bundled with GTK already, so end-users do not need to worry about how to install GTK itself.
There are various methods to install GTK on Windows development machines.
-
MSYS2
This method is based on the packages provided by MSYS2, which provides a UNIX-like environment for Windows. Both of these repositories also provide packages for a large number of other useful open source libraries.
-
gvsbuild
This method provides scripts to build the GTK stack from source and outputs libraries and tools that can be consumed by Visual Studio or Meson based projects.
We assume that you are using Windows 7 or later. For older versions of Windows, you will need to do a custom build of older versions of GLib and GTK.
Using GTK from MSYS2 packages
Installation
The MSYS2 project provides a UNIX-like development environment for Windows. It provides packages for many software applications and libraries, including the GTK stack. If you prefer developing using Visual Studio, you should use gvsbuild instead.
In MSYS2 packages are installed using the pacman package manager.
Note: in the following steps, we will assume you’re using a
64-bit Windows
. Therefore, the package names include the x86_64 architecture identifier. If you’re using a 32-bit Windows, please adapt the instructions below using the i686 architecture identifier.
Step 1.: Download the MSYS2 installer that matches your platform and follow the installation instructions.
Step 2.: Install GTK4 and its dependencies. Open a MSYS2 shell, and run:
pacman -S mingw-w64-ucrt-x86_64-gtk4
If you want to develop with GTK3, run:
pacman -S mingw-w64-ucrt-x86_64-gtk3
Step 3. (optional): If you want to develop a GTK application in C, C++, Fortran, etc, you’ll need a compiler like GCC and its toolchain:
pacman -S mingw-w64-ucrt-x86_64-toolchain base-devel
If you want to develop a GTK application in Python, you need to install the Python bindings:
pacman -S mingw-w64-ucrt-x86_64-python-gobject
If you want to develop a GTK application in Vala, you will need to install the Vala package:
pacman -S mingw-w64-ucrt-x86_64-vala
Building and distributing your application
Once you have installed the GTK as above, you should have little problem compiling a GTK app. In order to run it successfully, you will also need a GTK theme. There is some old builtin support for a Windows theme in GTK, but that makes your app look like a Windows 7 app. It is better to get a Windows 10 theme, for instance the Windows 10 Transformation Pack.
Step 1. Copy the icon assets from the Windows 10 Transformation Pack repository in a folder under your installation folder, under share/themes/Windows10
:
- for the GTK4 assets, copy the contents of the
gtk-4.0
folder undershare/themes/Windows10/gtk-4.0
- for the GTK3 assets, copy the contents of the
gtk-3.20
folder undershare/themes/WIndows10/gtk-3.0
Step 2. You also need to copy the icons from the Adwaita theme, which you can download from the GNOME sources.
Step 3. Perform the same steps for the hicolor
icons, which are the mandatory fallback for icons not available in Adwaita.
Step 4. To make GTK pick up this theme, put a file settings.ini
under the etc
folder in your installation folder:
- for GTK4, use
etc/gtk-4.0/settings.ini
- for GTK3, use
etc/gtk-3.0/settings.ini
The settings.ini
file should contain:
[Settings]
gtk-theme-name=Windows10
gtk-font-name=Segoe UI 9
Step 5. To top it all off, run the glib-compile-schemas
utility provided by GLib to generate the compiled settings schema in your installation folder:
glib-compile-schemas share/glib-2.0/schemas
Step 6. You can then zip up your installation folder, or use an installer generator to do that for you, and distribute the result.
You may use MSYS2 to build your GTK application and create an installer to distribute it. Your installer will need to ship your application build artifacts as well as GTK binaries and runtime dependencies.
Legal notes on distributing GTK with your application
You are welcome to redistribute GTK binaries, including applications that bundle them, on other web sites, CD-ROM, and other media. You don’t have to ask for permission. That’s one of the points of Free Software.
One important thing that the GNU licenses require is that you must also redistribute the source code on request. This usually means at least the gettext, GLib, GTK, Pango and ATK sources.
Step 1: Install MSYS2
Download the MSYS2 installer and follow the installation instructions: http://www.msys2.org/
Step 2: Install GTK+3
Open a MSYS2 shell, and run: pacman -S mingw-w64-x86_64-gtk3
Step 3: Modify PATH variable so that the library can be found
- Open up Control Panel
- Go to System and Security > System
- Click on the Advanced system settings link
- Click on Environment Variables… button
- Under System variables find the Path variable and select it
- Click the Edit button
- Add either
;C:\msys64\mingw64\bin
or;C:\msys32\mingw32\bin
to the end of the variable, depending on your system architecture - Click
OK
, and you are done - Restart your system for the changes to apply
Введение в GTK
Последнее обновление: 19.01.2025
Настольные приложения с графическим интерфейсом представляют один из наиболее распространенных типов приложений, предоставляя пользователю удобный интерфейс для выполнения различных задач.
Для создания графического интерфейсов могут применяться различные инструменты. Для создания графических приложений на языке Си один из наиболее популярных таких инструментов является GTK. В целом
GTK представляет библиотеку для создания графических пользовательских интерфейсов
GTK начал развиваться как часть графического редактора GIMP еще в 90-е годы 20-го века. Собственно сам акроним GTK расшифровывается как «Gimp ToolKit».
Однако по мере развития GTK вышел за рамки проекта GIMP и превратился в самостоятельный инструментарий для создания пользовательского интерфейса. В 1998 году вышла первая версия GTK. На сеголняшний день GTK
является одним из наиболее используемых инструментов для создания пользовательского интерфейса. Например, на основе GTK построены рабочие окружения GNOME и Xfce.
Стоит отметить, что GTK постоянно развивается, один функционал добавляется, другой объявляется устаревшим или удаляется. Текущей версией является версия 4, которая вышла 16 декабря 2020 года и в
рамках которой постоянно выходят подверсии. И хотя какие-то принципы, виджеты остаются одними и те же от версии к версии, однако между отдельными версиями нет полной совместимости. Так, код написанный под GTK3 может не работать
под GTK4. В данном руководстве мы будет рассматривать именно последнюю версию — GTK 4 (на момент написания текущей статьи это подверсия GTK 4.17.2)
Также стоит отметить, что несмотря на то, что изначально GTK применялся на Linux, сейчас это полноценный кроссплатформенный тулкит, который позволяет разрабатывать графические приложения под все основные операционные системы, в том числе
под Windows и MacOS и даже Android.
GTK выпускается на условиях GNU Library General Public License, которая допускает гибкое лицензирование клиентских приложений. Сам исходный код доступен в репозитории на Gitlab по адресу
https://gitlab.gnome.org/GNOME/gtk/-/tree/main
GTK имеет основанную на C объектно-ориентированную архитектуру, которая обеспечивает максимальную гибкость и переносимость. Хотя основным языком программирования для использования GTK является язык С, но также существуют привязки для многих других языков, включая C++, Python, JavaScript, Rust, Go и т.д.
Основным строительным блоком интерфейса на GTK являются виджеты. Все, из чего состоит графический интерфейс — окно, кнопка, текстовые поля — это все виджеты. Виджеты организованы в иерархию. Виджет окна является основным контейнером, который вмещает все остальные виджеты. Причем фреймворк GTK уже из коробки предоставляет всю необходимую палитру виджетов для разных задач. Нам лишь остается их использовать.
Таким образом, GTK упрощает создание богатых графических пользовательских интерфейсов.
GTK управляется событиями. GTK прослушивает такие события, как нажатие кнопки, и передает событие приложению, а приложение в ответ на событие выполняет некоторое действие.
Одной из сильных сторон GTK является примение тем. Благодаря темам можно изменить внешний вид каждого виджета в GTK. Причем настройка внешнего вида, дизайн отделены от
построения программной логики.
Фреймворк GTK состоит из трех основных компонентов:
-
GDK: уровень абстракции, который позволяет GTK поддерживать несколько оконных систем. GDK предоставляет возможности оконной системы в Wayland, X11, Microsoft Windows и Apple macOS.
-
GSK: API для создания графа сцены из операции рисования, называемой «узлами», и его рендеринга с использованием различных бэкэндов. GSK предоставляет рендереры для OpenGL, Vulkan и Cairo.
-
GTK: набор инструментов GUI, который содержит элементы пользовательского интерфейса, менеджеры компоновки, типы хранения данных для эффективного использования в приложениях с графическим интерфейсом и т.д.
Также следует отметить, что GTK зависит от ряда библиотек:
-
GLib: библиотека утилит общего назначения, не специфичная для графических пользовательских интерфейсов. GLib предоставляет множество полезных типов данных, макросов, преобразований типов, строковых утилит, файловых утилит и т.д.
-
GObject: библиотека, которая предоставляет систему типов, набор основных типов, включая тип объекта и систему сигналов.
-
GIO: современный, простой в использовании API для работы с виртуальной файловой системой, который содержит абстракции для файлов, дисков, томов, потокового ввода-вывода, а также сетевое программирование и IPC через DBus.
-
Cairo: библиотека 2D-графики с поддержкой нескольких устройств вывода.
-
OpenGL: основная среда для разработки переносимых, интерактивных приложений 2D- и 3D-графики.
-
Vulkan: новый графический API, который можно считать преемником OpenGL.
-
Pango: библиотека для интернационализации текста. Она построена на основе объекта PangoLayout, который представляет абзац текста. Pango предоставляет движок для GtkTextView, GtkLabel, GtkEntry и всех виджетов GTK, отображающих текст.
-
gdk-pixbuf: небольшая портативная библиотека, которая позволяет создавать объекты GdkPixbuf («пиксельный буфер») из изображений. GdkPixbuf можно использовать в сочетании с виджетами, такими как GtkImage, для вывода изображений.
-
graphene: небольшая библиотека, которая предоставляет векторные и матричные типы данных и операции. Graphene предоставляет оптимизированные реализации с использованием различных наборов инструкций SIMD, таких как SSE и ARM NEON.
Установка GTK
Установка GTK на Linux
Для работы с GTK на Linux нам надо установить соответствующий пакет:
-
Для Debian/Ubuntu это пакет libgtk-4-dev
sudo apt install libgtk-4-dev
-
Для Fedora это пакет gtk4-devel:
dnf install gtk4-devel
Установка GTK на Windows
Для создания приложений на GTK на Windows нам потребуется MSYS.
Проект MSYS2 предоставляет UNIX-подобную среду разработки для Windows. Он предоставляет пакеты для многих программных приложений и библиотек, включая стек GTK.
Итак, загрузим установщик MSYS с сайта https://www.msys2.org/
После загрузки запустим программу установки:
На первом шаге установки будет предложено установить каталог для установки. По умолчанию это каталог C:\msys64:
Оставим каталог установки по умолчанию (при желании можно изменить). На следующем шаге устанавливаются настройки для ярлыка для меню Пуск, и затем собственно будет произведена установка.
После завершения установки нам отобразить финальное окно, в котором нажмем на кнопку Завершить
Теперь нам надо установить собственно GTK и все его зависимости. Для этого в папке установки MSYS (по умолчанию C:/msys64
)
надо найти и запустить файл usrt_64.exe:
В MSYS2 пакеты устанавливаются с помощью менеджера пакетов pacman. И для установки GTK в открывшуюся консоль введем команду
pacman -S mingw-w64-ucrt-x86_64-gtk4
Также для разработки на С нам потребуется установить еще пару пакетов
pacman -S mingw-w64-ucrt-x86_64-toolchain base-devel
Первое приложение
Создадим новый файл, допустим, он будет называться «hello.c», и определим в нем следующий код:
#include <gtk/gtk.h> int main (int argc, char **argv) { // инициализируем набор виджетов gtk_init (); // создаем главное окно приложения GtkWidget *window = gtk_window_new(); // настройка элементов пользовательского интерфейса // в данном случае просто устанавливаем заголовок окна gtk_window_set_title (GTK_WINDOW (window), "METANIT.COM"); // отображаем окно gtk_window_present (GTK_WINDOW (window)); // запускаем цикл прослушивания событий и взаимодействуем с пользователем //выходим из цикла, когда все окна приложения будут закрыты while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0) g_main_context_iteration (NULL, TRUE); // когда окно приложения закрыто, выходим из приложения return 0; }
Это самый простейший код графического приложения GTK, которое просто отображает окно. Рассмотрим данный код. Прежде всего подключаем заголовочный файл gtk/gtk.h, который содержит необходимые определения функций и виджетов GTK:
#include <gtk/gtk.h>
Для использования виджетов GTK необходимо инициализироватьэти виджеты помощью вызова
gtk_init()
Данный метод подключается к оконной системе и выполняет ряд дополнительных задач инициализации.
Основной графического интерфейса являются окна. И после инициализации виджетов мы создаем главное окно приложения:
GtkWidget *window = gtk_window_new();
Для создания окна вызывается функция gtk_widget_new(), которая возвращает указатель на тип GtkWidget
После создания окна мы можем настроить его стилевые характеристики, добавить в него другие виджеты. Но в данном случае просто устанавливаем заголовок:
gtk_window_set_title (GTK_WINDOW (window), "METANIT.COM");
Для установка заголовка окна применяется функция gtk_window_set_title(). В качестве первого параметра в функцию передается окно в виде объекта
GtkWindow. Причем поскольку окно
представляет тип GtkWidget, то нам надо его привести к типу GtkWindow — для этого применяется выражение GTK_WINDOW (window)
. Второй параметр функции — собственно заголовок в виде строки.
Настроив окно, отображаем его c помощью функции gtk_window_present()
gtk_window_present (GTK_WINDOW (window));
Для взаимодействия с пользователем GTK использует событийную модель. Для запуска прослушивания сообщений мы запускаем цикл:
while (g_list_model_get_n_items (gtk_window_get_toplevels()) > 0) g_main_context_iteration (NULL, TRUE);
Выражение g_list_model_get_n_items (gtk_window_get_toplevels ())
вычисляет количество отображаемых окон приложения. То есть когда это количество станет равным 0 (например,
пользователь закроет главное окно), то произойдет выход из цикла.
Функция g_main_context_iteration()
проверяет, есть ли какие-то события, которые надо обработать (например, нажатие кнопки). Значение второго параметра —
TRUE
позволяет ожидать возникновения событий. То есть, когда в приложении не происходит никаких событий, приложение будет их ожидать.
Когда пользователь закроет окно, вместе с этим завершит работу и все приложение.
Построение и запуск приложения
Построение и запуск приложения на Linux
Чтобы скомпилировать приложение GTK, вам нужно указать компилятору, где найти файлы заголовков и библиотеки GTK. Это делается с помощью утилиты pkg-config. Так, перейдем в консоли к папке с исходным файлом и далее для компиляции приложения выполним команду
gcc $(pkg-config --cflags gtk4) -o hello hello.c $(pkg-config --libs gtk4)
В итоге в папке с файлом «hello.c» появится новый файл «hello». Запустим его:
Построение и запуск приложения на Windows
Если целевая ОС — Windows, то откроем консоль MSYS, запустив приложение ucrt64.exe. С помощью команды cd перейдем в нем к папке с исходным файлом (допустим, исходный файл располагается в папке C:/c):
cd c:\c
Далее для компиляции приложения выполним команду
gcc $(pkg-config --cflags gtk4) -o hello hello.c $(pkg-config --libs gtk4)
В итоге в папке с файлом «hello.c» появится новый файл «hello» (hello.exe на Windows), который мы можем запустить:
На Windows по умолчанию запускаеся консольное приложение, которое запускает окно приложения. Чтобы скрыть консоль, надо при компиляции добавить флаг -mwindows
gcc $(pkg-config --cflags gtk4) -mwindows -o hello hello.c $(pkg-config --libs gtk4)
Install GTK4 on Windows11
Contents
- Install GTK4 on Windows11
- 1. Download and install Msys2
- 2. Install GTK4 and Mingw-toolchain
- 3. Setting Path
- 4. Hello world
- Summary
This is a guide to install and config GTK4 on Windows 11.
Note
All steps have been tested in Sandbox:
Edition Windows 11 Enterprise
Version 22H2
OS build 22621.1848
1. Download and install Msys2
This tutorial uses the default installation path, if you use a custom one, you need to pay attention when setting PATH later
Download from here, and install
After clicking Finish, the command line interface will pop up. According to the documentation of Msys2, we first install gcc:
pacman -S mingw-w64-ucrt-x86_64-gcc
- Enter(Y) to install
-
Hint
Shift+Ins is the shortcut to paste in Msys2 Shell.
3. Setting Path
Edit System Variable (Follow here)
Add Your path to msys2mingw64bin, as default it’s C:\msys64\mingw64\bin.
Add Your path to msys2usrbin, as default it’s C:\msys64\usr\bin.
Note
Follow the sequence above, as Windows will follow the sequence on PATH table.
This will affect our latter input commands pkg-config and mkdir.
Given that we need to use make, however, Msys2 will name it as «mingw32-make.exe».
So we go to the directory we just put in PATH (C:\msys64\mingw64\bin), find the «mingw32-make.exe» and rename to «make.exe» (or create copy).
Now, when we open cmd or powershell, and type make -v, it works!
![]()
Then, we try pkg-config —cflags —libs gtk4. We expect to have output like this:
![]()
Hint
If not… «Follow» this
then, open Msys2 shell, run
cp -r /mingw64/lib/pkgconfig/* /usr/share/pkgconfig/
to copy «gtk4.pc» to the path that pkg-config can find.
4. Hello world
Open a new folder, and create a new file called demo.c.
We use the demo from GTK:
static void activate(GtkApplication* app, gpointer user_data) { GtkWidget* window; window = gtk_application_window_new(app); gtk_window_set_title(GTK_WINDOW(window), "Window"); gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); gtk_widget_show(window); } int main(int argc, char** argv) { GtkApplication* app; int status; app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS); g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); status = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); return status; }
And another file called makefile:
CC = gcc CFLAGS = -O2 -Wall GTK_CFLAGS = `pkg-config --cflags gtk4` GTK_LIBS = `pkg-config --libs gtk4` all: @mkdir -p ./out $(CC) $(GTK_CFLAGS) -o ./out/demo.exe demo.c $(GTK_LIBS)
Remember to save them, and open a cmd in this directory (Shift + Right click).
Run make, the .exe file will be generated under ./out. (Ignore warning message)
Summary
That’s all the steps, looks like it’s hard to config the basic environment for C development.
So, life is short, I choose Linux
Note: These instructions are intended for developers wanting to develop applications based on GTK+, not for end-users.
Requirements
Windows version
GTK+ requires Windows Vista or later.
For older versions of Windows, you should do a custom build of older versions of GLib and GTK+.
Installing GTK+ and its dependencies
The easiest way to install GTK+ and its dependencies in binary form is through the MSYS2 project. MSYS2 provides a UNIX-like development environment for Windows. It provides packages for many software applications and libraries, including the GTK+ stack. These packages are installed using the pacman package manager.
Note: in the following steps, we’ll assume you’re using a 64-bit Windows. Therefore, the package names include the x86_64
architecture identifier. If you’re using a 32-bit Windows, please adapt the instructions below using the i686
architecture identifier.
Step 1: Install MSYS2
Download the MSYS2 installer that matches your platform and follow the installation instructions.
Step 2: Install GTK+3 and its dependencies
Open a MSYS2 shell, and run:
pacman -S mingw-w64-x86_64-gtk3
Step 3 (recommended): Install GTK+ core applications
Glade is a GUI designer for GTK+. It lets you design your GUI and export it in XML format.
You can then import your GUI from your code using the GtkBuilder
API. Read the GtkBuilder
section in the GTK+ manual for more information.
To install Glade:
pacman -S mingw-w64-x86_64-glade
Devhelp is a help browser. It lets you easily navigate offline in the GTK+, glib and gobject API help relative to the version of these libraries installed on your system.
To install Devhelp:
pacman -S mingw-w64-x86_64-devhelp
Step 4 (optional): Install the Python bindings
If you want to develop a GTK+3 application in Python, you need to install the Python bindings.
If you develop in Python 3:
pacman -S mingw-w64-x86_64-python3-gobject
If you develop in Python 2:
pacman -S mingw-w64-x86_64-python2-gobject
Step 5 (optional): Install build tools
If you want to develop a GTK+3 application in other languages like C, C++, Fortran, etc, you’ll need a compiler like gcc and other development tools:
pacman -S mingw-w64-x86_64-toolchain base-devel
Building and distributing your application
Building your application with MSYS2
You may use MSYS2 to build your GTK+ application and create an installer to distribute it. Your installer will need to ship your application build artifacts as well as GTK+ binaries and runtime dependencies.
Building your application with Visual Studio
GTK+ releases provide project files for Microsoft Visual Studio. You can use them to build GTK+ itself and use it in your own project. Learn more on how to build the GTK+ stack using Microsoft Visual Studio and read these other tips on how to build GTK+ with MSVC on Windows.
Distributing GTK+ with your application
You are welcome to redistribute GTK+ binaries, including applications that bundle them, on other web sites, CD-ROM, and other media. You don’t have to ask for permission. That’s one of the points of Free Software. One important thing that the GNU licenses require is that you must also redistribute the source code. This usually means at least the gettext, GLib, GTK+, Pango and Atk sources.
List of GTK+ dependencies
GTK+ depends on several libraries:
- GLib
- cairo
- Pango
- ATK
- gdk-pixbuf
To run GTK+ programs you will also need:
- gettext-runtime
- fontconfig
- freetype
- expat
- libpng
- zlib