我可以根据当前设置自动为 xrandr 生成命令行吗?

我可以根据当前设置自动为 xrandr 生成命令行吗?

不久前,我为我的双屏设置编写了一个设置脚本,当 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了解详情。

相关内容