shell: add private surface struct

Add a pointer to wlsc_surface for shell-private data. This is a
temporary solution.

Add struct shell_surface, where you can add any shell-private data
members related to a wlsc_surface. The getter function takes care of
creating the private data if it does not exist yet.

Not used anywhere yet.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
diff --git a/compositor/shell.c b/compositor/shell.c
index f8305db..edef868 100644
--- a/compositor/shell.c
+++ b/compositor/shell.c
@@ -58,6 +58,10 @@
 	struct wl_list hidden_surface_list;
 };
 
+struct shell_surface {
+	struct wl_listener destroy_listener;
+};
+
 struct wlsc_move_grab {
 	struct wl_grab grab;
 	struct wlsc_surface *surface;
@@ -65,6 +69,43 @@
 };
 
 static void
+destroy_shell_surface(struct shell_surface *priv)
+{
+	wl_list_remove(&priv->destroy_listener.link);
+	free(priv);
+}
+
+static void
+handle_shell_surface_destroy(struct wl_listener *listener,
+			     struct wl_resource *resource, uint32_t time)
+{
+	struct shell_surface *priv =
+		container_of(listener, struct shell_surface, destroy_listener);
+	destroy_shell_surface(priv);
+}
+
+static struct shell_surface *
+get_shell_surface(struct wlsc_surface *surface)
+{
+	struct shell_surface *priv;
+
+	if (surface->shell_priv)
+		return surface->shell_priv;
+
+	priv = calloc(1, sizeof *priv);
+	if (!priv)
+		return NULL;
+
+	priv->destroy_listener.func = handle_shell_surface_destroy;
+	wl_list_insert(surface->surface.resource.destroy_listener_list.prev,
+		       &priv->destroy_listener.link);
+
+	surface->shell_priv = priv;
+
+	return priv;
+}
+
+static void
 move_grab_motion(struct wl_grab *grab,
 		   uint32_t time, int32_t x, int32_t y)
 {