Чиним видеорежимы

3 сентября 2019

Седые аксакалы, заставшие XFree86, помнят, что настройка графического режима в ней была нетривиальным делом — требовалось указывать низкоуровневые параметры видеорежимов, включая тайминги, частоту развёртки и прочие магические значения. Во всех руководствах (к слову сказать, немногочисленных и невнятных) неизменно подчёркивалось, что неверные числа могут привести к самым тяжёлым последствиям, вплоть до сгоревшего монитора.

Но затем появился Mandrake Linux, и настройка оборудования в Линуксе превратилась в простую и приятную процедуру.

Причина, по которой нам пришлось вспомнить те суровые времена, явилась нам в образе древнего компьютера на базе 945 чипсета, который было решено превратить в видеопроектор, подключив к нему 21-дюймовый монитор. Было замечено, что все операционные системы (как Windows, так и Linux) используют на нём разрешение, весьма далёкое от максимального.

В нашем распоряжении имеется утилита xrandr, которая показывает доступные видеорежимы и позволяет переключаться между ними на лету. Проблема в том, что xrandr не видела разрешений больше 1024x768, потому что слишком современный монитор оказался не состоянии сообщить о них слишком старой видеокарте через аналоговый VGA-кабель.

Следует отметить, что в Windows 10 решить эту проблему так и не получилось.

Однако в Линуксе нам на помощь пришли два инструмента:

  • способность xrandr вручную добавлять описания новых видеорежимов в формате Modeline,
  • утилита cvt, генерирующая для заданного разрешения правильный Modeline, пригодный для передачи в xrandr.

Общая последовательность действий будет такой:

  • вызываем cvt и получаем modeline,
  • вызываем “xrandr --newmode” и регистрируем modeline,
  • вызываем “xrandr --addmode” и назначаем зарегистрированный modeline встроенной видеокарте,
  • вызываем “xrandr -s” и переключаемся на новое разрешение.

Получившийся сценарий сохраняем в /usr/local/sbin/fix-display-resolution и делаем исполняемым (chmod +x):

#!/bin/sh -x

MONITOR="VGA1"
  WIDTH="1920"
 HEIGHT="1080"

MODELINE="$(cvt "$WIDTH" "$HEIGHT" | awk '/Modeline/ { gsub(/"/, ""); for (i=2; i<=NF; i++) printf $i " "; exit }')"
MODENAME="${MODELINE%% *}"

test "$MODELINE" = "" && { echo "Cannot detect modeline" 1>&2; exit 1; }

xrandr --newmode $MODELINE
xrandr --addmode "$MONITOR" "$MODENAME"
xrandr -s "$MODENAME"

Как добавить сценарий в автозагрузку?

Зависит в первую очередь не столько от дистрибутива, сколько от оконного окружения. Например, если используется LXDE:

  • выбираем Главное меню => Preferences => Default applications for LXSession,
  • в открывшемся окне переходим на вкладку Autostart,
  • в строке “Manual autostarted applications” вводим полный путь к созданному файлу: /usr/local/sbin/fix-display-resolution,
  • и нажимаем кнопку “+ Add”.


← Назад в Блог

Подпишитесь на новые статьи: