xrandr (Русский)

Ссылки по теме

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

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 имеет большое количество параметров - читайте man xrandr.

Настройка

xrandr сам по себе является простым интерфейсом для конфигурации RandR и не имеет собственных файлов конфигурации. Тем не менее существует множество способов задать нужные параметры:

  1. Сконфигурировать RandR можно без помощи xrandr через файлы конфигурации X configuration files, смотрите так же Multihead#RandR. Это метод позволяет создать только статическую конфигурацию.
  2. Также можно использовать xrandr непосредственно в время запуска X сервера. Смотрите Autostarting#Graphical.
  3. Динамические конфигурации можно получить используя различные скрипты вызова xrandr которые в свою очередь можно запускать по определённым события ( подключение, отключение интерфейсов и.т.п. ), смотрите udev и acpid. В секции #Примеры приведено несколько скриптов.
Примечание: В KDM и GDM есть сценарии запуска которые выполняются до запуска X сервера. Для GDM, это /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
Примечание: Если используется драйвер intel xf86-video-intel, то необходимый режим вместе с другими параметрами можно увидеть в /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:

Примечание: Modeline из строки нужно убрать.
$ 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 не запоминаются после окончания X сессии.

Для тестирования режимов лучше всего использовать конструкции типа (которые после таймаута восстанавливают прежний режим):

$ 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.

Разрешение оказалось ниже, чем хотелось бы

Примечание: Сначала попробуйте этот метод #Поиск отсутствующих режимов.

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).

Смотрите также