Часть 1. зачем использовать gtk+?

Содержание:

Решение проблем

Различные темы приложений между GTK+ 2 и GTK+ 3

В общем, если выбранная тема имеет поддержку как для GTK+ 2 и GTK+ 3, тема будет применяться для всех GTK+ 2 и GTK+ 3 приложений.
Если выбранная тема имеет поддержку только GTK+ 2, будет использоваться для GTK+ 2 приложений, и GTK+ тема по умолчанию будет использоваться для GTK+ 3 приложений. Если выбранная тема имеет поддержку только GTK+ 3, то будет использована для GTK+ 3 приложений, и GTK+ тема по умолчанию будет использоваться для GTK+ 2 приложений. Таким образом, для согласования тем приложений, лучше использовать тему, которая имеет поддержку как GTK+ 2 так и GTK+ 3.

Вы можете найти установленные темы на вашей системе с поддержкой обоих версий GTK+ 2 и GTK+ 3, используя эту команду (не работает с именами, содержащими пробелы):

find $(find ~/.themes /usr/share/themes/ -wholename "*/gtk-3.0" | sed -e "s/^\(.*\)\/gtk-3.0$/\1/") -wholename "*/gtk-2.0" | sed -e "s/.*\/\(.*\)\/gtk-2.0/\1"/

Тема не применяется к root-приложениям

Пользовательский файл темы (, ) не может быть прочитан другими аккаунтами, выбранная тема не будет применяться к приложениям X запущенных от root. Возможное решение включает в себя:

# ln -s /home//.gtkrc-2.0 /root/.gtkrc-2.0

Смена темы от root

# gksu lxappearance

Используйте настройки демона (это в большинстве окружений рабочего стола). Вариант desktop-agnostic использует XSettings доступный в AUR xsettingsd-gitAUR.

Клиентские декорации

Чтобы удалить тень и зазор вокруг окон (например, в сочетании с тайловым оконным менеджером), создайте следующий файл:

~/.config/gtk-3.0/gtk.css
.window-frame, .window-frame:backdrop {
 box-shadow: 0 0 0 black;
 border-style: none;
 margin: 0;
 border-radius: 0;
}

.titlebar {
 border-radius: 0;
}

.window-frame.csd.popup {
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.13);
}

.header-bar {
  background-image: none;
  background-color: #ededed;
  box-shadow: none;
}
/* You may want to use this if you don't like the double title.
GtkLabel.title {
    opacity: 0;
}*/
~/.config/gtk-3.0/settings.ini
gtk-decoration-layout=menu:

Подавить предупреждение о accessibility bus

WARNING **: Couldn't connect to accessibility bus:

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

Не соответствует цвет фона в строке заголовка (TitleBar)

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

~/.config/gtk-3.0/gtk.css
/* Always use background color */
GtkWindow {
    background-color: @theme_bg_color;
}

/* Fix tooltip background override */
.tooltip {
    background-color: rgba(0, 0, 0, 0.8);
}

.tooltip * {
    background-color: transparent;
}

/* Fix Nautilus desktop window background override */
NautilusWindow {
     background-color: transparent; 
}

Поддержка эскизов для диалога файлов GTK + 2

Установите AUR чтобы получить возможность просмотра файлов в виде миниатюр, вместо списка, в файловом браузере GTK +.

Система типов Glib

Если вы когда-нибудь просматривали программный код GTK+, то могли удивиться, увидев множество типов данных языка C с префиксом , например, , , , а также незнакомые типы и . Дело в том, что комплект GTK+ основан на библиотеках переносимости языка C (portability libraries), названных GLib и GObject, которые определяют эти типы для того, чтобы способствовать межплатформным разработкам.

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

В библиотеке GLib также определено несколько очень удобных констант:

Дополнительные типы данных — это типы, служащие заменой для стандартных типов данных C (из соображений совместимости и читабельности) и гарантирующий одинаковый размер в байтах на всех платформах:

  • , , , , , , и — просто замены для стандартных типов C для совместимости;

  • — синоним типа ;

  • — полезен для представления логических значений и служит оболочкой для ;

  • , , , , и — знаковые и беззнаковые типы с гарантированным размером в байтах.

Удобно то, что применение библиотек GLib и GObject почти прозрачно. GLib широко используется в GTK+, поэтому если у вас есть работающая установка GTK+, то вы обнаружите, что библиотека Glib уже установлена. Как вы увидите позже в этой главе, при программировании с помощью комплекта GTK+ вам даже не придется явно включать заголовочный файл .

Архитектура

Основная статья: Список языковых привязок GTK+

GTK+ написана на языке Си, но тем не менее, является объектно-ориентированной. Одной из причин для выбора Си в качестве языка было желание легко строить интерфейсы для других языков программирования.
В результате под GTK+ можно писать на следующих языках программирования:

Язык Название Поддержка
Ada GtkAda Частичная поддержка до 2.18
C GTK+ Встроена
C++ gtkmm Да
C# и другие языки программирования платформы .NET Gtk# Частичная поддержка до 2.20
D gtkD Поддержка GTK2 была gtkD-1.7.4, после — GTK3 (плюс Cairo, Gda, Gl, GStreamer)
Erlang gtkNode Частичная поддержка до 2.16
Fortran gtk-fortran Частичная поддержка до 2.24 / 3.0
Go go-gtk Частичная поддержка (33%)
GOB языки, написанные для системы GObject. Да
Genie языки, написанные для системы GObject. Да
Haskell gtk2hs Да
FreeBASIC GTK+tobac2 Частичная поддержка до 2.22: Поддерживается также GTK3
Free Pascal (header) integrated into the core distribution GTK 2.16 с частичной поддержкой поздних версий
Java java-gnome Частичная поддержка до 2.20 (недоступна на Windows)
JavaScript seed/GJS Да
Lua lgob Поддерживает все версии, начиная с 2.16
Lisp
Lua LuaGtk Частичная поддержка до 2.16
Node.js node-gtk Да
OCaml LablGTK Частичная поддержка до 2.16
Perl perl-Gtk3 Да
PHP PHP-GTK Частичная поддержка до 2.20
PureBasic Gtk2 Да
Python GObject-интроспекция через PyGI, ранее PyGTK Да
R RGtk2 Частичная поддержка до 2.12
Ruby ruby-gtk2 Да
Smalltalk Smalltalk GTK GNU Smalltalk, Smalltalk YX, Squeak
Tcl Gnocl Да
Vala языки, написанные для системы GObject. Да

Собственно GTK+ состоит из двух компонентов: GTK и GDK. Первый содержит набор элементов пользовательского интерфейса, или «виджетов» (таких, как кнопка, список, поле для ввода текста и т. п.) для различных задач. GDK отвечает за вывод на экран и может использовать для этого X Window System, Linux Framebuffer, WinAPI или функции Mac OS X. Начиная с версии 2.8, GDK во многом (но не полностью) заменена на систему отрисовки векторной графики Cairo.

Помимо Cairo, GTK+ зависит от трёх библиотек — GLib, Pango и ATK, — которые разрабатываются вместе с GTK+, но могут использоваться и отдельно.

Средства настройки

  • Если вы используете Cinnamon, используйте Themes tool (cinnamon-settings themes): перейдите в Параметры > Параметры системы > Оформление.
  • Если вы используете Enlightenment: перейдите в Settings > All > Look > Application Theme.
  • Если вы используете GNOME, используйте Gnome Tweak Tool (gnome-tweak-tool): установите , перейдите в GNOME Tweak Tool > Внешний вид.
  • Если вы используете MATE, используйте Appearance Preferences tool (mate-appearance-properties): перейдите в Система > Параметры > Внешний вид.
  • Если вы используете Xfce, используйте Appearance tool: перейдите Настройки > Внешний вид.
  • Если вы используете Openbox, перейдите в obconf > Тема или lxappearance с установленным lxappearance-obconf, тогда lxappearance-obconf > Рамка окна > Тема.

Другие графические инструменты, как правило перезаписывают .

Поддерживаются оба GTK+ 2 и GTK+ 3:

KDE GTK Configurator — Приложение, которое позволяет изменять стиль и шрифт GTK+2 и Gtk+3 приложений.

После установки, также можно найти в System Settings > Application Appearance > GTK.

LXAppearance — независимая от Окружения рабочего стола утилита настройки GTK+2 и GTK+3, от проекта LXDE (не требует других частей LXDE).

Поддерживается только GTK+ 2:

GTK-KDE4 — Приложение, которое позволяет изменять стиль и шрифт GTK+2 приложений в KDE4.

После установки, также можно найти в System Settings > Lost and Found > GTK style.

GTK+ Change Theme — Маленькая программа, которая позволяет изменять вашу GTK+ 2.0 тему (считается лучшей альтернативой switch2).

GTK+ Preference Tool — Переключает GTK+ темы и меняет шрифт.

GTK+ Theme Switch — Простой переключатель GTK+ тем.

Настройка

Параметры GTK+ могут быть вручную заданы в файлах настройки, но окружение рабочего стола и приложения могут переопределить эти параметры. В зависимости от версии GTK+, эти файлы находятся по пути:

Примечание:

  • Некоторые настройки, описанных ниже (например ) являются устаревшими и игнорируется с GTK+ 3.10.
  • При редактировании файлов настроек GTK+, только вновь запущенные приложения будет отображать изменения.

Базовая настройка темы

Для ручного изменения темы GTK+, иконок, шрифтов и размера шрифтов, добавьте следующие файлы настроек, например:

GTK+ 2:

~/.gtkrc-2.0
gtk-icon-theme-name = "Adwaita"
gtk-theme-name = "Adwaita"
gtk-font-name = "DejaVu Sans 11"

GTK+ 3:

$XDG_CONFIG_HOME/gtk-3.0/settings.ini
gtk-icon-theme-name = Adwaita
gtk-theme-name = Adwaita
gtk-font-name = DejaVu Sans 11

Примечание: Название темы значков определено в файле индекса темы, а не в имени своего каталога.

Вариант тёмной темы

Некоторые темы GTK+ 3 содержат тёмный вариант темы, но он используется только когда приложение запрашивает именно его. Чтобы использовать вариант темной темы со всеми GTK+ 3 приложениями, установите:

gtk-application-prefer-dark-theme = true

Горячие клавиши

Keyboard shortcuts (otherwise known as accelerators in GTK+) may be changed by hovering the mouse over the respective menu item, and pressing the desired key combination. To enable this feature, set:

gtk-can-change-accels = 1

Задержка меню GNOME

Этот параметр управляет задержкой между «указыванием мыши» на меню и «открытием меню». Эта задержка измеряется в миллисекундах.

gtk-menu-popup-delay = 0

Уменьшить размер виджетов

Если у вас небольшой экран, или вы просто не любите большие иконки и виджеты, вы можете изменить их размер.

gtk-toolbar-style = GTK_TOOLBAR_ICONS

Чтобы использовать меньшие иконки:

gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-menu=16,16:gtk-large-toolbar=16,16\
:gtk-small-toolbar=16,16:gtk-button=16,16"

Или, чтобы удалить иконки из кнопок полностью:

gtk-button-images = 0

Вы также можете удалить из меню иконки:

gtk-menu-images = 0

Место запуска выбора файла

Чтобы открывать диалог «выбор файла» (например при открытии/сохранении) в текущем рабочем каталоге а не в последнем (recent) месте (обычно текущий-рабочий-каталог это домашний каталог), сделайте следующее:

Для GTK+ 3

Измените DConf с gsettings:

$ gsettings set org.gtk.Settings.FileChooser startup-mode cwd

Для GTK+ 2:

Измените файл настроек :

~/.config/gtk-2.0/gtkfilechooser.ini
StartupMode=cwd

Наследие поведения скроллбара

Примечание: Этот параметр не повиновался всеми приложениями GTK+.

Совет: Наследство поведения прокрутки может быть надежно достигнуто, просто используя правую кнопку мыши вместо левой кнопки мыши.

До GTK+ 3.6, щелчёк в обе стороны от ползунка сдвинет прокрутку в направлении щелчка, примерно на одну страницу. Так GTK+ 3.6, слайдер сразу перейдёт к позиции мыши. Такое поведение можно отменить в некоторых приложениях путем создания файла с содержимым, приведенным ниже:

~/.config/gtk-3.0/settings.ini
gtk-primary-button-warps-slider = false

Отключить наложение скролбара

С GTK+ 3.15, наложения полосы прокрутки по умолчанию включено, что означает, что полосы прокрутки будут показываться только при наведении курсора мыши на GTK+ 3 приложение. Такое поведение можно отменить, установив следующую переменную окружения: .

Смотрите .

Удалить наложенные показателя скролбара

Позиции наложения прокрутки обозначены тонкими пунктирными линиями в окне приложения. Эти пунктирные линии будут присутствовать, даже если накладка прокрутка отключена с помощью переменной сред, которая обсуждались в предыдущем разделе. Для удаления индикаторных линий, создайте следующий файл:

~/.config/gtk-3.0/gtk.css
/* Remove dotted lines from GTK+ 3 applications */
.undershoot.top, .undershoot.right, .undershoot.bottom, .undershoot.left { background-image: none; }

Explanation

Initialising the App

In a GTK application, the purpose of the function is to create a object and run it. In this example a instance is created and initialized using .

When creating a you need to pick an application identifier (a name) and input to as parameter. For this example, is used but for choosing an identifier for your application see this guide. Lastly takes a argument, which control some of the capabilities that your application has, like being able to open files specified on the command line, or parsing command line options.

Next the activate signal is connected to the function above the functions. The activate signal will be sent when your application is launched with on the line below. The also takes as arguments the pointers to the command line arguments counter and string array; this allows GTK to parse specific command line arguments that control the behavior of GTK itself. The parsed arguments will be removed from the array, leaving the unrecognized ones for your application to parse.

Within the signal is sent and we then proceed into the function of the application. Inside the function we want to construct our GTK window, so that a window is shown when the application is launched. The call to will create a new instance and store it inside the pointer. The window will have a frame, a title bar, and window controls depending on the platform.

A window title is set using . This function takes a pointer and a string as input. As our window pointer is a GtkWidget pointer, we need to cast it to . But instead of casting window via the usual C cast operator , should be cast using the macro. will perform a run time check if the pointer is an instance of the class, before casting, and emit a warning if the check fails. More information about this convention can be found here.

Finally the window size is set using and the window is then shown by GTK via .

When you exit the window, by for example pressing the X, the in the main loop returns with a number which is saved inside an integer named “status”. Afterwards, the object is freed from memory with . Finally the status integer is returned to the operating system, and the GTK application exits.

Adding Button

As seen above, adds a button to our window, with the label “Hello World”. Two new pointers are declared to accomplish this, and . The variable is created to store a which is GTK’s way of controlling the size and layout of buttons. The is created and assigned to which takes a enumeration value as parameter. The buttons which this box will contain can either be stored horizontally or vertically but this does not matter in this particular case as we are dealing with only one button. After initializing with horizontal orientation, the code adds the widget to the window widget using .

Adding Label

Next the button variable is initialized in similar manner. is called which returns a to be stored inside . Afterwards is added to our . Using the button is connected to a function in our app called , so that when the button is clicked, GTK will call this function. As the function does not use any data as input, NULL is passed to it. calls with the string “Hello World” which will print Hello World in a terminal if the GTK application was started from one.

Controlling Event Handling

After connecting , another signal is connected to the “clicked” state of the button using . This functions is similar to a with the difference lying in how the callback function is treated. Using allows you to specify what the callback function should take as the instance parameter by letting you pass it as data. In this case the function being called back is and the pointer is passed to it. This has the effect that when the button is clicked, the window is closed as if the “close” button had been pressed. In contrast, if a normal were used to connect the “clicked” signal with , then GTK would warn that the button is not a instance. More information about creating buttons can be found here.

Other Interfaces

  • Lazarus known issues (things that will never be fixed) — A list of interface compatibility issues
  • Win32/64 Interface — The Windows API (formerly Win32 API) interface for Windows 95/98/Me/2000/XP/Vista/10, but not CE
  • Windows CE Interface — For Pocket PC and Smartphones
  • Carbon Interface — The Carbon 32 bit interface for macOS (deprecated; removed from macOS 10.15)
  • Cocoa Interface — The Cocoa 64 bit interface for macOS
  • Qt Interface — The Qt4 interface for Unixes, macOS, Windows, and Linux-based PDAs
  • Qt5 Interface — The Qt5 interface for Unixes, macOS, Windows, and Linux-based PDAs
  • GTK1 Interface — The gtk1 interface for Unixes, macOS (X11), Windows
  • GTK2 Interface — The gtk2 interface for Unixes, macOS (X11), Windows
  • GTK3 Interface — The gtk3 interface for Unixes, macOS (X11), Windows
  • fpGUI Interface — Based on the fpGUI library, which is a cross-platform toolkit completely written in Object Pascal
  • Custom Drawn Interface — A cross-platform LCL backend written completely in Object Pascal inside Lazarus. The Lazarus interface to Android.

Platform specific Tips

  • Android Programming — For Android smartphones and tablets
  • iPhone/iPod development — About using Objective Pascal to develop iOS applications
  • FreeBSD Programming Tips — FreeBSD programming tips
  • Linux Programming Tips — How to execute particular programming tasks in Linux
  • macOS Programming Tips — Lazarus tips, useful tools, Unix commands, and more…
  • WinCE Programming Tips — Using the telephone API, sending SMSes, and more…
  • Windows Programming Tips — Desktop Windows programming tips

Interface Development Articles

  • Carbon interface internals — If you want to help improving the Carbon interface
  • Windows CE Development Notes — For Pocket PC and Smartphones
  • Adding a new interface — How to add a new widget set interface
  • LCL Defines — Choosing the right options to recompile LCL
  • LCL Internals — Some info about the inner workings of the LCL
  • Cocoa Internals — Some info about the inner workings of the Cocoa widgetset

Windows

GTK Libraries

  • Get an all-in-one bundle. Do not install each of the packages separately.
  • Do not install the bundle to a path that has spaces in it.
  • Do not get the 2.16 bundle.

You can check that you have done everything in this step correctly by opening a command prompt and entering

pkg-config --cflags gtk+-2.0

If you see some compiler flags that contain the path into which you have installed the binary bundle, you are okay.

Gtk2Hs Bindings

This step should be as easy as running

cabal update
cabal install gtk2hs-buildtools
cabal install gtk

After installing gtk2hs-buildtools, make sure that gtk2hsC2hs is in a directory that is on your %PATH%.

Changing Environment Variables

The installation process involves modifying (or, if necessary, adding) the %PATH% environment variable. This subtopic describes how to do this. The %PATH% variable is a ‘;’-separated list of directories.

You can see and modify variables with echo and set:

echo %PATH%
set PATH=dir1;dir2;...

Windows XP GUI

  • Start -> Control Panel -> System -> Advanced -> Environment Variables
  • In the top window, click «New» to add a variable or «Edit» to modify an existing one.

Windows 7 GUI

  • Click on the Windows symbol on the bottom-left where «Start» used to be
  • Choose Computer -> Properties -> Advanced System Settings
  • In the top window, click «New» to add a variable or «Edit» to modify an existing one.

Current issues

Here are some notes about some of the current issues. It is not a complete list, but mainly a collection of the information about some of the most annoying problems, that can not be solved simply.

Destroying handle during OnKeyDown gives AV

This is a more general problem, not only KeyDown. There are two solutions:

  • Increase reference counters of all used widgets during events. Difficult to maintain and we will never be sure to ref count every used widget.
  • Instead of destroying widgets immediately, hide them, untie them and put them into a queue. The widgets will then be destroyed in the message loop and on gtk intf shut down.

Z-Order of controls

In Gtk2 many controls don’t have a window, so they are just painted on their parent. This makes they be painted before controls with a window, so we get a wrong Z-Order.

Bug reports

  • http://bugs.freepascal.org/view.php?id=964
  • http://bugs.freepascal.org/view.php?id=8346

Open Dialog Options

TOpenDialog has several options to control the dialog. When implementing these options in Gtk2, however, one needs to watch out because of the vast amount of bugs in Gtk 2, which may prevent the options from working. For example, ofForceShowHidden doesn’t work because of Gtk 2 bugs, althougth it is implemented correctly.

Bug reports

ofForceShowHidden — http://bugs.freepascal.org/view.php?id=8473

TScrollBox and Scrolling problems

TScrollBox and Scrolling seems deeply broken in Gtk 2.

Bug reports

  • http://bugs.freepascal.org/view.php?id=10779
  • http://bugs.freepascal.org/view.php?id=10952
  • http://bugs.freepascal.org/view.php?id=9049
  • http://bugs.freepascal.org/view.php?id=11010

Shortcut keys

Bug reports

  • http://bugs.freepascal.org/view.php?id=1946
  • http://bugs.freepascal.org/view.php?id=7249
  • http://bugs.freepascal.org/view.php?id=10282

Up/Down key navigation between TEdits

A standard Gtk 2 feature allows the use of up/down key to navigate between GtkEntry widgets (like TEdits), but this is undesirable if the user implements a dropdrow list to be attached to the TEdit. As we cannot know what code the user has written, the best option is to disable this feature. Possible ways to do that are:

Listen to key press events of GtkEntry and for Up/Down events shift the focus to implemented widget.
Don’t propagate Up/Down key press events to GtkEntry.

As of lazarus 0.9.31 r31562 GtkEntry behaviour is same as under other widgetsets — NO FOCUS CHANGING BY VK_UP or VK_DOWN.

Bug reports

http://bugs.freepascal.org/view.php?id=11115

Использование

На основе GTK+ построены рабочие окружения GNOME и Xfce. Программы, использующие GTK+, могут выполняться в других окружениях, например в KDE и LXDE. Кроме того, GTK+ может работать и на операционных системах семействах Microsoft Windows и Mac OS X.

Также GTK+ выбран в качестве основной библиотеки построения пользовательских интерфейсов для Mono (порта Microsoft.NET для Linux).

Ниже предоставлен неполный (так как GTK слишком популярен) список проектов с использованием GTK:

Рабочие окружения, которые используют GTK+
  • GNOME — полностью построено на GTK+
  • Cinnamon — форк GNOME 3, использующий GTK+
  • MATE Desktop (форк GNOME 2) — полностью построено на GTK+
  • Xfce — построено на GTK+, но, в сравнении с GNOME, программы Xfce имеют меньше зависимостей
  • LXDE (Lightweight X11 Desktop Environment) — поддерживает только темы и программы GTK, сам строится на Qt
  • ROX Desktop
  • GPE Palmtop Environment
  • Access Linux Platform
  • Sugar — обучающая платформа, которая построена на GTK+ с использованием PyGTK
  • KDE, хотя использует Qt, имеет поддержку программ и тем GTK+ (с версии 4.2).
Оконные менеджеры, использующие GTK+
  • Aewm
  • AfterStep
  • Amaterus
  • IceWM
  • Metacity
  • Marco (форк Metacity в MATE)
  • Mutter
  • Sawfish
  • Wmg
  • Xfwm.
Приложения, использующие GTK+
  • AbiWord — текстовый редактор
  • Anjuta — официальная интегрированная среда разработки GNOME
  • Chromium — веб-браузер, разрабатываемый в основном компанией и использующий WebKit
  • Ekiga — приложения для VoIP и видео-конференций
  • Epiphany — веб-браузер среды GNOME.
  • Evolution — программа для управления контактами и электронной почтой
  • Firefox — стандартный браузер большинства Gnome-редакций дистрибутивов Linux
  • GIMP — растровый графический редактор
  • HandBrake — программа для конвертирования видео
  • Inkscape — векторный графический редактор
  • Midori — легковесный веб-браузер
  • MonoDevelop — открытая интегрированная среда разработки
  • Pidgin — клиент обмена мгновенными сообщениями
  • Wireshark — анализатор сетевых пакетов
  • SciTE — кроссплатформенный текстовый редактор

Знакомство с GNOME

GNOME — имя, данное проекту, начатому в 1997 г. программистами, работавшими в проекте GNU Image Manipulation Program (GIMP) над созданием унифицированного рабочего стола для Linux. Все были согласны с тем, что выбор ОС Linux как платформы рабочего стола тормозился отсутствием согласованной стратегии. В то время рабочий стол Linux напоминал Дикий Запад без общих стандартов или выработанных на практике приемов, и программисты могли делать всё, что вздумается. Без свободной группы, контролирующей меню рабочего стола, согласованное представление и отображение, документацию, трансляцию и т. д., освоение рабочего стола новичком было в лучшем случае путанным, а в худшем — непригодным.

Группа GNOME намеривалась создать рабочий стол для ОС Linux с лицензией GPL, разрабатывая утилиты и программы настройки в едином согласованном стиле, одновременно способствуя развитию стандартов для взаимодействия приложений, печати, управления сеансами и лучших приёмов в программировании GUI приложений.

Результаты их стараний очевидны: среда GNOME — основа стандартного рабочего стола Linux в дистрибутивах Debian, Fedora, Red Hat, Ubuntu и др. (рис. 1).

Рис. 1. Обзор активности в GNOME 3

Первоначально название GNOME означало GNU Network Object Model Environment (среда сетевых объектных моделей GNU), что отражает одну из ранее поставленных задач, внедрение в систему Linux объектной интегрированной системы, такой как Microsoft OLE, для того, чтобы вы могли, например, встроить электронную таблицу в документ текстового процессора. Теперь поставлены новые задачи, и то, что сегодня нам известно как GNOME, — это законченная вреда рабочего стола, содержащая панель для запуска приложений, комплект программ и утилит, библиотеки программирования и средства поддержки разработчиков.

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

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 .

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. 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:

Пример программы

Простая программа «Здравствуй, мир!» на GTK+ в Linux

/* Подключаем библиотеку GTK+ */
# include <gtk/gtk.h>
int main( int argc, char *argv[])
{
	/* Объявляем виджеты */
	GtkWidget *label;	// Метка
	GtkWidget *window;	// Главное окно
	/* Инициализируем GTK+ */
	gtk_init(&argc, &argv);
	/* Создаем главное окно */
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	/* Устанавливаем заголовок окна "Здравствуй, мир!" */
	gtk_window_set_title(GTK_WINDOW(window), "Здравствуй, мир!");
	/* Создаем метку с текстом "Здравствуй, мир!" */
	label = gtk_label_new("Здравствуй, мир!");
	/* Вставляем метку в главное окно */
	gtk_container_add(GTK_CONTAINER(window), label);
	/* Показываем окно вместе с виджетами */
	gtk_widget_show_all(window);
	/* Соединяем сигнал завершения с выходом из программы */
	g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
	/* Приложение переходит в вечный цикл ожидания действий пользователя */
	gtk_main();
	return ;
}

Чтобы скомпилировать пример, нужно выполнить команду:

gcc file_name.c -o file_name `pkg-config --cflags --libs gtk+-3.0`

В Windows скомпилировать пример при помощи MinGW можно следующей командой:

i686-pc-mingw32-gcc file_name.c `PKG_CONFIG_LIBDIR=yes PKG_CONFIG_PATH=/usr/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig/ pkg-config --cflags --libs gtk+-3.0`

История

Номер версии Дата выхода версии Значительные изменения Последняя минорная версия
1.0 14 апреля 1998 года Первая стабильная версия 1.0.6
1.2 27 февраля 1999 года Новые виджеты (GtkFontSelector, GtkPacker, GtkItemFactory, GtkCTree,GtkInvisible, GtkCalendar, GtkLayout, GtkPlug, GtkSocket) 1.2.10
2.0 11 марта 2002 года GObject, Universal Unicode UTF-8 2.0.9
2.2 22 декабря 2002 года Multihead support 2.2.4
2.4 16 марта 2004 года Новые виджеты (GtkFileChooser, GtkComboBox, GtkComboBoxEntry,GtkExpander, GtkFontButton, GtkColorButton) 2.4.14
2.6 16 декабря 2004 года Новые виджеты (GtkIconView, GtkAboutDialog, GtkCellView);это последний выпуск, поддерживающий Windows 98/ME 2.6.10
2.8 13 августа 2005 года Интеграция Cairo 2.8.20
2.10 3 июля 2006 года Новые виджеты (GtkStatusIcon, GtkAssistant, GtkLinkButton,GtkRecentChooser) и поддержка печати (GtkPrintOperation) 2.10.14
2.12 14 сентября 2007 года GtkBuilder 2.12.12
2.14 4 сентября 2008 года Поддержка загрузки JPEG 2000 2.14.7
2.16 13 марта 2009 года Новый GtkOrientable,в поле ввода пароля показывается предупреждение при включённом Caps Lock,улучшения в GtkScale, GtkStatusIcon, GtkFileChooser. 2.16.6
2.18 23 сентября 2009 года Новый GtkInfoBar. Улучшения в диалоге выбора файла, печати.GDK был переписан для использования ‘client-side windows’ 2.18.9
2.20 23 марта 2010 года Новый GtkSpinner и GtkToolPalette, GtkOffscreenWindow.Улучшения в диалоге выбора файла, работе с клавиатурой, GDK.Включены данные интроспекции GObject 2.20.1
2.22 23 сентября 2010 года gdk-pixbuf выделен в отдельный модуль,большинство функций отрисовки теперь выполняет Cairo 2.22.1
2.24 30 января 2011 года Новый упрощённый ComboBox-виджет (GtkComboBoxText),CUPS-бэкенд печати может отправлять задания в PDF,GtkBuilder получил поддержку текстовых тегов,внесено множество исправлений в символы интроспекции 2.24.0
3.0 10 февраля 2011 года За отрисовку теперь полностью отвечает Cairo, абстракция от X11,использование XInput2, поддержка CSS-подобных тем оформления 3.0.12
3.2 25 сентября 2011 года Новые экспериментальные бэкэнды Wayland и HTML5, новый диалог выбора шрифта,новые виджеты: GtkLockButton и GtkOverlay 3.2.4
26 марта 2012 года Поддержка сенсорных дисплеев, в том числе мультитач, поддержка режима плавной прокрутки, улучшена поддержка Windows, MacOS X, расширен API для формирования визуальных тем
24 сентября 2012 года Новые виджеты: GtkSearchEntry, GtkMenuButton, GtkLevelBar. Кнопки ввода чисел GtkSpinButton теперь могут быть расположены вертикально.Поддержка CSS-анимации, использования размытых теней.
13 мая 2013 года Поддержка Wayland 1.0, переработка GDK-бэкенда Broadway, улучшены темы оформления и управление геометрией.Добавлена поддержка всплывающих окон, проведена обширная работа по увеличению производительности
23 сентября 2013 года Новые виджеты (GtkHeaderBar, GtkPlacesSidebar, GtkStack, GtkStackSwitcher, GtkRevealer, GtkSearchBar, GtkListBox).Поддержка Wayland 1.2 (maximization, animated cursors, multiple monitors, settings, custom surfaces and frame synchronization)
25 марта 2014 года Поддержка Wayland 1.5; Новые виджеты (Popover, GtkActionBar, GtkFlowBox ). Улучшена поддержка глобального меню в OS X.
22 сентября 2014 года Поддержка Wayland 1.6; Интеграция интерактивного отладчика GtkInspector. Прекращена поддержка виджетов GdkColor, GtkMisc, GtkArrow, GtkStatusIcon, GtkNumerableIcon, GtkThemingEngine.
22 марта 2015 года GDK встроена поддержка отрисовки окон через OpenGL для X11 и Wayland через libepoxy с использованием GLX или EGL, новые виджеты (GtkGLArea, GtkStackSidebar, GtkModelButton, GtkPopoverMenu), Экспериментальная поддержка Mir.
22 ноября 2015 года Обновился дизайн выбора файла, Удалена поддержка Windows XP
21 марта 2016 года
20 сентября 2016 года Добавлен API GtkPadController для обработки жестов с планшетов, новый виджет GtkShortcutLabel, интегрирована технология Flatpak

Проект Ридли (Project Ridley) — это попытка объединить несколько библиотек, сделав их частью GTK+: libgnome, libgnomeui, libgnomeprint22, libgnomeprintui22, libglade, libgnomecanvas, libegg, libeel, gtkglext и libsexy.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector