Журнал LinuxFormat - перейти на главную

LXF145:GTK3

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

Содержание

Пересборка GUI

Джон Ламби вооружился последней версией инструментария виджетов.

Слышите громовые раскаты надвигающейся революции? GTK 3 — первая новая версия инструментария виджетов за последние девять лет, и она повлияет буквально на всех пользователей Linux, работающих в GUI. Если вам это кажется преувеличением, учтите, что на GTK основаны самые популярные рабочие столы Linux, такие как Gnome и Xfce, и GTK используется многими графическими приложениями из других рабочих столов, окружений окон и операционных систем. По сути, GTK можно описать как инструментарий для создания всего графического, работающего где угодно и на любом языке программирования.

GTK – лишь один кирпич в пирамиде связанных инструментариев. Например, GDK обеспечивает обобщенный графический слой, давая независимость от разных оконных систем, GIO предоставляет ввод/вывод, а комбинация GLib и Gobject создает объектно-ориентированную основу с базовыми алгоритмами, утилиты для управления ими и т. д. А на вершине пирамиды расположен Gnome.

GTK требует наличия еще двух других пакетов, которые, строго говоря, не являются частью G-вселенной:

  1. Cairo обеспечивает прорисовку графики.
  2. Pango обеспечивает набор шрифтов.

При таком широком размахе GTK в нем неминуемы излишества. Чтобы создать в нем приложение, нужно знать не только GTK, но и многие другие кирпичи, лежащие ниже в пирамиде – и иногда портирование программы в другие окружения требует значительной переработки.

GTK-приложения

GTK немного напоминает ядро Linux, только для графики (но он не жесткий, а, так сказать, «тягучий»); в нем самом многого не сделаешь – вся сила в программах, которые его применяют.

Итак, какие языки программирования и пакеты используют GTK сами по себе? Всех не перечислишь, но ниже вы найдете широко известные названия, которые стоит отметить:

  1. Gnome 3, который подробно рассмотрен в этом номере.
  2. Metacity, который в Gnome 3 был заменен на Gnome Shell, но все еще используется на старых машинах.
  3. Compiz использует в gtk-window-decorator как Gnome, так и Metacity.
  4. Firefox применяет GTK в ограниченных случаях, например, при настройках пользователя. Firefox 4 все еще применяет GTK 2, но заметны признаки разработки внедрения туда GTK 3.
  5. Также есть PyGTK, Perl-GTK и JavaScript, и другие интерпретируемые языки GTK.

Цели GTK 3

Три года назад идеи об очистке и обновлении GTK были высказаны на Hackfest в Берлине, а около года назад появился и план действий [roadmap] – он приведен на http://www.tuxradar.com/content/gtk-3-plans-laid-out. Одной из самых главных задач было предоставление функций, в которых нуждался Gnome 3 (обратитесь к путеводителю по новому рабочему столу на стр. 24). Главными областями улучшений были:

  1. Упрощение пирамиды.
  2. Облегчение портирования приложений.
  3. Помощь программистам и пользователям достичь желаемых эффектов, особенно с геометрией.
  4. Добавление метода работы с устройствами ввода XInput 2.
  5. Добавление нового способа работы с темами в API и пользовательских настроек на основе синтаксиса CSS.
  6. Обогащение набора виджетов и введение расширений, например, новых базовых классов.
  7. Оснащение аспектов интеграции с платформой, затрагиваемых при написании приложений.

GTK 3 не является конечным пунктом плана; уже идут разговоры о GTK 4 (он-то выйдет раньше, чем через девять лет!) Если вы интересуетесь его эволюцией, то прогресс отслеживается на http://live.gnome.org/GTK+/Roadmap.

Столь радикальная переработка включает удаление обветшавших функций и изменение других, так что 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, но не все. Последующие дистрибутивы, вероятно, будут вести себя так же.

В этом пункте у вас может возникнуть смутное подозрение насчет одной из отрицательных сторон таких решений: путаницы. Скажем, как узнать, есть ли у вас GTK? Это не так сложно: просто поищите в менеджере пакетов пакет с именем gtk3**** или библиотеку libgtk***3.***. Потом, как узнать, используется ли GTK 3 в приложении или пакете xyz? Самый простой и легкий способ узнать это – если xyz решил поддерживать и GTK 2, и GTK 3, то в дистрибутиве будут два разных пакета xyz – каждый для своей версии. Есть надежда, что имена пакетов это отразят. Похоже, именно таким методом пользуются пакеты, желающие поддерживать GTK 3, не заставляя пользователей менять версию.

Это выводит нас на другой потенциальный недостаток сосуществования: дублирование. В Fedora 15 вовлечены следующие пакеты:

  1. PackageKit-gtk-module
  2. ibus-gtk
  3. libindicator
  4. webkitgtk
  5. spice-gtk

Про те, что вне списка, сказать трудно. Попробуйте идентифицировать главный двоичный файл или файл библиотеки xyz, запустив для него команду:

ldd -v binary_filename

Если в выводе вы увидите ссылку на библиотеку GTK, она может дать ответ на ваш вопрос.

Как насчет KDE?

Тем, кому хочется запускать GTK-программы в KDE и иметь возможность распространить на эти программы настройки и темы KDE, следует познакомиться с проектом Hugo: http://hugo-kde.blogspot.com/2010/11/oxygen-gtk.html.

Итак, в отличие от типового обновления, простая установка пакета версии GTK 3 на вашу машину либо не повлияет на все остальное, либо влияние будет незначительным. Фактическое же его подключение требует вмешательства разработчиков программ на его основе.

А надо ли вам заботиться об этом? Может, предоставить это поставщику дистрибутива? Да, возможно, но только если у вас нет чрезмерно перенастроенного внешнего вида GTK через личные настройки, или собственных GTK-приложений. Но если вы заметите изменения, это поможет вам разобраться в происходящем. Ясно, что раз вы создали собственные настройки или изменили системные, то понимали, что делаете.

Особенности GTK 3

Рассмотрим подробнее некоторые из новых функций инструментария виджетов. В GTK 3 есть система управления геометрией «height-for-width» и «width-for-height». Height-for-width значит, что виджет может менять размер требуемого места по вертикали за счет полученного места по горизонтали. Width-for-height работает сходным образом.

Пример работы такой системы – метка, которая «растекается» по ширине в контейнере, благодаря этому «оседая» по высоте. Это происходит полностью автоматически. Виджет должен решить, какое направление считается фиксированным, а какое – растягиваемым, то есть нужен ли height-for-width или width-for-height, а затем производит соответствующие вызовы. Обе функции запроса (на предпочтительную высоту или ширину) и вызовы расположения выполнятся рекурсивно вниз по потомкам виджета, если таковые есть, оценивая минимальный и натуральный размер каждого из них.

Расширения XInput 2 обеспечивают поддержку более широкого класса функций и устройств ввода, таких как множественные устройства ввода, коды 32-разрядных клавиатур и расширенный интерфейс графических планшетов. Эта поддержка не обязательна при установке GTK, но по умолчанию включена. Приложения могут получать одновременный доступ к нескольким устройствам ввода и использовать добавочные «оси», предоставляемые устройствами, такие как сила нажатия и наклон. Координаты событий могут описывать позиции субпикселей, так как теперь их тип – число с плавающей точкой. (Такие интерфейсы – часть Устройств и Событий GDK, а не GTK.)

Введение в stylesheets

GTK 3 прорисовывает виджеты на основе стиля и темы. Конструкция GtkStyle из GTK 2 уже устарела, как и спецификация стилей в пользовательском .gtkrc-2.0. Да и сам файл .gtkrc-xx тоже устарел. Их сменили StyleProvider API и стили типа CSS, задаваемые и настраиваемые пользователем. Имеется новый API для рендеринга и свежий API ThemeEngine. Это сильно улучшает способы, которыми программа и пользователь могут влиять на внешний вид виджета или класса виджетов. Также есть формальная поддержка разработки пользовательского движка тем документацией – хотя легче она от этого не стала.

Ниже перечислены свойства стиля, задаваемые в новом формате CSS:

  1. engine
  2. background-color
  3. color
  4. border-color
  5. font
  6. margin
  7. padding
  8. background-image
  9. border-width
  10. border-radius
  11. border-style
  12. border-image
  13. registered style properties

Есть две разновидности зарегистрированных свойств стиля: характерные для движка стилевые свойства зарегистрированы в GtkThemingEngines, а характерные для виджета – в Widgets. Имена свойств имеют форму

-namespace-name

В этом примере namespace – имя движка темы или имя класса виджетов, соответственно, а name – имя свойства. Давайте-ка попробуем совместить это – вот пример CSS-подобного стиля в GTK 3:

GtkSwitch {
background-color: #122830;
color: #66c8fa;
font: Comic Sans 12;
-GtkSwitch-slider-width: 96;
}
GtkEntry {
background-color: #091929;
color: #99A9B9;
margin: 5 10 3 8;
-GtkEntry-inner-border: 10 3 8 5;
-GtkEntry-font: Times New Roman 10
}

В этом пункте следует отметить, что файл под названием .gtkrc или .gtkrc-2.0 в домашнем каталоге пользователя ныне отсутствует. Этот файл содержал спецификации нескольких типов, а сейчас все они определяются иначе, а именно:

  1. Настройки, простые присваивания в формате name=value Перешли в settings.ini.
  2. Стили Перешли в стили CSS.
  3. Привязки клавиш Новый синтаксис в формате CSS, того же типа, что новые стили.

Установки пользователя обычно управляются внешним менеджером окружения XSettings, который поставляется с рабочим столом, однако вы можете разместить их в новом файле settings.ini, расположение которого указано в экспортированной переменной окружения XDG_CONFIG_HOME. Если вы экспортируете XDG_CONFIG_HOME в some_directory,то GTK 3 будет искать файл настроек в

${XDG_CONFIG_HOME}/gtk-3.0/settings.ini

Можно видеть, что синтаксис настроек в нем немного отличается, но тем не менее до боли знаком:

export XDG_CONFIG_HOME=${HOME}/.xsettings
cat ${XDG_CONFIG_HOME}/gtk-3.0/settings.ini
[Settings]
gtk-theme-name=HighContrast
gtk-application-prefer-dark-theme=1
gtk-font-name=Times Roman 12

Точно – это ж воскресший INI-файл из MS-DOS! (Рано смеетесь: он мог бы стать и реестром). Формат name=value остался неизменным; новизна состоит в расположении файла и группировании разделов, область установок GTK называется [Settings]. В документации по GTK 3 упоминается про файл .gtkrc-3.0, однако тестирование и обсуждение в списках рассылки указывают, что покамест GTK 3 этот файл игнорирует – не утруждайте себя его созданием.

Свежие виджеты

Появилось несколько новых виджетов, и выполнен ряд усовершествований для виджетов с прокруткой. Перечислим последние виджеты:

  1. GtkSwitch Переключатель в легком стиле.
  2. GtkScale Базовый класс для виджетов Horizonal и Vertical Scale.
  3. GtkCellArea Абстрактный класс, пригодный для раскладки GtkCellRenderers.
  4. GtkCellAreaBox Область ячейки, отображающая GtkCellRenderers в ряд или столбец.
  5. GtkCellAreaContext Здесь хранится информация по геометрии рядов в GtkCellArea.
  6. GtkGrid Распределяет виджеты по рядам и колонкам.
  7. GtkBox Базовый класс для контейнеров.
  8. GtkButtonBox Базовый класс для GtkHButtonBox и для GtkVButtonBox.
  9. GtkPaned Другой базовый класс, для виджетов с двумя регулируемыми панелями.
  10. GtkSeparator Базовый класс для GtkHSeparator и GtkVSeparator.
  11. GtkScrollbar И еще один базовый класс – теперь для GtkHScrollbar и GtkVScrollbar.
  12. GtkScrollable Интерфейс для виджетов с прокруткой.
  13. GtkAppChooser Виджеты диалога и кнопки для выбора, которое из установленных приложений использовать для обработки конкретного файла.

Интеграция с платформой

Попробуем

Как всегда, Linux Format шагает впереди (но не впереди паровоза) самых последних технологий; поэтому на LXFDVD помещено работающее окружение GTK 3, которое вы можете испробовать. Там содержится сборка GTK 3 и сопутствующие пакеты, которые должны запускаться на любом дистрибутиве с Glibc 2.11 или более новым, а также две небольших программки:

  1. Программа на C и на Python, демонстрирующая переход с GTK 2 на GTK 3. Под GTK 2 это приложение использует виджет кнопки-переключателя, в сочетании с новым драйвером X-Telekinesis, позволяющим включать и выключать свет в редакции LXF. (Будьте социально ответственны, пожалуйста!)
  2. Программа только на C, демонстрирующая технологию интеграции с платформой – процесс, следящий за стартом и остановкой другого процесса, основываясь на имени приложения.

В версии программы lightswitch после перехода togglebutton заменен на новый виджет GTK 3, lightswitch. В случае с программой на C ее придется изменить и пересобрать с библиотеками GTK 3.

Для приложений Python это производится в два этапа. Начнем с исходного, из файла togglebutton.py:

  1. Перейти с PyGTK на PyGobject с Gobject_Introspection, теперь в файле togglegobj.py.
  2. Сменить виджет togglebutton на виджет lightswitch из GTK 3, сейчас файл switchgobj.py.

Инструкции по сборке и запуску программы прилагаются к пакету – все готово, чтобы вы могли попробовать самую свежую версию GTK и увидеть, что получается.

Вообще говоря, тема платформенной интеграции охватывает все, что касается установки и использования программы в разных платформах и окружениях. Звучит несколько расплывчато, но для инструментария, которых охватывает столько окружений и должен подстраиваться под многочисленные и разнообразые подсистемы, лежащие в их основе, это действительно важно. Новые особенности GTK 3 упрощают дело. А именно, класс GtkApplication, реализованный как производный от класса GIO GApplication, обеспечивает средства связи окон с процессами и позволяет процессам отслеживать и контролировать друг друга через посредство сигналов и действий.

Термин «приложение» может породить некоторую путаницу – в нашем контексте он означает абстрактный объект, отличный от привычного определения выполняемой программы. Эту последнюю мы будем называть процессом. В частности, имя «приложения» не обязательно совпадает с именем исполняемого файла данного процесса.

Например, некий процесс может идентифицироваться с определенным именем приложения и затем наблюдать за запуском/остановом другого процесса с таким же или другим именем приложения, и предпринимать действия, соответствующие ситуации. На LXFDVD помещен пример подобного случая. Процессы могут также обмениваться друг с другом различными простыми сигналами и более сложными объектно-ориентированными сообщениями, описывающими действия, которые следует выполнить.

В основе здесь лежит технология межпроцессного взаимодействия D-BUS (известная также как MessageBus), и она далеко не нова. Скажем, программный интерфейс для D-BUS уже много лет предоставляется в GLib. Например, вызовы метода, о которых мы упоминали выше, используют интерфейс D-BUS Introspect, который возвращает XML-строку, описывающую интерфейсы, методы и сигналы объекта. По сути, то, что произошло, представляет собой постепенную эволюцию и создание интерфейсов более высокого уровня в GIO и GTK. Данная эволюция не намерена останавливаться, и следующим шагом в ее развитии является новый GtkApplication.

Переход и сосуществование

Теперь займемся проблемами, сопутствующими переходу. Рассмотрим три типа пользователей: пользователь, который не настраивает и не разрабатывает приложения; пользователь, кто делает свои настройки, но не создает приложений; и пользователь, разрабатывающий ПО.

Первый будет приятно удивлен новым внешним видом и содержимым рабочего стола, без необходимости менять что-либо. Пользователь, склонный к настройке приложений, обнаружит, что Settings, Bindings и Styles, которые нужно было задать в .gtkrc или .gtkrc-2.0, видимо, куда-то подевались и (Bindings и Styles) переписаны в формате CSS, как описано выше. Действия третьего пользователя, как мы увидим, сильно зависят от природы его приложения и от языка программирования.

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

С интерпретируемыми языками ситуация менее ясна. В Python, знакомый пакет PyGTK устарел и заменен тандемом PyGobject и Gobject-Introspection. Без переписывания не обойтись, что может вызвать шок у обладателей больших библиотек приложений на PyGTK. В чем тут дело? PyGTK – пример привязки языка вручную («статической»). Разработчики годами считали необходимым доступ к внутренним переменным и приватным полям GTK, что все более усложняло поддержку, особенно при обновлении до GTK 3.

Gobject-Introspection предоставляет уровень, содержащий метаданные в библиотеке Gobject, где они могут быть доступны и из компилируемых, и из интерпретируемых языков, давая также способ полуавтоматического сканирования и распознавания синтаксиса языка программирования и сборки соответствующей библиотеки, которую можно привязать к языку. Для программ на Python это означает, что вместо импорта PyGTK они будут импортировать GDK, GTK и Gobject из репозитория Gobject-Introspection. Для языка Perl работа по переходу на Gobject-Introspection ведется на момент написания этой статьи.

И, наконец, следует переписать движки тем, ради реализации интерфейса GtkThemingEngine из GTK 3.

Персональные инструменты
купить
подписаться
Яндекс.Метрика