如果我连接(任何)外接显示器,如何自动尝试特定的分辨率?

如果我连接(任何)外接显示器,如何自动尝试特定的分辨率?

有没有什么方法可以配置 Ubuntu,以便在插入一个(或两个)显示器时设置默认的“首次尝试”显示器分辨率。无论使用什么显卡或图形驱动程序。

例如,当我插入支持 1920x1080 的 HDMI 显示器时,ubuntu 会自动将屏幕分辨率设置为全高清,从而播放顺畅。这很好。

但我需要的只是简单的 1024x768 分辨率,通过 HDMI。为了解决这个问题,我可以轻松进入系统设置 - 显示并进行设置,ubuntu 还会记住我的设置。或者使用 xrandr 命令。

但是每次我更换监视器时,我都需要进入系统设置(或再次运行另一个 xrandr 命令)。

那么,有什么办法可以告诉 ubuntu 吗,比如

“对于插入的每个显示器,无论是通过 D-SUB 还是 HDMI 或其他方式,请尝试检查它是否支持 1024x768,如果支持,则使用该分辨率”

我在想

  1. 为所有显示器供应商和型号生成类似通用 monitors.xml 的内容
  2. 每次插入/拔出显示器时运行自定义 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

如何使用

  1. 将脚本复制到一个空文件中,另存为set_screens.py
  2. 在脚本的头部部分设置:

    • 你的名字默认屏幕,因为您可能希望将其从自动分辨率设置中排除。
    • 您想要在新屏幕上尝试的分辨率。

      # --- 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"
      #---
      
  3. 通过以下命令(从终端)测试运行脚本:

    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 垂直像素 刷新率

相关内容