Gnome桌面环境启用Wayland
默认情况下, Gnome桌面环境使用的协议是X11
协议.
Wayland
是X11
的替代品, 可以提供更好的性能和体验.(绘图在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 IDEA
对Wayland
的支持不足, 其底层基于Java
的Swing
实现图形渲染, 但是目前Swing
还是基于X11
协议, 因此无法使用
Wayland
协议,
会导致系统使用XWayland
来模拟X11
协议, 从而影响其性能,
主要的影响是:
- 打字输入的渲染会比较卡顿
- 应用内部窗口初始化时会出现短暂的黑色背景
- 编辑器滑动会比较卡顿不够流畅
Jetbrains
对Wayland
的支持仍在继续
Jetbrains
去年发布过一个博客, 该博客详细介绍了基于IDE
对Wayland
的支持.
Wayland Support for IntelliJ-based IDEs
该博客中首先对Wayland
作出了介绍, 以及目前Java
对Wayland
的支持现状由于历史的原因, 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工具包方案.
参考
- OpenJDK Project Wakefield - Wayland desktop support for JDK on Linux
- Project Wakefield: A New Wayland Desktop for Java On Linux
Update 2024-06-04 (启用InteiliJ IDEA
对Wayland
的原生支持)
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.
启用步骤
- 进入Releases下载最新的
JetBrains Runtime
- 修改
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
- 在
IDEA
内进入Choose Boot Java Runtime for the IDE
修改Runtime
为新下载的包. - 重启
IDEA
- 启动后执行
xlsclients
检查IDEA
是否运行在X
模式下, 进程名为java