Project Wakefieldの現状

# Project Wakefield
[Project Wakefield](https://openjdk.org/projects/wakefield/ "Project Wakefield")はLinux版OpenJDKのGUI層を従来のX WindowからWaylandへ移行させるプロジェクトです。

# Waylandって何
[Wayland](https://wayland.freedesktop.org/ "Wayland")とは従来Unix系OSのGUI層を担ってきたX Windowを置き換えるべく開発されたものです。Xとの差異については他を参照していただくとして、徐々にXの代替としての地位を築いてきて現在ではほぼすべてのLinuxディストリビューションが指定しなければWaylandで動作するところまで来ています。

# JavaのToolkitとX Windowサポート
JavaはJDK1.0の頃はLinuxをサポートしていませんでした。過去に誰かが「JDK1.0のLinux版ってどこにあるの」と尋ねていたことがありましたが、そういうものは存在しなかったのです。今からすると信じられないことですが。

AWT（とその上に構築されているSwing）はjava.awt.Toolkitという仕組みの上にGUIのサポートを構築しています。JDK1.4までのUNIX系OSではMotif Toolkit（MToolkit）というものが動いていました。これは[java.awt.Toolkit#getDefaultTookit()](https://docs.oracle.com/javase/jp/1.4/api/java/awt/Toolkit.html#getDefaultToolkit())を見ると分かります。

> このシステムプロパティがない場合、使用されるデフォルトのツールキットは "sun.awt.motif.MToolkit" という名前のクラスになります。これは Abstract Window Toolkit の motif 実装です。

JDK1.5にてXToolkitが[導入されました](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/awt/1.5/xawt.html "Solaris/Linux上のXToolkit")。

> Java SE 5.0から、AWTがSolarisおよびLinuxプラットフォーム上に再実装されました。新しいToolkitの実装には、次のような利点があります。
> * MotifおよびXtライブラリへの依存関係をなくします。
> * ほかのGUIツールキットとの相互運用性が向上します。
> * より良いパフォーマンスと品質を提供します。
>
> LinuxとSolarisの両方で、新しいツールキット(XToolkit)がデフォルトになります。

[Javaバージョン履歴](https://ja.wikipedia.org/wiki/Java%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%B1%A5%E6%AD%B4 "Javaバージョン履歴")のページを参照する限りではJDK1.5の最初のリリースは2004年のようですので、そして、MToolkitはほぼ一瞬で消えてしまったので、すでに20年くらいXToolkit以外に選択肢がない状態だったことになります。

# Waylandへの対応
WaylandにはXwaylandと呼ばれるX互換レイヤーが用意されており、何もしなくてもXクライアントが（大抵は）問題なく動作するようになっています。現時点ではまだ殆どのJDK/OpenJDKがXToolkitで動作しているので、それらはXwaylandを経由して動作していることになります。

しかしXwayland経由でJavaアプリケーションを動作させる場合一部に非互換部分があります。これはX WindowとWaylandのポリシーなどの違いから出てくる差異であり、Xwaylandのシミュレーションを完璧にすればOKという問題ではない部分があります。特にRobot APIに関する部分で引っかかるようです。

そこでWaylandへのnative対応が求められるようになってきました。このためProject WakefieldではWayland nativeのToolkitであるWLToolkitを開発しています。

ある時期からJetBrainsが自社製IDEのWayland native対応を進める姿勢を示したことでWLToolkitの開発はかなり進歩したようです。

# 最新のWLToolkit
一番手軽にWLToolkitを体験する方法は[SDKMAN!](https://sdkman.io/ "SDKMAN!")からJetBrains Runtime（jbr）を読み込むことだと思います。JBR21にはすでにWLToolkitが取り込まれています。

```
sdk install java 21.0.4-jbr
```

これでSwingのサンプルのTreeIconDemo2を実行した結果がこうなります。

```
java -Dawt.toolkit.name=WLToolkit components.TreeIconDemo2
```
![Screenshot from 2024-10-15 00-27-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21571/838d472f-7310-012f-ceb0-2a6164cfa624.png)

Toolkit指定を外して実行した結果はこうなります。（Xwaylandによる描画結果になります。）

![Screenshot from 2024-10-15 00-33-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21571/4e8934bf-b600-df67-e8c2-3e2db46269d3.png)

ウィンドウのタイトルバーの角丸処理が外れているのとフォントのレンダリングに差があり、まだ完成度が低いという感じです。

デスクトップの世界ではまあXwaylandがあればそれなりのクオリティの描画結果が得られるので、ズバリの非互換を踏んでいるケース以外今のところそんなに気にしなくてもいいのですが、問題は組込の世界ですね。

組込の世界ではOSとしてはLinuxをベースにしたものが提供されるケースは多いのですが、X Windowは提供されないというケースが増えてきました。Waylandならあります、という状況ですね。また組込JavaだとまだJDK8以下を使っているケースも多いと思われます。SDKMAN!で提供されるJBRも21にはWLToolkitが含まれていますが、11だとXToolkitしか入っていませんでした。OpenJDKでメインブランチにWLToolkitが取り込まれたとしても入るのは新しいものからになる可能性が高く、JDK8までWLToolkitが降りてくるのはかなり先だと考えるべきでしょう。組込の状況から考えてWayland native対応の重要度が高いのはメジャーバージョンの低いJDKの方だと考えるべきでしょう。逆にそこでの対応が遅れた場合Javaを捨てる製品が増えていくのではという懸念があるのでした。