<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF145%3AGTK3</id>
		<title>LXF145:GTK3 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF145%3AGTK3"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF145:GTK3&amp;action=history"/>
		<updated>2026-05-13T03:12:59Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF145:GTK3&amp;diff=15278&amp;oldid=prev</id>
		<title>2sash-kan: Новая страница: «==Пересборка GUI==  : '''Джон Ламби''' вооружился последней версией инструментария виджетов.  …»</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF145:GTK3&amp;diff=15278&amp;oldid=prev"/>
				<updated>2014-07-08T13:06:08Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «==Пересборка GUI==  : &amp;#039;&amp;#039;&amp;#039;Джон Ламби&amp;#039;&amp;#039;&amp;#039; вооружился последней версией инструментария виджетов.  …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Пересборка GUI==&lt;br /&gt;
&lt;br /&gt;
: '''Джон Ламби''' вооружился последней версией инструментария виджетов.&lt;br /&gt;
&lt;br /&gt;
Слышите громовые раскаты надвигающейся революции? GTK 3 — первая новая версия инструментария виджетов за последние девять лет, и она повлияет буквально на всех пользователей Linux, работающих в GUI. Если вам это кажется преувеличением, учтите, что на GTK основаны самые популярные рабочие столы Linux, такие как Gnome и Xfce, и GTK используется многими графическими приложениями из других рабочих столов, окружений окон и операционных систем. По сути, GTK можно описать как инструментарий для создания всего графического, работающего где угодно и на любом языке программирования.&lt;br /&gt;
&lt;br /&gt;
GTK – лишь один кирпич в пирамиде связанных инструментариев. Например, GDK обеспечивает обобщенный графический слой, давая независимость от разных оконных систем, GIO предоставляет ввод/вывод, а комбинация GLib и Gobject создает объектно-ориентированную основу с базовыми алгоритмами, утилиты для управления ими и т. д. А на вершине пирамиды расположен Gnome.&lt;br /&gt;
&lt;br /&gt;
GTK требует наличия еще двух других пакетов, которые, строго говоря, не являются частью G-вселенной:&lt;br /&gt;
# Cairo обеспечивает прорисовку графики.&lt;br /&gt;
# Pango обеспечивает набор шрифтов.&lt;br /&gt;
&lt;br /&gt;
При таком широком размахе GTK в нем неминуемы излишества. Чтобы создать в нем приложение, нужно знать не только GTK, но и многие другие кирпичи, лежащие ниже в пирамиде – и иногда портирование программы в другие окружения требует значительной переработки.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|right|Заголовок=GTK-приложения|Содержание=GTK немного напоминает ядро Linux, только для графики (но он не жесткий, а, так сказать, «тягучий»); в нем самом многого не сделаешь – вся сила в программах, которые его применяют.&lt;br /&gt;
&lt;br /&gt;
Итак, какие языки программирования и пакеты используют GTK сами по себе? Всех не перечислишь, но ниже вы найдете широко известные названия, которые стоит отметить:&lt;br /&gt;
# Gnome 3, который подробно рассмотрен в этом номере.&lt;br /&gt;
# Metacity, который в Gnome 3 был заменен на Gnome Shell, но все еще используется на старых машинах.&lt;br /&gt;
# Compiz использует в gtk-window-decorator как Gnome, так и Metacity.&lt;br /&gt;
# Firefox применяет GTK в ограниченных случаях, например, при настройках пользователя. Firefox 4 все еще применяет GTK 2, но заметны признаки разработки внедрения туда GTK 3.&lt;br /&gt;
# Также есть PyGTK, Perl-GTK и JavaScript, и другие интерпретируемые языки GTK.|Ширина=20%}}&lt;br /&gt;
&lt;br /&gt;
===Цели GTK 3===&lt;br /&gt;
&lt;br /&gt;
Три года назад идеи об очистке и обновлении GTK были высказаны на Hackfest в Берлине, а около года назад появился и план действий [roadmap] – он приведен на http://www.tuxradar.com/content/gtk-3-plans-laid-out. Одной из самых главных задач было предоставление функций, в которых нуждался Gnome 3 (обратитесь к путеводителю по новому рабочему столу на стр. 24). Главными областями улучшений были:&lt;br /&gt;
# Упрощение пирамиды.&lt;br /&gt;
# Облегчение портирования приложений.&lt;br /&gt;
# Помощь программистам и пользователям достичь желаемых эффектов, особенно с геометрией.&lt;br /&gt;
# Добавление метода работы с устройствами ввода XInput 2.&lt;br /&gt;
# Добавление нового способа работы с темами в API и пользовательских настроек на основе синтаксиса CSS.&lt;br /&gt;
# Обогащение набора виджетов и введение расширений, например, новых базовых классов.&lt;br /&gt;
# Оснащение аспектов интеграции с платформой, затрагиваемых при написании приложений.&lt;br /&gt;
&lt;br /&gt;
GTK 3 не является конечным пунктом плана; уже идут разговоры о GTK 4 (он-то выйдет раньше, чем через девять лет!) Если вы интересуетесь его эволюцией, то прогресс отслеживается на http://live.gnome.org/GTK+/Roadmap.&lt;br /&gt;
&lt;br /&gt;
Столь радикальная переработка включает удаление обветшавших функций и изменение других, так что GTK 3 собран так, чтобы сосуществовать с GTK 2, используя другие имена для библиотек. Это и хорошо, и плохо. Хорошо тем, что вы сможете установить и использовать его, не преобразовывая все ваши программы. Фактически библиотеки GTK 3 уже есть в Fedora 14, замаскированные в пакете под названием '''gtk3-2.90.5-1.fc14'''. (Не тратьте свое время на испытания этого пакета; мы не смогли ни найти графическую программу, использующую его, ни собрать с ним что-либо). Fedora 15 будет содержать пакет уже «настоящего» GTK 3 – возможно, это будет gtk3-3.0.x – и перейдет на Gnome 3, эксплуатирующий GTK 3. Ожидается, что в Fedora 15 и другие пакеты начнут использовать GTK 3, но не все. Последующие дистрибутивы, вероятно, будут вести себя так же.&lt;br /&gt;
&lt;br /&gt;
В этом пункте у вас может возникнуть смутное подозрение насчет одной из отрицательных сторон таких решений: путаницы. Скажем, как узнать, есть ли у вас GTK? Это не так сложно: просто поищите в менеджере пакетов пакет с именем gtk3**** или библиотеку libgtk***3.***. Потом, как узнать, используется ли GTK 3 в приложении или пакете xyz? Самый простой и легкий способ узнать это – если xyz решил поддерживать и GTK 2, и GTK 3, то в дистрибутиве будут два разных пакета xyz – каждый для своей версии. Есть надежда, что имена пакетов это отразят. Похоже, именно таким методом пользуются пакеты, желающие поддерживать GTK 3, не заставляя пользователей менять версию.&lt;br /&gt;
&lt;br /&gt;
Это выводит нас на другой потенциальный недостаток сосуществования: дублирование. В Fedora 15 вовлечены следующие пакеты:&lt;br /&gt;
# PackageKit-gtk-module&lt;br /&gt;
# ibus-gtk&lt;br /&gt;
# libindicator&lt;br /&gt;
# webkitgtk&lt;br /&gt;
# spice-gtk&lt;br /&gt;
&lt;br /&gt;
Про те, что вне списка, сказать трудно. Попробуйте идентифицировать главный двоичный файл или файл библиотеки xyz, запустив для него команду:&lt;br /&gt;
&lt;br /&gt;
 ldd -v binary_filename&lt;br /&gt;
&lt;br /&gt;
Если в выводе вы увидите ссылку на библиотеку GTK, она может дать ответ на ваш вопрос.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|right|Заголовок=Как насчет KDE?|Содержание=Тем, кому хочется запускать GTK-программы в KDE и иметь возможность распространить на эти программы настройки и темы KDE, следует познакомиться с проектом Hugo: http://hugo-kde.blogspot.com/2010/11/oxygen-gtk.html.|Ширина=20%}}&lt;br /&gt;
&lt;br /&gt;
Итак, в отличие от типового обновления, простая установка пакета версии GTK 3 на вашу машину либо не повлияет на все остальное, либо влияние будет незначительным. Фактическое же его подключение требует вмешательства разработчиков программ на его основе.&lt;br /&gt;
&lt;br /&gt;
А надо ли вам заботиться об этом? Может, предоставить это поставщику дистрибутива? Да, возможно, но только если у вас нет чрезмерно перенастроенного внешнего вида GTK через личные настройки, или собственных GTK-приложений. Но если вы заметите изменения, это поможет вам разобраться в происходящем. Ясно, что раз вы создали собственные настройки или изменили системные, то понимали, что делаете.&lt;br /&gt;
&lt;br /&gt;
==Особенности GTK 3==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим подробнее некоторые из новых функций инструментария виджетов. В GTK 3 есть система управления геометрией «height-for-width» и «width-for-height». Height-for-width значит, что виджет может менять размер требуемого места по вертикали за счет полученного места по горизонтали. Width-for-height работает сходным образом.&lt;br /&gt;
&lt;br /&gt;
Пример работы такой системы – метка, которая «растекается» по ширине в контейнере, благодаря этому «оседая» по высоте. Это происходит полностью автоматически. Виджет должен решить, какое направление считается фиксированным, а какое – растягиваемым, то есть нужен ли height-for-width или width-for-height, а затем производит соответствующие вызовы. Обе функции запроса (на предпочтительную высоту или ширину) и вызовы расположения выполнятся рекурсивно вниз по потомкам виджета, если таковые есть, оценивая минимальный и натуральный размер каждого из них.&lt;br /&gt;
&lt;br /&gt;
Расширения XInput 2 обеспечивают поддержку более широкого класса функций и устройств ввода, таких как множественные устройства ввода, коды 32-разрядных клавиатур и расширенный интерфейс графических планшетов. Эта поддержка не обязательна при установке GTK, но по умолчанию включена. Приложения могут получать одновременный доступ к нескольким устройствам ввода и использовать добавочные «оси», предоставляемые устройствами, такие как сила нажатия и наклон. Координаты событий могут описывать позиции субпикселей, так как теперь их тип – число с плавающей точкой. (Такие интерфейсы – часть Устройств и Событий GDK, а не GTK.)&lt;br /&gt;
&lt;br /&gt;
===Введение в stylesheets===&lt;br /&gt;
&lt;br /&gt;
GTK 3 прорисовывает виджеты на основе стиля и темы. Конструкция GtkStyle из GTK 2 уже устарела, как и спецификация стилей в пользовательском .gtkrc-2.0. Да и сам файл .gtkrc-xx тоже устарел. Их сменили StyleProvider API и стили типа CSS, задаваемые и настраиваемые пользователем. Имеется новый API для рендеринга и свежий API ThemeEngine. Это сильно улучшает способы, которыми программа и пользователь могут влиять на внешний вид виджета или класса виджетов. Также есть формальная поддержка разработки пользовательского движка тем документацией – хотя легче она от этого не стала.&lt;br /&gt;
&lt;br /&gt;
Ниже перечислены свойства стиля, задаваемые в новом формате CSS:&lt;br /&gt;
# engine&lt;br /&gt;
# background-color&lt;br /&gt;
# color&lt;br /&gt;
# border-color&lt;br /&gt;
# font&lt;br /&gt;
# margin&lt;br /&gt;
# padding&lt;br /&gt;
# background-image&lt;br /&gt;
# border-width&lt;br /&gt;
# border-radius&lt;br /&gt;
# border-style&lt;br /&gt;
# border-image&lt;br /&gt;
# registered style properties&lt;br /&gt;
&lt;br /&gt;
Есть две разновидности зарегистрированных свойств стиля: характерные для движка стилевые свойства зарегистрированы в GtkThemingEngines, а характерные для виджета – в Widgets. Имена свойств имеют форму&lt;br /&gt;
&lt;br /&gt;
 -namespace-name&lt;br /&gt;
&lt;br /&gt;
В этом примере namespace – имя движка темы или имя класса виджетов, соответственно, а name – имя свойства. Давайте-ка попробуем совместить это – вот пример CSS-подобного стиля в GTK 3:&lt;br /&gt;
&lt;br /&gt;
 GtkSwitch {&lt;br /&gt;
 background-color: #122830;&lt;br /&gt;
 color: #66c8fa;&lt;br /&gt;
 font: Comic Sans 12;&lt;br /&gt;
 -GtkSwitch-slider-width: 96;&lt;br /&gt;
 }&lt;br /&gt;
 GtkEntry {&lt;br /&gt;
 background-color: #091929;&lt;br /&gt;
 color: #99A9B9;&lt;br /&gt;
 margin: 5 10 3 8;&lt;br /&gt;
 -GtkEntry-inner-border: 10 3 8 5;&lt;br /&gt;
 -GtkEntry-font: Times New Roman 10&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
В этом пункте следует отметить, что файл под названием .gtkrc или .gtkrc-2.0 в домашнем каталоге пользователя ныне отсутствует. Этот файл содержал спецификации нескольких типов, а сейчас все они определяются иначе, а именно:&lt;br /&gt;
# '''Настройки, простые присваивания в формате name=value''' Перешли в settings.ini.&lt;br /&gt;
# '''Стили''' Перешли в стили CSS.&lt;br /&gt;
# '''Привязки клавиш''' Новый синтаксис в формате CSS, того же типа, что новые стили.&lt;br /&gt;
&lt;br /&gt;
Установки пользователя обычно управляются внешним менеджером окружения XSettings, который поставляется с рабочим столом, однако вы можете разместить их в новом файле settings.ini, расположение которого указано в экспортированной переменной окружения XDG_CONFIG_HOME. Если вы экспортируете XDG_CONFIG_HOME в some_directory,то GTK 3 будет искать файл настроек в&lt;br /&gt;
&lt;br /&gt;
 ${XDG_CONFIG_HOME}/gtk-3.0/settings.ini&lt;br /&gt;
&lt;br /&gt;
Можно видеть, что синтаксис настроек в нем немного отличается, но тем не менее до боли знаком:&lt;br /&gt;
&lt;br /&gt;
 export XDG_CONFIG_HOME=${HOME}/.xsettings&lt;br /&gt;
 cat ${XDG_CONFIG_HOME}/gtk-3.0/settings.ini&lt;br /&gt;
 [Settings]&lt;br /&gt;
 gtk-theme-name=HighContrast&lt;br /&gt;
 gtk-application-prefer-dark-theme=1&lt;br /&gt;
 gtk-font-name=Times Roman 12&lt;br /&gt;
&lt;br /&gt;
Точно – это ж воскресший INI-файл из MS-DOS! (Рано смеетесь: он мог бы стать и реестром). Формат name=value остался неизменным; новизна состоит в расположении файла и группировании разделов, область установок GTK называется [Settings]. В документации по GTK 3 упоминается про файл '''.gtkrc-3.0''', однако тестирование и обсуждение в списках рассылки указывают, что покамест GTK 3 этот файл игнорирует – не утруждайте себя его созданием.&lt;br /&gt;
&lt;br /&gt;
===Свежие виджеты===&lt;br /&gt;
&lt;br /&gt;
Появилось несколько новых виджетов, и выполнен ряд усовершествований для виджетов с прокруткой. Перечислим последние виджеты:&lt;br /&gt;
# GtkSwitch Переключатель в легком стиле.&lt;br /&gt;
# GtkScale Базовый класс для виджетов Horizonal и Vertical Scale.&lt;br /&gt;
# GtkCellArea Абстрактный класс, пригодный для раскладки GtkCellRenderers.&lt;br /&gt;
# GtkCellAreaBox Область ячейки, отображающая GtkCellRenderers в ряд или столбец.&lt;br /&gt;
# GtkCellAreaContext Здесь хранится информация по геометрии рядов в GtkCellArea.&lt;br /&gt;
# GtkGrid Распределяет виджеты по рядам и колонкам.&lt;br /&gt;
# GtkBox Базовый класс для контейнеров.&lt;br /&gt;
# GtkButtonBox Базовый класс для GtkHButtonBox и для GtkVButtonBox.&lt;br /&gt;
# GtkPaned Другой базовый класс, для виджетов с двумя регулируемыми панелями.&lt;br /&gt;
# GtkSeparator Базовый класс для GtkHSeparator и GtkVSeparator.&lt;br /&gt;
# GtkScrollbar И еще один базовый класс – теперь для GtkHScrollbar и GtkVScrollbar.&lt;br /&gt;
# GtkScrollable Интерфейс для виджетов с прокруткой.&lt;br /&gt;
# GtkAppChooser Виджеты диалога и кнопки для выбора, которое из установленных приложений использовать для обработки конкретного файла.&lt;br /&gt;
&lt;br /&gt;
===Интеграция с платформой===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|right|Заголовок=Попробуем|Содержание=Как всегда, Linux Format шагает впереди (но не впереди паровоза) самых последних технологий; поэтому на '''LXFDVD''' помещено работающее окружение GTK 3, которое вы можете испробовать. Там содержится сборка GTK 3 и сопутствующие пакеты, которые должны запускаться на любом дистрибутиве с Glibc 2.11 или более новым, а также две небольших программки:&lt;br /&gt;
# Программа на C и на Python, демонстрирующая переход с GTK 2 на GTK 3. Под GTK 2 это приложение использует виджет кнопки-переключателя, в сочетании с новым драйвером X-Telekinesis, позволяющим включать и выключать свет в редакции LXF. (Будьте социально ответственны, пожалуйста!)&lt;br /&gt;
# Программа только на C, демонстрирующая технологию интеграции с платформой – процесс, следящий за стартом и остановкой другого процесса, основываясь на имени приложения.&lt;br /&gt;
&lt;br /&gt;
В версии программы lightswitch после перехода togglebutton заменен на новый виджет GTK 3, lightswitch. В случае с программой на C ее придется изменить и пересобрать с библиотеками GTK 3.&lt;br /&gt;
&lt;br /&gt;
Для приложений Python это производится в два этапа. Начнем с исходного, из файла '''togglebutton.py''':&lt;br /&gt;
# Перейти с PyGTK на PyGobject с Gobject_Introspection, теперь в файле '''togglegobj.py'''.&lt;br /&gt;
# Сменить виджет togglebutton на виджет lightswitch из GTK 3, сейчас файл '''switchgobj.py'''.&lt;br /&gt;
&lt;br /&gt;
Инструкции по сборке и запуску программы прилагаются к пакету – все готово, чтобы вы могли попробовать самую свежую версию GTK и увидеть, что получается.|Ширина=30%}}&lt;br /&gt;
&lt;br /&gt;
Вообще говоря, тема платформенной интеграции охватывает все, что касается установки и использования программы в разных платформах и окружениях. Звучит несколько расплывчато, но для инструментария, которых охватывает столько окружений и должен подстраиваться под многочисленные и разнообразые подсистемы, лежащие в их основе, это действительно важно. Новые особенности GTK 3 упрощают дело. А именно, класс GtkApplication, реализованный как производный от класса GIO GApplication, обеспечивает средства связи окон с процессами и позволяет процессам отслеживать и контролировать друг друга через посредство сигналов и действий.&lt;br /&gt;
&lt;br /&gt;
Термин «приложение» может породить некоторую путаницу – в нашем контексте он означает абстрактный объект, отличный от привычного определения выполняемой программы. Эту последнюю мы будем называть процессом. В частности, имя «приложения» не обязательно совпадает с именем исполняемого файла данного процесса.&lt;br /&gt;
&lt;br /&gt;
Например, некий процесс может идентифицироваться с определенным именем приложения и затем наблюдать за запуском/остановом другого процесса с таким же или другим именем приложения, и предпринимать действия, соответствующие ситуации. На '''LXFDVD''' помещен пример подобного случая. Процессы могут также обмениваться друг с другом различными простыми сигналами и более сложными объектно-ориентированными сообщениями, описывающими действия, которые следует выполнить.&lt;br /&gt;
&lt;br /&gt;
В основе здесь лежит технология межпроцессного взаимодействия D-BUS (известная также как MessageBus), и она далеко не нова. Скажем, программный интерфейс для D-BUS уже много лет предоставляется в GLib. Например, вызовы метода, о которых мы упоминали выше, используют интерфейс D-BUS Introspect, который возвращает XML-строку, описывающую интерфейсы, методы и сигналы объекта. По сути, то, что произошло, представляет собой постепенную эволюцию и создание интерфейсов более высокого уровня в GIO и GTK. Данная эволюция не намерена останавливаться, и следующим шагом в ее развитии является новый GtkApplication.&lt;br /&gt;
&lt;br /&gt;
==Переход и сосуществование==&lt;br /&gt;
&lt;br /&gt;
Теперь займемся проблемами, сопутствующими переходу. Рассмотрим три типа пользователей: пользователь, который не настраивает и не разрабатывает приложения; пользователь, кто делает свои настройки, но не создает приложений; и пользователь, разрабатывающий ПО.&lt;br /&gt;
&lt;br /&gt;
Первый будет приятно удивлен новым внешним видом и содержимым рабочего стола, без необходимости менять что-либо. Пользователь, склонный к настройке приложений, обнаружит, что Settings, Bindings и Styles, которые нужно было задать в .gtkrc или .gtkrc-2.0, видимо, куда-то подевались и (Bindings и Styles) переписаны в формате CSS, как описано выше. Действия третьего пользователя, как мы увидим, сильно зависят от природы его приложения и от языка программирования.&lt;br /&gt;
&lt;br /&gt;
В языках семейства C многие функции были признаны устаревшими, а другие были заменены. Например, при рисовании вместо GDK применяются функции Cairo. Если программа пользователя требует любую из них, она должна быть преобразована, но, вообще говоря, в глобальном переписывании нужды нет. После этого, конечно, нужно пересобрать приложения, включив файлы и библиотеки GTK 3.&lt;br /&gt;
&lt;br /&gt;
С интерпретируемыми языками ситуация менее ясна. В Python, знакомый пакет PyGTK устарел и заменен тандемом PyGobject и Gobject-Introspection. Без переписывания не обойтись, что может вызвать шок у обладателей больших библиотек приложений на PyGTK. В чем тут дело? PyGTK – пример привязки языка вручную («статической»). Разработчики годами считали необходимым доступ к внутренним переменным и приватным полям GTK, что все более усложняло поддержку, особенно при обновлении до GTK 3.&lt;br /&gt;
&lt;br /&gt;
Gobject-Introspection предоставляет уровень, содержащий метаданные в библиотеке Gobject, где они могут быть доступны и из компилируемых, и из интерпретируемых языков, давая также способ полуавтоматического сканирования и распознавания синтаксиса языка программирования и сборки соответствующей библиотеки, которую можно привязать к языку. Для программ на Python это означает, что вместо импорта PyGTK они будут импортировать GDK, GTK и Gobject из репозитория Gobject-Introspection. Для языка Perl работа по переходу на Gobject-Introspection ведется на момент написания этой статьи.&lt;br /&gt;
&lt;br /&gt;
И, наконец, следует переписать движки тем, ради реализации интерфейса GtkThemingEngine из GTK 3.&lt;/div&gt;</summary>
		<author><name>2sash-kan</name></author>	</entry>

	</feed>