如何禁用监视器自动配置?

我正在运行Ubuntu 16.04(开发分支),XFCE作为桌面环境。

我的电脑连接到两台显示器。 一个通过常规VGA电缆,另一个连接到HDMI切换器。 该设置工作正常,但每次我暂时将HDMI切换器更改为另一个HDMI连接Xorg检测到显示器已断开连接并重新配置Xorg仅使用一个显示器,将HDMI切换器切换回我的计算机不会重新激活双显示器使用其中之一,我必须用xrandr手动触发它

如何防止这种自动监视器检测和重新配置发生? 我希望能够在没有电脑做任何事情的情况下切换HDMI切换器。

用于恢复多监视器设置的命令:

 xrandr \ --output HDMI-1 \ --mode "1920x1080" \ --panning "1920x1080+1280+0/0x0+0+0" \ --output DVI-1-I \ --mode "1280x1024" \ --panning "1280x1024/0x0+0+0" 

正常使用的xrandr输出:

 Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192 DP-1 disconnected (normal left inverted right x axis y axis) HDMI-1 connected 1920x1080+1280+0 (normal left inverted right x axis y axis) 443mm x 249mm panning 1920x1080+1280+0 1920x1080 60.00*+ 60.00 50.00 59.94 59.93 1920x1080i 60.00 50.00 59.94 1680x1050 59.95 59.88 1600x1024 60.17 1400x1050 74.76 70.00 59.98 1280x1024 75.02 60.02 1440x900 59.89 59.90 1280x960 60.00 1360x768 59.80 59.96 1280x800 59.91 1152x864 75.00 75.00 70.00 60.00 1280x720 60.00 50.00 59.94 1024x768 60.04 75.03 70.07 60.00 960x720 75.00 60.00 928x696 75.00 60.05 896x672 75.05 60.01 960x600 60.00 832x624 74.55 960x540 59.99 800x600 75.00 70.00 65.00 60.00 72.19 75.00 60.32 56.25 840x525 74.96 69.88 60.01 59.88 720x576 50.00 800x512 60.17 700x525 74.76 70.06 59.98 720x480 60.00 59.94 640x512 75.02 60.02 720x450 59.89 640x480 60.00 72.81 75.00 66.67 60.00 59.94 720x400 70.08 680x384 59.80 59.96 576x432 75.00 75.00 70.00 60.06 512x384 75.03 70.07 60.00 416x312 74.66 400x300 72.19 75.12 60.32 56.34 320x240 72.81 75.00 60.05 DVI-I-1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 359mm x 287mm 1280x1024 60.02*+ 75.02 1280x960 60.00 1280x800 74.93 59.81 1152x864 75.00 1280x768 74.89 59.87 1280x720 60.00 1024x768 75.08 75.03 70.07 60.00 1024x576 59.97 832x624 74.55 800x600 72.19 75.00 70.01 60.32 56.25 848x480 60.00 640x480 75.00 72.81 66.67 60.00 720x400 70.08 

HDMI切换器切换到其他连接时的xrandr输出:

 Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 8192 x 8192 DP-1 disconnected (normal left inverted right x axis y axis) HDMI-1 disconnected (normal left inverted right x axis y axis) DVI-I-1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 359mm x 287mm 1280x1024 60.02*+ 75.02 1280x960 60.00 1280x800 74.93 59.81 1152x864 75.00 1280x768 74.89 59.87 1280x720 60.00 1024x768 75.08 75.03 70.07 60.00 1024x576 59.97 832x624 74.55 800x600 72.19 75.00 70.01 60.32 56.25 848x480 60.00 640x480 75.00 72.81 66.67 60.00 720x400 70.08 

我尝试了更多的东西:

连接显示器后找出模式:

 $ xvidtune -show "1920x1080" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 -hsync +vsync 

然后断开监视器:

 $ xrandr --newmode "1920x1080-new" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 -hsync +vsync $ xrandr --addmode HDMI-1 1920x1080-new $ xrandr --output HDMI-1 --mode 1920x1080-new 

这允许我在断开连接时激活显示,否则由于不存在的模式1920×1080而失败。 然而问题仍然存在,如果我切换HDMI切换器,显示器将被禁用,即使我将其设置为自定义模式。

这是使用HDMI切换器断开显示器时的udev事件:

 $ udevadm monitor --property monitor will print the received events for: UDEV - the event which udev sends out after rule processing KERNEL - the kernel uevent KERNEL[41678.571099] change /devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 (drm) ACTION=change DEVNAME=/dev/dri/card0 DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 DEVTYPE=drm_minor HOTPLUG=1 MAJOR=226 MINOR=0 SEQNUM=3248 SUBSYSTEM=drm UDEV [41678.573432] change /devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 (drm) ACTION=change DEVNAME=/dev/dri/card0 DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 DEVTYPE=drm_minor HOTPLUG=1 ID_FOR_SEAT=drm-pci-0000_01_00_0 ID_PATH=pci-0000:01:00.0 ID_PATH_TAG=pci-0000_01_00_0 MAJOR=226 MINOR=0 SEQNUM=3248 SUBSYSTEM=drm TAGS=:uaccess:master-of-seat:seat: USEC_INITIALIZED=31279519 

这是使用HDMI切换器重新启用显示器时的udev事件:

 $ udevadm monitor --property monitor will print the received events for: UDEV - the event which udev sends out after rule processing KERNEL - the kernel uevent KERNEL[41696.104481] change /devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 (drm) ACTION=change DEVNAME=/dev/dri/card0 DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 DEVTYPE=drm_minor HOTPLUG=1 MAJOR=226 MINOR=0 SEQNUM=3249 SUBSYSTEM=drm UDEV [41696.105685] change /devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 (drm) ACTION=change DEVNAME=/dev/dri/card0 DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:01:00.0/drm/card0 DEVTYPE=drm_minor HOTPLUG=1 ID_FOR_SEAT=drm-pci-0000_01_00_0 ID_PATH=pci-0000:01:00.0 ID_PATH_TAG=pci-0000_01_00_0 MAJOR=226 MINOR=0 SEQNUM=3249 SUBSYSTEM=drm TAGS=:seat:master-of-seat:uaccess: USEC_INITIALIZED=31279519 

 $ sudo lshw -c display *-display description: VGA compatible controller product: Redwood XT [Radeon HD 5670/5690/5730] vendor: Advanced Micro Devices, Inc. [AMD/ATI] physical id: 0 bus info: pci@0000:01:00.0 version: 00 width: 64 bits clock: 33MHz capabilities: pm pciexpress msi vga_controller bus_master cap_list rom configuration: driver=radeon latency=0 resources: irq:55 memory:c0000000-cfffffff memory:fea20000-fea3ffff ioport:e000(size=256) memory:c0000-dffff 

这不是最终答案,只是指向正确方向的指针。 在XFCE上, xfsettingsd程序负责处理RRScreenChangeNotify事件并触发模式切换,确切的function可以在xfce4-settings-4.12.0/xfsettingsd/displays.c第77行找到,该函数名为xfce_displays_helper_screen_on_event 。 当新显示器连接时,禁用该function将使模式不再更改。

调试信息可以通过以下方式获得

 DISPLAY=:0 XFSETTINGSD_DEBUG=512 xfsettingsd --replace --no-daemon 

对于其他肉桂和侏儒,可以在这里找到解决方案:

肉桂:

 gsettings set org.cinnamon.settings-daemon.plugins.xrandr active false 

侏儒:

 gsettings set org.gnome.settings-daemon.plugins.xrandr active false