X11 / Xlib: создание окна «Стекло» - PullRequest
6 голосов
/ 01 декабря 2010

Я пытался создать полностью прозрачное окно, используя C ++ и X11. Он не должен потреблять какие-либо события и просто перенаправляет их в окна ниже. Какой-то GlassPane, так как он известен для Java-Windows, но на весь экран. Тогда я хотел бы нарисовать на этом окне.

Возможно ли это как-то с X11?

Моей первой попыткой было игнорирование всех событий, просто скопируйте изображение из корневого окна, используя XGetImage() ... Но, во-первых, это довольно медленно, поскольку окно должно быть полноэкранным. XShmGetImage к сожалению, здесь не вариант.

Конечно, этому окну не нужно будет украшать, но это не большая проблема.

Как это сделать, используя только X11 / Xlib? Если это невозможно, что еще мне нужно?

Любая помощь приветствуется!

PS: Xinerama активируется так же, как и Compiz, если это вызовет проблемы, я мог бы жить, отключив их.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2010

Вы можете создать окно только для вывода , установив пустую форму ввода.

API - XFixesSetWindowShapeRegion(), и вы можете установить ShapeInput отдельно от ShapeBounding.XFixesCreateRegion() используется для передачи региона.

Затем вам нужен RGBA (с альфа-каналом) visual , чтобы вы могли рисовать прозрачные пиксели в большей части окна.

A композитинг Для работы прозрачности потребуется оконный менеджер.

4 голосов
/ 01 декабря 2010

Для этого вам понадобится оверлейная визуальная поддержка на вашем X-сервере, иначе производительность будет абсолютно плачевной, поскольку вам придется постоянно отображать / отменять отображение своего окна и / или постоянно выполнять танец get / putimage.

Вы должны иметь основную / корневую плоскость без наложения и создать наложенный визуал поверх этого.Все, что ясно в плоскости наложения, пройдет через «главный экран».

Документация о том, как сделать это в «обычном Х», очень скудна, проще будет через OpenGL / GLX, http://www.opengl.org/sdk/docs/man/xhtml/glXChooseVisual.xml - просто попробуйте:

int query[] = { /* GLX_RGBA, */ GLX_LEVEL, 1, 0 };
overlayVisual = glXChooseVisual(mydisplay, DefaultScreen(mydisplay), query);
myWindow = XCreateWindow(..., overlayVisual, ...);

Тогда Вы сможете очистить окно, чтобы сделать видимым «основной корень», и нарисуйте его, чтобы закрыть его.В «старые времена» наложение часто требовалось для визуального отображения без RGB (с цветовой индексацией / палитрой), а для прозрачных частей использовалась цветовая маркировка.OpenGL RGBA должен поддерживать прозрачность / смешивание через альфа-канал, хотя ...

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

...