Sharing a single wl_display (client) by multiple toolkits
Scott Anderson
scott.anderson at collabora.com
Sat Mar 23 11:50:28 UTC 2019
On 22/03/19 8:37 am, Jaroslaw Kubik wrote:
> Hi,
>
> Does wayland-client support sharing a single connection object between
> unrelated pieces of code? Such feature could be useful for integrating
> multiple toolkits (ie. showing GTK widget in a Qt application). I am trying
> to get something similar (but less spectacular) done at the moment, and
> I am facing the following issue: When two unrelated pieces of code
> (ie. GTK and Qt) use the same wl_display and both create a proxy to a
> global object (ie. wl_output), then from the server perspective both these
> proxies are indistinguishable. When sending events like wl_surface.enter,
> the server has to pick a single wl_resource as an argument. That wl_resource
> is bound to a specific wl_output proxy on the client side. If the server
> chooses wrong, then the window created and managed by Qt will receive
> wl_surface.enter event with wl_output proxy instance that belongs to GTK.
> It will attempt to access it's user-data and crash because it's not the data
> it is expecting.
>
> In the above scenario the server has no way of knowing which of the proxies
> are expected as parameters in any given case. And the client has no way of
> "discovering" equivalent proxies in case it would like to straighten it out.
> This leads me to believe that the design of the wayland protocol makes it
> impossible to share a connection object between unrelated code and that
> use-case is simply not supported.
>
> Is that correct? Are there any plans to address this?
>
> Best Regards,
> Jaroslaw Kubik
Hi,
Wayland can handle this perfectly fine. Separate sections of code can
create their own wl_registries and bind their own wl_globals
independently of each other, including using different versions of each
global. The only requirement is that they use the same wl_display
object, otherwise they will actually be two separate clients to the
compositor.
For example, the EGL and Vulkan Wayland platform is implemented this
way, where you give it a reference to your wl_display and wl_surface,
and it handles setting up and committing the buffer separately from
anything else.
If some global is bound multiple times, you will receive an event on
each of them and there won't be any mix up regarding user-data, so you
don't need to worry about whether the right global gets used.
Scott
More information about the wayland-devel
mailing list