У меня есть несколько вложенных X Windows - скажем, прокручиваемое окно в прокручиваемом окне (см. Пример ниже). В таком случае главное окно содержит (как минимум) основные полосы прокрутки и (основную) область рисования, которую они контролируют. Эта область рисования, в свою очередь, содержит (как минимум) прокручиваемый пакет окон - (вспомогательное) главное окно, содержащее полосу прокрутки и вспомогательную область рисования.
Во время прокрутки внутренней области рисования в реальном времени процедура перерисовки дает сбой, потому что я использую XCopyArea для ускорения процесса и перемещения допустимого содержимого и вызова фактической процедуры перерисовки только для вновь появившегося содержимого. Это отлично работает, когда внутренний пакет рисования находится сам по себе, но когда он вложен в другой, возникает проблема - когда внутренняя прокрутка-батк частично видна (т.е. прокручивается основная область рисования), перерисовка вновь появившегося содержимого обрезается из основного область рисования и никогда фактически не перерисовывалась, но считается таковой. Когда при следующем свитке XCopyArea получает эту якобы перерисованную область, она фактически пуста. Наконец, эта пустая область появляется на частично видимом внутреннем пакете прокрутки, и она пуста. На первом общем сообщении о перерисовке они исправляются.
Если я могу получить обтравочную маску для того, что действительно видно из (моей) внутренней области рисования, я могу настроить вызов XCopyArea () и перерисовать вызов и преодолеть проблему без плана «B», который перерисовывает все содержимое при каждом движении полосы прокрутки. .
Пример: разработка подключаемого модуля для Mozilla Firefox и необходимость определения области, описывающей видимую область «моего» окна, то есть ту, которая передается из системы Mozilla как область просмотра подключаемого модуля.
Это X Window System или просто X, а не «X Windows».





Если вы действительно получаете X Window, а не виджет из какого-то определенного набора инструментов (например, GTK +, может быть?), Тогда вы можете использовать вызов функции XGetWindowAttributes.
Это заполняет предоставленную структуру XWindowAttributes, которая включает целые числа для позиции x и y окна, а также его ширину и высоту и другие полезные факты.
Но на самом деле я думаю, что вы, вероятно, используете API плагина Mozilla, унаследованный от Netscape, он же NSAPI, и в этом случае вы получите вызов вашей функции NPP_SetWindow () хотя бы один раз (и снова, если необходимо, потому что что-то изменилось) с структура, содержащая искомую информацию. Попробуйте посмотреть http://www.mozilla.org/projects/plugins/ для получения дополнительной информации об API, которые вам следует использовать.
Да, это окно, переданное из вызова NSAPI, но используется в отдельном (дочернем) процессе, в котором плагин действительно работает. XGetWindowAttributes дает информацию, но не о том, закрыто ли окно или, что наиболее важно, прокручено и частично видно, что мне и нужно.