[ Содержание ] [ Далее ]

Работа программ в системе X-Window

     Принцип работы программ примерно такой-же, как и при работе с текстовым терминалом, за исключением некоторых особенностей, связанных при работе с графикой. А если еще точнее сказать, то программе, помимо работы с текстовым терминалом, предоставляется возможность параллельно работать с графическим терминалом. У программы остаются все стандартные потоки (ввод, вывод и сообщения об ошибках), к ним просто добавляются дополнительные потоки для работы с графическими терминалами, работу с которыми производит библиотека Xlib.

     Особенности заключаются в некоторых затруднениях, связанных с хранением отображаемой информации. Текстовый терминал может помнить все символы, выводимые на экран дисплея - текстовая информация не занимает слишком много места (порядка 4096 байт на экран). С графикой немного сложнее - если помнить содержимое каждого окна, то необходимы большие обьемы памяти. Допустим, вы работаете в режиме 24-битного цвета с разрешением 1280*1024, то только на корневое окно потребуется 4 мегабайта памяти, а если Вы открыли десяток-другой окон... это конечно реально, но отдавать такие обьемы памяти на хранение содержимого окна, мягко говоря, накладно. Поэтому разработчики графических систем обычно идут другим путем.

     Программа в любой момент времени может вести графические построения в пределах своих окон. Сервер лишь будет ограничивать вывод видимыми областями окон. Т.е. если вывод идет в окно, которое частично закрыто окном другого приложения - сервер замаскирует вывод таким образом, что информация будет выводиться только в видимой области окна приложения. Если программа хочет нарисовать линию на участке своего окна, который закрыт другим окном, то вообще никакого вывода не будет. Программа же будет считать, что она нарисовала все ей необходимое. Однако нигде не запоминается, что программа рисовала на экране. Продолжим нашу ситуацию. Допустим программа, окно которого частично закрывало окно нашей программы, завершила свою работу и закрыло своё окно. Теперь все наше окно стало видно на экране дисплея, но... как восстановить ту часть окна, которую не было видно? Ведь нигде информации об этом не хранится. В этом случае X-сервер анализирует ситуацию и посылает программе запрос на перерисовку "испорченного" участка своего окна. Далее, задача восстановления информации возложена собственно на программу, которой принадлежит это окно. Как она будет помнить то, что было нарисовано в этом участке окна X-сервер не беспокоит. Самый распространенный способ - это хранение информации в виде обьектов данных и перерисовка их по мере необходимости. Можно просто хранить отдельный графический образ, делать все построения в нем, а вывод на экран делать на него. Можно это все совместить. Все зависит от характера данных, которые выводятся на экран. Наиболее часто выбирают первый вариант.

     Возможность удаленной работы с программой с одной стороны является большим плюсом, с другой стороны накладывает определенные ограничения на скорость работы графического интерфейса даже для программ, работающих на локальном компьютере. Поэтому требования к оптимизации отрисовки графических элементов интерфейса несколько выше, чем в системах с возможностью прямого обращения к видеопамяти.

     Подчастую самым узким местом, ограничивающим скорость работы программы является канал связи между компьютером, на котором работает программа и компьютером, на котором запущен X-сервер, поэтому такие обьекты данных, как окна, контексты рисования, графические образы и образы графических курсоров хранятся непосредственно на X-сервере и поэтому программе порой достаточно лишь давать короткую команду на обработку данных, хранящихся на X-сервере, что значительно увеличивает реакцию программы на действия пользователя. Тем не менее некоторые приложения, например работа с фотореалистичной графикой или видео на удаленных машинах порой либо невозможна, либо весьма затруднена даже на высокоскоростных 100-мегабитных каналах. Тем не менее технологии не стоят на месте и вполне возможно, что в ближайшем будущем эта проблема исчезнет.

     Данные от сервера программа получает в виде событий (events). Нажимает-ли пользователь клавишу, двигает мышкой, изменяет размер окна - программа узнает об этом через события. Программа может указать X-серверу, какие события для нее представляют интерес. Таким образом, к примеру, можно сэкономить узкую пропускную способность канала между программой и сервером за счет устранения передачи ненужных событий.

     Помимо всего прочего, на сервере существует база данных настроек программ (applications defaults), в которой хранятся начальные параметры программ. Обычно в этой базе хранится информация о цветах, используемых шрифтах, размерах окон и т.д. К сожалению, отсутствие подробной документации по использованию этой базы ограничивает использование этого механизма разработчиками программного обеспечения.


[ Содержание ] [ Далее ]