Search code examples
c++x11xlibglasspane

X11/Xlib: Create "GlassPane"-Window


I've tried to create a fully transparent window using C++ & X11. It should not consume any events and simply forwards them to the windows below. Some kind of GlassPane as it's known for Java-Windows, but full screen. Then I'd like to draw on this window.

Is this somehow possible with X11?

My first attempt was ignoring all events, simply copy the image from the root window using XGetImage()... But first of all, this is quite slow as the window would need to be full screen. XShmGetImage unfortunately isn't an option here.

For sure, this window wouldn't need any decoration, but that isn't a big problem.

How to do this using X11 / Xlib only? If it's not possible, what else do I need?

Any help is appreciated!

PS: Xinerama is activated as well as Compiz, if that brings problems I could live deactivating them.


Solution

  • You can create an output-only window by setting its input shape to empty.

    The API is XFixesSetWindowShapeRegion() and you can set ShapeInput separately from ShapeBounding. XFixesCreateRegion() is used to get a region to pass in.

    Then you need an RGBA (with-alpha-channel) visual so you can draw transparent pixels into most of the window.

    A compositing window manager will be required in order for the transparency to work.