我会傻傻地 上网搜索,搜索出来 --ozone-platform 这个命令行参数可以指定用 x11 还是 wayland,在以前,我只会做到这里,妥协地改 .desktop 文件(我不太想改 .desktop 文件,因为.desktop 文件一般是由包管理器负责部署的,直接改,不"通知"包管理器的话以后可能会出问题,而且 chrome 这边PWA也会生成 .desktop 文件)。
但现在,我们可以直接派 Agent 过去调查 chromium 的源代码:
● Ozone 平台在启动时选择 X11 和 Wayland 的具体逻辑如下:
构建时配置
在 build/config/ozone.gni:59-90 中定义了默认平台选择:
- Linux 桌面:默认使用 x11 平台
- ChromeOS:默认使用 x11 平台
- Fuchsia:默认使用 flatland 平台
- 其他情况:默认使用 headless 平台
运行时选择逻辑
在 ui/linux/display_server_utils.cc:50-70 中的 SetOzonePlatformForLinuxIfNeeded() 函数:
1. 命令行参数优先:如果已指定 --ozone-platform,直接使用该值
2. Wayland 检测:
- 检查 XDG_SESSION_TYPE 环境变量是否为 "wayland"
- 如果是,自动选择 wayland 平台
3. X11 回退:如果没有指定平台且不是 Wayland 会话,默认选择 x11
环境检测
在 ui/linux/display_server_utils.cc:72-87 中的检测函数:
- Wayland:检查 WAYLAND_DISPLAY 环境变量或 $XDG_RUNTIME_DIR/wayland-0 套接字文件
- X11:检查 DISPLAY 环境变量
平台初始化流程
在 ui/ozone/public/ozone_platform.cc:32-43 中:
1. 通过 GetOzonePlatformId() 获取平台 ID
2. 使用 PlatformObject<OzonePlatform>::Create() 创建对应平台实例
3. 平台列表在构建时由 generate_ozone_platform_list.py 生成
总结:Ozone 优先使用命令行参数,其次根据桌面环境自动选择 Wayland(当检测到 Wayland 会话时),否则默认回退到 X11。
好耶~~!我们现在就知道了 chrome 原来是根据 XDG_SESSION_TYPE 选择 X11/Wayland 的。
我们就可以把 XDG_SESSION_TYPE 改到 wayland 之外的值
启动 chrome ,它真的按照 Agent 说的那样使用 X11 (Xwayland) 了!
虽然 Agent 写代码现在不太行,但让它看现有代码效率比自己看要高。

