openjdk.ruOpenJDK на русском

JEP 283: Enable GTK 3 on Linux

Включение GTK 3 в Linux

Авторddhill
ОтветственныйDavid Hill
ТипFeature
ОбластьJDK
СтатусClosed / Delivered
Выпуск9
Компонентjavafx / window-toolkit
Обсуждениеopenjfx dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьM
РецензентыDavid Hill, Jonathan Giles, Kevin Rushforth, Philip Race, Sergey Bylokhov, Victor Dyakov
ОдобренKevin Rushforth
Создан2015/12/16 16:42
Обновлён2018/10/12 21:18
Задача8145568

Аннотация

Дать графическим приложениям на Java, будь то на основе JavaFX, Swing или AWT, возможность использовать в Linux как GTK 2, так и GTK 3.

Цели

  • По умолчанию поддерживать нативный GTK 2, а при его недоступности переходить на GTK 3.
  • Использовать GTK 3, если это указано системным свойством.
  • Если GTK 3 требуется для совместимости и это требование можно обнаружить достаточно рано, включать GTK 3 автоматически.
  • Позволить существующим приложениям без изменений работать в Linux-системе, где установлен GTK 2, GTK 3 или оба.

Что не является целью

Использовать общие механизмы динамических обёрток в AWT/Swing и JavaFX.

Мотивация

Сейчас Java в Linux использует GTK 2. Это приводит к ряду проблем:

  • GTK используется в нескольких Java-пакетах, в том числе в AWT/Swing, JavaFX и SWT. SWT перешёл на GTK 3, хотя с помощью системного свойства его можно заставить использовать старую версию. Такое смешение пакетов, использующих разные версии GTK, приводит к сбоям приложений. Особенно заметна эта проблема в Eclipse, который основан на SWT. JavaFX может сосуществовать как со Swing, так и с SWT.

  • Доступность версий: GTK 3 вышел в 2011 году и является основной веткой разработки. Хотя в распространённых современных дистрибутивах Linux по умолчанию доступны обе версии, 2 и 3, на протяжении срока жизни JDK 9 это может измениться.

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

  • Некоторые приложения (например, Java Mission Control) совмещают JavaFX и SWT и полагаются на флаг возврата к GTK 2.

Описание

Графика Java должна поддерживать как GTK 2, так и GTK 3.

Сейчас AWT и Swing находят нужные функции GTK динамически, а не компонуются напрямую с самими нативными библиотеками.

JavaFX уже применяет подобный механизм в других местах и может применить его в коде управления окнами при вызовах GTK.

Этот механизм динамической загрузки можно расширить так, чтобы он выбирал GTK 2 или 3 и как можно полнее скрывал за функциями-обёртками существенные программные различия между ними. Скорее всего, придётся решить ряд программных проблем, например, связанных с различиями в структурах данных или в функциях.

На выбор GTK 2 или 3 во время выполнения будет влиять системное свойство. Чтобы снизить риск, по умолчанию это свойство будет указывать GTK 2. Если в системе нет GTK 2, среда выполнения автоматически выберет GTK 3. Если среда выполнения может вовремя обнаружить необходимость использовать GTK 3, например когда FXCanvas используется вместе с SWT, системное свойство будет автоматически установлено в GTK 3.

JavaFX взаимодействует с AWT/Swing через JFXPanel и использует функциональность AWT для поддержки печати. Можно реализовать поддержку GTK 2/3 только в JavaFX, но это ограничит круг приложений, которые могут поддерживаться.

Основные подзадачи для AWT/Swing:

  • Доработать существующую динамическую прослойку GTK, чтобы она поддерживала и GTK 3.
  • Переработать Swing GTK LnF для поддержки GTK-3.
  • Перевести peer-класс FileChooserDialog на GTK-3.
  • Перевести AwtRobot на GTK-3 (или, возможно, убрать зависимость от GTK вообще).
  • Протестировать существующими автоматическими тестами как с GTK 2, так и с GTK 3.

Подзадачи для JavaFX:

  • Создать прослойку для динамической загрузки GTK 2.
  • Доработать динамическую прослойку GTK, чтобы она поддерживала и GTK 3.
  • Протестировать существующими автоматическими тестами как с GTK2, так и с GTK 3.

Альтернативы

Перевести графику Java на поддержку только GTK 3.

Плюсы:

  • Меньше общих затрат на перенос и тестирование при переводе существующего кода на компиляцию с GTK3 и его использование.
  • Один вариант тестирования вместо двух.
  • В дальнейшем только одна ветвь кода.

Минусы:

  • Выше риск ошибок, которые не обнаружит наше тестирование.
  • Дополнительная работа с look and feel AWT.
  • Необходимость (довольно маловероятная) устанавливать бинарные файлы GTK 3 в целевой системе.
  • Переносить пришлось бы либо и JavaFX, и AWT/Swing, либо ни то ни другое: нельзя было бы отказаться от одного из подпроектов и всё же выпустить другой.
  • Перенос потребовал бы большей согласованности между AWT и Swing.

Тестирование

Следует использовать существующие системные тесты Java для Linux.

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

Риски и допущения

Основной риск предлагаемого решения в том, что появятся новые ошибки, которые не будут выявлены тестированием. AWT использует больше возможностей, поэтому для него риск появления новых ошибок из-за изменений в поведении GTK может быть выше.

Есть риск, что подзадача для AWT/Swing или подзадача для JavaFX не будет завершена вовремя из-за непредвиденных технических трудностей.

Если работу над AWT/Swing не удастся завершить, это наложит ограничения на JavaFX во время выполнения, но только для приложений, совмещающих их. В первую очередь это приложения, которые используют JFXPanel или выполняют печать.

Если работу над JavaFX не удастся завершить, во время выполнения возникнут проблемы у приложений, совмещающих JavaFX и SWT (FXCanvas).