# xrandr (Русский)

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

- Xorg (Русский)
- Multihead

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков 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[broken link: invalid section] 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`.

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

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

Пример: видеокарты на основе 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).

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

- https://wiki.ubuntu.com/X/Config/Resolution
- RandR 1.2 tutorial
- Xorg RandR 1.2 on ThinkWiki
- FAQVideoModes - more information about modelines

Categories:

- X server (Русский)
- Русский

Hidden category:

- Pages with broken section links