xrandr (Русский)
xrandr - это официальная программа настройки оконной системы X. С ее помощью можно изменить параметры вывода изображения RandR. Для получения информации о настройке вывода изображения сразу на несколько мониторов смотрите статью Multihead.
Установка
Установите пакет 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 не запоминаются после окончания X сессии.
- xrandr имеет большое количество параметров - читайте xrandr(1).
Настройка
xrandr сам по себе является простым интерфейсом для конфигурации RandR и не имеет собственных файлов конфигурации. Тем не менее существует множество способов задать нужные параметры:
- Сконфигурировать RandR можно без помощи xrandr через файлы конфигурации X configuration files, смотрите так же Multihead#RandR. Это метод позволяет создать только статическую конфигурацию.
- Также можно использовать xrandr непосредственно в время запуска X сервера. Смотрите Autostarting#Graphical[ссылка недействительна: раздел не найден].
- Динамические конфигурации можно получить используя различные скрипты вызова xrandr которые в свою очередь можно запускать по определённым события ( подключение, отключение интерфейсов и.т.п. ), смотрите udev и acpid. В секции #Примеры приведено несколько скриптов.
/etc/gdm/
, а для KDM /usr/share/config/kdm/Xsetup
и для SDDM это /usr/share/sddm/scripts/Xsetup
. Этот метод требует прав на доступ к корневым каталогам и изменения файлов системных конфигураций, однако позволяет внести изменения до запуска xprofile.Примеры
1. Позволяет включать интерфейс VGA или .др, отключая при этом LVDS или др.
- Для ноутбуков по умолчанию используется
$IN
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. Позволяет автоматизировать выбор режимов работы для всех подключённых мониторов.
- I am using it with srandrdAUR in my i3-wm like so (#Example 3[ссылка недействительна: раздел не найден] didn't work for me for some reason or other):.
~/.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 с нужными нам параметрами:
- для некоторых LCD мониторов (например samsung 2343NW), необходимо использовать "cvt -r".
$ 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
/var/log/Xorg.0.log
— он может отличатся от выданного gtf
или cvt
:
[ 45.063] (II) intel(0): clock: 241.5 MHz Image Size: 597 x 336 mm [ 45.063] (II) intel(0): h_active: 2560 h_sync: 2600 h_sync_end 2632 h_blank_end 2720 h_border: 0 [ 45.063] (II) intel(0): v_active: 1440 v_sync: 1443 v_sync_end 1448 v_blanking: 1481 v_border: 0
xrandr --newmode "2560x1440" 241.50 2560 2600 2632 2720 1440 1443 1448 1481 -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
intel
на нужный, например nvidia
. Разрешение оказалось ниже, чем хотелось бы
Пример: видеокарты на основе 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).