LINUX.ORG.RU

Можно ли средствами XCB получить неразорванную картинку root окна?

 , , ,


0

1

имеется необходимость получать неразорванную картинку root окна через XCB для обработки ее в Vulkan API — а то получается, если я даже включаю vsync в Vulkan и начинаю рисовать картинку root на overlay — выводится разорванная картинка — тоесть некоторые ее части остаются от прошлых кадров (тиринг).

п.с. продолжаю делать все тот же композитный менеджер с Vulkan рендерером. — По самому вулкану вроде в контексте данной темы неплохо разобрался — однако все та же проблема — взять нужные графические данные для отрисовки.

и еще вопрос — если overlay постоянно держать видимым, то получается его содержимое захватывается и root окном, из-за чего получается статическая картинка. Но если overlay анмапить и мапить заново — получается небольшое мерцание. Как нормальным путем получать с root окна данные и отрисовывать их на overlay?
Исследовал уже и chamferwm, и picom — но пока ничего по данному моменту проследить не удалось — слишком много фонового кода там — в первом случае вообще полный WM, во втором код на си не особо читабельный как по мне — сложно проследить проделываемую работу по теме.

★★

начинаю рисовать картинку root на overlay

root window не редиректится. X Composite Extension:

8. Hierarchy Redirection

    RedirectWindow

		window:				Window
		update:				UPDATETYPE

		errors: Window, Access, Match

	The root window may not be redirected. Doing so results in a Match
	error.

Во многих, если вообще не во всех композитных оконных менеджерах используется концепция виртуального корневого окна (virtual root window) или виртуального фона (virtual background). Виртуальное корневое окно - это уже обычное окно, которое будет родителем всех остальных окон (см. reparenting). Так это окно обычное, то оно будет редиректиться в offscreen и там его можно забирать. Виртуальный фон (virtual background window) отличается тем, что не будет родителем окон верхнего уровня, родителем все так же будет root window, но просто на экране этого root window видно не будет, так как фон и все остальное рисуется на окне виртуального фона, а root window будет просто загорожено и его не трогают. По-моему, виртуальный фон используется в KDE.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

root window не редиректится. X Composite Extension:

да — в этом то и проблема...
я это все уже изучил вдоль и поперек все эти спеки Xorg

концепция виртуального корневого окна (virtual root window) или виртуального фона (virtual background).

интересная идея — но как мне рисовать на такое окно всякие панели от WM?

safocl ★★
() автор топика
Ответ на: комментарий от Zubok

-- а что на счет map/unmap overlay? — когда его лучше делать — или вообще будет и так работать?

safocl ★★
() автор топика
Ответ на: комментарий от safocl

да — в этом то и проблема...

я это все уже изучил вдоль и поперек все эти спеки Xorg

А объясни, зачем тебе грабить изображение root window вообще? Что там на этом окне у тебя нарисовано и зачем? Ты делаешь из своего WM XGetImage (xcb_get_image)?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

ну мне же надо где то брать изображения не только содержимого окон, но и их рамок, и панелей...
что-то я не нашел другого способа получения этого.

safocl ★★
() автор топика
Ответ на: комментарий от Zubok

нет, у меня только композитный менеджер, не WM — как picom, только рендерер на Vulkan хочу

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

ну мне же надо где то брать изображения не только содержимого окон, но и их рамок, и панелей...

Ты определенно делаешь что-то не так.

п.с. продолжаю делать все тот же композитный менеджер с Vulkan рендерером.

Если ты делаешь композитный оконный менеджер, то рамки, панели он и должен рисовать. Содержимое окна - X-клиент, а рамки рисует WM. Панели рисует либо отдельное приложение либо тот же WM. Никаких фотографирований экрана не надо.

Если ты пишешь не WM, а просто композитор типа xcompmgr, picom, compton, то и в этом случае ничего «фотографировать» не надо. Окна остаются под управлением оконного менеджера, который и рамки и панели рисует.

Что-то ты не то изначально делаешь. Фотографировать окно root приходится разве что для скриншотов или реализации псевдопрозрачности.

Zubok ★★★★★
()
Ответ на: комментарий от safocl

_NET_SUPPORTING_WM_CHECK не совсем понял для чего, но насколько понял это какое то как раз сервисное окно, которое создает WM? но у меня с ним просто вылетает прога, без ошибки... а я вроде везде сделал проверки и исключения приделал для xcb.

safocl ★★
() автор топика
Ответ на: комментарий от safocl

у меня вот такие значения атомов:

`--> xprop -root
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x2600002
ESETROOT_PMAP_ID(PIXMAP): pixmap id # 0x1e00004
_XROOTPMAP_ID(PIXMAP): pixmap id # 0x1e00004
AT_SPI_BUS(STRING) = "unix:path=/tmp/dbus-CA1DC20x0P,guid=8567ca37d4edca2a2b0749f4613df4b5"
GDK_VISUALS(INTEGER) = 43, 130
I3_CONFIG_PATH(UTF8_STRING) = "/home/safff/.config/i3/config"
I3_PID(CARDINAL) = 912
I3_SOCKET_PATH(UTF8_STRING) = "/run/user/1001/i3/ipc-socket.912"
_NET_CLIENT_LIST(WINDOW): window id # 0xc00006, 0x2200006, 0x200002c, 0x2600002, 0x2800002
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0xc00006, 0x2200006, 0x200002c, 0x2600002, 0x2800002
_NET_DESKTOP_NAMES(UTF8_STRING) = "1 ", "2 ", "8 ", "9 "
_NET_DESKTOP_VIEWPORT(CARDINAL) = 0, 0, 0, 0, 0, 0, 0, 0
_NET_NUMBER_OF_DESKTOPS(CARDINAL) = 4
_NET_CURRENT_DESKTOP(CARDINAL) = 0
_NET_SUPPORTED(ATOM) = _NET_SUPPORTED, _NET_SUPPORTING_WM_CHECK, _NET_WM_NAME, _NET_WM_VISIBLE_NAME, _NET_WM_MOVERESIZE, _NET_WM_STATE_STICKY, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_DEMANDS_ATTENTION, _NET_WM_STATE_MODAL, _NET_WM_STATE_HIDDEN, _NET_WM_STATE_FOCUSED, _NET_WM_STATE, _NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE_NORMAL, _NET_WM_WINDOW_TYPE_DOCK, _NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_TOOLBAR, _NET_WM_WINDOW_TYPE_SPLASH, _NET_WM_WINDOW_TYPE_MENU, _NET_WM_WINDOW_TYPE_DROPDOWN_MENU, _NET_WM_WINDOW_TYPE_POPUP_MENU, _NET_WM_WINDOW_TYPE_TOOLTIP, _NET_WM_WINDOW_TYPE_NOTIFICATION, _NET_WM_DESKTOP, _NET_WM_STRUT_PARTIAL, _NET_CLIENT_LIST, _NET_CLIENT_LIST_STACKING, _NET_CURRENT_DESKTOP, _NET_NUMBER_OF_DESKTOPS, _NET_DESKTOP_NAMES, _NET_DESKTOP_VIEWPORT, _NET_ACTIVE_WINDOW, _NET_CLOSE_WINDOW, _NET_MOVERESIZE_WINDOW
_NET_WM_NAME(UTF8_STRING) = "i3"
_NET_SUPPORTING_WM_CHECK(WINDOW): window id # 0x200063
RESOURCE_MANAGER(STRING) = "*.background:\t#0e1011\n*.color0:\t#cccc1f\n*.color1:\t#cc342b\n*.color10:\t#198844\n*.color11:\t#fba922\n*.color12:\t#8e9dff\n*.color13:\t#3e3d3c\n*.color14:\t#38746d\n*.color15:\t#ececec\n*.color2:\t#198844\n*.color3:\t#fba922\n*.color4:\t#8e9dff\n*.color5:\t#a36ac7\n*.color6:\t#3971ed\n*.color7:\t#c5c8c6\n*.color8:\t#969896\n*.color9:\t#cccc1f\n*.cursorColor:\t#c5c8c6\n*.foreground:\t#c5c8c6\n*antialias:\ttrue\n*autohint:\ttrue\nURxvt*depth:\t32\nURxvt*scrollBar:\tfalse\nURxvt*scrollBar_right:\tfalse\nURxvt*transparent:\tfalse\nURxvt.background:\t[95]#0e1011\nURxvt.boldFont:\txft:PT Mono:bold:pixelsize=15\nURxvt.font:\txft:PT Mono:pixelsize=15\nURxvt.letterSpace:\t0\n"
_XKB_RULES_NAMES(STRING) = "evdev", "pc104", "us,ru", "euro,winkeys", "grp:ctrl_shift_toggle"
XFree86_has_VT(INTEGER) = 1
XFree86_VT(INTEGER) = 1
Xorg_Seat(STRING) = "seat0"


и
`--> xprop -id 0x200063
_NET_WM_NAME(UTF8_STRING) = "i3"
_NET_SUPPORTING_WM_CHECK(WINDOW): window id # 0x200063

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)

если брать графические данные окон из оффскрин хранилища получается вот так

однако, почему-то на видео все равно тиринг присутствует, хотя в рендерере включен vsync

safocl ★★
() автор топика
Ответ на: комментарий от safocl

хмм... а как от WM тогда получить рамки и панели?

А зачем тебе их получать? Ты так и не сказал. Тебе тень нарисовать? Размеры рамки можно выяснить по свойству _NET_FRAME_EXTENTS, например. Это свойство оконный менеджер выставляет, если он уважает EWMH. Так зачем тебе сами декорации? Суть-то задачи поясни.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

ну для отрисовки... я же рисую все на overlay — и получается как на скрине — графические данные окон есть, а все остальное пространство незаполненное

safocl ★★
() автор топика
Ответ на: комментарий от safocl

я конечно может и не правильно понимаю последовательность действий и саму суть отрисовки в композите с vsync — но как мне предполагается — я беру фоновую картинку (ее я понял как получать — _XROOTPMAP_ID), рисую ее, потом рисую все панели, потом рисую все видимые окна с рамками...

если не я буду рисовать эти рамки на оверлее, то как я буду получать эти данные с отрисованным скрином?
все же данные будут под оверлеем, ничего не будет меняться, будет статичная картинка.
а я могу только данные содержимого окон получать.

safocl ★★
() автор топика
Ответ на: комментарий от safocl

мне уже кажется, что проще изучить wayland spec и сделать свой композитор там...
допустим взять за основу sway и сделать возможность через Vulkan все рендерить.

safocl ★★
() автор топика
Ответ на: комментарий от safocl

изучить wayland spec и сделать свой композитор
ну да и запилить еще одну реализацию стандарта. стагнация xmpp людей ничему не научила.

anonymous
()
Ответ на: комментарий от anonymous

не понял юмора...
но как бы sway не может в мою видяху (nvidia gtx1650) — если бы умела — сидел бы и не заморачивался вообще никак. Ну если только с какими то приложениями через Xwayland были бы трабблы

safocl ★★
() автор топика
Ответ на: комментарий от safocl

После того, как ты рассказал, зачем тебе, т. е. про твою задачу, могу только посоветовать запастись огромным терпением и смотреть исходники compton, picom. Наверное, лучше последнее. Глобально я бы думал в сторону добавления рендеринга через Vulkan прямо в picom. Там уже есть xrender и gl в каталоге backend. И в picom куча подготовительной работы уже сделана.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

ну вот да — я потихому пытаюсь вникать в их код.

safocl ★★
() автор топика
Ответ на: комментарий от Zubok

тоесть я просто создаю window на весь screen, делаю на него reparent всех существующих (или всех видимых) windows?

safocl ★★
() автор топика
Ответ на: комментарий от safocl

Тут невозможно ничего объяснить. Очень много всего. Я не в состоянии. Reparent делать не нужно. Ты же потом уточнил, что не композитный оконный менеджер пишешь. Оконный менеджер у тебя какой-то: например, xfwm4 с отключенным композитингом или еще какой некомпозитный WM. У меня, например, iceWM, который отлично работает и с xcompmgr, и c picom (compton не пробовал, но думаю, что и с ним проблем не будет). picom, xcompmgr, compton - не оконные менеджеры. Они окнами не управляют.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

а это ты сказал, когда думал, что я буду WM свой делать, ясно...
но я как раз композитный менеджер делаю, такой как picom — может ты тут имел ввиду что не оконный менеджер...

я тут нашел старую статью — надо почитать.

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

Ну вот да. Сначала подумал про композитный WM, а потом уже разъяснил, что просто композитный менеджер. А статью, да, прочитай. Я не смотрел, но вступление, кажется, об этом.

This project is about writing a free software compositing manager (Wikipedia 2009-02-25) on top of the X WINDOW PROTOCOL (Wikipedia 2009-02-24). Basically, a compositing manager is a piece of software running along with the window manager and where each graphical program outputs into a separate and independent off-screen buffer that can be manipulated before being shown in order to enhance user experience. Unlike a compositing window manager, a compositing manager does not manage windows but simply implements visual effects such as windows translucency, drop shadows, fading. . .

Судя по оглавлению, статья издалека начинает освещать. Но это как раз то, что нужно.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.