Программирование в X Window средствами Free Pascal
Шрифт:
Информация о дисплее, на котором показано окно, содержится в структуре Visual, на которую показывает поле visual. Эти данные, как правило, не обрабатываются обычными программами-клиентами (заметим, что для получения информации о дисплее, в системе предусмотрена процедура XGetVisualInfo).
Класс окна сообщает поле class. Возможные значения: InputOutput и InputOnly.
Число цветовых плоскостей дисплея (число бит-на-пиксел) помещается в поле depth.
На информацию об
Идентификатор главного (корневого) окна экрана, на котором помещается окно, находится в поле root.
Если окно имеет палитру, и она в настоящее время активна, то поле map_installed равно True, в противном случае - False.
Видно в настоящее время окно на экране или нет, сообщает атрибут map_state.
Маска всех событий, выбранных всеми программами для данного окна, содержится в атрибуте all_event_mask. Дело в том, что окно обрабатывается не только порождающим его клиентом, но, возможно, и другими приложениями, например, менеджером окон.
Мы рассказали о том, как получить атрибуты окна, и что они означают. Теперь рассмотрим, как их изменить. Для этого можно использовать несколько процедур X Window, основной из которых является XChangeWindowAttributes, имеющая следующий прототип:
Требуемые установки атрибутов передаются через аргумент prWinAttr. Он указывает на переменную типа TXSetWindowAttributes. Ее поля те же, что и соответствующие поля TXWindowAttributes. Разница заключается лишь в разных именах некоторых из них. Так, поле your_event_mask в TXWindowAttributes соответствует полю event_mask в TXSetWindowAttributes.
Структура TXSetWindowAttributes содержит дополнительное поле cursor. Оно определяет вид курсора мыши, когда последний находится в окне. Если поле равно None (значение по умолчанию), то используется курсор родительского окна, в противном случае значением параметра должен быть идентификатор того или иного курсора.
Параметр nValueMask при вызове указанной процедуры представляет комбинацию флагов, говорящих о том, какие из полей переменной prWinAttr принимать во внимание.
В следующем примере приведен фрагмент кода, в котором изменяются параметры border_pixmap и win_gravity некоторого окна:
…
…
…
…
Отдельные
атрибуты окна можно изменить более просто с помощью специальных процедур. Так, например, функция XSetWindowBackground меняет фон окна, XSetWindowBorder - его край.1.1.9 Операции над окнами
Манипулировать окнами можно не только с помощью атрибутов: Xlib предоставляет набор функций для изменения их размеров, перемещения на экране и в стеке окон, сворачивания и т.п.
Первая пара операций, которые можно применить к окну - отображение или скрытие. Отображение окна заставляют окно появиться на экране, скрытие приводит к удалению с экрана (хотя логическое окно в памяти все еще существует). Например, если в вашей программе есть диалоговое окно, вместо создания его каждый раз по запросу пользователя, мы можем создать окно один раз в скрытом режиме и, когда пользователь запросит открыть диалог, просто отобразить окно на экране. Когда пользователь нажимает "OK" или "Cancel", окно скрывается. Это значительно быстрее создания и уничтожения окна, однако стоит ресурсов, как на стороне клиента, так и на стороне X сервера.
Отображение окна может быть выполнено с помощью XMapWindow, скрытие - с помощью XUnmapWindow. Функция отображения заставит событие Expose послаться программе, если только окно полностью не закрыто другими окнами.
Другое действие, которое можно выполнить над окнами - переместить их в другую позицию. Это может быть выполнено функцией XMoveWindow, которая принимает новые координаты окна. Имейте в виду, что после перемещения окно может быть частично скрытым другими окнами (или наоборот, открыто ими), и таким образом, может быть сгенерировано сообщение Expose.
Изменить размер окна можно с помощью функции XResizeWindow. Мы можем также объединить перемещение и изменение размеров, используя одну функцию XMoveResizeWindow.
Все приведенные выше функции изменяли свойства одного окна. Существует ряд свойств, связанных с данным окном и другими окнами. Одно из них - порядок засылки в стек: порядок, в котором окна располагаются друг над другом. Говорят, что окно переднего плана находится на верхе стека, а окно заднего плана - на дне стека. Перемещение окна на вершину стека осуществляет функция XRaiseWindow, перемещение окна на дно стека - функция XLowerWindow.
С помощью функции XIconifyWindow окно может быть свернуто, а с помощью XMapWindow - восстановлено. Для того, чтобы понять, почему для XIconifyWindow нет обратной функции, необходимо заметить, что, когда окно сворачивается, на самом деле оно скрывается, а вместо него отображается окно иконки. Таким образом, чтобы восстановить исходное окно, нужно просто отобразить его снова. Иконка является на самом деле другим окном, которое просто тесно связано сильно с нашим нормальным окном - это не другое состояние нашего окна.