当前配置到底是什么(2026-10-10 实测三层一致)
configuration.nix: local.launcher = { enable = true; session = "x11"; greeter = "x11"; };
nix eval 结果: session=x11 greeter=x11 ⇒ defaultSession=plasmax11 sddm.wayland.enable=false xkb=cn
落地文件: /etc/sddm.conf.d/00-nixos.conf → DefaultSession=plasmax11.desktop / DisplayServer=x11
当前会话: XDG_SESSION_TYPE=x11(从 plasmashell 进程 environ 读)
实现集中在 modules/system/launcher.nix(configuration.nix 只留开关)。
世代: gen78 sddm-default-session-x11 → gen79 deepseek-set-wayland-is-future → gen80 desktop-launcher-module
为什么本机默认 X11(launcher.nix 文件头的四条判据)
① Wayland 下 fcitx5 的 waylandFrontend 不可用 ⇒ Rime 打不出字 ✗
② Wayland 无全局窗口定位 API ⇒ 窗口位置回不来 ✗
③ 本机显示栈(4060 reverseSync、MST 色深约束、固定 EDID)都是按 X11 调的 ✗
④ greeter 用 Wayland 时,接外接屏(2560x1440)会反复刷
"kwin_wayland_drm: Atomic modeset test failed!"(ENOSPC)⇒ 登录界面画不出来 = 开机黑屏 ✗
(这就是那段“桌面起不来”的根因,详见「显卡:780M集显外接屏幕启动黑屏问题」 oDmTnSoJUTax 的 B01 行)
四个开关各管什么(最容易混)
local.launcher.session → 登录后默认会话;模块翻译成上游文件名:x11→plasmax11 / wayland→plasma
local.launcher.greeter → 登录界面(greeter)自己的显示服务器(与用户会话无关)
local.launcher.xkbLayout → X11 键盘布局;Wayland 会话由 KWin 自管
i18n.inputMethod.fcitx5.waylandFrontend → Wayland 会话下的输入法前端开关(X11 会话不受影响)
坑 1:上游命名里 plasma 就是 Wayland
share/wayland-sessions/plasma.desktop → startplasma-wayland Name=Plasma (Wayland)
share/xsessions/plasmax11.desktop → startplasma-x11 Name=Plasma (X11)
⇒ 同一个 plasma-workspace、同一个 DesktopNames=KDE,只差启动程序
⇒ SDDM 的 DefaultSession 在两个 SessionDir 里按**文件名**找 ⇒ 写 "plasma" 必然落到 Wayland
⇒ 模块把这件事收敛成 session = x11|wayland,调用方不必记 plasmax11 这个上游细节
坑 2:两个“改了不生效”的原因(都实测过)
① state.conf 优先于 defaultSession
/var/lib/sddm/state.conf 的 [Last] Session= 是“上次会话”,greeter 会预选它,登录成功后写回。
若它铉着 Wayland,defaultSession 永远轮不上(表现:改了配置、重启后还是 Wayland)。
对齐办法(二选一): A. 在 greeter 下拉里选一次目标会话(会重写 state.conf)
B. 直接改/删 /var/lib/sddm/state.conf(需 root)
本机当前: state.conf 为空/不存在 ⇒ 不会盖掉 defaultSession ✓
② SDDM 只在启动时读一次配置 ⇒ 光 rebuild 不重启 SDDM 无效
实测: 21:45 改成 plasmax11 并 rebuild(gen78),21:50 登录仍进 Wayland
—— 因为 display-manager 还是 01:25 开机那个进程(systemctl show display-manager -p ExecMainStartTimestamp)
生效点: 改 config ⇒ rebuild ⇒ **重启 SDDM(systemctl restart display-manager)或重启系统** ⇒ 之后默认才生效
判据:确认当前在哪个会话
loginctl list-sessions --no-legend # 会话号与类型
loginctl show-session <会话号> -p Type -p Desktop -p Service # Type=wayland|x11
journalctl -u display-manager | grep -i 'selected, command' # SDDM 本次选了哪个 .desktop
systemctl show display-manager -p ExecMainStartTimestamp --value # SDDM 何时启动(判断配置是否已被重读)
grep -E 'DefaultSession|DisplayServer' /etc/sddm.conf.d/00-nixos.conf # 配置里写的值
cat /var/lib/sddm/state.conf # 那个优先级更高的“上次会话”
从会话进程读真相: tr '\0' '\n' < /proc/<plasmashell 的 pid>/environ | grep XDG_SESSION_TYPE
上游方向与迁移路径(Wayland 是未来,X11 将被移除)
事实 1: 上游命名已定 plasma = Wayland;X11 那份只能叫 plasmax11(见坑 1)
事实 2: KDE 已宣布逐步移除 X11 会话 ⇒ 将来 plasmax11.desktop 会消失
本模块默认 session = "x11" ⇒ 那时会指向不存在的文件名 ✗
迁移(模块已把文件名收敛,只改一行):
configuration.nix: local.launcher = { session = "wayland"; }; # 模块自动翻译成 plasma.desktop
配套(否则 Rime 打不出字):
i18n.inputMethod.fcitx5.waylandFrontend = true; # 详见「日常应用:rime 输入法无法输入拼音」X7t2Gy1c3Dbw 的 P1
迁 Wayland 后仍需接受: 窗口位置无法由应用自定(Wayland 固有),需用窗口规则约束
何时必须迁(判据): ls <xsessions 目录>/plasmax11.desktop 一旦不存在 = 上游已移除
撤销 / 临时切换
临时进另一种会话: 登录界面左下角会话下拉框手选(立刻生效,不需重启 SDDM,且会重写 state.conf)
整体切 Wayland: local.launcher.session = "wayland" + waylandFrontend = true ⇒ rebuild + 重启 SDDM
只换 greeter: local.launcher.greeter = "wayland"(注意判据④:外接屏接着时可能黑屏)