Настройка дисплеев xrandr'ом: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
[[Категория:HOWTO]] [[Категория:Linux Desktop]]
{{stub}}
{{stub}}
== Вступление ==
== Вступление ==


Строка 99: Строка 96:
         ;;
         ;;
  esac
  esac
[[Категория:HOWTO]]
[[Категория:Пользователю]]

Версия от 10:11, 26 декабря 2008

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Вступление

Для ноутбуков, иметь внешний видеовыход - привычное дело. И большинство видеокарт для настольных систем тоже имеют как минимум два. Для эффективного использования более одного монитора можно изменить параметры для каждого по отдельности.

Мой случай

Есть ноутбук с VGA-выходом. Дома стоит монитор, который может 1680х1050@60Hz, а на работе 1280х1024@72Hz. По умолчанию, xorg запускался, стараясь вывести сигнал на все возможные выходы. При этом драйвер radeon искал компромисс между разными разрешениями мониторов и экрана ноутбука. И если один из них работал только в режиме 1024х768, то остальные получали такую же картинку. Поиск в Интернет подсказал использовать xrandr для настройки.

Начальные условия

  • 01:05.0 VGA compatible controller [0300]: ATI Technologies Inc RS690M [Radeon X1200 Series] [1002:791f]
  • xorg-server-1.5.1-alt2
  • xorg-drv-radeon-6.9.0-alt3
  • графический режим запускается хотя бы на одном мониторе

Реализация

Заставить xorg скриптом переключать к нужному видеовыходу картинку максимального разрешения. При этом приходится отключать другой видеовыход, чтоб драйвер не пробовал искать компромисс.

Для начала я определил, как называются видеовыходы (обозначены полужирным шрифтом):

#xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 1680 x 1600
VGA-0 connected (normal left inverted right x axis y axis)
  1680x1050      60.0 +   60.0
<... cut ...>
  720x400        70.1
LVDS connected 1280x800+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
  1280x800       60.0*+
 <... cut ...>
  640x480        59.9
HDMI-0 disconnected (normal left inverted right x axis y axis)

Затем был создан первый скрипт, который:

  1. Отключал экран ноутбука (LVDS)
  2. Переключал монитор (VGA-0) в наилучший режим
#!/bin/bash
xrandr --output LVDS --off
xrandr --output VGA-0 --auto

Второй скрипт, позволял переключаться обратно на экран ноутбука:

#!/bin/bash
xrandr --output VGA-0 --off
xrandr --output LVDS --auto

Третий, включал оба выхода ( VGA-0 и LVDS ) в режиме дублирования, при этом использовалось "минимальное общее" разрешение

#!/bin/bash
xrandr --output LVDS --off
xrandr --output VGA-0 --off
xrandr --output LVDS --mode 1024x768
xrandr --output VGA-0 --mode 1024x768

TODO: Найти устройство с HDMI и попробовать выводить сигнал на него.

Использование "горячей" клавиши

Для переключения видеовыходов (на ноутбуках), есть комбинация Fn+[соответствующая кнопка]. ACPId видит её как:

acpid: received event "video VGA 00000080 00000000"

Потому, создаём описание события в /etc/acpi/events/[произвольное название]:

event=video VGA 00000080 00000000
action=/etc/acpi/switchVga.sh

И добавляем соответствующий сценарий, который реализует циклическое переключение между LVDS->VGA->LVDS+VGA:

#!/bin/bash
VGASTAT=$( cat /tmp/vgastatus 2>/dev/null )
case $VGASTAT in
       "LVDS" )
       # It was LVDS, switching on VGA
       xrandr --output LVDS --off;
       xrandr --output VGA-0 --auto;
       echo "VGA-0" > /tmp/vgastatus ;
       ;;
       "VGA-0" )
       # It was VGA, switching on ALL (HDMI was not tested
       xrandr --output LVDS --off;
       xrandr --output VGA-0 --off;
       xrandr --output LVDS --mode 1024x768;
       xrandr --output VGA-0 --mode 1024x768;
       echo "ALL" > /tmp/vgastatus;
       ;;
       "ALL" )
       # It was ALL , switching on LVDS
       xrandr --output VGA-0 --off;
       xrandr --output LVDS --auto;
       echo "LVDS" > /tmp/vgastatus;
       ;;
       "" )
       # If we've rebooted comp, switching on LVDS
       xrandr --output VGA-0 --off;
       xrandr --output LVDS --auto;
       echo "LVDS" > /tmp/vgastatus;
       ;;
esac