xrandr (Русский)
Ссылки по теме
xrandr - это официальная программа настройки оконной системы X. С ее помощью можно изменить параметры вывода изображения RandR. Для получения информации о настройке вывода изображения сразу на несколько мониторов смотрите статью Multihead.
Contents
Установка
Установите пакет xorg-xrandr. Также существуют графические оболочки arandr и lxrandr.
Тест режимов вывода изображения
Если запустить xrandr без дополнительных параметров, то она проверит все доступные интерфейсы (LVDS
, VGA-0
, и.т.д.) выведет их состояние и возможные режимы работы для них.
$ xrandr
Screen 0: minimum 320 x 200, current 1440 x 900, maximum 8192 x 8192 VGA disconnected (normal left inverted right x axis y axis) LVDS connected (normal left inverted right x axis y axis) 1440x900 59.9*+ 1280x854 59.9 1280x800 59.8 ...
Вы можете использовать xrandr для установки разрешения на нужном интерфейсе (режим работы с этим разрешением должен быть в списке выше):
$ xrandr --output LVDS --mode 1280x800
Если в списке присутствуют несколько режимов с одинаковым разрешением, но разной частотой, то необходимо в параметрах так же указывать нужную частоту --rate
, либо её можно задать потом отдельно. Например:
$ xrandr --output LVDS --mode 1280x800 --rate 75
Параметр --auto
запустит интерфейс в режиме с максимально возможными параметрами (имеющимися в списке выше).
$ xrandr --output LVDS --auto
Можно указывать несколько интерфейсов в одной команде например, выключить LVDS
и включить HDMI-0
в автоматическом режиме:
$ xrandr --output LVDS --off --output HDMI-0 --auto
Настройка
xrandr сам по себе является простым интерфейсом для конфигурации RandR и не имеет собственных файлов конфигурации. Тем не менее существует множество способов задать нужные параметры:
- Сконфигурировать RandR можно без помощи xrandr через файлы конфигурации X configuration files, смотрите так же Multihead#RandR. Это метод позволяет создать только статическую конфигурацию.
- Также можно использовать xrandr непосредственно в время запуска X сервера. Смотрите Autostarting#Graphical.
- Динамические конфигурации можно получить используя различные скрипты вызова xrandr которые в свою очередь можно запускать по определённым события ( подключение, отключение интерфейсов и.т.п. ), смотрите udev и acpid. В секции #Примеры приведено несколько скриптов.
Примеры
1. Позволяет включать интерфейс VGA или .др, отключая при этом LVDS или др.
#!/bin/bash IN="LVDS1" EXT="VGA1" if (xrandr | grep "$EXT disconnected"); then xrandr --output $EXT --off --output $IN --auto else xrandr --output $IN --off --output $EXT --auto fi
2. Позволяет включать интерфейс VGA или .др , и затем отключать их после отключения внешнего монитора.
#!/bin/bash IN="LVDS1" EXT="VGA1" if (xrandr | grep "$EXT disconnected"); then xrandr --output $IN --auto --output $EXT --off else xrandr --output $IN --auto --primary --output $EXT --auto --right-of $IN fi
3. Позволяет автоматизировать выбор режимов работы для всех подключённых мониторов.
# get info from xrandr connectedOutputs=$(xrandr | grep " connected" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/") activeOutput=$(xrandr | grep -E " connected (primary )?[1-9]+" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/") # initialize variables execute="xrandr " default="xrandr " i=1 switch=0 for display in $connectedOutputs do # build default configuration if [ $i -eq 1 ] then default=$default"--output $display --auto " else default=$default"--output $display --off " fi # build "switching" configuration if [ $switch -eq 1 ] then execute=$execute"--output $display --auto " switch=0 else execute=$execute"--output $display --off " fi # check whether the next output should be switched on if [ $display = $activeOutput ] then switch=1 fi i=$(( $i + 1 )) done # check if the default setup needs to be executed then run it echo "Resulting Configuration:" if [ -z "$(echo $execute | grep "auto")" ] then echo "Command: $default" `$default` else echo "Command: $execute" `$execute` fi echo -e "\n$(xrandr)"
4. Позволяет автоматизировать выбор режимов работы для всех подключённых мониторов.
~/.xprofile
srandrd ~/.i3/detect_displays.sh
#!/bin/bash XRANDR="xrandr" CMD="${XRANDR}" declare -A VOUTS eval VOUTS=$(${XRANDR}|awk 'BEGIN {printf("(")} /^\S.*connected/{printf("[%s]=%s ", $1, $2)} END{printf(")")}') declare -A POS #XPOS=0 #YPOS=0 #POS="${XPOS}x${YPOS}" POS=([X]=0 [Y]=0) find_mode() { echo $(${XRANDR} |grep ${1} -A1|awk '{FS="[ x]"} /^\s/{printf("WIDTH=%s\nHEIGHT=%s", $4,$5)}') } xrandr_params_for() { if [ "${2}" == 'connected' ] then eval $(find_mode ${1}) #sets ${WIDTH} and ${HEIGHT} MODE="${WIDTH}x${HEIGHT}" CMD="${CMD} --output ${1} --mode ${MODE} --pos ${POS[X]}x${POS[Y]}" POS[X]=$((${POS[X]}+${WIDTH})) return 0 else CMD="${CMD} --output ${1} --off" return 1 fi } for VOUT in ${!VOUTS[*]} do xrandr_params_for ${VOUT} ${VOUTS[${VOUT}]} done set -x ${CMD} set +x
5. Позволяет включить интерфейс если подключённое устройство находится в спящем режиме(DisplayPort и аналоги).
local times=2 local seconds=1 while [ $times -gt 0 ]; do xrandr 1> /dev/null sleep $seconds let times-=1 done
Устранение неполадок
Поиск отсутствующих режимов
Из за различных факторов xrandr не всегда может корректно определить режимы работы устройств. Это можно исправить добавив нужный режим в ручную.
Для начала запускаем gtf
или cvt
чтобы получить Modeline с нужными нам параметрами:
$ cvt 1280 1024
# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
Теперь можно создать новый режим для xrandr:
$ xrandr --newmode "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
После создания необходимо добавить режим для интерфейса на котором вы будете его использовать.
$ xrandr --addmode VGA1 1280x1024_60.00
После этого можно его использовать:
$ xrandr --output VGA1 --mode 1280x1024_60.00
Для тестирования режимов лучше всего использовать конструкции типа (которые после таймаута восстанавливают прежний режим):
$ xrandr --output VGA1 --mode 1280x1024_60.00 && sleep 5 && xrandr --newmode "1024x768-safe" 65.00 1024 1048 1184 1344 768 771 777 806 -HSync -VSync && xrandr --addmode VGA1 1024x768-safe && xrandr --output VGA1 --mode 1024x768-safe
EDID checksum is invalid
Если приведущий метод приводит к ошибке *ERROR* EDID checksum is invalid
, смотрите KMS#Forcing modes and EDID и [1].
Добавление отсутствующих режимов работы
После того как нашли нужный режим с помощью xrandr
, его можно добавить в /etc/X11/xorg.conf.d/*
:
/etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor" Identifier "VGA1" Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync Option "PreferredMode" "1280x1024_60.00" EndSection Section "Screen" Identifier "Screen0" Monitor "VGA1" DefaultDepth 24 SubSection "Display" Modes "1280x1024_60.00" EndSubSection EndSection Section "Device" Identifier "Device0" Driver "intel" EndSection
Разрешение оказалось ниже, чем хотелось бы
Background: ATI X1550 based video card and two LCD monitors DELL 2408(up to 1920x1200) and Samsung 206BW(up to 1680x1050). Upon first login after installation, the resolution default to 1152x864. xrandr does not list any resolution higher than 1152x864. You may want to try editing /etc/X11/xorg.conf.d/*, add a section about virtual screen, logout, login and see if this helps. If not then read on.
change /etc/X11/xorg.conf.d/*
/etc/X11/xorg.conf.d/10-monitor.conf
Section "Screen" ... SubSection "Display" Virtual 3600 1200 EndSubSection EndSection
About the numbers: DELL on the left and Samsung on the right. So the virtual width is of sum of both LCD width 3600=1920+1680; Height then is figured as the max of them, which is max(1200,1050)=1200. If you put one LCD above the other, use this calculation instead: (max(width1, width2), height1+height2).