shell: Convert resources to pointers

This commit converts shell_surface.resource to a pointers and updates
shell.c to use wl_resource_get accessors for shell_surface, desktop_shell,
screensaver, and workspace_manager related resources.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
diff --git a/src/shell.c b/src/shell.c
index d747bc1..3b236c9 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -181,7 +181,8 @@
 };
 
 struct shell_surface {
-	struct wl_resource resource;
+	struct wl_resource *resource;
+	struct wl_signal destroy_signal;
 
 	struct weston_surface *surface;
 	struct wl_listener surface_destroy_listener;
@@ -327,7 +328,7 @@
 	grab->grab.interface = interface;
 	grab->shsurf = shsurf;
 	grab->shsurf_destroy_listener.notify = destroy_shell_grab_shsurf;
-	wl_signal_add(&shsurf->resource.destroy_signal,
+	wl_signal_add(&shsurf->destroy_signal,
 		      &grab->shsurf_destroy_listener);
 
 	grab->pointer = pointer;
@@ -521,8 +522,7 @@
 	wl_list_for_each(state, &ws->focus_list, link) {
 		if (state->seat == seat) {
 			surface = seat->keyboard->focus;
-			state->keyboard_focus =
-				(struct weston_surface *) surface;
+			state->keyboard_focus = surface;
 			return;
 		}
 	}
@@ -672,12 +672,15 @@
 static void
 broadcast_current_workspace_state(struct desktop_shell *shell)
 {
-	struct wl_resource *resource;
+	struct wl_list *link;
 
-	wl_list_for_each(resource, &shell->workspaces.client_list, link)
-		workspace_manager_send_state(resource,
+	for (link = shell->workspaces.client_list.next;
+	     link != &shell->workspaces.client_list;
+	     link = link->next) {
+		workspace_manager_send_state(wl_resource_from_link(link),
 					     shell->workspaces.current,
 					     shell->workspaces.num);
+	}
 }
 
 static void
@@ -983,7 +986,7 @@
 			       struct wl_resource *surface_resource,
 			       uint32_t workspace)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
 	struct weston_surface *main_surface;
@@ -999,7 +1002,7 @@
 static void
 unbind_resource(struct wl_resource *resource)
 {
-	wl_list_remove(&resource->link);
+	wl_list_remove(wl_resource_get_link(resource));
 	free(resource);
 }
 
@@ -1019,8 +1022,9 @@
 		return;
 	}
 
-	resource->destroy = unbind_resource;
-	wl_list_insert(&shell->workspaces.client_list, &resource->link);
+	wl_resource_set_destructor(resource, unbind_resource);
+	wl_list_insert(&shell->workspaces.client_list,
+		       wl_resource_get_link(resource));
 
 	workspace_manager_send_state(resource,
 				     shell->workspaces.current,
@@ -1106,7 +1110,7 @@
 		   struct wl_resource *seat_resource, uint32_t serial)
 {
 	struct weston_seat *seat = seat_resource->data;
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 	struct weston_surface *surface;
 
 	surface = weston_surface_get_main_surface(seat->pointer->focus);
@@ -1168,7 +1172,7 @@
 {
 	struct shell_surface *shsurf = get_shell_surface(surface);
 
-	wl_shell_surface_send_configure(&shsurf->resource,
+	wl_shell_surface_send_configure(shsurf->resource,
 					edges, width, height);
 }
 
@@ -1266,7 +1270,7 @@
 		     uint32_t edges)
 {
 	struct weston_seat *seat = seat_resource->data;
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 	struct weston_surface *surface;
 
 	if (shsurf->type == SHELL_SURFACE_FULLSCREEN)
@@ -1391,7 +1395,7 @@
 
 	if (!shsurf)
 		return;
-	if (!shsurf->resource.client)
+	if (!shsurf->resource)
 		return;
 
 	if (shsurf->surface == shsurf->shell->grab_surface)
@@ -1408,7 +1412,7 @@
 			wl_event_loop_add_timer(loop, ping_timeout_handler, shsurf);
 		wl_event_source_timer_update(shsurf->ping_timer->source, ping_timeout);
 
-		wl_shell_surface_send_ping(&shsurf->resource, serial);
+		wl_shell_surface_send_ping(shsurf->resource, serial);
 	}
 }
 
@@ -1416,8 +1420,7 @@
 handle_pointer_focus(struct wl_listener *listener, void *data)
 {
 	struct weston_pointer *pointer = data;
-	struct weston_surface *surface =
-		(struct weston_surface *) pointer->focus;
+	struct weston_surface *surface = pointer->focus;
 	struct weston_compositor *compositor;
 	struct shell_surface *shsurf;
 	uint32_t serial;
@@ -1453,7 +1456,7 @@
 shell_surface_pong(struct wl_client *client, struct wl_resource *resource,
 							uint32_t serial)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 	struct weston_seat *seat;
 	struct weston_compositor *ec = shsurf->surface->compositor;
 
@@ -1475,7 +1478,7 @@
 shell_surface_set_title(struct wl_client *client,
 			struct wl_resource *resource, const char *title)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 
 	free(shsurf->title);
 	shsurf->title = strdup(title);
@@ -1485,7 +1488,7 @@
 shell_surface_set_class(struct wl_client *client,
 			struct wl_resource *resource, const char *class)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 
 	free(shsurf->class);
 	shsurf->class = strdup(class);
@@ -1644,7 +1647,7 @@
 shell_surface_set_toplevel(struct wl_client *client,
 			   struct wl_resource *resource)
 {
-	struct shell_surface *surface = resource->data;
+	struct shell_surface *surface = wl_resource_get_user_data(resource);
 
 	set_toplevel(surface);
 }
@@ -1667,7 +1670,7 @@
 			    struct wl_resource *parent_resource,
 			    int x, int y, uint32_t flags)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 	struct weston_surface *parent =
 		wl_resource_get_user_data(parent_resource);
 
@@ -1705,7 +1708,7 @@
 			    struct wl_resource *resource,
 			    struct wl_resource *output_resource )
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 	struct weston_surface *es = shsurf->surface;
 	struct desktop_shell *shell = NULL;
 	uint32_t edges = 0, panel_height = 0;
@@ -1922,7 +1925,7 @@
 			     uint32_t framerate,
 			     struct wl_resource *output_resource)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 	struct weston_output *output;
 
 	if (output_resource)
@@ -2055,7 +2058,7 @@
 
 	resource = grab->pointer->focus_resource;
 	if (resource) {
-		display = wl_client_get_display(resource->client);
+		display = wl_client_get_display(wl_resource_get_client(resource));
 		serial = wl_display_get_serial(display);
 		wl_pointer_send_button(resource, serial, time, button, state);
 	} else if (state == WL_POINTER_BUTTON_STATE_RELEASED &&
@@ -2090,7 +2093,7 @@
 		assert(!wl_list_empty(&shseat->popup_grab.surfaces_list));
 		/* Send the popup_done event to all the popups open */
 		wl_list_for_each(shsurf, &shseat->popup_grab.surfaces_list, popup.grab_link) {
-			wl_shell_surface_send_popup_done(&shsurf->resource);
+			wl_shell_surface_send_popup_done(shsurf->resource);
 			shsurf->popup.shseat = NULL;
 			if (prev) {
 				wl_list_init(&prev->popup.grab_link);
@@ -2108,7 +2111,7 @@
 	struct weston_seat *seat = shseat->seat;
 
 	if (wl_list_empty(&shseat->popup_grab.surfaces_list)) {
-		shseat->popup_grab.client = shsurf->resource.client;
+		shseat->popup_grab.client = wl_resource_get_client(shsurf->resource);
 		shseat->popup_grab.grab.interface = &popup_grab_interface;
 		/* We must make sure here that this popup was opened after
 		 * a mouse press, and not just by moving around with other
@@ -2150,7 +2153,7 @@
 	if (shseat->seat->pointer->grab_serial == shsurf->popup.serial) {
 		add_popup_grab(shsurf, shseat);
 	} else {
-		wl_shell_surface_send_popup_done(&shsurf->resource);
+		wl_shell_surface_send_popup_done(shsurf->resource);
 		shseat->popup_grab.client = NULL;
 	}
 }
@@ -2163,10 +2166,10 @@
 			struct wl_resource *parent_resource,
 			int32_t x, int32_t y, uint32_t flags)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 
 	shsurf->type = SHELL_SURFACE_POPUP;
-	shsurf->parent = parent_resource->data;
+	shsurf->parent = wl_resource_get_user_data(parent_resource);
 	shsurf->popup.shseat = get_shell_seat(seat_resource->data);
 	shsurf->popup.serial = serial;
 	shsurf->popup.x = x;
@@ -2189,6 +2192,8 @@
 static void
 destroy_shell_surface(struct shell_surface *shsurf)
 {
+	wl_signal_emit(&shsurf->destroy_signal, shsurf);
+
 	if (!wl_list_empty(&shsurf->popup.grab_link)) {
 		remove_popup_grab(shsurf);
 	}
@@ -2215,7 +2220,7 @@
 static void
 shell_destroy_shell_surface(struct wl_resource *resource)
 {
-	struct shell_surface *shsurf = resource->data;
+	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
 
 	destroy_shell_surface(shsurf);
 }
@@ -2227,13 +2232,10 @@
 						    struct shell_surface,
 						    surface_destroy_listener);
 
-	if (shsurf->resource.client) {
-		wl_resource_destroy(&shsurf->resource);
-	} else {
-		wl_signal_emit(&shsurf->resource.destroy_signal,
-			       &shsurf->resource);
+	if (shsurf->resource)
+		wl_resource_destroy(shsurf->resource);
+	else
 		destroy_shell_surface(shsurf);
-	}
 }
 
 static void
@@ -2279,7 +2281,7 @@
 	shsurf->ping_timer = NULL;
 	wl_list_init(&shsurf->fullscreen.transform.link);
 
-	wl_signal_init(&shsurf->resource.destroy_signal);
+	wl_signal_init(&shsurf->destroy_signal);
 	shsurf->surface_destroy_listener.notify = shell_handle_surface_destroy;
 	wl_signal_add(&surface->destroy_signal,
 		      &shsurf->surface_destroy_listener);
@@ -2310,7 +2312,7 @@
 {
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct shell_surface *shsurf;
 
 	if (get_shell_surface(surface)) {
@@ -2328,14 +2330,12 @@
 		return;
 	}
 
-	shsurf->resource.destroy = shell_destroy_shell_surface;
-	shsurf->resource.object.id = id;
-	shsurf->resource.object.interface = &wl_shell_surface_interface;
-	shsurf->resource.object.implementation =
-		(void (**)(void)) &shell_surface_implementation;
-	shsurf->resource.data = shsurf;
-
-	wl_client_add_resource(client, &shsurf->resource);
+	shsurf->resource = wl_client_add_object(client,
+						&wl_shell_surface_interface,
+						&shell_surface_implementation,
+						id, shsurf);
+	wl_resource_set_destructor(shsurf->resource,
+				   shell_destroy_shell_surface);
 }
 
 static const struct wl_shell_interface shell_implementation = {
@@ -2435,7 +2435,7 @@
 			     struct wl_resource *output_resource,
 			     struct wl_resource *surface_resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
 
@@ -2469,7 +2469,7 @@
 			struct wl_resource *output_resource,
 			struct wl_resource *surface_resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
 
@@ -2524,7 +2524,7 @@
 			       struct wl_resource *resource,
 			       struct wl_resource *surface_resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
 
@@ -2536,7 +2536,7 @@
 	shell->lock_surface = surface;
 
 	shell->lock_surface_listener.notify = handle_lock_surface_destroy;
-	wl_signal_add(&surface_resource->destroy_signal,
+	wl_signal_add(&surface->destroy_signal,
 		      &shell->lock_surface_listener);
 
 	surface->configure = lock_surface_configure;
@@ -2575,7 +2575,7 @@
 desktop_shell_unlock(struct wl_client *client,
 		     struct wl_resource *resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 
 	shell->prepare_event_sent = false;
 
@@ -2588,7 +2588,7 @@
 			       struct wl_resource *resource,
 			       struct wl_resource *surface_resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 
 	shell->grab_surface = wl_resource_get_user_data(surface_resource);
 }
@@ -2597,7 +2597,7 @@
 desktop_shell_desktop_ready(struct wl_client *client,
 			    struct wl_resource *resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 
 	shell_fade_startup(shell);
 }
@@ -3605,7 +3605,7 @@
 static void
 unbind_desktop_shell(struct wl_resource *resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 
 	if (shell->locked)
 		resume_desktop(shell);
@@ -3627,7 +3627,7 @@
 					id, shell);
 
 	if (client == shell->child.client) {
-		resource->destroy = unbind_desktop_shell;
+		wl_resource_set_destructor(resource, unbind_desktop_shell);
 		shell->child.desktop_shell = resource;
 
 		if (version < 2)
@@ -3671,7 +3671,7 @@
 			struct wl_resource *surface_resource,
 			struct wl_resource *output_resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
 	struct weston_output *output = output_resource->data;
@@ -3688,7 +3688,7 @@
 static void
 unbind_screensaver(struct wl_resource *resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 
 	shell->screensaver.binding = NULL;
 	free(resource);
@@ -3706,7 +3706,7 @@
 					id, shell);
 
 	if (shell->screensaver.binding == NULL) {
-		resource->destroy = unbind_screensaver;
+		wl_resource_set_destructor(resource, unbind_screensaver);
 		shell->screensaver.binding = resource;
 		return;
 	}
@@ -3873,7 +3873,7 @@
 {
 	struct weston_surface *surface =
 		wl_resource_get_user_data(surface_resource);
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 	struct input_panel_surface *ipsurf;
 
 	if (get_input_panel_surface(surface)) {
@@ -3908,7 +3908,7 @@
 static void
 unbind_input_panel(struct wl_resource *resource)
 {
-	struct desktop_shell *shell = resource->data;
+	struct desktop_shell *shell = wl_resource_get_user_data(resource);
 
 	shell->input_panel.binding = NULL;
 	free(resource);
@@ -4175,7 +4175,7 @@
 		resource = grab->keyboard->focus_resource;
 
 		if (resource) {
-			display = wl_client_get_display(resource->client);
+			display = wl_client_get_display(wl_resource_get_client(resource));
 			serial = wl_display_next_serial(display);
 			wl_keyboard_send_key(resource, serial, time, key, state);
 		}