如何使用多个显示器管理 BSPWM 上的桌面和 Polybar

如何使用多个显示器管理 BSPWM 上的桌面和 Polybar

我使用 bspwm 作为我的窗口管理器。我已经在台式机上使用它很长时间了,现在我也在笔记本电脑上使用它,但这里操作起来有点困难。

我使用一个名为蒙斯自动处理我的“屏幕布局”。我将它作为 bspwmrc 上的守护进程运行,当我拔下外部显示器时,它会自动更改为仅笔记本电脑屏幕。好的。

问题是,我的笔记本电脑有两个显卡:AMD 集成显卡和 Nvidia 专用显卡。这就是xrandr我所拥有的:

  • 使用集成 AMD 运行时:
    • 笔记本电脑显示屏:eDP-1
    • 外部 DisplayPort 1:DP-1
    • 外部 DisplayPort 2:DP-2
    • 外接 HDMI:HDMI-1
  • 当专用 NVIDIA 时:
    • 笔记本电脑显示屏:eDP-1-1
    • 外部DP:DP-1-1
    • 外部DP:DP-1-2
    • HDMI-1-1

为了简单起见,我需要区分:

  • 仅限 AMD
  • 仅限英伟达
  • AMD + 显示端口(仅数字 1 (so, eDP-1))
  • Nvidia + 显示端口 1 ( eDP-1-1)

我想告诉我的 bspwm grep 结果xrandr并相应地分配我的工作空间。如果手动完成,我运行:

  • 如果只有笔记本电脑屏幕(不需要判断它是在 AMD 还是 nvidia 上运行):

    bspc monitor -d I II III IV V VI VII VIII IX X
    
  • 如果使用 AMD 集成 + 外部 DisplayPort 运行:

    bspc monitor eDP-1 -d I II III IV V
    bspc monitor DP-1 -d VI VII VIII IX X
    
  • 如果它在 Displayport 上使用 nvidia 专用 + 外部显示器运行:

    bspc monitor eDP-1-1 -d I II III IV V
    bspc monitor DP-1-1 -d VI VII VIII IX X
    

如何编写 if / else 决策来检查是否存在eDP-1DP-1eDP-1-1DP-1-1采取相应行动?

我真的不懂任何 bash、脚本或编程,所以我真的不知道如何正确地制作它。你们能帮我吗?

我希望我解释得足够好!

PS:^DP前面是grep一行开始用大写的P,否则它也会找到笔记本电脑的屏幕。

答案1

好吧,经过几个小时的尝试和错误,我终于做到了。我还学习了如何在脚本上使用 if 语句,所以这是值得的。

解决如下:

amddp=$(xrandr --query | grep '^DP-1')
nvidiadp=$(xrandr --query | grep '^DP-1-1 connected')
if [[ $amddp = *\ connected* ]]; then
        bspc monitor eDP-1 -d I II III IV V
        bspc monitor DP-1 -d VI VII VIII IX X
elif [[ $nvidiadp = *\ connected* ]]; then
        bspc monitor eDP-1-1 -d I II III IV V
        bspc monitor DP-1-1 -d VI VII VIII IX X
else
        bspc monitor -d I II III IV V VI VII VIII IX X
fi

稍微理解一下:

  • 当它 grep 查找^DP-1 时(这意味着以以下内容开头的行DP-1,避免笔记本电脑的 eDP-1 屏幕。
  • 当它说时= *\ connected*,它意味着等于:
    • *任何字符或字符组(我使用它是因为我不必在脚本上写下 grep 命令将输出的整行)。
    • \(反斜杠空格)实际上表示空格字符。否则,当我断开显示器连接时,在 grep 查找*connected*“断开连接”时仍然会出现“已连接”一词

相关内容