xdg-shell: Make xdg_surface fail when surface has role

It is illegal for a surface to have more than one role. The only thing which can be done with an xdg_surface (apart from destroying it) is to assign the surface a role with the get_toplevel, get_popup, etc requests.

On Mutter, calling get_xdg_surface on a surface which already has an assigned role generates the 'role' protocol error. Weston will not send an error, however it may later abort on a failed assert during cleanup. wlroots allows this case, and only sends the role error when assigning an explicit role through creating a toplevel or popup.

On the grounds that it makes no sense to create an xdg_surface for a wl_surface which already has a role, make it explicitly illegal.

cf. weston!559 (merged), weston!627 (merged)

Signed-off-by: Daniel Stone daniels@collabora.com

Merge request reports