Let pointer events pass through

Simon Ser contact at emersion.fr
Mon Nov 18 12:49:19 UTC 2019


On Monday, November 18, 2019 1:37 PM, Guillermo Rodriguez <guillerodriguez.dev at gmail.com> wrote:

> Hello,
>
> I am writing a Wayland client that acts as an OSD "overlay" on top of
> another application. This OSD overlay should not handle any pointer
> events -- these should "pass through" and be handled by the
> application below.
>
> From the docs, wwl_surface::set_input_region looked promising:
>
> > Input events happening outside of this region will try the next surface in the server surface stack. The compositor ignores the parts of the input region that fall outside of the surface. [...] The initial value for an input region is infinite. That means the whole surface will accept input. Setting the pending input region has copy semantics, and the wl_region object can be destroyed immediately. A NULL wl_region causes the input region to be set to infinite.
>
> I am trying this:
>
> struct wl_region* region =
> wl_compositor_create_region(_glfw.wl.compositor);
> wl_surface_set_input_region(window->wl.surface, region);
>
>         wl_region_destroy(region);
>
>
> However it doesn't seem to work -- pointer events do not seem to "pass through".
>
> Same problem is also reported here: https://github.com/glfw/glfw/pull/1568
>
> Is this approach correct? Any hints on how to debug this?

This should work. Other clients do this, for instance swaybg [1].

This is probably a GNOME bug. I'd suggest trying on other compositors
(KDE, Weston, Sway, …) and report a GNOME bug if it only happens on
GNOME.

[1]: https://github.com/swaywm/swaybg/blob/master/main.c#L271



More information about the wayland-devel mailing list