- Setting up GTK for Windows
- MSYS2
- gvsbuild
- Using GTK from MSYS2 packages
- Installation
- Building and distributing your application
- Legal notes on distributing GTK with your application
- Gtk windows in window
- GtkWindow
- Краткое описание
- Иерархия объектов
- Обеспечивающие интерфейсы
- Свойства
- Сигналы
- Описание
- Детали
- GtkWindow
- gtk_window_new ()
- gtk_window_set_title ()
- gtk_window_set_wmclass ()
- gtk_window_set_policy ()
- Внимание
- gtk_window_set_resizable ()
- gtk_window_get_resizable ()
- gtk_window_add_accel_group ()
- gtk_window_remove_accel_group ()
- gtk_window_position
- Внимание
- gtk_window_activate_focus ()
- gtk_window_activate_default ()
- gtk_window_set_modal ()
- gtk_window_set_default_size ()
- gtk_window_set_geometry_hints ()
- gtk_window_set_gravity ()
- gtk_window_get_gravity ()
- gtk_window_set_position ()
- gtk_window_set_transient_for ()
- gtk_window_set_destroy_with_parent ()
- gtk_window_set_screen ()
- gtk_window_get_screen ()
- gtk_window_is_active ()
- gtk_window_has_toplevel_focus ()
- gtk_window_list_toplevels ()
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 GTK3 and its dependencies. Open a MSYS2 shell, and run:
Step 3. (recommended): Install the 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:
Step 4. (optional): If you want to develop a GTK3 application in Python, you need to install the Python bindings.
If you develop in Python 3:
If you develop in Python 2:
Step 5. (optional): Install the build tools. If you want to develop a GTK3 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
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 gtk-3.20 folder of that repository to a folder share/themes/Windows10/gtk-3.0/ in your installation folder.
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 in etc/gtk-3.0 in your installation folder. This should contain
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:
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.
GTK is hosted by GNOME.
GTK is maintained by the GTK Team.
© 1997-2021, The GTK Team. All Rights Reserved.
Gtk windows in window
GTK+ Reference Manual
GtkWindow
GtkWindow Окно верхнего уровня, которое может содержать другие виджеты
Краткое описание
Иерархия объектов
Обеспечивающие интерфейсы
GtkWindow обеспечивают AtkImplementorIface.
Свойства
Сигналы
Описание
Детали
GtkWindow
gtk_window_new ()
Создаёт новый GtkWindow, который является окном верхнего уровня способным содержать другие виджеты. Практически всегда тип окна должен быть GTK_WINDOW_TOPLEVEL. Если вы создаёте что-то вроде всплывающего меню с нуля (что является плохой идеей, просто используйте GtkMenu), вы могли бы использовать GTK_WINDOW_POPUP. GTK_WINDOW_POPUP не для диалогов, хотя в некоторых других программных инструментах диалоги называются «popups». В GTK+, GTK_WINDOW_POPUP означает всплывающее меню или всплывающую подсказку. В X11, всплывающими окнами не может управлять window manager.
Если вам нужно простое окно (окно без границ), используйте gtk_window_set_decorated() , не используйте GTK_WINDOW_POPUP.
gtk_window_set_title ()
Устанавливает заголовок GtkWindow. Заголовок окна будет отображён в панели заголовка; в X Window System, панель заголовка представляется window manager, может изменяться согласно точной конфигурации пользователя. Заголовок должен помогать пользователю отличать одно окно от других открытых окон. Хороший заголовок может включать имя приложения и текущемго файла например.
gtk_window_set_wmclass ()
Не используйте эту функцию. Она устанавливает X Window System «class» и «name» подсказки для окна. Согласно ICCCM, вы должны всегда устанавливать их в тоже самое значение для всех окон в приложении и GTK+ устанавливает их в эти значения по умолчанию, поэтому вызывать эту функцию бессмысленно. Однако вы можете вызвать gtk_window_set_role() для каждого окна в вашем приложении, чтобы помочь управляющему сессиями (session manager). Установка функции позволяет менеджеру окон запоминать позицию окна при запуске сохранённых сессий.
Подсказка имени окна
Подсказка класса окна
gtk_window_set_policy ()
Внимание
gtk_window_set_policy устарела и не нужно её использовать во вновь создаваемом коде. Используйте вместо неё gtk_window_set_resizable() .
Изменения размеров окна верхнего уровня и попытки пользователя изменять размер. В действительности есть только два способа вызова этой функции:
gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE) означает, что окно позволяет изменять размер пользователю (user-resizable).
gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, TRUE) означает, что размер окна управляется программой (program-controlled) и должно просто соответствовать текущемму размеру запроса дочерних окон.
Первая политика по умолчанию, то есть по умолчанию окна предназначены для изменения размера пользователями.
Основная функции должна быть например: void gtk_window_set_resizable (GtkWindow* window, gboolean setting); . почему GTK+ 2.0 и представляет gtk_window_set_resizable() , которую вы должны использовать вместо gtk_window_set_policy() .
Если установлено TRUE , параметр allow_grow позволяет пользователю разворачивать окно сверх размера запрошенного его дочерними виджетами. Если allow_grow равно TRUE , убедитесь что ваши дочерние виджеты работают верно при изменении размера окна.
Окно верхнего уровня будет всегда изменять размер для соответствия запрошенному размеру дочерних виджетов. Это значит, что если вы добавите дочерние виджеты, окно верхнего уровня растянется для их размещения. Однако, обычно окно верхнего уровня не сжимается если его дочерние виджеты запрашивают меньший размер; параметр auto_shrink заставляет окно уплотизменяться, когда дочерние виджеты получают слишком много пространства. auto_shrink обычно используется со второй из двух выше упомянутых политик окон. Таким образом, установите auto_shrink в TRUE если вы хотите иметь фиксированное окно, всегда оптимизированного размера, установленного вашей программой.
Заметьте, auto_shrink не делает ничего, если allow_shrink и allow_grow установлены в FALSE .
Не одна из двух предложенных политик поведения окна не устанавливает параметр allow_shrink в значение TRUE . Если allow_shrink равен TRUE , пользователь может уменьшать окно таким образом, что его дочерние виджеты не получат запрашиваемый размер полностью; по существу это плохая ситуация, потому что виджеты будут выглядеть неправильно если это случиться. Кроме того GTK+ имеет тенденцию повторно разворачивать окно если размер пересчитан по какой нибудь причине. Поэтому allow_shrink должен всегда быть установлен в FALSE .
Иногда, когда вы думаете, что нужно использовать allow_shrink , реальная проблема заключается в некотором определённом дочернем виджете который запрашивает слишком много пространства, поэтому пользователь не может достаточно уменьшить окно. Возможно вызвать gtk_widget_set_size_request() на дочернем виджете, сделав этот запрашиваемый размер слишком большим. Вместо установки размеров дочерних виджетов, рассмотрите использование gtk_window_set_default_size() таким образом, чтобы этот дочерний виджет получал больше распределения чем запрашивается.
Может ли пользователь уменьшать окно сверх размера запроса
Может ли пользователь увеличивать окно сверх размера запроса
Возвращать ли автоматически размер окна к запрашиваемому если оно является большим
gtk_window_set_resizable ()
Устанавливает может ли пользователь изменять размер окна. По умолчанию окна позволяют пользователю менять размер.
TRUE если пользователь может изменять размер этого окна
gtk_window_get_resizable ()
TRUE если пользователь может изменять размер этого окна
gtk_window_add_accel_group ()
Присоединяет accel_group к window , так что вызов gtk_accel_groups_activate() на window активизирует акселераторы в accel_group .
Окно к которому прикрепляется акселератор
gtk_window_remove_accel_group ()
gtk_window_position
Внимание
gtk_window_position устарела и не нужно её использовать во вновь создаваемом коде.
gtk_window_activate_focus ()
Активирует текущий виджет окна находящийся в фокусе.
TRUE если данный виджет активирован.
gtk_window_activate_default ()
Активирует виджет по умолчанию в данном окне, если текущий виджет находящийся в фокусе не был сконфигурирован получать действие по умолчанию (смотрите GTK_RECEIVES_DEFAULT в GtkWidgetFlags), когда виджет в фокусе активирован.
TRUE если данный виджет активирован.
gtk_window_set_modal ()
Устанавливает окно модальным или нет. Модальные окна предотвращают взаимодействие с другими окнами в том же самом приложении. Чтобы сохранять модальные диалоги на переднем плане основного окна приложения, используйте gtk_window_set_transient_for() чтобы сделать диалог переходным для родителя; большинство window managers будут запрещать понижение диалога ниже родительского.
Является ли окно модальным
gtk_window_set_default_size ()
Устанавливает размер окна по умолчанию. Если окно «natural» размера (его запрашиваемый размер) будет больше чем значение по умолчанию, то значение по умолчанию игнорируется. Наиболее обычно, если размер по умолчанию не подчиняется подсказкам геометрии окна ( gtk_window_set_geometry_hints() может использоваться для их явной установки), размер по умолчанию будет прикреплён к ближайшему допустимому размеру.
В отличии от gtk_widget_set_size_request() , которая устанавливает запрашиваемый размер для виджета и таким образом препятствует пользователям уменьшать окно, эта функция только устанавливает начальный размер, так же, как если бы пользователь самостоятельно изменил размер. Пользователи могут уменьшать окно как обычно. Установка размера по умолчанию равного -1, это способ использовать по умолчанию размер «natural» (запрашиваемый размер окна).
Для большего контроля начального размера окна и как работает изменение размера, изучите gtk_window_set_geometry_hints() .
Для некоторых ситуаций, gtk_window_resize() является более соответствующей функцией. gtk_window_resize() изменяет текущий размер окна, а не размер используемый на начальном дисплее. gtk_window_resize() всегда оказывает воздействие непосредственно на окно, не на геометрию виджета.
Размер по умолчанию используется только при отображении окна в первый раз; если окно скрыть и снова развернуть, то будет использован запомненный размер до скрытия, вместо использования размера по умолчанию.
Окна не могут фактически быть размером 0x0, они должны быть по крайней мере 1×1, но помещение 0 для width и height позволяется, результатом будет размер по умолчанию 1×1.
Ширина в пикселах, или -1 для сброса ширины по умолчанию
Высота в пикселах, или -1 для сброса высоты по умолчанию
gtk_window_set_geometry_hints ()
Эта функция устанавливает подсказки о том, как пользователь может изменять размер окна. Вы можете установить минимальный и максимальный размер окна; позволить изменение размера приращением (например для xterm, вы можете только изменять размер размером символов); аспект соотношения и многое другое. Смотрите структуру GdkGeometry.
Подсказки геометрии применяемые к виджету
Структура содержащая информацию о геометрии
Маска указывающая на какое поле структуры должно быть обращено внимание
gtk_window_set_gravity ()
Уравновешенность окна определяют координаты помещенные в gtk_window_move() . Смотрите gtk_window_move() и GdkGravity для более подробной информации.
По умолчанию уравновешивание окна имеет значение GDK_GRAVITY_NORTH_WEST которое будет естественно «делать то, что подразумевается.»
gtk_window_get_gravity ()
Получает значение установленное gtk_window_set_gravity() .
gtk_window_set_position ()
Устанавливает ограничения позиции окна. Если старое или новое ограничение равно GTK_WIN_POS_CENTER_ALWAYS , то это будет причиной перестановки окна для удовлетворения нового ограничения.
gtk_window_set_transient_for ()
Диалоговые окна должны быть установлены переходящими для основного окна приложения, которым они были порождены. Это позволяет window managers например сохранять диалог на переднем плане относительно основного окна, или распределить диалог поверх основного окна. gtk_dialog_new_with_buttons() и другие функции удобств в GTK+ будут иногда вызывать gtk_window_set_transient_for() от вашего имени.
В Windows, эта функция помещает дочернее окно поверх родительского, почти также сделал бы менеджер окон в X.
gtk_window_set_destroy_with_parent ()
Если setting равно TRUE , то когда закрытие переходного окна родителя для window , так же закроет window непосредственно. Это полезно для диалогов которые не должны существовать без основного окна с которым они ассоциированы.
Закрыть ли window с его переходным родителем
gtk_window_set_screen ()
Устанавливает GdkScreen на котором отображается window ; если окно уже отображено, это отменит отображение и отобразит на новом экране.
Начиная с версии 2.2
gtk_window_get_screen ()
Возвращает GdkScreen ассоциированный с window .
Начиная с версии 2.2
gtk_window_is_active ()
Определяет, является ли окно частью текущемго активного верхнего уровня. (Таким образом, окно верхнего уровня получает нажатие клавиши.) Значение TRUE возвращается, если активно непосредственно окно верхнего уровня, а так же если, скажем, GtkPlug встроен в активный верхний уровень. Вы можете использовать эту функцию, если хотите отрисовывать виджет по разному в активном и не активном окне. Смотрите gtk_window_has_toplevel_focus()
TRUE если окно — часть текущемго активного окна.
Начиная с версии 2.4
gtk_window_has_toplevel_focus ()
Определяет сфокусирован ли ввод в пределах данного GtkWindow. Для реальных окон верхнего уровня, это идентично gtk_window_is_active() , но для встроенных окон, как например GtkPlug, результаты будут отличаться.
TRUE если ввод сфокусирован в пределах данного GtkWindow
Начиная с версии 2.4
gtk_window_list_toplevels ()
Возвращает список всех существующих окон верхнего уровня. На виджеты в списке нет индивидуальных ссылок. Если вы хотите выполнить итерацию через список и выполнить действия, вовлекающие callbacks-функции, которые могли бы уничтожить виджеты, вы должны сначала вызвать g_list_foreach (result, (GFunc)g_object_ref, NULL) , а затем убрать ссылки на все виджеты.