插入外部显示器时自动应用 RandR 配置的工具

Yar*_*ych 67 linux xorg udev xrandr

有没有一种工具可以让人们:

  • 记住每个显示器的当前 RandR 配置(位置、方向、分辨率等),
  • 插入显示器后立即自动应用最后一次已知的良好配置,而无需使用小程序或 xrandr(1)?

这些配置必须在每个用户、每个显示器的基础上应用。

如果野外没有这样的工具,我想自己拼一个,但据我所知,没有办法判断是否插入了显示器。我是否必须使用 xrandr -q 进行轮询偶尔弄清楚输出是连接还是断开,还是有更有效的方法来做到这一点?可以调整 udev 来做到这一点吗?

Jac*_*hal 26

关于可以在每个用户和每个显示器的基础上存储监视器配置文件的工具,autorandr将完全做到这一点。

我的笔记本电脑有一个 NVIDIA 卡,所以我使用disper 后端而不是 xrandr。Autorandr 将使用 disper 作为后端来管理您的监视器(如果您将其称为autodisper. 不过,对于本文的其余部分,我将其称为autorandr一致性。

您可以使用autorandr --save profile_name. autorandr单独运行会为您提供一个配置文件列表,并确定哪一个被检测为当前配置。

例如:

$ autorandr
laptop
syncmaster19 (detected)
Run Code Online (Sandbox Code Playgroud)

您可以告诉它自动为当前配置加载适当的配置文件autorandr --change。此命令与 udev 规则配对以在热插拔时运行它,将执行您的要求。

作为额外的预防措施,我已附加--default laptop到该命令中,如果没有与当前配置匹配的已保存配置文件,它将使其默认为笔记本电脑的显示器。所以我用来切换显示的完整命令是:

autorandr --change --default laptop
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我热插拔显示器时,我的机器没有提供任何 udev 输出。我使用的是 NVIDIA 专有驱动程序,所以这并不奇怪。所以我现在将它绑定到 XF68Display 键 (Fn-F8),这几乎一样好。

  • 以防万一,有一个很好的维护重写的 Python 分支 `autorandr`:https://github.com/phillipberndt/autorandr (14认同)
  • **autorandr** 也很好地封装在 Ubuntu 中,并负责所有 **udev** 和 **xdg** 配置。您需要做的就是根据[README](https://github.com/phillipberndt/autorandr/) 创建您的配置文件,它将自动切换。请注意,版本 1.4 (Ubuntu 18) 的功能并不完整。我正在使用[此处](https://packages.ubuntu.com/search?keywords=autorandr) 中的 1.8,效果很好。 (2认同)

peo*_*oro 25

我正在使用这个简单的(自制的)脚本,当 VGA 连接/断开连接时,它会不断轮询 RandR 并在 LVDS1 和 VGA1 之间切换。(对于HDMI输出,在以下脚本文件中,将所有更改VGA1HDMI1

这是一个肮脏的解决方案,但它工作得很好。

它是为我的设置定制的:您很可能需要更改 RandR 输出名称(LVDS1VGA1),与我不同的是,您可能对 VGA 的 RandR 默认模式没问题。

#!/bin/bash

# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
    echo "Switching to VGA1"
    xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    MONITOR=VGA1
}
function DeactivateVGA {
    echo "Switching to LVDS1"
    xrandr --output VGA1 --off --output LVDS1 --auto
    MONITOR=LVDS1
}

# functions to check if VGA is connected and in use
function VGAActive {
    [ $MONITOR = "VGA1" ]
}
function VGAConnected {
    ! xrandr | grep "^VGA1" | grep disconnected
}

# actual script
while true
do
    if ! VGAActive && VGAConnected
    then
        ActivateVGA
    fi

    if VGAActive && ! VGAConnected
    then
        DeactivateVGA
    fi

    sleep 1s
done
Run Code Online (Sandbox Code Playgroud)

完整步骤:

  1. 将上述脚本 ( homemadeMonitor.sh) 放入您的首选目录

  2. 通过在终端中键入以下命令使 .sh 文件可执行

    chmod +x homemadeMonitor.sh

  3. 运行 .sh 文件

    ./homemadeMonitor.sh


And*_*ndy 22

回应问题的“[a] 方法来告诉监视器已插入”部分:

支持仍然有很大差异,但最近的内核支持在显示热插拔发生时生成 udev 事件。使用内核 2.6.38 和 ATI X1400 硬件,我在第一次连接 VGA 显示器时收到一个事件,但在随后断开或重新连接显示器时没有事件。英特尔硬件可能有更好的支持。NVIDIA 专有驱动程序目前不支持 KMS;我还没有尝试在 NVIDIA 硬件上寻找热插拔事件,但我怀疑它是否有效。

如果您想尝试使用 udev,您可以尝试以下步骤:

  • 更新到最新的内核
  • 确保启用内核模式设置 (KMS)。如果启用,它应该在您的内核输出中报告。我的说[drm] radeon kernel modesetting enabled[drm] initializing kernel modesetting
  • 运行udevadm monitor --property并查看当您(断开)连接时是否报告事件显示

如果您在显示热插拔上收到 udev 事件,您可以使用 udev 规则触发一个脚本,例如:

ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"
Run Code Online (Sandbox Code Playgroud)

注意:这会不会,如果您使用的是NVIDIA GPU与专有二进制驱动程序,因为它不使用KMS。您不会收到任何 udev 事件。


小智 7

我使用了上面建议的 udev 规则以及一个看起来像的 shell 脚本

#!/bin/sh

dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority

if [ "${dmode}" = disconnected ]; then
     /usr/bin/xrandr --auto
elif [ "${dmode}" = connected ];then
     /usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi
Run Code Online (Sandbox Code Playgroud)

Xauthority 部分和 export 一样必不可少DISPLAY,您可以使用 echo$DISPLAY查看它等于哪个数字。使用xrandr -q就看你有外部显示器。最后一个 else 语句只是为了确保您永远不会在没有显示的情况下卡住。


iyr*_*rin 7

如果您必须让它在插入时自动检测显示,似乎最干净的解决方案是添加 UDEV 规则来运行包含您的 xrandr 命令的脚本。以下是一位用户的解决方案1的示例:

使用udevadm
此步骤监视(输出)UDEV 事件对于每个用户来说都是最重要的。运行udevadm monitor --environment --udev。然后连接您的 HDMI 电缆。

UDEV 规则
根据上述命令的输出,用户在 处创建了此 UDEV 规则/etc/udev/rules.d/95-monitor-hotplug.rules

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"
Run Code Online (Sandbox Code Playgroud)

请注意使用的环境变量,因此 xrandr 将在用户配置文件下运行。

xrandr 脚本 hotplug_monitor.sh

您可能需要调整 xrandr 选项以满足您的需要。

#! /usr/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority

function connect(){
    xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred 
}

function disconnect(){
      xrandr --output HDMI1 --off
}

xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect
Run Code Online (Sandbox Code Playgroud)


Joa*_*ner 6

一个等待 X 服务器通知它有关更改的监视器配置,然后执行给定命令(例如autorandr在另一个答案中提到的命令)的小程序可从以下网址获得:https : //bitbucket.org/portix/srandrd/overview

这似乎是一个更干净的解决方案,使用udev(您必须担心找到合适的 X 服务器等)