screen_post_window()

Публикация (фиксация) изменений содержимого окна

Прототип:

#include <screen/screen.h>
int screen_post_window( screen_window_t win,
screen_buffer_t buf,
int count,
const int *dirty_rects,
int flags );

Аргументы:

win
Дескриптор окна.
buf
Дескриптор видео-буфера указанного окна, изменения в котором должны быть опубликованы (отображены). Большинство приложений использует два видео-буфера для рендеринга, что обычно именуется двойной буферизацией. Таким образом, наиболее простой способ осуществления корректного рендеринга - использование первого дескриптора из возвращаемого через свойство SCREEN_PROPERTY_RENDER_BUFFERS массива дескрипторов буферов. Composition Manager графической подсистемы Screen осуществляет автоматическую ротацию доступных видео-буферов окна, сохраняя на первой позиции свободный видео-буфер.
count
Количество прямоугольных областей, переданных в массиве dirty_rects.
dirty_rects
Массив элементов типа int, содержащих координаты x1, y1, x2, и y2 прямоугольных областей, описывающих изменения в видео-буфере с момента предыдущего вызова данной функции. Массив dirty_rects должен содержать ровно count * 4 элементов типа int.
flags
Маска режимов исполнения функции. Используемые значения должны быть включены в список поддерживаемых режимов.

Библиотека:

libscreen

Описание:

Тип функции: Триггеры с перерисовкой

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

В дополнение к областям, определенным свойством dirty_rects, Screen может принять решение о публикации всего содержимого видео-буфера. Screen может извлекать данные из видео-буфера независимо от вызовов функции screen_post_window() (например, когда содержимое или параметры перекрывающего окна обновляются или когда окно является автономным и весь видео-буфер буден непрерывно считываться графическими устройствами до тех пор, пока не будет опубликован другой видео-буфер для замены текущего). Ваше приложение должно гарантировать пригодность содержимого видео-буфера (что в большинстве случаев соответствует неизменности контента) для чтения со стороны оборудования и последующего отображения до тех пор, пока не будет опубликован другой видео-буфер. Иными словами, операция публикации буфера определяет конкретный видео-буфер окна, к которому будет адресоваться Composition Manager из состава графической подсистемы Screen.

screen_post_window() возвращает управление немедленно, если видео-буферы доступны и не установлен флаг SCREEN_WAIT_IDLE. Использование нескольких потоков или управление видео-буферами со стороны приложения при рендеринге с максимальной частотой обновления необязательны, поскольку вызов screen_post_window() не всегда блокируется, в отличие от эквивалентных вызовов в других графических подсистемах.

Если флаг SCREEN_WAIT_IDLE установлен, функция возвратит управление только после обновления изображения на экране. Обратите внимание на то, что содержимое окна не будет отображено графической подсистемой до тех пор, пока функция screen_post_window() не будет вызвана хотя бы один раз.

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

Если count равен 0, текущий буфер не будет опубликован и новое подмножество видео-буферов, готовых для рендеринга будет возвращено. Текущее состояние буфера кадров на экране не будет изменено.

Возвращаемое значение:

0
Если указанные области видео-буфера были опубликованы и новое подмножество видео-буферов, готовых для рендеринга было возвращено (эти буфера могут быть использованы для рендеринга при последующих операциях рендеринга).
-1
В случае ошибки, код ошибки записывается в errno.

Коды ошибок:

EINVAL
Переданы некорректные параметры.
EFAULT
Возникла ошибка при отправке пакетного сообщения.
ENOMEM
Память, ассоциированная с окном была освобождена. Это некорректное поведение клиентской программы, когда screen_post_window() вызвана после screen_destroy_window() с дескриптором удаленного окна.
Код ошибки ENOMEM добавлен в ЗОСРВ «Нейтрино» редакции 2021

Классификация:

Графическая подсистема ЗОСРВ «Нейтрино», Screen

Поддерживается, начиная с ЗОСРВ «Нейтрино» редакции 2020

Безопасность использования
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да




Предыдущий раздел: Окна