Добавлен: 29.10.2018
Просмотров: 48161
Скачиваний: 190
446
Глава 5. Ввод и вывод информации
вариант строки. В конечном счете, способ отображения ввода символа KILL — это дело
вкуса. Как и в случае с символом ERASE, уйти назад за пределы текущей строки не
представляется возможным. При удалении блока символов драйвер может испытывать,
а может и не испытывать затруднения с возвратом задействованных буферов в пул.
Иногда символы ERASE или KILL должны вводиться как обычные данные. В этом
случае в качестве эскейп-символа (escape character) служит LNEXT
1
. В UNIX для его
ввода по умолчанию используется
CTRL+V
. К примеру, старые UNIX-системы часто ис-
пользуют в качестве символа KILL знак
@
, но почтовая система Интернета использует
адреса вида
linda@cs.washington.edu
. Все, кому удобнее пользоваться старым соглаше-
нием, могут переопределить KILL и назначить для него знак
@
, но тогда им придется
вводить знак
@
в адресную строку электронной почты в буквальном виде. Это делается
путем набора последовательности
CTRL+V
@
. Сам символ
CTRL+V
тоже может быть
введен в буквальном виде путем последовательного двойного набора
CTRL+V
. Как толь-
ко драйвер встречает
CTRL+V
, он выставляет флажок, свидетельствующий о том, что
следующий символ исключается из обработки особым способом. Сам символ LNEXT
в очередь символов не заносится.
Чтобы дать возможность пользователям остановить прокрутку изображения на экра-
не за пределы видимости, предоставляются управляющие коды для остановки и по-
следующего возобновления прокрутки. В UNIX для этого используются коды STOP
(
CTRL+S
) и START (
CTRL+Q
) соответственно. Они не сохраняются, а используются для
установки и снятия флажка в структуре данных клавиатуры. Когда предпринимается
попытка вывода информации на экран, проверяется состояние этого флажка. Если он
установлен, вывод не осуществляется. Наряду с программным выводом обычно по-
давляется и отображение ввода.
Довольно часто возникает необходимость прервать работу вышедшей из-под контроля
отлаживаемой программы. Для этого могут быть использованы символы INTR (
DEL
)
и QUIT (
CTRL+\
). В UNIX клавиша
DEL
посылает сигнал SIGINT всем процессам, за-
пущенным с этой клавиатуры. Реализация работы клавиши
DEL
может быть крайне
затруднена, поскольку UNIX с самого начала разрабатывалась для одновременной ра-
боты с несколькими пользователями. Поэтому обычно приходится иметь дело с множе-
ством процессов, запущенных от имени многих пользователей, и клавиша
DEL
должна
послать сигнал только процессу, принадлежащему данному пользователю. Трудности
возникают при получении информации от драйвера той частью операционной систе-
мы, которая обрабатывает сигналы и которая, ко всему прочему, эту информацию и не
запрашивает.
Действие сочетания клавиш
CTRL+\
подобно действию клавиши
DEL
, за исключением
того, что посылается сигнал SIGQUIT, вызывающий вывод дампа ядра, если этот сигнал
не перехватывается или не игнорируется. При нажатии любой из этих клавиш драйвер
должен отобразить возврат каретки и перевод строки и сбросить весь накопленный
ввод, позволяя начать все с чистого листа. Зачастую для INTR используется сочета-
ние
CTRL+C
, а не клавиша
DEL
, поскольку многие программы используют
DEL
наряду
с клавишей забивания для редактирования ввода.
Следующий специальный символ, EOF (
CTRL+D
), вызывает в UNIX выполнение для
терминала всех отложенных запросов на чтение, используя все содержимое буфера,
1
Точнее, символ LNEXT используется здесь в качестве экранирующего. — Примеч. ред.
5.6. Пользовательский интерфейс: клавиатура, мышь, монитор
447
даже если буфер пуст. Ввод
CTRL+D
в самом начале строки заставляет программу про-
читать нуль байтов, что условно воспринимается как конец файла и заставляет многие
программы действовать точно так же, как при встрече кода конца файла во входном
файле.
Программное обеспечение мыши
Мышь, или иногда трекбол, то есть та же мышь, положенная на спину, имеется на мно-
гих персональных компьютерах. Одна из распространенных конструкций мыши имеет
внутри себя обрезиненный шарик, выступающий наружу через отверстие в ее нижней
части и вращающийся по мере перемещения мыши по нескользкой поверхности. При
вращении шарик трется о прорезиненные ролики, помещенные на валах, расположен-
ных под прямым углом друг относительно друга. Перемещение влево-вправо вызывает
вращение вала, параллельного оси Y, а перемещение вверх-вниз вызывает вращение
вала, параллельного оси X.
Еще одной популярной разновидностью является оптическая мышь, оборудованная
в нижней части одним или несколькими светоизлучающими диодами и фотодетекто-
рами. Их ранние модели должны были работать на специальном коврике, имеющем
выгравированную прямоугольную сетку, чтобы мышь могла подсчитывать количество
пересекаемых линий. Современные оптические мыши имеют встроенную микросхему
обработки изображения и производят в низком разрешении непрерывную съемку на-
ходящейся под ними поверхности, изучая изменение изображений от снимка к снимку.
Как только мышь будет перемещена в любом направлении на определенное мини-
мальное расстояние или ее кнопка будет нажата или освобождена, компьютеру будет
отослано сообщение. Минимальное расстояние составляет около 0,1 мм (хотя его
можно настроить программным способом). Некоторые называют это расстояние микки.
У мышей могут быть одна, две или три кнопки в зависимости от представления раз-
работчика об интеллектуальных возможностях пользователей отслеживать назначение
более чем одной кнопки. У некоторых мышей имеется колесо, которое может отправ-
лять компьютеру дополнительные данные. Беспроводные мыши ничем не отличаются
от проводных, за исключением того, что они отправляют свои данные на компьютер
не по проводам, а по маломощному радиоканалу, использующему, к примеру, стандарт
Bluetooth
.
Сообщение в адрес компьютера имеет три составляющие: Δx, Δy и кнопки. Первая
составляющая — это изменение позиции x со времени последнего сообщения. Затем
следует изменение позиции y со времени последнего сообщения. И в завершение
включается информация о состоянии кнопок. Формат сообщения зависит от системы
и количества имеющихся кнопок. Обычно оно занимает 3 байта. Многие мыши отправ-
ляют сообщения максимум 40 раз в секунду, поэтому со времени последнего сообщения
мышь может переместиться на несколько микки.
Учтите, что мышь показывает только изменение позиции, а не саму по себе абсолютную
позицию. Если мышь поднять и аккуратно вернуть на место без вращения шарика, то
никаких сообщений отправлено не будет.
Многие графические интерфейсы пользователя различают одиночный и двойной
щелчки кнопкой мыши. Если два щелчка достаточно близки в пространстве (в мик-
ки) и также близки по времени (в миллисекундах), то будет послан сигнал двойного
448
Глава 5. Ввод и вывод информации
щелчка. Максимальное значение понятия «достаточно близки» зависит от программы,
а каждый из этих параметров может быть настроен пользователем.
5.6.2. Программное обеспечение вывода информации
Теперь рассмотрим программное обеспечение вывода. Сначала разберемся с простым
выводом в текстовое окно, которое обычно предпочитают использовать программисты.
Затем рассмотрим графический интерфейс пользователя, предпочитаемый другими
пользователями.
Текстовые окна
Вывод проще ввода, когда он представляет собой последовательный вывод символов
одного и того же шрифта, размера и цвета. Большей частью программы отправляют
символы в текущее окно, где они и отображаются. Обычно за один системный вызов
выводится блок символов, к примеру целая строка.
Экранные редакторы и многие другие сложные программы должны уметь обновлять
экран сложными способами, например удалять одну строку в середине экрана. Для
обеспечения этих потребностей большинство драйверов вывода поддерживают наборы
команд для перемещения курсора, вставки и удаления символов или строк там, где на-
ходится курсор, и т. д. Эти команды часто называются эскейп-последовательностями.
В период широкого распространения «немых» ASCII-терминалов с отображением
25 строк по 80 символов существовали сотни типов терминалов, у каждого из которых
имелись собственные эскейп-последователности. Поэтому трудно было написать про-
грамму, которая работала на более чем одном типе терминала.
Одно из решений, представленное в системе Berkeley UNIX, представляло собой базу
данных терминалов, называемую termcap. Этот программный пакет определял набор
основных действий, таких как перемещение курсора в позицию (строка, столбец). Для
перемещения курсора в конкретное место программа, например редактор, использовала
общую эскейп-последовательность, которая затем превращалась в фактическую эскейп-
последовательность для того терминала, на который осуществлялся вывод. Таким
образом, редактор работает на любом терминале, для которого имеется запись в базе
данных termcap. Основная часть UNIX-программ по-прежнему именно так и работает,
даже на персональных компьютерах.
Со временем промышленность стала испытывать потребность в стандартизации
эскейп-последовательностей, поэтому был разработан стандарт ANSI. Некоторые из
его значений показаны в табл. 5.5.
Таблица 5.5. Эскейп-последовательности стандарта ANSI, воспринимаемые драйве-
ром терминала при выводе информации. ESC означает ASCII-символ эскейп (0x1B),
а n, m и s являются дополнительными числовыми параметрами
Эскейп-
последовательность
Предназначение
ESC [ n A
Перемещение вверх на n строк
ESC [ n B
Перемещение вниз на n строк
ESC [ n C
Перемещение вправо на n позиций
5.6. Пользовательский интерфейс: клавиатура, мышь, монитор
449
Эскейп-
последовательность
Предназначение
ESC [ n D
Перемещение влево на n позиций
ESC [ m; n H
Перемещение курсора в позицию (m, n)
ESC [ s J
Очистка экрана от позиции курсора (0 — до конца, 1 — от на-
чала, 2 — всего экрана)
ESC [ s K
Очистка строки от позиции курсора (0 — до конца, 1 — от на-
чала, 2 — всей строки)
ESC [ n L
Вставка n строк в позицию курсора
ESC [ n M
Удаление n строк с позиции курсора
ESC [ n P
Удаление n символов с позиции курсора
ESC [ n @
Вставка n символов в позицию курсора
ESC [ n m
Включение отображения n (0 — нормального, 4 — полужир-
ного, 5 — мигающего, 7 — инвертированного)
ESC M
Прокрутка экрана назад, если курсор находится в верхней
строке
Рассмотрим, как эти эскейп-последовательности могут использоваться текстовым
редактором. Предположим, что пользователь набрал команду, предписывающую ре-
дактору удалить все символы в строке 3, а затем убрать разрыв между строками 2 и 4.
Редактор должен послать по последовательному каналу в адрес терминала следующую
эскейп-последовательность:
ESC [ 3 ; 1 H ESC [ 0 K ESC [ 1 M
(где пробелы используются только для разделения символов и по каналу не передают-
ся). Эта последовательность приводит к перемещению курсора в начало третьей строки,
удалению всей строки, а затем удалению только что опустевшей строки, заставляя все
строки, начиная с четвертой, подняться на одну строку. При этом та строка, что была
четвертой, становится третьей, пятая — четвертой и т. д. Аналогичные эскейп-последо-
вательности могут использоваться для добавления текста в середину дисплея. Слова
могут добавляться или удаляться аналогичным образом.
Система X Window
Пользовательский интерфейс практически всех UNIX-систем базируется на системе
X Window System
(которую часто называют просто X), разработанной в 1980-е годы
в Массачусетском технологическом институте (MIT) как часть проекта Athena. Она
обладает хорошей переносимостью и работает целиком в пользовательском простран-
стве. Первоначально она предназначалась для подключения большого количества
удаленных пользовательских терминалов к центральному вычислительному серверу,
поэтому логически разбита на клиентское и серверное программное обеспечение,
которое потенциально может работать на разных компьютерах. На современных
персональных компьютерах обе ее составляющие могут работать на одной и той же
машине. В Linux-системах популярные среды рабочих столов Gnome и KDE работают
поверх X-системы.
450
Глава 5. Ввод и вывод информации
Когда X-система работает на одной машине, программное обеспечение, которое собира-
ет входящую информацию с клавиатуры и мыши и выводит выходную информацию на
экран, называется X-сервером. Х-сервер должен отслеживать, какое из окон выбрано
в данный момент (в каком из них находится указатель мыши), поэтому он знает, какому
именно клиенту отправлять весь клавиатурный ввод. Он обменивается информаци-
ей с работающими программами (возможно, по сети), называемыми X-клиентами.
X-сервер отправляет им информацию, получаемую с клавиатуры и мыши, и принимает
от них команды на отображение информации.
Может показаться странным, что X-сервер всегда находится внутри пользовательских
компьютеров, а X-клиент может быть вне его, на удаленном вычислительном сервере,
но стоит лишь подумать об основной задаче X-сервера — отображении битов на экране,
как сразу становится понятно, почему нужно держать его ближе к пользователю. С точ-
ки зрения программы именно клиент предписывает серверу какие-то действия вроде
отображения текста и геометрических фигур. А сервер (в локальном персональном
компьютере) делает, как и все серверы, лишь то, что ему сказано.
Схема клиента и сервера для случая, когда X-клиент и X-сервер размещаются на
разных машинах, показана на рис. 5.27. Но при запуске Gnome или KDE на одной ма-
шине в роли клиента выступает какая-нибудь прикладная программа, использующая
X-библиотеку, которая общается с X-сервером на той же самой машине (но использует
TCP-подключение через сокеты аналогично тому, как это делалось бы в случае исполь-
зования удаленного компьютера).
Рис. 5.27. Клиенты и серверы в системе X Window System, разработанной в MIT
Смысл предоставления возможности запуска X Window System в качестве надстрой-
ки над UNIX (или над другой операционной системой) на отдельной машине или
с использованием сети заключается в том, что X-система фактически определяет
протокол обмена данными между X-клиентом и X-сервером (см. рис. 5.27). И не