18

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
4
  • I assume the monitor is listed in xrandr when reconnected? Could you post the output of xrandr when the setup is as you like it to be? we can then easily make it restore automatically on reconnect. Also, what is your xrandr command to "manually trigger". Mar 8, 2016 at 14:34
  • 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.
    – Grumbel
    Mar 8, 2016 at 19:03
  • 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 :) Jun 7, 2016 at 14:48
  • @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
    – user.dz
    Jan 6, 2017 at 20:39

4 Answers 4

5

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
5
  • 2
    This would have been perfect, but unfortunately doesn't work with gnome-shell anymore (e.g. on Ubuntu 20.04). May 3, 2021 at 8:59
  • 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
    – Zoltan
    May 22, 2021 at 10:18
  • In Ubuntu 22.04 we don't have this plugin, maybe anyone know howto disable the monitor hot-plug events? or keep xrandr configuration? or disable auto xrandr config?
    – Hpsaturn
    Nov 29, 2022 at 12:36
  • @FlorianEchtler, see this answer: does gsettings list-recursive have anything xrandr related in gnome-shell?
    – KJ7LNW
    Jun 29, 2023 at 20:55
  • As otheres have mentioned this is not present in Jammy ahonnecke@antonym:~$ gsettings set org.gnome.settings-daemon.plugins.xrandr active false No such schema “org.gnome.settings-daemon.plugins.xrandr” Dec 28, 2023 at 16:44
4

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
3
  • 1
    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.
    – Jim Paris
    Jan 20, 2020 at 19:30
  • 1
    @JimParis But how did you disable RRScreenChangeNotify?
    – GDorn
    Nov 16, 2020 at 21:55
  • In the function xfce_displays_helper_screen_on_event, right inside the if (event_num == RRScreenChangeNotify) block, I added return GDK_FILTER_REMOVE;
    – Jim Paris
    Nov 18, 2020 at 16:17
4

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.

2
  • No such gsetting on Ubuntu 22.04 (GNOME 42.5, Wayland)
    – nazikus
    Nov 18, 2022 at 12:53
  • 1
    @nazikus that's because you're running gnome, not Mate. See the gnome answer above.
    – KJ7LNW
    Jun 29, 2023 at 19:21
1

Since this seems to be window manager specific, here is a way to find the setting for your system if its not one of the ones already listed in other answers to the OP:

Grep gsettings list-recursively for xrandr:

]$ gsettings list-recursively|grep xrandr
org.mate.SettingsDaemon.plugins.xrandr priority 1
org.mate.SettingsDaemon.plugins.xrandr default-configuration-file '/etc/mate-settings-daemon/xrandr/monitors.xml'
org.mate.SettingsDaemon.plugins.xrandr show-notification-icon false
org.mate.SettingsDaemon.plugins.xrandr turn-on-external-monitors-at-startup false
org.mate.SettingsDaemon.plugins.xrandr turn-on-laptop-monitor-at-startup true
org.mate.SettingsDaemon.plugins.xrandr active true
org.mate.SettingsDaemon.plugins.xrandr use-xorg-monitor-settings true

You can see the xrandr active setting and then use gsettings set to change it. In this example it is Mate as already answered by @Daniel above, but this SE answer isn't intended to be a duplicate, but rather, it adds information on how to find xrandr settings specific to your window manager if it is neither Cinnamon, Gnome, nor Mate.

Also noteworthy: gsettings is a gnomeish thing, so not all WMs will use it, but FYI in case its useful.

2
  • Jammy seems to lack xrandr completely: ahonnecke@antonym:~$ lsb_release -a Description: Pop!_OS 22.04 LTS Release: 22.04 Codename: jammy ahonnecke@antonym:~$ gsettings list-recursively|grep xrandr Dec 28, 2023 at 16:47
  • @AshtonHonnecke, is the universe repo enabled (not sure if that is necessary)? You could try apt-file search xrandr. Also, see this: superuser.com/a/1131240/1216286
    – KJ7LNW
    Dec 29, 2023 at 20:57

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .