shell: Add back ability to rotate unresponsive surfaces

When a surface in deemed unresponsive and we trigger the busy cursor, it's
no longer possible to rotate the surface.  This is clearly unacceptable.
This patch adds handling of right clicks to the busy grab so that we can
continue to rotate a surface even if the client is sleeping.

https://bugs.freedesktop.org/show_bug.cgi?id=60609
diff --git a/src/shell.c b/src/shell.c
index 6b0f574..39987d5 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -236,6 +236,9 @@
 static struct desktop_shell *
 shell_surface_get_shell(struct shell_surface *shsurf);
 
+static void
+surface_rotate(struct shell_surface *surface, struct wl_seat *seat);
+
 static bool
 shell_surface_is_top_fullscreen(struct shell_surface *shsurf)
 {
@@ -1232,6 +1235,9 @@
 	if (shsurf && button == BTN_LEFT && state) {
 		activate(shsurf->shell, shsurf->surface, seat);
 		surface_move(shsurf, seat);
+	} else if (shsurf && button == BTN_RIGHT && state) {
+		activate(shsurf->shell, shsurf->surface, seat);
+		surface_rotate(shsurf, &seat->seat);
 	}
 }
 
@@ -2589,23 +2595,12 @@
 };
 
 static void
-rotate_binding(struct wl_seat *seat, uint32_t time, uint32_t button,
-	       void *data)
+surface_rotate(struct shell_surface *surface, struct wl_seat *seat)
 {
-	struct weston_surface *base_surface =
-		(struct weston_surface *) seat->pointer->focus;
-	struct shell_surface *surface;
 	struct rotate_grab *rotate;
 	float dx, dy;
 	float r;
 
-	if (base_surface == NULL)
-		return;
-
-	surface = get_shell_surface(base_surface);
-	if (!surface || surface->type == SHELL_SURFACE_FULLSCREEN)
-		return;
-
 	rotate = malloc(sizeof *rotate);
 	if (!rotate)
 		return;
@@ -2637,6 +2632,24 @@
 }
 
 static void
+rotate_binding(struct wl_seat *seat, uint32_t time, uint32_t button,
+	       void *data)
+{
+	struct weston_surface *base_surface =
+		(struct weston_surface *) seat->pointer->focus;
+	struct shell_surface *surface;
+
+	if (base_surface == NULL)
+		return;
+
+	surface = get_shell_surface(base_surface);
+	if (!surface || surface->type == SHELL_SURFACE_FULLSCREEN)
+		return;
+
+	surface_rotate(surface, seat);
+}
+
+static void
 lower_fullscreen_layer(struct desktop_shell *shell)
 {
 	struct workspace *ws;