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[broken link: invalid section].
- Динамические конфигурации можно получить используя различные скрипты вызова 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
Разрешение оказалось ниже, чем хотелось бы
Пример: видеокарты на основе ATI X1550 и два ЖК-монитора DELL 2408 (разрешение экрана до 1920х1200) и Samsung 206BW (до 1680x1050). При первом входе в систему после установки, разрешение по умолчанию 1152x864. XRandR не перечисляет разрешения выше 1152x864. Вы можете попробовать отредактировать /etc/X11/xorg.conf.d/*, добавить раздел о виртуальном экране, выйти из системы, войти в систему, и посмотреть, поможет ли это. Если нет, то читайте дальше.
change /etc/X11/xorg.conf.d/*
/etc/X11/xorg.conf.d/10-monitor.conf
Section "Screen"
...
SubSection "Display"
Virtual 3600 1200
EndSubSection
EndSection
О цифрах: DELL слева и Samsung справа. Таким образом, виртуальная ширина суммы обоих ЖК шириной 3600 = 1920 + 1680; Высота, - максимальная из них, что максимум (1200,1050) = 1200. Если поставить один LCD выше другого, используйте этот расчет: (максимум (ширина 1, ширина 2), высота 1 + высота 2).