Чтение онлайн

на главную - закладки

Жанры

Программирование в X Window средствами Free Pascal

Семериков С. А.

Шрифт:

Для передачи информации о желаемой геометрии окна используется структура TXSizeHints.

X Window позволяет сообщить менеджеру также следующее:

• начальное состояние окна: нормальное или минимизированное;

• воспринимает ли окно ввод с клавиатуры;

• класс программы и ее имя для чтения ресурсов из базы данных ресурсов.

После того, как "рекомендации" менеджеру окон переданы, программа выбирает события, на которые она будет реагировать. Для этого вызывается функция XSelectInput. Ее последний аргумент есть комбинация битовых масок (флагов). В нашем случае это (ExposureMask or KeyPressMask). ExposureMask сообщает X Window, что программа обрабатывает событие Expose. Оно посылается сервером каждый раз, когда окно должно быть перерисовано. KeyPressMask выбирает событие KeyPress - нажатие клавиши клавиатуры.

Теперь окно программы создано, но не показано на экране. Чтобы это произошло, надо вызвать процедуру библиотеки XMapWindow. Заметим, что из-за буферизации событий библиотекой Xlib, окно не будет реально нарисовано, пока программа не обратится к процедуре получения сообщений от сервера XNextEvent.

Программы для X построены по принципу управляемости событиями. Поэтому, после того, как окно создано, заданы необходимые параметры для менеджера окон, основная ее работа - это получать сообщения от сервера и откликаться на них. Выполняется это в бесконечном цикле. Очередное событие "вынимается" процедурой XNextEvent. Само оно есть переменная типа XEvent, который представляет собой объединение структур. Каждое событие (Expose, KeyPress и т.д.) имеет свои данные (и, следовательно, свое поле в объединении XEvent).

При получении сообщения Expose программа перерисовывает окно. Это событие является одним из наиболее важных событий, которые приложение может получить. Оно будет послано нашему окну в одном из различных случаев:

• другое окно перекрыло часть нашего;

• наше окно было выведено поверх всех других окон;

• наше окно впервые прорисовывается на экране;

• наше окно было восстановлено после сворачивания.

Когда мы получаем событие Expose, мы должны взять данные события из члена xexpose объединения XEvent. Он содержит различные интересные поля:

• count - количество других событий Expose, ожидающие в очереди событий сервера. Это может быть полезным, если мы получаем несколько таких сообщений подряд - рекомендуется избегать перерисовывать окно, пока мы не получим последнее из их (то есть пока count не равно 0).

• window - идентификатор окна, которому было послано сообщение Expose (в случае, если приложение зарегистрировало это событие в различных окнах).

• x, y - координаты верхнего левого угла области окна, которая должна быть перерисована.

• width, height - ширина и высота области окна, которая должна быть перерисована.

Действия по обработке Expose начинаются с создания графического контекста - структуры, которая содержит данные, необходимые для вывода информации, в нашем случае - текста:

prGC:= XCreateGC(prDisplay, prWnd, 0, NIL);

После этого рисуется строка "Hello, world!". Более графический контекст не нужен - он уничтожается:

XFreeGC(prDisplay, prGC);

Окно может получить несколько событий Expose одновременно. Чтобы не перерисовывать себя многократно, программа дожидается прихода последнего из них и только потом осуществляет вывод.

Приход события KeyPress означает, что программу надо завершить: прекратить связь с сервером, для чего вызывать XCloseDisplay(prDisplay), и вызвать функцию halt.

XCloseDisplay закрывает соединение с Х сервером, закрывает все окна и удаляет идентификаторы ресурсов, созданных клиентом на дисплее. Для удаления только окна без разрыва связи с Х сервером необходимо использовать функции XDestroyWindow и XDestroySubWindows.

1.1.7 События

Когда пользователь нажимает на кнопку мыши или клавишу клавиатуры, или когда окно программы нуждается в перерисовке, или когда происходят другие изменения в системе, сервер подготавливает соответствующий пакет данных и отправляет его той или иной программе (или программам). Этот пакет данных называется событием.

Типичная GUI программа имеет следующую структуру:

1. Выполняются инициализационные процедуры.

2. Устанавливается соединение с Х сервером.

3. Выполняются инициализационные процедуры, связанные с Х.

4. Пока не завершились:

1. Получаем следующее событие от Х сервера.

2. Обрабатываем событие, возможно посылая различные запросы на рисование к Х серверу.

3. Если событие было завершающим, заканчиваем цикл.

5. Закрываем соединение с Х сервером.

6. Выполняем завершающие действия.

Возможных событий достаточно много; их список можно найти в файле X.pp. Каждое из них имеет свой тип и соответствующую структуру данных. Все они вместе, как было сказано выше, описываются объединением XEvent.

Как мы видели из примера в предыдущем пункте, программа для каждого из своих окон может выбрать события, которые будут ему передаваться. Делается это с помощью функции XSelectInput. При вызове этой процедуры требуемые события идентифицируются соответствующими флагами. Так событию, ButtonPress (нажатие кнопки мыши) соответствует флаг ButtonPressMask. Когда кнопка отпускается, сервер порождает событие ButtonRelease, которому соответствует флаг - ButtonReleaseMask.

Маска выбираемых событий может составляться с помощью побитового "ИЛИ" из таких значений:

• 0 - не ожидать никаких событий

• KeyPressMask - ожидать событие нажатия клавиши

• KeyReleaseMask - ожидать событие отпускания клавиши

• ButtonPressMask - ожидать событие нажатия кнопки мыши

• ButtonReleaseMask - ожидать событие отпускания кнопки мыши

• EnterWindowMask - ожидать событие входа в окно

• LeaveWindowMask - ожидать событие выхода из окна

• PointerMotionMask - ожидать событие движения мышиного курсора

• PointerMotionHintMask - ожидать событие движения мышиного курсора с дополнительными указаниями

Поделиться:
Популярные книги

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Московское золото или нежная попа комсомолки. Часть 1

Хренов Алексей
1. Летчик Леха
Фантастика:
боевая фантастика
попаданцы
6.33
рейтинг книги
Московское золото или нежная попа комсомолки. Часть 1

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Горячий старт. Часть 2

Глазачев Георгий
2. Бесконечная Империя Вечности
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Горячий старт. Часть 2

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Иной. Том 5. Адская работа

Amazerak
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Иной. Том 5. Адская работа

Интриганка

Шелдон Сидни
Приключения:
исторические приключения
9.24
рейтинг книги
Интриганка

Иной. Том 1. Школа на краю пустыни

Amazerak
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Иной. Том 1. Школа на краю пустыни

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Двойник короля 19

Скабер Артемий
19. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 19

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник