不久前,我为我的双屏设置编写了一个设置脚本,当 X 出现故障时我需要恢复正常,但我刚刚找到了一个备用显示器,并发现我可以从我不知道的 USB-C 端口使用 DP。
我突然想到 xrandr 也许能够为当前设置创建自己的命令行,而不必我自己去编写它,但我找不到任何选项。
这有用吗?这是个愚蠢的想法吗?
答案1
我之前遇到过同样的问题,这导致我创建了一个~/.bashrc
名为的函数xreset
:
xreset () {
xrandr --output HDMI-0 --mode 1920x1080 --pos 0x0 --rotate normal \
--output eDP-1-1 --mode 1920x1080 --pos 3840x2160 --rotate normal \
--output DP-1-1 --mode 3840x2160 --pos 1920x0 --rotate normal
} # xreset
按位置和分辨率排列好显示器后,使用以下命令获取当前设置:
$ xrandr | grep " connected"
HDMI-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 1107mm x 623mm
eDP-1-1 connected primary 1920x1080+3840+2160 (normal left inverted right x axis y axis) 382mm x 215mm
DP-1-1 connected 3840x2160+1920+0 (normal left inverted right x axis y axis) 1600mm x 900mm
这里提供的所有信息可供您创建自己的xreset
功能。
答案2
啧啧。有时候问这个问题会得到不同的搜索词。
Arandr 是一个图形编辑器,允许您移动事物,但最切题的是它会将 xrandr 命令行保存/导出为脚本:
xrandr \
--output HDMI-2 --mode 3840x2160 --pos 0x48 --rotate normal \
--output HDMI-1 --off \
--output DP-1 --mode 3840x2160 --pos 5760x0 --rotate left \
--output eDP-1 --primary --mode 1920x1080 --pos 3840x1528 --rotate normal \
--output DP-2 --off
我不需要“关闭”输出,但它们是无害的。
答案3
我不知道这样的软件,但这里有一个快速脚本,它执行的逻辑对应操作iptables -S
,即生成导致当前配置的命令:
#!/bin/bash
# Emit current X configuration as xrandr commands (similar to iptables -S)
# (does not currently support custom modelines or axis or panning)
# Copyright 2003 Mikko Rantalainen <[email protected]>
# License: MIT
function create_flags()
{
port="$1"
shift
status="$1"
shift
if [ "$status" = "disconnected" ]; then
printf "%s" "--output '$port' --off"
return
fi
if [ "$status" != "connected" ]; then
echo "Error: port=$port: unknown status=$status" 1>&2
exit 1
fi
PRIMARY=""
if [ "$1" = "primary" ]; then
PRIMARY="yes"
shift
fi
mode="$1"
shift
printf "%s\n" "$mode" | sed 's/+/ /; s/+/x/' | while read mode position
do
printf "%s" "--output '$port' --mode '$mode' --pos '$position'"
done
if [ "$PRIMARY" = "yes" ]; then
printf "%s" " --primary"
fi
rotation="$1"
if [ "$rotation" = "left" ]; then
printf " --rotation left"
shift
elif [ "$rotation" = "right" ]; then
printf " --rotation right"
shift
elif [ "$rotation" = "inverted" ]; then
printf " --rotation inverted"
shift
fi
return
}
printf "xrandr"
LC_ALL=C xrandr -q | grep connected | while read line
do
test "$1" = "--debug" && printf "\nProcessing line [%s]\n" "$line" 1>&2
printf " %s" "$(create_flags $line)"
done
printf "\n"
将其保存为文本文件,赋予其可执行位并运行它以将当前 X 屏幕配置作为xrandr
命令发出。传递命令行参数--debug
以显示如何解释每一行。
我希望xrandr -S
默认发出这个。如果输出不是为将来解析而设计的,则解析文本输出总是容易出错。这不会尝试保留所选的刷新率,因为查询的输出语法存在问题。相反,将xrandr
默认为每个 GPU 和显示器组合支持的最高刷新率。
xrandr
请注意,连接器/输出名称可能会发生变化,因此如果在重启后重命名输出,则无法使用发出的命令。请参阅https://www.baeldung.com/linux/primary-monitor-x-wayland了解详情。