Use wl_signal mechanism

Mostly mechanical rewrite to track waylands change to struct wl_signal.
diff --git a/src/shell.c b/src/shell.c
index 70a8e62..b7bd4be 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -151,8 +151,7 @@
 };
 
 static void
-destroy_shell_grab_shsurf(struct wl_listener *listener,
-			  struct wl_resource *resource)
+destroy_shell_grab_shsurf(struct wl_listener *listener, void *data)
 {
 	struct shell_grab *grab;
 
@@ -169,9 +168,9 @@
 {
 	grab->grab.interface = interface;
 	grab->shsurf = shsurf;
-	grab->shsurf_destroy_listener.func = destroy_shell_grab_shsurf;
-	wl_list_insert(shsurf->resource.destroy_listener_list.prev,
-		       &grab->shsurf_destroy_listener.link);
+	grab->shsurf_destroy_listener.notify = destroy_shell_grab_shsurf;
+	wl_signal_add(&shsurf->resource.destroy_signal,
+		      &grab->shsurf_destroy_listener);
 
 }
 
@@ -852,8 +851,7 @@
 }
 
 static void
-shell_handle_surface_destroy(struct wl_listener *listener,
-			     struct wl_resource *resource)
+shell_handle_surface_destroy(struct wl_listener *listener, void *data)
 {
 	struct shell_surface *shsurf = container_of(listener,
 						    struct shell_surface,
@@ -866,16 +864,13 @@
 static struct shell_surface *
 get_shell_surface(struct weston_surface *surface)
 {
-	struct wl_list *lst = &surface->surface.resource.destroy_listener_list;
 	struct wl_listener *listener;
 
-	/* search the destroy listener list for our callback */
-	wl_list_for_each(listener, lst, link) {
-		if (listener->func == shell_handle_surface_destroy) {
-			return container_of(listener, struct shell_surface,
-					    surface_destroy_listener);
-		}
-	}
+	listener = wl_signal_get(&surface->surface.resource.destroy_signal,
+				 shell_handle_surface_destroy);
+	if (listener)
+		return container_of(listener, struct shell_surface,
+				    surface_destroy_listener);
 
 	return NULL;
 }
@@ -928,9 +923,9 @@
 	shsurf->fullscreen.black_surface = NULL;
 	wl_list_init(&shsurf->fullscreen.transform.link);
 
-	shsurf->surface_destroy_listener.func = shell_handle_surface_destroy;
-	wl_list_insert(surface->surface.resource.destroy_listener_list.prev,
-		       &shsurf->surface_destroy_listener.link);
+	shsurf->surface_destroy_listener.notify = shell_handle_surface_destroy;
+	wl_signal_add(&surface->surface.resource.destroy_signal,
+		      &shsurf->surface_destroy_listener);
 
 	/* init link so its safe to always remove it in destroy_shell_surface */
 	wl_list_init(&shsurf->link);
@@ -1082,8 +1077,7 @@
 }
 
 static void
-handle_lock_surface_destroy(struct wl_listener *listener,
-			    struct wl_resource *resource)
+handle_lock_surface_destroy(struct wl_listener *listener, void *data)
 {
 	struct wl_shell *shell =
 		container_of(listener, struct wl_shell, lock_surface_listener);
@@ -1110,9 +1104,9 @@
 
 	shell->lock_surface = surface;
 
-	shell->lock_surface_listener.func = handle_lock_surface_destroy;
-	wl_list_insert(&surface_resource->destroy_listener_list,
-		       &shell->lock_surface_listener.link);
+	shell->lock_surface_listener.notify = handle_lock_surface_destroy;
+	wl_signal_add(&surface_resource->destroy_signal,
+		      &shell->lock_surface_listener);
 
 	shell->lock_surface->type = SHELL_SURFACE_LOCK;
 }
@@ -2026,8 +2020,8 @@
 		return;
 
 	wl_list_remove(&switcher->listener.link);
-	wl_list_insert(next->surface.resource.destroy_listener_list.prev,
-		       &switcher->listener.link);
+	wl_signal_add(&next->surface.resource.destroy_signal,
+		      &switcher->listener);
 
 	switcher->current = next;
 	next->alpha = 255;
@@ -2038,8 +2032,7 @@
 }
 
 static void
-switcher_handle_surface_destroy(struct wl_listener *listener,
-				struct wl_resource *resource)
+switcher_handle_surface_destroy(struct wl_listener *listener, void *data)
 {
 	struct switcher *switcher =
 		container_of(listener, struct switcher, listener);
@@ -2097,7 +2090,7 @@
 	switcher = malloc(sizeof *switcher);
 	switcher->compositor = compositor;
 	switcher->current = NULL;
-	switcher->listener.func = switcher_handle_surface_destroy;
+	switcher->listener.notify = switcher_handle_surface_destroy;
 	wl_list_init(&switcher->listener.link);
 
 	switcher->grab.interface = &switcher_grab;