连接新显示器时是否自动降低分辨率至最小显示器的分辨率?

连接新显示器时是否自动降低分辨率至最小显示器的分辨率?

我有一台显示器和一台电视,有时会用到。显示器是 4k 的,分辨率为 2560x1440 - 除非连接电视时,我需要手动将分辨率降低到 1080,然后在断开电视连接后手动将其设置回 1440。

xrandr 输出如下所示:

DVI-I-1 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +  59.94    23.98    60.05    60.00  
   1440x480      60.05  
   1280x720      60.00    59.94  
   720x480       59.94  
   640x480       59.93  
HDMI-0 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 597mm x 336mm
   3840x2160     60.00 +  59.94    29.97    25.00    23.98  
   2560x1440     59.95* 
   2048x1280     60.00  
   1920x1080     60.00    59.94    50.00    25.00    23.98    60.00    50.04  
   1600x1200     60.00  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1280x720      59.94  
   1152x864      75.00  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    59.94    59.93  

答案1

改变信号的分辨率

在...的帮助下吉德克,我们可以对多个信号采取行动,例如连接/断开监视器。如果我们同时连接monitor-addedmonitor-removed信号(显示)根据所连接的电视自动更新显示器分辨率,我们就完成了。

在脚本中

#!/usr/bin/env python3
import gi
gi.require_version("Gdk", "3.0")
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk
import subprocess

triggermon = "DVI-I-1" # if this one is connected, reduce resolution
tochange = "HDMI-0" # the monitor to lower resolution on
lowres = "1920x1080" # the low resolution
highres =  "3840x2160" # the default resolution


class WatchOut:
    def __init__(self):
        self.gdkdsp = Gdk.Display.get_default()
        # use connect/disconnect signales
        self.gdkdsp.connect("monitor_added", self.act_onchange)
        self.gdkdsp.connect("monitor_removed", self.act_onchange)
        # make sure initial configuration is correct
        self.act_onchange()
        # we need a gtk thread to use the signals
        Gtk.main()

    def act_onchange(self, *args):
        # let's default to highres
        curr_res = highres
        # get attached n-monitors, lower res if triggermon is connected
        n_mons = self.gdkdsp.get_n_monitors()
        for n in [n for n in range(self.gdkdsp.get_n_monitors())]:
            mon_name = self.gdkdsp.get_monitor(n).get_model()
            if mon_name == triggermon:
                curr_res = lowres
        # set resolution
        subprocess.Popen([
            "xrandr", "--output", tochange, "--mode", curr_res
        ])               
        
WatchOut()

设置

  • 将脚本复制到一个空文件中,另存actonmonitor.py使其可执行(如果您运行它但没有明确调用解释器)。

  • 监视器名称位于脚本的头部,因此您提到的分辨率,如果需要,请更改它们。

  • 在终端窗口中测试运行它。

      /path/to/actonmonitor.py
    
  • 看看一切是否正常运行。

  • 如果您愿意,可以将其添加到您的启动应用程序中。

注意:

辅助显示器在显示器布局中的确切位置不在 xrandr 的(您的)输出中。如果位置很重要,您可能需要xrandr向脚本添加额外的命令。

相关内容