How to disable monitor auto configuration?

11,230

Solution 1

This is not a final answer, just a pointer into the right direction. On XFCE the xfsettingsd programm is responsible for handling of the RRScreenChangeNotify event and triggering the mode switch, the exact function can be found in xfce4-settings-4.12.0/xfsettingsd/displays.c line 77, the function is called xfce_displays_helper_screen_on_event. Disabling the function will make the mode no longer change when a new monitor connects.

Debug information can be obtained with:

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

Solution 2

For other Cinnamon and Gnome a solution can be found here:

Cinnamon:

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

Gnome:

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

Solution 3

The following command worked for me on Ubuntu Mate 20.04:

gsettings set org.mate.SettingsDaemon.plugins.xrandr active false

Before applying this fix, I had been running into a similar situation where turning off my HDMI connected monitor would result in it never coming back unless I manually ran xrandr with known good settings.

Share:
11,230

Related videos on Youtube

Navin Peiris
Author by

Navin Peiris

Updated on September 18, 2022

Comments

  • Navin Peiris
    Navin Peiris over 1 year

    Im running Ubuntu 16.04 (dev branch), XFCE as desktop environment.

    My computer is connected to two monitors. One via regular VGA cable and the other is connected to a HDMI Switcher. That setup works fine, but every time I temporarily change the HDMI Switcher to another HDMI connection Xorg detects that the monitor has been disconnected and reconfigures Xorg to only use a single monitor, switching the HDMI Switcher back to my computer doesn't reactivate dual monitor use either, I have to manually trigger that with xrandr

    How can I prevent this kind of automatic monitor detection and reconfiguration from happening? I'd like to be able to switch the HDMI Switcher without the computer doing anything.

    Command used to restore the multi-monitor setup:

    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 output on regular use:

    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  
    

    xrandr output when HDMI switcher is switched to a different connection:

    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  
    

    Some more things I tried:

    With the monitor connected find out the modeline:

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

    Then with the monitor disconnected:

    $ 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
    

    This allows me to activate the display when disconnected, which would otherwise fail due to non-existent mode 1920x1080. The problem however remains, if I switch the HDMI Switcher the display gets disabled, even if I have it set to a custom mode.

    This are the udev events when disconnecting the display with the HDMI Switcher:

    $ 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
    

    This are the udev events when reenabling the display with the HDMI Switcher:

    $ 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
    
    • Admin
      Admin about 8 years
      Updated the post. However I don't want to just automatically restore the config, I want it to not get messed up in the first place.
    • Admin
      Admin almost 8 years
      That is most likely out of reach, unless you find a graphics driver that fixes it. The issue is caused by the fact that the communication between the driver and your screen fails on connection, jumping to defaults. You need some kind of action, either by a shortcut key or automaitcally. Make your pick, fix it dirty or not at all :)
    • Admin
      Admin over 7 years
      @Grumbel, Could you add the output of sudo lshw -c display to the question. If you have nvidia, try the answer in askubuntu.com/q/858798/26246
  • Jim Paris
    Jim Paris over 4 years
    Thanks for the suggestion. I disabled the handling of RRScreenChangeNotify and it fixed a lot of issues on my setup, including problems where monitors would wake up immediately after suspending.
  • GDorn
    GDorn over 3 years
    @JimParis But how did you disable RRScreenChangeNotify?
  • Jim Paris
    Jim Paris over 3 years
    In the function xfce_displays_helper_screen_on_event, right inside the if (event_num == RRScreenChangeNotify) block, I added return GDK_FILTER_REMOVE;
  • Florian Echtler
    Florian Echtler about 3 years
    This would have been perfect, but unfortunately doesn't work with gnome-shell anymore (e.g. on Ubuntu 20.04).
  • Zoltan
    Zoltan almost 3 years
    Unfortunately this does not work with the Cinnamon version shipped in Ubuntu 20.04 any more, the csd-xrandr executable must be directly dealt with instead: github.com/linuxmint/cinnamon/issues/5619