Добавлен: 29.10.2018
Просмотров: 48166
Скачиваний: 190
5.6. Пользовательский интерфейс: клавиатура, мышь, монитор
451
важно, где именно находятся клиент и сервер — на одной машине, отделены друг от
друга на 100 метров и связаны по сети или их разделяют тысячи километров и они
связаны через Интернет. Во всех случаях протокол и работа системы имеют иден-
тичный характер.
X-система — это всего лишь система организации многооконного интерфейса. Она не
является полноценной системой графического интерфейса пользователя. Для полу-
чения полноценного графического интерфейса пользователя поверх нее запускается
другое программное обеспечение. Один из его уровней — это Xlib, представляющий
собой библиотеку процедур для доступа к функциональности X-системы. Эти процеду-
ры формируют основу X Window System и станут предметом нашего дальнейшего
рассмотрения, но они слишком примитивны для непосредственного доступа к ним
пользовательских программ. К примеру, они посылают отдельное сообщение о каждом
щелчке мыши, поэтому определение того, какие два щелчка на самом деле формируют
двойной щелчок, должно быть сделано на уровне, находящемся выше Xlib.
Для облегчения программирования в среде X-системы в качестве ее составной
части предоставляется инструментарий под названием Intrinsics. На этом уровне
осуществляется управление кнопками, полосами прокрутки и другими элементами
графического интерфейса, именуемыми виджетами (widgets). Для создания на-
стоящего графического интерфейса пользователя с универсальными восприятием
и поведением необходим другой уровень (или несколько уровней). Один из при-
меров — Motif (см. рис. 5.27) — является основой для общей среды рабочего сто-
ла — Common Desktop Environment, используемой в Solaris и других коммерческих
UNIX-системах. Во многих приложениях используются вызовы к Motif, а не к Xlib.
В Gnome и KDE имеется структура, похожая на ту, которая показана на рис. 5.27,
только в них используются другие библиотеки. В Gnome используется библиотека
GTK+, а в KDE — библиотека Qt.
Также стоит заметить, что управление окнами не является частью самой X-системы.
Решение о его отделении было принято преднамеренно. Этим занимается отдельный
процесс X-клиента под названием менеджер окон. Он управляет созданием, удале-
нием и перемещением окон на экране. Для управления окнами он посылает команды
X-серверу, предписывая, что нужно делать. Зачастую он работает на той же машине
в качестве X-клиента, но теоретически может работать где угодно.
Такая модульная конструкция, состоящая из нескольких уровней и многочисленных
программ, придает X-системе высокую степень переносимости и гибкости. Она была
перенесена на большинство версий UNIX, включая Solaris, все варианты BSD, AIX,
Linux и т. д., предоставляя разработчикам приложений возможность использовать
стандартный интерфейс для нескольких платформ. Она также была перенесена на
другие операционные системы. Для сравнения, в Windows система управления окна-
ми и графический интерфейс пользователя перемешаны в интерфейсе графических
устройств — GDI и расположены в ядре, что усложняет их поддержку и, конечно же,
делает невозможным их перенос.
Теперь перейдем к краткому обзору X-системы с уровня Xlib. При запуске X-программа
создает подключение к одному или нескольким X-серверам, назовем их рабочими
станциями, даже если они будут сосуществовать на одной и той же машине с самой
X-программой. X-система рассматривает эти подключения как надежные в том смысле,
что потерянные и продублированные сообщения обрабатываются сетевым программ-
452
Глава 5. Ввод и вывод информации
ным обеспечением и не нужно заботиться об ошибках обмена данными. Обычно для
связи между клиентом и сервером используется протокол TCP/IP.
При обмене данными используются четыре вида сообщений:
команды вывода графики от программы к рабочей станции;
ответы рабочей станции на программные запросы;
извещения о событиях клавиатуры, мыши и других устройств;
сообщения об ошибках.
Большинство команд на вывод графики посылаются из программ к рабочим станциям
в виде одностороннего сообщения, на которое не ожидается никакого ответа. Причина
такой конструкции кроется в том, что когда клиент и сервер работают на разных ма-
шинах, на прохождение и выполнение команды может потребоваться значительный
отрезок времени. Блокировка прикладной программы в течение этого отрезка приве-
дет к ненужному замедлению ее работы. В то же время, когда программе необходима
информация от рабочей станции, она просто вынуждена ждать возвращения ответа.
Как и Windows, X-система является в высокой степени управляемой событиями.
События поступают от рабочей станции к программе, зачастую в качестве ответа на
какие-нибудь действия человека, например нажатие клавиш, перемещение мыши или
окна, находящегося на первом плане. Каждое сообщение о событии занимает 32 байта,
где в первом байте дается тип события, а в следующем 31 байте предоставляется до-
полнительная информация. Существует несколько десятков событий, но программе
отправляются сообщения только о тех событиях, о желании обработки которых она
сообщила. К примеру, если программа не желает ничего слышать об освобождаемых
клавишах, то сообщения об их освобождении ей и не посылаются. Как и в Windows,
события выстраиваются в очередь, и программа считывает информацию о них из
входной очереди.
Но в отличие от Windows, операционная система никогда сама не вызывает процеду-
ры, находящиеся внутри прикладной программы. Она даже не знает, какая процедура
какое событие обрабатывает.
Ключевым понятием в X-системе является ресурс. Он представляет собой структуру
данных, в которой содержится определенная информация. Прикладные программы
создают ресурсы на рабочих станциях. Ресурсы могут совместно использоваться не-
сколькими процессами, запущенными на рабочей станции. Ресурсы настроены на
короткий период существования и не в состоянии пережить перезагрузку рабочей
станции. Типичными ресурсами являются окна, шрифты, цветовые карты (палитры),
карты элементов изображений (растровые изображения), курсоры и графические кон-
тексты. Последние используются для связи свойств с окнами и имеют концептуальное
сходство с контекстами устройств в Windows.
Примерная неполная структура X-программы показана в листинге 5.1. Она начинается
с нескольких необходимых заголовков, за которыми следует ряд определений пере-
менных. Затем осуществляется подключение к X-серверу, указанному в виде параметра
процедуры XOpenDisplay. После этого происходит выделение окну ресурсов, и его
дескриптор сохраняется в переменной win. На практике здесь должна происходить
инициализация. Затем программа сообщает менеджеру окон о существовании нового
окна, чтобы он мог взять его под свое управление.
5.6. Пользовательский интерфейс: клавиатура, мышь, монитор
453
Листинг 5.2. Структура прикладной программы X Window
#include <X11/Xlib.h>
#include <X11/Xutil.h>
main(int argc, char *argv[])
{
Display disp; /* идентификатор сервера */
Window win; /* идентификатор окна */
GC gc; /* идентификатор графического контекста
*/
XEvent event; /* хранилище для одного события */
int running = 1;
disp = XOpenDisplay("display name"); /* подключение к X-серверу */
win = XCreateSimpleWindow(disp, ... ); /* выделение памяти для нового
окна */
XSetStandardProperties(disp, ...); /* оповещение менеджера окон */
gc = XCreateGC(disp, win, 0, 0); /* создание графического
контекста */
XSelectInput(disp, win, ButtonPressMask | KeyPressMask | ExposureMask);
XMapRaised(disp, win); /* отображение окна; отправка
события Expose */
while (running) {
XNextEvent(disp, &event); /* получение следующего события */
switch (event.type) {
case Expose: ...; break; /* перерисовка окна */
case ButtonPress: ...; break; /* обработка щелчка мыши */
case Keypress: ...; break; /* обработка клавиатурного ввода */
}
}
XFreeGC(disp, gc); /* избавление от графического
контекста */
XDestroyWindow(disp, win); /* высвобождение пространства памяти
окна */
XCloseDisplay(disp); /* разрыв сетевого подключения */
}
Путем вызова процедуры XCreateGC создается графический контекст, в котором сохра-
няются свойства окна. В более сложных программах в этом месте может проводиться
инициализация. В следующем операторе содержится вызов процедуры XSelectInput,
сообщающей X-серверу, какие события программа готова обрабатывать. В данном
случае программу интересуют щелчки мышью, нажатия клавиш и выводимые на
первый план окна. В действительности настоящая программа будет интересоваться
и другими событиями. И наконец, процедура XMapRaised осуществляет отображение
нового окна на экране, выводя его на первый план. С этого момента окно становится
видимым на экране.
Основной цикл состоит из двух операторов и логически выглядит намного проще со-
ответствующего цикла в Windows. Первый оператор получает событие, а второй осу-
ществляет его диспетчеризацию по типу этого события для его дальнейшей обработки.
Когда какое-нибудь событие свидетельствует об окончании программы, переменной
454
Глава 5. Ввод и вывод информации
running присваивается значение 0 и цикл завершается. Перед выходом программа из-
бавляется от графического контекста, окна и подключения.
Следует заметить, что графический интерфейс пользователя нравится далеко не
всем. Многие программисты предпочитают традиционный интерфейс, основанный
на использовании командной строки, который рассматривался ранее в этом разделе.
X-система управляет им с помощью клиентской программы под названием xterm. Эта
программа имитирует работу почтенного интеллектуального терминала VT102, уком-
плектованного всеми эскейп-последовательностями. Такие редакторы, как vi и emacs,
а также другие программы, использующие базу данных termcap, работают в подобных
окнах без каких-либо изменений.
Графические пользовательские интерфейсы
На многих персональных компьютерах предлагается пользоваться графическим
интерфейсом пользователя
(Graphical User Interface (GUI)). Сокращение GUI про-
износится как «гуи».
GUI был изобретен Дугласом Энгельбартом (Douglas Engelbart) и его исследователь-
ской группой из Стэнфордского исследовательского института. Затем он был скопи-
рован исследователями из Xerox PARC. Однажды соучредитель компании Apple Стив
Джобс (Steve Jobs) посетил PARC, увидел GUI на компьютере Xerox и воскликнул
примерно следующее: «Ну надо же! Это ведь будущее компьютерного мира». GUI
подтолкнул его на создание нового компьютера, которым стал Apple Lisa. Из-за доро-
говизны компьютер Lisa потерпел коммерческий провал, но его потомок, Macintosh,
имел громадный успех.
Когда компания Microsoft получила прототип компьютера Macintosh, чтобы получить
возможность разработки на нем программы Microsoft Office, ее руководство попросило
Apple лицензировать этот интерфейс для всех желающих, чтобы он стал промышленным
стандартом. (Microsoft выручила намного больше денег от программы Office, чем от MS-
DOS, поэтому ей захотелось отказаться от MS-DOS, чтобы получить более совершенную
платформу для Office.) Ответственный исполнитель проекта Macintosh в компании Apple
Жан-Луи Гассе (Jean-Louis Gassee) в просьбе отказал, а Стив Джобс не стал отменять его
решение. В конце концов Microsoft получила лицензию на элементы этого интерфейса.
Именно они и стали основой интерфейса системы Windows. Когда Windows стала вхо-
дить в моду, Apple подала на Microsoft в суд, обвиняя ее в выходе за лицензионные рамки,
но судья не согласился с этим, и Windows продолжала наступать Macintosh на пятки.
Если бы Гассе согласился со многими специалистами компании Apple, также желающими
всеобщего лицензирования программного обеспечения Macintosh, компания Apple, на-
верное, разбогатела бы на лицензионных сборах и Windows сейчас бы не существовало.
Если на время не принимать во внимание интерфейсы сенсорных экранов, то в GUI
есть четыре наиболее важных элемента, обозначаемых символами WIMP. Эти буквы
означают соответственно: окна — Windows, значки — Icons, меню — Menus и указыва-
ющие устройства — Pointing device. Окна представляют собой прямоугольные области
экрана, используемые для запуска программ. Значки являются небольшими обозначе-
ниями, на которых можно щелкать мышью с целью выполнения каких-либо действий.
Меню представляют собой перечни действий, любое из которых может быть выбрано.
И наконец, указывающие устройства — это мыши, трекболы или другая аппаратура,
используемая для перемещения указателя по экрану с целью выбора элементов.
5.6. Пользовательский интерфейс: клавиатура, мышь, монитор
455
Программное обеспечение GUI может быть реализовано либо в качестве кода на
уровне пользователя, как это сделано в системах UNIX, либо в самой операционной
системе, как в случае с системой Windows. Для ввода в системах GUI по-прежнему
используются клавиатура и мышь, а вот вывод практически всегда направляется на
специальное устройство, называемое графическим адаптером. Этот адаптер состоит
из специального блока памяти, называемого видеопамятью, в которой хранятся изо-
бражения, появляющиеся на экране. На графических адаптерах часто ставят 32- или
64-разрядные центральные процессоры и до 4 Гбайт собственной оперативной памяти,
отделенной от оперативной памяти самого компьютера.
Каждый графический адаптер поддерживает определенное количество разрешений
экрана. Общепринятыми разрешениями (по горизонтали × по вертикали в пикселах)
являются 1280 × 960, 1600 × 1200 и 1920 × 1080, 2560 × 1600 и 3840 × 2160. Многие
разрешения на практике имеют соотношение сторон экрана 4:3, что соответствует
соотношению размеров экрана телевизионных приемников стандартов NTSC и PAL
и обеспечивает прямоугольность пикселов на тех же мониторах, которые используются
для телевизионных приемников. Высшие разрешения предназначены для широко-
экранных мониторов с соответствующим соотношением сторон. При разрешении
1920 × 1800 (размер видео стандарта full HD) цветной дисплей, имеющий 24 бита
на пиксел, требует около 6,2 Мбайт оперативной памяти для хранения всего лишь
одного изображения, поэтому при наличии 256 Мбайт и более графический адаптер
может одновременно хранить множество изображений. Если весь экран обновляется
75 раз в секунду, видеопамять должна быть способна непрерывно поставлять данные
со скоростью 445 Мбайт/с.
Тема программного обеспечения вывода для GUI-интерфейсов слишком обширна. От-
дельно о Windows GUI написано множество томов по 1500 страниц (например, Petzold,
2013; Simon, 1997; Rector and Newcomer, 1997). Совершенно очевидно, что в этом разде-
ле мы можем лишь вскользь коснуться этой темы и представить ряд основополагающих
понятий. Для конкретизации изложения будет дано описание интерфейса Win32 API,
который поддерживается всеми 32-разрядными версиями Windows. В общих чертах
программное обеспечение вывода для других GUI-интерфейсов приблизительно со-
поставимо с этим, но в деталях оно имеет существенные отличия.
Основным элементом экрана является прямоугольная область, называемая окном.
Позиция и размеры окна однозначно определяются за счет задания координат (в пик-
селах) двух диагонально противоположных углов. Окно может содержать небольшой
заголовок, строку меню, cтроку инструментов, а также вертикальную и горизонталь-
ную полосы прокрутки. Типичное окно показано на рис. 5.28. Заметьте, что отсчет
в системе координат Windows начинается с верхнего левого угла и координата y рас-
тет вниз, что отличает эту систему координат от декартовой, которая используется
в математике.
При создании окна задаются параметры, определяющие, может ли пользователь его
перемещать, изменять его размеры или прокручивать (перетаскивая движок в полосе
прокрутки). Главное окно, создаваемое многими программами, может подвергать-
ся перемещению, изменению размеров и прокрутке, что оказывает существенное
влияние на способ написания Windows-программ. В частности, программы должны
получать информацию об изменениях размера своих окон и должны быть готовы
к перерисовке содержимого окон в любой момент, даже когда они ожидают этого
меньше всего.