LINUX.ORG.RU

Какие подходы можно использовать для разработки приложения отрисовки оверлея на экране?

 , , , ,


0

4

Народ, посоветуйте, пожалуйста, каким самым простым способом можно было написать приложение примерно следующего свойства:

  • обозначаем некий фрагмент экрана
  • приложение захватывает изображением с этой части экрана
  • обрабатывает его некоторым алгоритмом, который выдает некие инструкции о том, что и как необходимо нарисовать поверх этого кадра (самый простой пример в качестве результата png с прозрачностью и дополнительной разметкой)
  • приложение рисует эту дополнительную часть на экране

и, главное,

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

оверлей естественным образом может и будет «запаздывать», если содержимое области меняется слишком быстро.

Функциональный пример подобного приложения: прогнать кадры через нейронку-детектор и отрисовать баундинг-боксы поверх кадра. Но, т.к. захват будет происходить с экрана, то захваченным кадром может является картинка в браузере, или фотография, открытая в просмотрщике изибражений. То есть всё, что попадает в целевую область экрана «гонится» на нейронку и затем рисуем боксы. Естественно, что боксы от предыдущей отрисовки не должны попадать в следующий захваченный кадр (отсюда термин оверлей).

Правильно понимаю, что в такой формулировке, это задача, требующая работы на уровне X или wayland-а?

Ответ на: комментарий от snizovtsev

Если нужно не отдельное приложение перехватывать, а целиком десктоп, то наверное можно overlay прикрутить к вложенному wayland композитору, запущенному как-то так:

env GNOME_SHELL_SLOWDOWN_FACTOR=2 \
    MUTTER_DEBUG_DUMMY_MODE_SPECS=1024x768 \
    dbus-run-session -- gnome-shell --nested \
    --wayland
snizovtsev ★★★★★
()
Последнее исправление: snizovtsev (всего исправлений: 1)

Для захвата, проще всего использовать Pipewire. Работать будет и под иксами, и под Wayland. Под иксами можно ещё нативный иксовый API дёргать, но под Wayland других вариантов считай нет (у отдельных композиторов есть свои протоколы, но это залупа и гной).

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

Под Wayland, лучше всего наверное будет взять протокол layer shell (https://wayland.app/protocols/wlr-layer-shell-unstable-v1), его умеют почти все кроме гнома и он позволяет рисовать твоё окно с привязкой к углам экрана и без захвата фокуса, потому что сделан для панелек. Насчёт гнома, я не знаю что тебе посоветовать, кроме как слать гномеров трахать бетон в лесу.

hateyoufeel ★★★★★
()