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
Grumbel
  • 4,729
  • 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". – Jacob Vlijm Mar 08 '16 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 08 '16 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 :) – Jacob Vlijm Jun 07 '16 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 https://askubuntu.com/q/858798/26246 – user.dz Jan 06 '17 at 20:39

4 Answers4

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
Grumbel
  • 4,729
  • 2
    This would have been perfect, but unfortunately doesn't work with gnome-shell anymore (e.g. on Ubuntu 20.04). – Florian Echtler May 03 '21 at 08: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: https://github.com/linuxmint/cinnamon/issues/5619 – Zoltan May 22 '21 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 '22 at 12:36
  • @FlorianEchtler, see this answer: does gsettings list-recursive have anything xrandr related in gnome-shell? – KJ7LNW Jun 29 '23 at 20:55
  • As otheres have mentioned this is not present in Jammy
    No such schema “org.gnome.settings-daemon.plugins.xrandr”
    
    – Ashton Honnecke Dec 28 '23 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
Grumbel
  • 4,729
  • 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 '20 at 19:30
  • 1
    @JimParis But how did you disable RRScreenChangeNotify? – GDorn Nov 16 '20 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 '20 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.

Nmath
  • 12,333
Daniel
  • 41
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.

KJ7LNW
  • 211
  • Jammy seems to lack xrandr completely:
    Description: Pop!_OS 22.04 LTS
    Release: 22.04
    Codename: jammy
    ahonnecke@antonym:~$ gsettings list-recursively|grep xrandr
    
    – Ashton Honnecke Dec 28 '23 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: https://superuser.com/a/1131240/1216286 – KJ7LNW Dec 29 '23 at 20:57