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