diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index f420384f85f6262b5251a1431b4408420981c1aa..c1308c52db33ddb972bb15fc7c75239dac6f60b9 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -1580,7 +1580,7 @@ bind_workspace_manager(struct wl_client *client,
 
 static void
 touch_move_grab_down(struct weston_touch_grab *grab, uint32_t time,
-		     int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+		     int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 }
 
@@ -1602,7 +1602,7 @@ touch_move_grab_up(struct weston_touch_grab *grab, uint32_t time, int touch_id)
 
 static void
 touch_move_grab_motion(struct weston_touch_grab *grab, uint32_t time,
-		       int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+		       int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 	struct weston_touch_move_grab *move = (struct weston_touch_move_grab *) grab;
 	struct shell_surface *shsurf = move->base.shsurf;
@@ -3291,7 +3291,7 @@ static const struct weston_pointer_grab_interface popup_grab_interface = {
 
 static void
 touch_popup_grab_down(struct weston_touch_grab *grab, uint32_t time,
-		      int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+		      int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 	struct wl_resource *resource;
 	struct shell_seat *shseat =
@@ -3299,6 +3299,9 @@ touch_popup_grab_down(struct weston_touch_grab *grab, uint32_t time,
 	struct wl_display *display = shseat->seat->compositor->wl_display;
 	uint32_t serial;
 	struct wl_list *resource_list;
+	wl_fixed_t sx, sy;
+
+	weston_view_from_global_fixed(grab->touch->focus, x, y, &sx, &sy);
 
 	resource_list = &grab->touch->focus_resource_list;
 	if (!wl_list_empty(resource_list)) {
@@ -3332,10 +3335,13 @@ touch_popup_grab_up(struct weston_touch_grab *grab, uint32_t time, int touch_id)
 
 static void
 touch_popup_grab_motion(struct weston_touch_grab *grab, uint32_t time,
-			int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+			int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
+	wl_fixed_t sx, sy;
+
+	weston_view_from_global_fixed(grab->touch->focus, x, y, &sx, &sy);
 
 	resource_list = &grab->touch->focus_resource_list;
 	if (!wl_list_empty(resource_list)) {
diff --git a/src/data-device.c b/src/data-device.c
index 9825bda69aa781bc9875ebca7bb3ad0b9a52e789..89ffce494da728c62cf430ccf0335470c0e09ea5 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -480,7 +480,7 @@ drag_grab_touch_focus(struct weston_touch_drag *drag)
 
 static void
 drag_grab_touch_motion(struct weston_touch_grab *grab, uint32_t time,
-		int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+		int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 	struct weston_touch_drag *touch_drag =
 		container_of(grab, struct weston_touch_drag, grab);
diff --git a/src/input.c b/src/input.c
index 8f24ccd5f21ad99042ccadf4f4f063f5669f0db8..3227db463f0d3001e8f2e13e23d361f9a700d4ca 100644
--- a/src/input.c
+++ b/src/input.c
@@ -236,13 +236,16 @@ static const struct weston_pointer_grab_interface
 
 static void
 default_grab_touch_down(struct weston_touch_grab *grab, uint32_t time,
-			int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+			int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 	struct weston_touch *touch = grab->touch;
 	struct wl_display *display = touch->seat->compositor->wl_display;
 	uint32_t serial;
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
+	wl_fixed_t sx, sy;
+
+	weston_view_from_global_fixed(touch->focus, x, y, &sx, &sy);
 
 	resource_list = &touch->focus_resource_list;
 
@@ -276,11 +279,14 @@ default_grab_touch_up(struct weston_touch_grab *grab,
 
 static void
 default_grab_touch_motion(struct weston_touch_grab *grab, uint32_t time,
-			  int touch_id, wl_fixed_t sx, wl_fixed_t sy)
+			  int touch_id, wl_fixed_t x, wl_fixed_t y)
 {
 	struct weston_touch *touch = grab->touch;
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
+	wl_fixed_t sx, sy;
+
+	weston_view_from_global_fixed(touch->focus, x, y, &sx, &sy);
 
 	resource_list = &touch->focus_resource_list;
 
@@ -1535,10 +1541,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
 		if (touch->num_tp == 1) {
 			ev = weston_compositor_pick_view(ec, x, y, &sx, &sy);
 			weston_touch_set_focus(touch, ev);
-		} else if (touch->focus) {
-			ev = touch->focus;
-			weston_view_from_global_fixed(ev, x, y, &sx, &sy);
-		} else {
+		} else if (!touch->focus) {
 			/* Unexpected condition: We have non-initial touch but
 			 * there is no focused surface.
 			 */
@@ -1550,7 +1553,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
 		weston_compositor_run_touch_binding(ec, touch,
 						    time, touch_type);
 
-		grab->interface->down(grab, time, touch_id, sx, sy);
+		grab->interface->down(grab, time, touch_id, x, y);
 		if (touch->num_tp == 1) {
 			touch->grab_serial =
 				wl_display_get_serial(ec->wl_display);
@@ -1566,8 +1569,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
 		if (!ev)
 			break;
 
-		weston_view_from_global_fixed(ev, x, y, &sx, &sy);
-		grab->interface->motion(grab, time, touch_id, sx, sy);
+		grab->interface->motion(grab, time, touch_id, x, y);
 		break;
 	case WL_TOUCH_UP:
 		if (touch->num_tp == 0) {