Как отключить автоматическую настройку монитора?

Вопрос или проблема

Я работаю на Ubuntu 16.04 (dev branch), 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  

Вывод xrandr, когда HDMI переключатель переключен на другое соединение:

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 переключатель, дисплей отключается, даже если у меня он настроен на пользовательский режим.

Это события udev при отключении дисплея с HDMI переключателем:

$ 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

Это события udev при повторном включении дисплея с HDMI переключателем:

$ 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

Для других Cinnamon и Gnome решение можно найти здесь:

Cinnamon:

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

Gnome:

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

Это не окончательный ответ, просто указание в правильном направлении. В XFCE программа xfsettingsd отвечает за обработку события RRScreenChangeNotify и переключение режима, точная функция находится в xfce4-settings-4.12.0/xfsettingsd/displays.c строка 77, функция называется xfce_displays_helper_screen_on_event. Отключение функции позволит режиму оставаться неизменным при подключении нового монитора.

Отладочную информацию можно получить с помощью:

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

Следующая команда сработала для меня на Ubuntu Mate 20.04:

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

Перед применением этого исправления у меня была похожая ситуация, когда отключение моего HDMI подключенного монитора приводило к тому, что он никогда не возвращался, если я не запускал xrandr вручную с известными хорошими настройками.

Поскольку это кажется специфичным для оконного менеджера, вот способ найти настройку для вашей системы, если она не одна из уже перечисленных в других ответах на OP:

Grep gsettings list-recursively для 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

Вы можете увидеть настройку xrandr active, а затем использовать gsettings set для её изменения. В этом примере это Mate, как уже отвечал @Daniel выше, но этот SE ответ не предназначен как дублирующий, а скорее добавляет информацию о том, как найти настройки xrandr, специфичные для вашего оконного менеджера, если это ни Cinnamon, ни Gnome, ни Mate.

Также стоит отметить: gsettings – это гномская вещь, так что не все WM будут её использовать, но для информации, если это полезно.

На Ubuntu 22.04 с Xubuntu (xfce4 ) рабочим столом,
gsettings set com.canonical.unity.settings-daemon.plugins.xrandr active false
не помогло .

Что сработало для меня, так это в графическом интерфейсе Настройки / Дисплей / Общие
настроить мониторы как требуется .
затем в Настройки / Дисплей / Расширенные
создать профиль, соответствующий текущим настройкам
и включить обе “Конфигурировать новые дисплеи при подключении”
и “Автоматически включать профили при подключении нового дисплея”

Ответ или решение

Чтобы ответить на вопрос о том, как отключить автоматическую перенастройку монитора в Ubuntu 16.04 с использованием рабочего окружения XFCE, начнем с понимания проблемы и её потенциальных решений.

Теория

Ваша система автоматически обнаруживает изменения в подключении мониторов через HDMI, что приводит к нежелательной перепланировке экранов. Это происходит из-за поведения Xorg, который отвечает за управление дисплеем, и компонента xfsettingsd в XFCE, обрабатывающего события RRScreenChangeNotify.

Пример

Вы подключены к двум мониторам: один через VGA, а другой через HDMI-коммутатор. В нормальном режиме у вас расширенное рабочее пространство 3200×1080, но переключение HDMI-коммутатора на другое устройство приводит к тому, что Xorg распознает отключение, и это вызывает сокращение рабочего пространства до 1280×1024.

Применение

1. Отключение автоматической конфигурации с помощью XFCE:

Чтобы предотвратить автоматические изменения конфигурации мониторов, можно попробовать отключить функции, ответственные за обработку таких событий:

  • В XFCE программа xfsettingsd управляет изменениями экрана. Вы можете попробовать следующее:
DISPLAY=:0 XFSETTINGSD_DEBUG=512 xfsettingsd --replace --no-daemon

Этот метод покажет вам, какие действия предпринимаются программой при изменении конфигурации. Это позволит вам более точно определить, где можно внести изменения.

  • Для более устойчивого результата, изучите исходный код xfsettingsd, особенно функцию xfce_displays_helper_screen_on_event в файле xfce4-settings-4.12.0/xfsettingsd/displays.c, чтобы понять, как можно откорректировать обработку событий экрана.

2. Создание профиля дисплея:

Создайте и сохраните текущую конфигурацию в GUI-настройках:

  • Откройте "Настройки" -> "Дисплей" -> "Общие".
  • Настройте мониторы, как вам нужно, и сохраните профиль.
  • Перейдите в "Настройки" -> "Дисплей" -> "Расширенные".
  • Активируйте параметры "Настройка новых дисплеев при подключении" и "Автоматическое включение профилей при подключении нового дисплея".

3. Альтернативы для других окружений:

Если вы используете другое окружение, например, GNOME или MATE, можно отключить плагин xrandr:

  • Для GNOME:
    gsettings set org.gnome.settings-daemon.plugins.xrandr active false
  • Для MATE:
    gsettings set org.mate.SettingsDaemon.plugins.xrandr active false

Вывод

Учитывая специфику XFCE и Ubuntu 16.04, вам, возможно, придется прибегнуть к модификации исходного кода xfsettingsd или использовать сохраненные профили дисплея для достижения требуемого поведения. Выберите подходящий способ в зависимости от ваших технических возможностей и коммуникативного навыка, чтобы избежать автоматического изменения настройки мониторов при переключении HDMI-коммутатора.

Оцените материал
Добавить комментарий

Капча загружается...