<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 21, 2014 at 1:47 AM, Sjoerd Simons <span dir="ltr"><<a href="mailto:sjoerd.simons@collabora.co.uk" target="_blank">sjoerd.simons@collabora.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Remove the explicit destroy method from xdg_surface and xdg_popup as<br>
neither of them can be re-created after being destroyed. As a results a<br>
wl_surface gets into an odd sort of odd limbo state after a<br>
xdg_{surface,popup}.destroy call where it not only no longer has an<br>
xdg_{surface,popup} associated with it but where it's also not possible<br>
to re-created one.<br>
<br>
This also happens to align the life-time rules of xdg_{surface,popup} to<br>
match those of wl_shell_surface, which is probably good for consistency.<br></blockquote><div><br></div><div>Sjoerd,<br>First of all, making xdg_shell consistent with wl_shell is a non-reason for doing anything. The objective to xdg_shell is to *replace* wl_shell so they are going to have different symantics.<br>
<br></div><div>Second, regarding your original patch. I'm sorry that it never got reviewed, but implementation details of desktop-shell are, again, not a good driving force for xdg_shell. If weston's desktop-shell has wl_shell_surface symantics too closely tied to xdg_shell, that's a bug in weston's desktop-shell, not a bug in xdg_shell. Right now, weston's desktop-shell is kind of a mess and, yes, it makes a lot of assumptions about the lifecycles of objects both internal and external. When I did the surface/view split, it was a pain because it made the tacit assumption that a shell surface was a surface was a place on-screen. Separating these assumptions will make desktop-shell much cleaner.<br>
<br></div><div>Third is the question of whether we want destructors or not. One of the things we have learned is that destructors are very hard to properly add later. If there is any chance that we will need them, we have to add them before we stabilize the protocol. Also, I don't think there's any real harm except for the possible case where the xdg_surface is hanging around after the wl_surface is destroyed. I'd be 100% ok with defining any requests on the xdg_surface to result in a protocol error if the wl_surface is destroyed. It's possible that we could remove the destructor and tie the two lifecycles together. However, we need to be *really* careful about doing so.<br>
<br></div><div>--Jason Ekstrand<br></div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Signed-off-by: Sjoerd Simons <<a href="mailto:sjoerd.simons@collabora.co.uk" target="_blank">sjoerd.simons@collabora.co.uk</a>><br>
---<br>
desktop-shell/shell.c | 25 ++-----------------------<br>
protocol/xdg-shell.xml | 24 ++++--------------------<br>
2 files changed, 6 insertions(+), 43 deletions(-)<br>
<br>
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c<br>
index 593c7f3..efec100 100644<br>
--- a/desktop-shell/shell.c<br>
+++ b/desktop-shell/shell.c<br>
@@ -3370,13 +3370,6 @@ static const struct wl_shell_interface shell_implementation = {<br>
* xdg-shell implementation */<br>
<br>
static void<br>
-xdg_surface_destroy(struct wl_client *client,<br>
- struct wl_resource *resource)<br>
-{<br>
- wl_resource_destroy(resource);<br>
-}<br>
-<br>
-static void<br>
xdg_surface_set_parent(struct wl_client *client,<br>
struct wl_resource *resource,<br>
struct wl_resource *parent_resource)<br>
@@ -3534,7 +3527,6 @@ xdg_surface_set_minimized(struct wl_client *client,<br>
}<br>
<br>
static const struct xdg_surface_interface xdg_surface_implementation = {<br>
- xdg_surface_destroy,<br>
xdg_surface_set_parent,<br>
xdg_surface_set_title,<br>
xdg_surface_set_app_id,<br>
@@ -3662,18 +3654,6 @@ shell_surface_is_xdg_surface(struct shell_surface *shsurf)<br>
}<br>
<br>
/* xdg-popup implementation */<br>
-<br>
-static void<br>
-xdg_popup_destroy(struct wl_client *client,<br>
- struct wl_resource *resource)<br>
-{<br>
- wl_resource_destroy(resource);<br>
-}<br>
-<br>
-static const struct xdg_popup_interface xdg_popup_implementation = {<br>
- xdg_popup_destroy,<br>
-};<br>
-<br>
static void<br>
xdg_popup_send_configure(struct weston_surface *surface,<br>
int32_t width, int32_t height)<br>
@@ -3753,8 +3733,7 @@ xdg_get_xdg_popup(struct wl_client *client,<br>
wl_resource_create(client,<br>
&xdg_popup_interface, 1, id);<br>
wl_resource_set_implementation(shsurf->resource,<br>
- &xdg_popup_implementation,<br>
- shsurf, shell_destroy_shell_surface);<br>
+ NULL, shsurf, shell_destroy_shell_surface);<br>
}<br>
<br>
static void<br>
@@ -3771,7 +3750,7 @@ shell_surface_is_xdg_popup(struct shell_surface *shsurf)<br>
{<br>
return wl_resource_instance_of(shsurf->resource,<br>
&xdg_popup_interface,<br>
- &xdg_popup_implementation);<br>
+ NULL);<br>
}<br>
<br>
static const struct xdg_shell_interface xdg_implementation = {<br>
diff --git a/protocol/xdg-shell.xml b/protocol/xdg-shell.xml<br>
index bd36231..ea005bc 100644<br>
--- a/protocol/xdg-shell.xml<br>
+++ b/protocol/xdg-shell.xml<br>
@@ -127,16 +127,6 @@<br>
the wl_surface object.<br>
</description><br>
<br>
- <request name="destroy" type="destructor"><br>
- <description summary="remove xdg_surface interface"><br>
- The xdg_surface interface is removed from the wl_surface object<br>
- that was turned into a xdg_surface with<br>
- xdg_shell.get_xdg_surface request. The xdg_surface properties,<br>
- like maximized and fullscreen, are lost. The wl_surface loses<br>
- its role as a xdg_surface. The wl_surface is unmapped.<br>
- </description><br>
- </request><br>
-<br>
<request name="set_parent"><br>
<description summary="surface is a child of another surface"><br>
Child surfaces are stacked above their parents, and will be<br>
@@ -388,17 +378,11 @@<br>
parent surface, in surface local coordinates.<br>
<br>
xdg_popup surfaces are always transient for another surface.<br>
- </description><br>
<br>
- <request name="destroy" type="destructor"><br>
- <description summary="remove xdg_surface interface"><br>
- The xdg_surface interface is removed from the wl_surface object<br>
- that was turned into a xdg_surface with<br>
- xdg_shell.get_xdg_surface request. The xdg_surface properties,<br>
- like maximized and fullscreen, are lost. The wl_surface loses<br>
- its role as a xdg_surface. The wl_surface is unmapped.<br>
- </description><br>
- </request><br>
+ On the server side the object is automatically destroyed when<br>
+ the related wl_surface is destroyed. On client side, xdg_popup.destroy()<br>
+ must be called before destroying the wl_surface object.<br>
+ </description><br>
<br>
<event name="popup_done"><br>
<description summary="popup interaction is done"><br>
<span><font color="#888888">--<br>
2.0.1<br>
<br>
_______________________________________________<br>
wayland-devel mailing list<br>
<a href="mailto:wayland-devel@lists.freedesktop.org" target="_blank">wayland-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
</font></span></blockquote></div><br></div></div>