You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XMonad IndependentScreens启动时第二显示器工作区加载异常求助

XMonad IndependentScreens 启动时第二显示器默认工作区异常问题

问题描述

配置XMonad的IndependentScreens实现单显示器独立工作区,此前运行正常,但重启电脑后第二台显示器默认打开0_code工作区。切换至该显示器并手动切到1_web工作区后,功能恢复正常。已确认xrandr在XMonad启动前已正确配置显示器。

相关配置与输出

工作区配置

def {
        workspaces         = withScreens 2 [ "web", "code", "spare" ],
}

布局配置

myLayout = onWorkspaces [ "1_web","1_code","1_spare" ] myVerticalLayout $ myDefaultLayout
  where
    myDefaultLayout = tall
    myVerticalLayout = three

Xrandr输出

Screen 0: minimum 8 x 8, current 3640 x 1920, maximum 32767 x 32767
DP-0 connected 1080x1920+2560+0 right (normal left inverted right x axis y axis) 544mm x 303mm
   1920x1080     60.00 + 164.92   144.00   119.98*   99.93    84.90    59.94    50.00  
DP-2 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 598mm x 336mm
   2560x1440    144.00 + 119.99*   59.95  

解决方法

1. 启动时强制指定各屏幕的默认工作区

在XMonad配置中添加startupHook,明确为每个屏幕设置初始工作区:

首先导入必要模块:

import XMonad.Actions.OnScreen (viewOnScreen)

然后定义启动钩子:

myStartupHook = do
    -- 屏幕0(主显示器DP-2)默认打开0_web
    viewOnScreen 0 "0_web"
    -- 屏幕1(副显示器DP-0)默认打开1_web
    viewOnScreen 1 "1_web"

最后将钩子加入主配置:

def {
        workspaces         = withScreens 2 [ "web", "code", "spare" ],
        startupHook        = myStartupHook,
        layoutHook         = myLayout,
        -- 其他配置项...
}

2. 验证工作区命名与布局的匹配性

withScreens 2生成的工作区命名规则为[屏幕编号]_[工作区名称],即屏幕0对应0_web、0_code、0_spare,屏幕1对应1_web、1_code、1_spare。你的布局配置已经正确针对屏幕1的工作区设置了垂直布局,启动时强制指定工作区可以消除XMonad初始映射的不确定性。

3. 确保Xrandr配置稳定后再启动XMonad

即使xrandr在XMonad前执行,也可能存在显示器配置未完全生效的时序问题。可以修改启动脚本,加入短暂延迟:

xrandr --output DP-2 --primary --mode 2560x1440 --rate 144 --output DP-0 --mode 1920x1080 --rate 144 --right-of DP-2 && sleep 1 && xmonad

内容的提问来源于stack exchange,提问作者Allusive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:30:28