Библиотека Интернет Индустрии I2R.ru |
|||
|
X Window -- восполняя пробелы. Часть 2 -- XlibКороткий обзор X Window в предыдущей
части статьи, где не были отражены многие нюансы и даже ряд очень специфических
понятий X Window, пока свидетельствует лишь о том, что система действительно сложна
и функциональна. И чтобы использовать эту функциональность, необходимы удачный
программный интерфейс и реализация этого интерфейса. К счастью, они существуют,
называются, соответственно, Xlib.h и Xlib и обязательно входят в комплект поставки
дистрибутива той или иной реализации X Window. В файле Xlib.h собраны описания
основных типов данных и операций над ними, реализованных в рамках облегчающей
разработку клиентских приложений библиотеки Xlib. С точки зрения C-программиста,
может оказаться весьма важным своевременное замечание о том, что к большинству
элементов сложных структур данных X Window нельзя обращаться "напрямую" -- для
этого есть специальные функции, а многие типы данных определены в файле Xlib.h
как "непрозрачные" (opaque, для объектов таких типов известны только их типизованные
адреса, а сами реализации скрыты).
Создание оконной иерархии будущего приложения:
Необязательная установка атрибутов некоторых окон:
Указание X-серверу отобразить построенную оконную иерархию:
... Необязательное принудительное закрытие окон:
Отсоединение от X-сервера:
Естественно, что даже в такой концептуальной картине есть нечто настораживающее. А именно, скрытое требование к внимательности программиста--разработчика ПО для X Window. Ведь идентификаторы окон всей иерархии надо не просто хранить, но и, например, гарантированно выполнять для всех них "визуальные" вызовы, чтобы на экране отобразилась "правильная картинка". Вот и настало время успокаивающего уточнения -- Xlib располагает дополнительными функциями, играющими роль итераторов. Для большинства упомянутых функций, работающих с одним из множества объектов, есть их итеративные аналоги. Так, например, вызов XMapWindow для одного окна дублирован вызовом-итератором XMapSubwindows, который "отмечает" указанием "отобразить" все окна, чьим "родителем" является переданное в вызове. По аналогичному принципу работают вызовы XUnmapSubwindows и XDestroySubwindows -- укажите им идентификатор некоторого окна и переложите на X Window заботу и об "обходе" всех окон, родителем которых оно является, и о выполнении для каждого соответствующей операции. События Первая концептуальная модель нашей "программы" для X Window обладает одним принципиальным свойством -- она статична, т. е. обеспечивает отображение некоторой "картинки" (пусть даже сложной), но не более. Динамика же поддерживается именно механизмом событий -- основой большинства систем, отвечающих за взаимодействие человека и машины. В терминах X Window под событиями понимается информация о чем-то "стороннем" по отношению к программе-клиенту, но о чем она должна быть проинформирована. События разделены на две основные категории -- "непосредственные", инициируемые человеком-пользователем, и "косвенные", инициируемые X-сервером или другой программой-клиентом. Очевидно, что человек-пользователь может воздействовать на X-сервер только с помощью двух доступных средств -- клавиатуры и позиционирующего устройства (ПУ). И ничего неожиданного и сложного нет в том, что в категорию "непосредственных" событий входят ButtonPress (нажатие клавиши ПУ), KeyPress (нажатие клавиши клавиатуры), MotionNotify (перемещение ПУ) и т. п. "Косвенные" события интересней и намного сложней -- они формируются X-сервером на основе кэшированной информации об оконных иерархиях и отражают изменения в последних. Впрочем, весьма условные вопросы классификации всего тридцати событий -- это далеко не самое главное и сложное в механизме событий X Window. Самое главное (с точки зрения программиста) -- концептуальная модель самого этого механизма, выраженная в уже известных и новых терминах Xlib. А она одновременно сложна и проста, и именно ей мы посвятим этот раздел статьи. В основе механизма сообщений лежит понятие "очереди сообщений" (events queue). "Очередь" -- абстрактный тип данных, обеспечивающий две базовые асинхронные операции: запись_в_очередь/чтение_из_очереди и поддерживающий политику "первым вошел -- первым вышел", т. е. данные из очереди читаются в порядке их записи в очередь. X Window иногда называют "системой N+1 очередей" -- в этом названии достаточно точно отражена основная идея ее системы событий: X-сервер поддерживает главную очередь событий, а Xlib реализует дополнительные очереди -- для каждого клиентского приложения. Собственно, в этом и заключается вся "архитектурная сложность", а настоящие сложности начинаются в нюансах. Первый, естественно, связан с ограничениями, диктуемыми реальностью, а именно, с разнообразием событий и множеством окон в каждом приложении. Тридцать событий и несколько сотен окон (или даже несколько тысяч) образуют слишком большое количество комбинаций, а если учесть, что реакции на одинаковые события в разных окнах могут понадобиться разные... И здесь разработчики X Window нашли весьма успешное решение проблемы -- реализовав так называемый "механизм интересов окна" (название это ни в коей мере не официальное). Суть его заключается в том, что в перечне атрибутов каждого окна присутствует перечисление событий, информация о которых нужна данному окну. Раз это атрибут окна, значит, он устанавливается при создании окна посредством тех же функций XCreateWindow/XCreateSimpleWindow, а впоследствии его можно изменить с помощью опять же уже известного нам вызова XChangeWindowAttributes или специального -- XSelectInput. Перечисление событий, попадающих в "круг интересов окна", реализуется тривиально -- битово-масочным способом, при котором в битовом массиве достаточного размера каждый бит является аналогом тумблера "Вкл/Выкл" для соответствующего события. Количество событий X Window (30) обеспечивает эффективную упаковку всего перечисления в одно машинное слово современных 32-битовых машин и оставляет возможности для расширения функциональности системы событий в будущем. Но вернемся к общей картине: "механизм интересов окна" -- это то, что, с одной стороны, позволяет Xlib по-умному распоряжаться ресурсами, избегая ненужного копирования всех событий от одного X-сервера в очередях всех клиентских приложений, с другой -- освобождает программиста от необходимости мучительного отбора только интересующих его событий. Естественно, что вся реализация самих очередей событий и механизма отбора нужных событий в очереди клиентских программ никаких действий от программиста не требует -- после конфигурирования "механизма интересов окна" он должен только все время "просматривать" очередь событий своей задачи и активировать необходимые действия при нахождении соответствующих событий. Термин "все время" в данном случае означает все время исполнения клиентской программы, а для просмотра очереди сообщений в Xlib предусмотрен богатый набор функций, таких, как XNextEvent, XMaskEvent, XCheckMaskEvent, XWindowEvent, XCheckWindowEvent, XIfEvent, XCheckIfEvent и т. д. Сразу можно обратить внимание на "неожиданное" изобилие операций с очередью сообщений по сравнению с предыдущим минимализмом -- мы столкнулись с ключевыми функциями X Window. Но и они совсем не сложны. Так, например, XNextEvent просто читает из очереди событий клиентского приложения информацию о любом событии, а если очередь пуста -- ожидает появления такой информации. Теперь мы можем уточнить нашу концептуальную модель программы для X Window, добавив ей способность реагировать на события. Установка соединения с X-сервером:
Создание оконной иерархии будущего приложения:
Необязательная установка атрибутов некоторых окон:
Конфигурирование "механизма интересов окна":
Указание X-серверу отобразить построенную оконную иерархию:
прочитать событие из очереди сообщений:
В реальных программах "Выполнять всегда" традиционно реализуется с помощью бесконечного цикла, реализация механизмов выполнения ассоциированных с событиями действий полностью возложена на программиста (как он того хочет, так и будет), а определение типа прочитанного сообщения -- действие не более сложное, чем чтение содержимого переменной. И это все? Конечно же, нет. За пределами статьи осталась тьма нюансов, возможностей, "подводных камней" и расширений Xlib. Впрочем, автор и не ставил перед собой заведомо невыполнимой задачи -- "обучить X Window за 10 минут". Зато все оказалось совсем не таким страшным, и заинтересовавшиеся читатели могут продолжить самостоятельное изучение X Window с посещения персонального сайта признанного специалиста Кентона Ли, где собрана каталогизированная подборка ссылок на множество посвященных X Window-тематике ресурсов.
|
|
2000-2008 г. Все авторские права соблюдены. |
|