Skip to main content

Gnome桌面环境启用Wayland

· 5 min read
orange
programmer on jvm platform

默认情况下, Gnome桌面环境使用的协议是X11协议.
WaylandX11的替代品, 可以提供更好的性能和体验.(绘图在Client侧而不是像X11一样由XServer负责).
下面将介绍如何启用Wayland协议.

确认当前的通信协议

执行以下命令, 确认当前的通信协议:

echo $XDG_SESSION_TYPE

当输出结果为x11时, 说明当前使用的是X11协议. 如果输出结果为wayland时, 说明当前使用的是Wayland协议, 不需要做任何操作.

修改配置文件

执行以下命令, 修改配置文件:

sudo vim /etc/gdm3/custom.conf

将配置文件中的WaylandEnable=false改为WaylandEnable=true

重启gdm服务并进入桌面

执行以下命令, 重启gdm服务:

sudo systemctl restart gdm

gdm服务重启后, 当前登录的会话会退出, 需要重新登录, 登录时选择Wayland登录方式即可.

验证

执行以下命令, 验证是否启用Wayland:

echo $XDG_SESSION_TYPE

当输出结果为wayland时, 说明启用Wayland成功.

应用Wayland支持

Chrome

com.google.Chrome --ozone-platform=wayland

VsCode

code --ozone-platform=wayland

参考资料

Update 2024-03-28 (InteiliJ IDEA目前对Wayland的原生支持还在进行中)

Wayland的支持不足

InteiliJ IDEAWayland的支持不足, 其底层基于JavaSwing实现图形渲染, 但是目前Swing还是基于X11协议, 因此无法使用 Wayland协议, 会导致系统使用XWayland来模拟X11协议, 从而影响其性能, 主要的影响是:

  • 打字输入的渲染会比较卡顿
  • 应用内部窗口初始化时会出现短暂的黑色背景
  • 编辑器滑动会比较卡顿不够流畅

JetbrainsWayland的支持仍在继续

Jetbrains去年发布过一个博客, 该博客详细介绍了基于IDEWayland的支持.
Wayland Support for IntelliJ-based IDEs
该博客中首先对Wayland作出了介绍, 以及目前JavaWayland的支持现状由于历史的原因, Java尚未支持Wayland而是采用 Xwayland兼容性过渡方案.
其次介绍了目前对于Java原生Wayland支持的挑战.
最后是对未来支持Wayland的展望.

OpenJDK Project Wakefield

OpenJDK中的Wakefield项目致力于解决让在JDK中实现Wayland display server的支持

该项目有中短期和中长期两个目标:

短期到中期解决方案:
a short to medium term solution for JDK running on Wayland in X11 compatibility mode.
JDK在X11兼容模式下运行在Wayland上.

中期到长期解决方案:
a medium to long term solution for JDK running as a native Wayland client. Pure Wayland toolkit plan proposal.
JDK作为原生Wayland客户端, 需要一个纯Wayland工具包方案.

参考

Update 2024-06-04 (启用InteiliJ IDEAWayland的原生支持)

InteiliJ IDEA底层的Runtime正在支持Wayland, 可以通过修改Java Runtime来启用Wayland原生支持, 启用后UI交互相较于 XWayland会比较流畅

已知问题

启用后会有一些问题, 例如:

  • Cannot use the input method (fcitx) to input chinese characters.
  • Cannot open dialog for renaming files.

启用步骤

  1. 进入Releases下载最新的JetBrains Runtime
  2. 修改idea64.vmoptions增加以下内容
--add-opens=java.base/java.io=ALL-UNNAMED \
-ea \
-Dawt.toolkit.name=WLToolkit \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.ref=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.net=ALL-UNNAMED \
--add-opens=java.base/java.nio=ALL-UNNAMED \
--add-opens=java.base/java.nio.charset=ALL-UNNAMED \
--add-opens=java.base/java.text=ALL-UNNAMED \
--add-opens=java.base/java.time=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED \
--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED \
--add-opens=java.base/jdk.internal.vm=ALL-UNNAMED \
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/sun.nio.fs=ALL-UNNAMED \
--add-opens=java.base/sun.security.ssl=ALL-UNNAMED \
--add-opens=java.base/sun.security.util=ALL-UNNAMED \
--add-opens=java.base/sun.net.dns=ALL-UNNAMED \
--add-opens=java.desktop/com.sun.java.swing.plaf.gtk=ALL-UNNAMED \
--add-opens=java.desktop/java.awt=ALL-UNNAMED \
--add-opens=java.desktop/java.awt.dnd.peer=ALL-UNNAMED \
--add-opens=java.desktop/java.awt.event=ALL-UNNAMED \
--add-opens=java.desktop/java.awt.image=ALL-UNNAMED \
--add-opens=java.desktop/java.awt.peer=ALL-UNNAMED \
--add-opens=java.desktop/java.awt.font=ALL-UNNAMED \
--add-opens=java.desktop/javax.swing=ALL-UNNAMED \
--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED \
--add-opens=java.desktop/javax.swing.text.html=ALL-UNNAMED \
--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED \
--add-opens=java.desktop/sun.awt.wl=ALL-UNNAMED \
--add-opens=java.desktop/sun.awt.datatransfer=ALL-UNNAMED \
--add-opens=java.desktop/sun.awt.image=ALL-UNNAMED \
--add-opens=java.desktop/sun.awt=ALL-UNNAMED \
--add-opens=java.desktop/sun.font=ALL-UNNAMED \
--add-opens=java.desktop/sun.java2d=ALL-UNNAMED \
--add-opens=java.desktop/sun.swing=ALL-UNNAMED \
--add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED \
--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
--add-opens=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
--add-opens=jdk.jdi/com.sun.tools.jdi=ALL-UNNAMED com.intellij.idea.Main
  1. IDEA内进入Choose Boot Java Runtime for the IDE修改Runtime为新下载的包.
  2. 重启IDEA
  3. 启动后执行xlsclients检查IDEA是否运行在X模式下, 进程名为java

参考