Почему xrandr не использует настройки –fb при дублировании дисплеев?

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

У меня в офисе на рабочем столе Ubuntu два расположенных рядом монитора. У меня есть псевдонимы для разных конфигураций мониторов. Иногда мне нужно отзеркалить мониторы (для обсуждений со студентом в моей лаборатории), а иногда я хочу, чтобы студент использовал второй монитор как устройство для презентаций.

Когда я запускаю псевдоним “mirror” после “landscape” или “portrait”, xrandr сообщает, что экран недостаточно велик из-за предыдущих настроек. Если я сначала запускаю псевдоним “student” (который отключает второй монитор), то могу успешно запустить “mirror”.

Я попробовал много различных изменений, но ничего, похоже, не дает необходимого эффекта. Что я делаю не так с xrandr?

Вот вывод в командной строке.

[~] source ~/src/dotfiles/hosts/gtkoffice_rc 
[~] landscape 
[~] mirror
xrandr: указанный экран 1920x1200 недостаточно велик для вывода DP-2 (1920x1200+1920+0)
xrandr: Настройка crtc 1 не удалась
X Error of failed request:  BadValue (целочисленный параметр выходит за пределы допустимого диапазона для операции)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  21 (RRSetCrtcConfig)
  Value in failed request:  0x0
  Serial number of failed request:  54
  Current serial number in output stream:  54
[~] landscape 
[~] student
[~] mirror
[~] 

А вот материалы из ~/src/dotfiles/hosts/gtkoffice_rc

export RIGHT_DISPLAY="DP-2"
export LEFT_DISPLAY="DP-3"
# для редактирования рукописей
alias portrait="xrandr --fb 3120x1920  --output $LEFT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --output $RIGHT_DISPLAY --mode 1920x1200 --panning  1200x1920+1920+0 --rotate left"
# для обычной работы
alias landscape="xrandr --fb  3840x1200 --output $LEFT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --output $RIGHT_DISPLAY --mode 1920x1200 --panning 1920x1200+1920+0 --rotate normal"
# для обсуждений
alias mirror="xrandr --fb 1920x1200 --output $LEFT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --output $RIGHT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --rotate normal"
# студент использует второй монитор
alias student="xrandr --fb 1920x1200 --output $LEFT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --output $RIGHT_DISPLAY --off"

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

В данном случае вы столкнулись с проблемой настройки дублирования дисплеев с помощью инструмента xrandr на вашем Ubuntu-десктопе. Рассмотрим основные причины, по которым возникают ошибки при использовании опции --fb для дублирования дисплеев, и возможные решения.

Теория

xrandr — это утилита командной строки для взаимодействия с расширением X RANDR (Resize and Rotate) сервера X, которая позволяет изменять размеры экрана, устанавливать отображения и разрешения для подключенных мониторов. Когда вы настраиваете дублирование дисплеев с помощью xrandr, важно правильно указывать размер "рамки" (--fb, framebuffer) так, чтобы он соответствовал общему разрешению всех активных дисплеев. При этом указанное разрешение должно быть достаточно большим, чтобы вместить все экраны, как это делается для "landscape" и "portrait" конфигураций в вашем сценарии.

Пример

Рассмотрим вашу текущую настройку alias для дублирования (alias mirror):

alias mirror="xrandr --fb 1920x1200 --output $LEFT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --output $RIGHT_DISPLAY --mode 1920x1200 --panning 1920x1200+0+0 --rotate normal"

При использовании данной команды xrandr должно сконфигурировать оба дисплея с одинаковым разрешением и расположением, начиная от координат (0,0). Однако, в случае, если вы ранее использовали команду landscape или portrait, допустимые размеры экрана (рамки) остаются прежними, и более узкая рамка, чем та, что используется в данных конфигурациях, может вызвать ошибку, которую вы получаете:

xrandr: specified screen 1920x1200 not large enough for output DP-2 (1920x1200+1920+0)
xrandr: Configure crtc 1 failed

Это возникает из-за того, что xrandr пытается расположить ваши дисплеи в пространстве, где суммарный размер (ширина) больше, чем указанный для рамки (framebuffer).

Применение

Для решения этой проблемы нужно обеспечить, чтобы разрешение рамки всегда было как минимум равным или больше разрешения любого из ваших дисплеев, но при этом могло соответствовать суммарному разрешению для всех активных дисплеев. Так как mirror предполагает одинаковое разрешение для обоих мониторов при их зеркалировании, убедитесь, что:

  1. Вы задаете корректное разрешение рамки как минимум равное одному дисплею. То есть, если режим зеркалирования у вас настроен на один монитор 1920×1200, то данный размер рамки корректен для mirror.
  2. Правильно сбрасываете текущие настройки перед переключением на mirror после использования других конфигураций, которые предполагают увеличение рамки.

Ваши alias можно отредактировать так:

  • Перед alias mirror добавьте команду, которая бы выполняла сброс всех текущих настроек дисплеев.
  • Или используйте последовательность команд, которая отключает один дисплей, а затем активирует второй в зеркальном режиме с нужной рамкой.

Например, предварительный сброс можно сделать с помощью команды:

xrandr --output $RIGHT_DISPLAY --off --output $LEFT_DISPLAY --off

Переход на alias mirror после последовательного включения дисплеев должен сработать корректно. Учтите, что каждое изменение отображения обнуляет предыдущие геометрии, что позволяет избежать ошибок размерности.

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

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

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

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