Книга: Разработка приложений в среде Linux. Второе издание

21.4. Прямой вывод на экран

21.4. Прямой вывод на экран

В некоторых случаях наличие одной только способности выводить символы на экран не является достаточным. Частично это связано с невозможностью определить текущее состояние экрана. В системе Unix принята стандартная практика — состояние экрана игнорируется. Если нужно, вы можете задать настройки экрана, при появлении необходимости внести в них изменения, после чего полностью перерисовывать экран всякий раз, когда этого требует пользователь (как правило, нажатием комбинации ^L). Можно планировать и другие применения.

В частности, для работы программ и функций, предназначенных для фиксирования и восстановления экрана, требуется доступ к текущему содержимому экрана. Система Linux предоставляет такой доступ через два интерфейса. Один из них предлагает только текстовое содержимое экрана, второй содержит атрибуты (цвет и так далее).

Простейший текстовый механизм носит название vcs, что, вероятно, означает virtual console screen (экран виртуальной консоли)[155]. Чтение устройства /dev/vcs0 дает содержимое текущей виртуальной консоли, как оно выглядит на момент чтения. Если экран в настоящий момент прокручен (по умолчанию для прокрутки экрана назначаются клавиатурные последовательности <Control+PageUp> и <Control+PageDown>), устройство /dev/vcs0 содержит прокрученное содержимое, видимое на экране. Остальные устройства vcs, /dev/vcsn, представляют текущее состояние виртуальной консоли n и обычно доступны через /dev/ttyn.

При чтении файла /dev/vcs* не дается никаких указаний относительно новых строк или размера консоли, кроме метки EOF в конце экрана. Если вы прочитали 2000 байт и затем получили EOF, вы не сможете определить размеры экрана: может быть, он содержит 80 столбцов и 25 строк, а, может быть, 40 столбцов и 50 строк. Для отметки конца строк не выводятся символы новой строки, к тому же каждая пустая символьная ячейка (независимо от того, записывалась ли в нее когда-либо информация) обозначается символом пробела. Существует несколько популярных конфигураций экрана, и нет никакой гарантии, что каждая из них имеет однозначное количество строк и столбцов. Механизм vcs предлагает легкий способ для находчивых системных администраторов или разработчиков увидеть содержимое любой виртуальной консоли. Однако он не особенно полезен с точки зрения программистов, по крайней мере, без посторонней помощи.

Один из удобных способов — это использование vcs из X. По умолчанию XFree86 запускает X-сервер на первой свободной виртуальной консоли, но не на той консоли, из которой была активизирована программа. Если вы запускаете XFree86 из виртуальной консоли 1, то вам не нужно возвращаться в консоль 1 для того, чтобы увидеть регистрационные сообщения, которые XFree86 выводит на экран. Просто перенесите наверх окно терминала того же самого размера, что и консоль (обычно 80 столбцов на 25 строк), войдите в систему как привилегированный пользователь (для того чтобы получить доступ к механизму vcs) и запустите cat /dev/vcs1. Содержимое первой виртуальной консоли заполнит ваше терминальное окно.

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

• Цвета.

• Другие атрибуты (например, мерцание).

• Текущая позиция курсора.

• Конфигурация экрана (количество строк и столбцов).

Механизм vcsа (что означает virtual console screen with attributes — экран виртуальной консоли с атрибутами) предоставляет всю необходимую информацию. Первые четыре байта /dev/vcsan (для того же самого значения n, что и в vcs) содержат заголовок, показывающий текущую позицию курсора и конфигурацию экрана. Первый байт указывает количество строк, второй — количество колонок, третий — текущий столбец курсора, четвертый — текущую строку курсора. Остальная часть файла содержит переменные байты, которые отображают текст, и байты атрибутов текста данной консоли.

Таким образом, если вам требуется знать только размеры консоли и ее текстовое содержимое, то вы можете прочитать первые два байта из соответствующего механизма vcsa, а после этого работать только с механизмом vcs. Если вы хотите задать текущую позицию курсора, то нужно заполнить третий и четвертый байты механизма vcsa. Обратите внимание на то, что первые два байта предназначены только для чтения (то есть первые два символа являются просто заполнителями). Мы предпочитаем применять пробелы или другие подобные символы для того, чтобы подчеркнуть это. В качестве примера показано перемещение курсора на четвертой виртуальной консоли в восьмую строку и двенадцатый столбец (отсчитывая от нуля):

echo -n -е '..2307' > /dev/vcsa4

Параметр -n предотвращает добавление символа новой строки в конце, выполняет интерпретацию кодов смены алфавита, поэтому выражение nnn трактуется как восьмеричный символ nnn.

Атрибуты и символьное содержимое отображаются как переменные байты, первый из которых содержит символ, а второй — атрибуты для применения к этому символу. Байт атрибута, как правило, определяется по аналогии с байтом атрибута, используемым на оборудовании VGA. Остальные виды технических средств, включая карты TGA, применяемые во многих машинах Linux/Alpha, и консольный драйвер SPARC, эмулируют обработку атрибутов VGA. На видеоаппаратуре без поддержки цвета, но с поддержкой подчеркивания, атрибуты могут считываться несколько по-другому. Однако способ разработки позволяет делать вид, что все оборудование ведет себя как VGA.

В каждом атрибутном байте отдельные биты интерпретируются так, как описано в табл. 21.12. Это VGA представление; некоторые цветовые устройства заменяют мерцание ярким задним фоном. Монохромное изображение использует нулевой бит цвета переднего плана для указания подчеркивания.

Таблица 21.12. Атрибуты

Бит (биты) Результат
7 Мерцание
6-4 Фон
3 Полужирный шрифт
2-0 Передний план

Оглавление книги


Генерация: 1.224. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз