[PATCH weston v2] desktop-shell: Fail if get_xdg_surface is called on an xdg_surface
Jasper St. Pierre
jstpierre at mecheye.net
Thu Feb 5 15:57:58 PST 2015
The issue isn't "there's already a role". The issue is that we don't allow
two xdg_surface proxies for the same surface (a currently-undocumented but
sane limitation). For pretty much any other surface role, allowing the
surface to re-gain its role is a feature, not a bug.
On Thu, Feb 5, 2015 at 1:46 PM, Bill Spitzak <spitzak at gmail.com> wrote:
> How about a wrapper function around weston_surface_set_role that always
> fails if there is a non-zero role, and then call that? You can then
> gradually transition all the other calls to this new one, and if they are
> all changed then remove the old function.
>
>
> On 02/05/2015 05:21 AM, Jonas Ådahl wrote:
>
>> If a client calls xdg_shell.get_xdg_surface on a surface that is already
>> an xdg_surface wold, prior to this patch, succeed, but cause weston to
>> crash later when trying to configure. This patch instead sends a role
>> error to the client complaining that it already is an xdg_surface.
>>
>> Note that .._set_role() only fails when changing roles, not when setting
>> the same role twice.
>>
>> The same is done for xdg_popup.
>>
>> Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
>> Reviewed-by: Daniel Stone <daniels at collabora.com>
>> ---
>>
>> Changed since v1:
>>
>> Put the assignments on their own lines.
>>
>>
>> desktop-shell/shell.c | 16 ++++++++++++++++
>> 1 file changed, 16 insertions(+)
>>
>> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
>> index a7514f7..d4407d0 100644
>> --- a/desktop-shell/shell.c
>> +++ b/desktop-shell/shell.c
>> @@ -3959,6 +3959,14 @@ xdg_get_xdg_surface(struct wl_client *client,
>> struct desktop_shell *shell = sc->shell;
>> struct shell_surface *shsurf;
>>
>> + shsurf = get_shell_surface(surface);
>> + if (shsurf && shell_surface_is_xdg_surface(shsurf)) {
>> + wl_resource_post_error(resource, XDG_SHELL_ERROR_ROLE,
>> + "This wl_surface is already an "
>> + "xdg_surface");
>> + return;
>> + }
>> +
>> if (weston_surface_set_role(surface, "xdg_surface",
>> resource, XDG_SHELL_ERROR_ROLE) < 0)
>> return;
>> @@ -4052,6 +4060,14 @@ xdg_get_xdg_popup(struct wl_client *client,
>> struct weston_surface *parent;
>> struct shell_seat *seat;
>>
>> + shsurf = get_shell_surface(surface);
>> + if (shsurf && shell_surface_is_xdg_popup(shsurf)) {
>> + wl_resource_post_error(resource, XDG_SHELL_ERROR_ROLE,
>> + "This wl_surface is already an "
>> + "xdg_popup");
>> + return;
>> + }
>> +
>> if (weston_surface_set_role(surface, "xdg_popup",
>> resource, XDG_SHELL_ERROR_ROLE) < 0)
>> return;
>>
>> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
--
Jasper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20150205/f598617e/attachment.html>
More information about the wayland-devel
mailing list