有没有什么方法可以配置 Ubuntu,以便在插入一个(或两个)显示器时设置默认的“首次尝试”显示器分辨率。无论使用什么显卡或图形驱动程序。
例如,当我插入支持 1920x1080 的 HDMI 显示器时,ubuntu 会自动将屏幕分辨率设置为全高清,从而播放顺畅。这很好。
但我需要的只是简单的 1024x768 分辨率,通过 HDMI。为了解决这个问题,我可以轻松进入系统设置 - 显示并进行设置,ubuntu 还会记住我的设置。或者使用 xrandr 命令。
但是每次我更换监视器时,我都需要进入系统设置(或再次运行另一个 xrandr 命令)。
那么,有什么办法可以告诉 ubuntu 吗,比如
“对于插入的每个显示器,无论是通过 D-SUB 还是 HDMI 或其他方式,请尝试检查它是否支持 1024x768,如果支持,则使用该分辨率”
我在想
- 为所有显示器供应商和型号生成类似通用 monitors.xml 的内容
- 每次插入/拔出显示器时运行自定义 xrandr 脚本,但这可能会导致屏幕闪烁。
但我仍然不知道如何实现它们。
作为信息,系统配置为使用 lightdm,如果这很重要的话。我已经阅读了有关 xrandr、monitors.xml 的信息,但仍然找不到解决方案。提前致谢。
答案1
检查新屏幕的后台脚本
每 5 秒一次,下面的后台脚本会查找要连接的新屏幕。
如果发生这种情况时,它会尝试将分辨率设置为您在脚本头部部分设置的分辨率(参见:如何使用)。
如果屏幕设置成功,则会显示通知:
如果设置分辨率的命令失败,则会显示通知:
剧本
#!/usr/bin/env python3
import subprocess
import time
# --- set your main screen below, since you probably want to set it differently
main_screen = "DVI-I-1"
# --- set the tried resolution below
res = "200x300"
#---
screens1 = [main_screen]
def screeens():
[l.split()[0] for l in subprocess.check_output("xrandr")\
.decode("utf-8").splitlines() if " connected" in l]
while True:
time.sleep(5)
screens2 = [l.split()[0] for l in subprocess.check_output("xrandr").decode("utf-8")\
.splitlines() if " connected" in l]
new = [scr for scr in screens2 if not scr in screens1]
for scr in new:
try:
subprocess.check_call(["xrandr", "--auto", "--output", scr, "--mode", res])
# small break to give the screens time to adapt
time.sleep(5)
subprocess.Popen(["notify-send", "successfully set "+scr+" to "+res])
except subprocess.CalledProcessError:
subprocess.Popen(["notify-send", "failed to set resolution of "+scr+" to "+res])
screens1 = screens2
如何使用
- 将脚本复制到一个空文件中,另存为
set_screens.py
在脚本的头部部分设置:
- 你的名字默认屏幕,因为您可能希望将其从自动分辨率设置中排除。
您想要在新屏幕上尝试的分辨率。
# --- set your main screen below, since you probably want to set it differently main_screen = "DVI-I-1" # --- set the tried resolution below res = "200X300" #---
通过以下命令(从终端)测试运行脚本:
python /path/to/set_screens.py
如果一切正常,将其添加到启动应用程序:
/bin/bash -c "sleep 15 && python3 /path/to/set_screens.py"
笔记
在启动命令中这
sleep 15
是必不可少的,特别是如果可能附加了辅助屏幕。如果桌面尚未完全加载,则脚本在开始运行时会中断。如果脚本从终端运行良好,但作为 sartup 命令运行却中断,请稍微尝试一下
sleep 15
。如果您不想排除主屏幕尝试设置分辨率,请更改以下行:
screens1 = [main_screen]
进入:
screens1 = []
运行后台脚本
如果你不需要运行后台脚本,那就不要运行。如果它能增加重要功能和/或节省你的时间,我看不出有什么理由不运行它,如果:
- 没有其他具有相同功能的 100% 干净且简单的解决方案。
和
- 脚本写得很好,没有增加明显的 CPU 负载
在这种情况下,xrandr
每五秒检查一次意味着没有什么到您的系统。
答案2
我在笔记本电脑上创建了几个桌面快捷方式来实现这种功能。它们是
$ cat LowRes.desktop
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_GB]=gnome-panel-launcher
Name[en_GB]=LowRes
Exec=xrandr -s 8
Comment[en_GB]=1368x768
Name=LowResDisplay
Comment=1368x768
Icon=gnome-panel-launcher
和
cat 高分辨率.桌面
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_GB]=gnome-panel-launcher
Name[en_GB]=HighRes
Exec=xrandr -s 4
Comment[en_GB]=1600x900
Name=HighResDisplay
Comment=1600x900
Icon=gnome-panel-launcher
也许类似的东西对你有用。
答案3
我为我的一台显示器创建了一个脚本,并在连接显示器时运行它。因此,您可以为不同类型的显示器创建类似的不同脚本,并根据需要运行每个脚本。
#!/bin/bash
sudo xrandr --addmode VGA-0 1440x900_60.00
sudo xrandr --newmode Modeline "1440x900_60.00" 106.47 1440 1520 1672 1904 900 901 904 932 -HSync +Vsync
使用以下命令为您的显示器创建 Modeline
cvt 1440x900 60
水平像素 x 垂直像素 刷新率