我使用 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-1
、DP-1
或eDP-1-1
并DP-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*
“断开连接”时仍然会出现“已连接”一词