Don't forget to transform coordinates for the grab surface.
diff --git a/wayland-system-compositor.c b/wayland-system-compositor.c
index 9ba4ea3..90d61bf 100644
--- a/wayland-system-compositor.c
+++ b/wayland-system-compositor.c
@@ -849,14 +849,26 @@
 	compositor_commit
 };
 
+static void
+wlsc_surface_transform(struct wlsc_surface *surface,
+		       int32_t x, int32_t y, int32_t *sx, int32_t *sy)
+{
+	/* Transform to surface coordinates. */
+	*sx = (x - surface->map.x) * surface->width / surface->map.width;
+	*sy = (y - surface->map.y) * surface->height / surface->map.height;
+}
+
 static struct wlsc_surface *
 pick_surface(struct wlsc_input_device *device, int32_t *sx, int32_t *sy)
 {
 	struct wlsc_compositor *ec = device->ec;
 	struct wlsc_surface *es;
 
-	if (device->grab > 0)
+	if (device->grab > 0) {
+		wlsc_surface_transform(device->grab_surface,
+				       device->x, device->y, sx, sy);
 		return device->grab_surface;
+	}
 
 	es = container_of(ec->surface_list.prev,
 			  struct wlsc_surface, link);
@@ -865,10 +877,7 @@
 		    device->x < es->map.x + es->map.width &&
 		    es->map.y <= device->y &&
 		    device->y < es->map.y + es->map.height) {
-			/* Transform to surface coordinates. */
-			*sx = (device->x - es->map.x) * es->width / es->map.width;
-			*sy = (device->y - es->map.y) * es->height / es->map.height;
-
+			wlsc_surface_transform(es, device->x, device->y, sx, sy);
 			return es;
 		}