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),这几乎一样好。
peo*_*oro 25
我正在使用这个简单的(自制的)脚本,当 VGA 连接/断开连接时,它会不断轮询 RandR 并在 LVDS1 和 VGA1 之间切换。(对于HDMI输出,在以下脚本文件中,将所有更改VGA1为HDMI1)
这是一个肮脏的解决方案,但它工作得很好。
它是为我的设置定制的:您很可能需要更改 RandR 输出名称(LVDS1和VGA1),与我不同的是,您可能对 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)
完整步骤:
将上述脚本 ( homemadeMonitor.sh) 放入您的首选目录
通过在终端中键入以下命令使 .sh 文件可执行
chmod +x homemadeMonitor.sh
运行 .sh 文件
./homemadeMonitor.sh
And*_*ndy 22
回应问题的“[a] 方法来告诉监视器已插入”部分:
支持仍然有很大差异,但最近的内核支持在显示热插拔发生时生成 udev 事件。使用内核 2.6.38 和 ATI X1400 硬件,我在第一次连接 VGA 显示器时收到一个事件,但在随后断开或重新连接显示器时没有事件。英特尔硬件可能有更好的支持。NVIDIA 专有驱动程序目前不支持 KMS;我还没有尝试在 NVIDIA 硬件上寻找热插拔事件,但我怀疑它是否有效。
如果您想尝试使用 udev,您可以尝试以下步骤:
[drm] radeon kernel modesetting enabled和[drm] initializing kernel modesettingudevadm 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 语句只是为了确保您永远不会在没有显示的情况下卡住。
如果您必须让它在插入时自动检测显示,似乎最干净的解决方案是添加 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)
一个等待 X 服务器通知它有关更改的监视器配置,然后执行给定命令(例如autorandr在另一个答案中提到的命令)的小程序可从以下网址获得:https : //bitbucket.org/portix/srandrd/overview
这似乎是一个更干净的解决方案,使用udev(您必须担心找到合适的 X 服务器等)