compositor: Change notify_* function to take a weston_seat

Fewer indirections and derefs, and it's also more appropriate for a
backend calling into weston core to pass a weston_seat.
diff --git a/src/compositor-android.c b/src/compositor-android.c
index e6d57a3..a9c45d2 100644
--- a/src/compositor-android.c
+++ b/src/compositor-android.c
@@ -322,7 +322,7 @@
 		evdev_device_destroy(device);
 
 	if (seat->base.seat.keyboard)
-		notify_keyboard_focus_out(&seat->base.seat);
+		notify_keyboard_focus_out(&seat->base);
 
 	weston_seat_release(&seat->base);
 	free(seat);
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 933a273..8c8c8c0 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -2049,7 +2049,7 @@
 		evdev_device_destroy(device);
 
 	if (seat->base.seat.keyboard)
-		notify_keyboard_focus_out(&seat->base.seat);
+		notify_keyboard_focus_out(&seat->base);
 }
 
 static void
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index afdb8e3..e5ff658 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -536,7 +536,7 @@
 	/* XXX: If we get a modifier event immediately before the focus,
 	 *      we should try to keep the same serial. */
 	output = wl_surface_get_user_data(surface);
-	notify_pointer_focus(&input->base.seat, &output->base, x, y);
+	notify_pointer_focus(&input->base, &output->base, x, y);
 	wl_pointer_set_cursor(input->pointer, serial, NULL, 0, 0);
 }
 
@@ -546,7 +546,7 @@
 {
 	struct wayland_input *input = data;
 
-	notify_pointer_focus(&input->base.seat, NULL, 0, 0);
+	notify_pointer_focus(&input->base, NULL, 0, 0);
 }
 
 static void
@@ -556,7 +556,7 @@
 	struct wayland_input *input = data;
 	struct wayland_compositor *c = input->compositor;
 
-	notify_motion(&input->base.seat, time,
+	notify_motion(&input->base, time,
 		      x - wl_fixed_from_int(c->border.left),
 		      y - wl_fixed_from_int(c->border.top));
 }
@@ -569,7 +569,7 @@
 	struct wayland_input *input = data;
 	enum wl_pointer_button_state state = state_w;
 
-	notify_button(&input->base.seat, time, button, state);
+	notify_button(&input->base, time, button, state);
 }
 
 static void
@@ -578,7 +578,7 @@
 {
 	struct wayland_input *input = data;
 
-	notify_axis(&input->base.seat, time, axis, value);
+	notify_axis(&input->base, time, axis, value);
 }
 
 static const struct wl_pointer_listener pointer_listener = {
@@ -640,7 +640,7 @@
 
 	/* XXX: If we get a modifier event immediately before the focus,
 	 *      we should try to keep the same serial. */
-	notify_keyboard_focus_in(&input->base.seat, keys,
+	notify_keyboard_focus_in(&input->base, keys,
 				 STATE_UPDATE_AUTOMATIC);
 }
 
@@ -652,7 +652,7 @@
 {
 	struct wayland_input *input = data;
 
-	notify_keyboard_focus_out(&input->base.seat);
+	notify_keyboard_focus_out(&input->base);
 }
 
 static void
@@ -662,7 +662,7 @@
 	struct wayland_input *input = data;
 
 	input->key_serial = serial;
-	notify_key(&input->base.seat, time, key,
+	notify_key(&input->base, time, key,
 		   state ? WL_KEYBOARD_KEY_STATE_PRESSED :
 			   WL_KEYBOARD_KEY_STATE_RELEASED,
 		   STATE_UPDATE_NONE);
@@ -689,7 +689,7 @@
 	xkb_state_update_mask(input->base.xkb_state.state,
 			      mods_depressed, mods_latched,
 			      mods_locked, 0, 0, group);
-	notify_modifiers(&input->base.seat, serial_out);
+	notify_modifiers(&input->base, serial_out);
 }
 
 static const struct wl_keyboard_listener keyboard_listener = {
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index c38d7dc..c02911d 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -641,8 +641,6 @@
 static void
 update_xkb_state(struct x11_compositor *c, xcb_xkb_state_notify_event_t *state)
 {
-	struct wl_seat *seat = &c->core_seat.seat;
-
 	xkb_state_update_mask(c->core_seat.xkb_state.state,
 			      get_xkb_mod_mask(c, state->baseMods),
 			      get_xkb_mod_mask(c, state->latchedMods),
@@ -651,7 +649,8 @@
 			      0,
 			      state->group);
 
-	notify_modifiers(seat, wl_display_next_serial(c->base.wl_display));
+	notify_modifiers(&c->core_seat,
+			 wl_display_next_serial(c->base.wl_display));
 }
 #endif
 
@@ -679,7 +678,7 @@
 			      0,
 			      0,
 			      (x11_mask >> 13) & 3);
-	notify_modifiers(&c->core_seat.seat,
+	notify_modifiers(&c->core_seat,
 			 wl_display_next_serial(c->base.wl_display));
 }
 
@@ -706,35 +705,35 @@
 		break;
 	case 4:
 		if (state)
-			notify_axis(&c->core_seat.seat,
+			notify_axis(&c->core_seat,
 				      weston_compositor_get_time(),
 				      WL_POINTER_AXIS_VERTICAL_SCROLL,
 				      wl_fixed_from_int(1));
 		return;
 	case 5:
 		if (state)
-			notify_axis(&c->core_seat.seat,
+			notify_axis(&c->core_seat,
 				      weston_compositor_get_time(),
 				      WL_POINTER_AXIS_VERTICAL_SCROLL,
 				      wl_fixed_from_int(-1));
 		return;
 	case 6:
 		if (state)
-			notify_axis(&c->core_seat.seat,
+			notify_axis(&c->core_seat,
 				      weston_compositor_get_time(),
 				      WL_POINTER_AXIS_HORIZONTAL_SCROLL,
 				      wl_fixed_from_int(1));
 		return;
 	case 7:
 		if (state)
-			notify_axis(&c->core_seat.seat,
+			notify_axis(&c->core_seat,
 				      weston_compositor_get_time(),
 				      WL_POINTER_AXIS_HORIZONTAL_SCROLL,
 				      wl_fixed_from_int(-1));
 		return;
 	}
 
-	notify_button(&c->core_seat.seat,
+	notify_button(&c->core_seat,
 		      weston_compositor_get_time(), button,
 		      state ? WL_POINTER_BUTTON_STATE_PRESSED :
 			      WL_POINTER_BUTTON_STATE_RELEASED);
@@ -799,7 +798,7 @@
 				 * and fall through and handle the new
 				 * event below. */
 				update_xkb_state_from_core(c, key_release->state);
-				notify_key(&c->core_seat.seat,
+				notify_key(&c->core_seat,
 					   weston_compositor_get_time(),
 					   key_release->detail - 8,
 					   WL_KEYBOARD_KEY_STATE_RELEASED,
@@ -828,7 +827,7 @@
 			 * event, rather than with the focus event.  I'm not
 			 * sure of the exact semantics around it and whether
 			 * we can ensure that we get both? */
-			notify_keyboard_focus_in(&c->core_seat.seat, &c->keys,
+			notify_keyboard_focus_in(&c->core_seat, &c->keys,
 						 STATE_UPDATE_AUTOMATIC);
 
 			free(prev);
@@ -845,7 +844,7 @@
 			key_press = (xcb_key_press_event_t *) event;
 			if (!c->has_xkb)
 				update_xkb_state_from_core(c, key_press->state);
-			notify_key(&c->core_seat.seat,
+			notify_key(&c->core_seat,
 				   weston_compositor_get_time(),
 				   key_press->detail - 8,
 				   WL_KEYBOARD_KEY_STATE_PRESSED,
@@ -860,7 +859,7 @@
 				break;
 			}
 			key_release = (xcb_key_press_event_t *) event;
-			notify_key(&c->core_seat.seat,
+			notify_key(&c->core_seat,
 				   weston_compositor_get_time(),
 				   key_release->detail - 8,
 				   WL_KEYBOARD_KEY_STATE_RELEASED,
@@ -879,7 +878,7 @@
 			output = x11_compositor_find_output(c, motion_notify->event);
 			x = wl_fixed_from_int(output->base.x + motion_notify->event_x);
 			y = wl_fixed_from_int(output->base.y + motion_notify->event_y);
-			notify_motion(&c->core_seat.seat,
+			notify_motion(&c->core_seat,
 				      weston_compositor_get_time(), x, y);
 			break;
 
@@ -899,7 +898,7 @@
 			x = wl_fixed_from_int(output->base.x + enter_notify->event_x);
 			y = wl_fixed_from_int(output->base.y + enter_notify->event_y);
 
-			notify_pointer_focus(&c->core_seat.seat,
+			notify_pointer_focus(&c->core_seat,
 					     &output->base, x, y);
 			break;
 
@@ -910,7 +909,7 @@
 			if (!c->has_xkb)
 				update_xkb_state_from_core(c, enter_notify->state);
 			output = x11_compositor_find_output(c, enter_notify->event);
-			notify_pointer_focus(&c->core_seat.seat, NULL, 0, 0);
+			notify_pointer_focus(&c->core_seat, NULL, 0, 0);
 			break;
 
 		case XCB_CLIENT_MESSAGE:
@@ -933,7 +932,7 @@
 			if (focus_in->mode == XCB_NOTIFY_MODE_WHILE_GRABBED ||
 			    focus_in->mode == XCB_NOTIFY_MODE_UNGRAB)
 				break;
-			notify_keyboard_focus_out(&c->core_seat.seat);
+			notify_keyboard_focus_out(&c->core_seat);
 			break;
 
 		default:
@@ -959,7 +958,7 @@
 	case XCB_KEY_RELEASE:
 		key_release = (xcb_key_press_event_t *) prev;
 		update_xkb_state_from_core(c, key_release->state);
-		notify_key(&c->core_seat.seat,
+		notify_key(&c->core_seat,
 			   weston_compositor_get_time(),
 			   key_release->detail - 8,
 			   WL_KEYBOARD_KEY_STATE_RELEASED,
diff --git a/src/compositor.c b/src/compositor.c
index 293e679..bdf9459 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -609,36 +609,36 @@
 }
 
 static void
-weston_device_repick(struct wl_seat *seat)
+weston_device_repick(struct weston_seat *seat)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
 	const struct wl_pointer_grab_interface *interface;
 	struct weston_surface *surface, *focus;
+	struct wl_pointer *pointer = seat->seat.pointer;
 
-	if (!seat->pointer)
+	if (!pointer)
 		return;
 
-	surface = weston_compositor_pick_surface(ws->compositor,
-						 seat->pointer->x,
-						 seat->pointer->y,
-						 &seat->pointer->current_x,
-						 &seat->pointer->current_y);
+	surface = weston_compositor_pick_surface(seat->compositor,
+						 pointer->x,
+						 pointer->y,
+						 &pointer->current_x,
+						 &pointer->current_y);
 
-	if (&surface->surface != seat->pointer->current) {
-		interface = seat->pointer->grab->interface;
-		seat->pointer->current = &surface->surface;
-		interface->focus(seat->pointer->grab, &surface->surface,
-				 seat->pointer->current_x,
-				 seat->pointer->current_y);
+	if (&surface->surface != pointer->current) {
+		interface = pointer->grab->interface;
+		pointer->current = &surface->surface;
+		interface->focus(pointer->grab, &surface->surface,
+				 pointer->current_x,
+				 pointer->current_y);
 	}
 
-	focus = (struct weston_surface *) seat->pointer->grab->focus;
+	focus = (struct weston_surface *) pointer->grab->focus;
 	if (focus)
 		weston_surface_from_global_fixed(focus,
-						 seat->pointer->x,
-						 seat->pointer->y,
-					         &seat->pointer->grab->x,
-					         &seat->pointer->grab->y);
+						 pointer->x,
+						 pointer->y,
+					         &pointer->grab->x,
+					         &pointer->grab->y);
 }
 
 static void
@@ -650,7 +650,7 @@
 		return;
 
 	wl_list_for_each(seat, &compositor->seat_list, link)
-		weston_device_repick(&seat->seat);
+		weston_device_repick(seat);
 }
 
 WL_EXPORT void
@@ -1695,7 +1695,7 @@
 }
 
 static  void
-weston_seat_update_drag_surface(struct wl_seat *seat, int dx, int dy);
+weston_seat_update_drag_surface(struct weston_seat *seat, int dx, int dy);
 
 static void
 clip_pointer_motion(struct weston_seat *seat, wl_fixed_t *fx, wl_fixed_t *fy)
@@ -1733,24 +1733,22 @@
 }
 
 WL_EXPORT void
-notify_motion(struct wl_seat *seat, uint32_t time, wl_fixed_t x, wl_fixed_t y)
+notify_motion(struct weston_seat *seat, uint32_t time, wl_fixed_t x, wl_fixed_t y)
 {
 	const struct wl_pointer_grab_interface *interface;
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *ec = ws->compositor;
+	struct weston_compositor *ec = seat->compositor;
 	struct weston_output *output;
+	struct wl_pointer *pointer = seat->seat.pointer;
 	int32_t ix, iy;
 
 	weston_compositor_activity(ec);
 
-	clip_pointer_motion(ws, &x, &y);
+	clip_pointer_motion(seat, &x, &y);
 
-	weston_seat_update_drag_surface(seat,
-					x - seat->pointer->x,
-					y - seat->pointer->y);
+	weston_seat_update_drag_surface(seat, x - pointer->x, y - pointer->y);
 
-	seat->pointer->x = x;
-	seat->pointer->y = y;
+	pointer->x = x;
+	pointer->y = y;
 
 	ix = wl_fixed_to_int(x);
 	iy = wl_fixed_to_int(y);
@@ -1762,15 +1760,15 @@
 			weston_output_update_zoom(output, ZOOM_FOCUS_POINTER);
 
 	weston_device_repick(seat);
-	interface = seat->pointer->grab->interface;
-	interface->motion(seat->pointer->grab, time,
-			  seat->pointer->grab->x, seat->pointer->grab->y);
+	interface = pointer->grab->interface;
+	interface->motion(pointer->grab, time,
+			  pointer->grab->x, pointer->grab->y);
 
-	if (ws->sprite) {
-		weston_surface_set_position(ws->sprite,
-					    ix - ws->hotspot_x,
-					    iy - ws->hotspot_y);
-		weston_surface_schedule_repaint(ws->sprite);
+	if (seat->sprite) {
+		weston_surface_set_position(seat->sprite,
+					    ix - seat->hotspot_x,
+					    iy - seat->hotspot_y);
+		weston_surface_schedule_repaint(seat->sprite);
 	}
 }
 
@@ -1789,50 +1787,49 @@
 }
 
 WL_EXPORT void
-notify_button(struct wl_seat *seat, uint32_t time, int32_t button,
+notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
 	      enum wl_pointer_button_state state)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *compositor = ws->compositor;
+	struct weston_compositor *compositor = seat->compositor;
+	struct wl_pointer *pointer = seat->seat.pointer;
 	struct weston_surface *focus =
-		(struct weston_surface *) seat->pointer->focus;
+		(struct weston_surface *) pointer->focus;
 	uint32_t serial = wl_display_next_serial(compositor->wl_display);
 
 	if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
 		if (compositor->ping_handler && focus)
 			compositor->ping_handler(focus, serial);
 		weston_compositor_idle_inhibit(compositor);
-		if (seat->pointer->button_count == 0) {
-			seat->pointer->grab_button = button;
-			seat->pointer->grab_time = time;
-			seat->pointer->grab_x = seat->pointer->x;
-			seat->pointer->grab_y = seat->pointer->y;
+		if (pointer->button_count == 0) {
+			pointer->grab_button = button;
+			pointer->grab_time = time;
+			pointer->grab_x = pointer->x;
+			pointer->grab_y = pointer->y;
 		}
-		seat->pointer->button_count++;
+		pointer->button_count++;
 	} else {
 		weston_compositor_idle_release(compositor);
-		seat->pointer->button_count--;
+		pointer->button_count--;
 	}
 
-	weston_compositor_run_button_binding(compositor, ws, time, button,
+	weston_compositor_run_button_binding(compositor, seat, time, button,
 					     state);
 
-	seat->pointer->grab->interface->button(seat->pointer->grab, time,
-					       button, state);
+	pointer->grab->interface->button(pointer->grab, time, button, state);
 
-	if (seat->pointer->button_count == 1)
-		seat->pointer->grab_serial =
+	if (pointer->button_count == 1)
+		pointer->grab_serial =
 			wl_display_get_serial(compositor->wl_display);
 }
 
 WL_EXPORT void
-notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis,
+notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
 	    wl_fixed_t value)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *compositor = ws->compositor;
+	struct weston_compositor *compositor = seat->compositor;
+	struct wl_pointer *pointer = seat->seat.pointer;
 	struct weston_surface *focus =
-		(struct weston_surface *) seat->pointer->focus;
+		(struct weston_surface *) pointer->focus;
 	uint32_t serial = wl_display_next_serial(compositor->wl_display);
 
 	if (compositor->ping_handler && focus)
@@ -1841,20 +1838,19 @@
 	weston_compositor_activity(compositor);
 
 	if (value)
-		weston_compositor_run_axis_binding(compositor, ws, time, axis,
-						   value);
+		weston_compositor_run_axis_binding(compositor, seat,
+						   time, axis, value);
 	else
 		return;
 
-	if (seat->pointer->focus_resource)
-		wl_pointer_send_axis(seat->pointer->focus_resource, time, axis,
+	if (pointer->focus_resource)
+		wl_pointer_send_axis(pointer->focus_resource, time, axis,
 				     value);
 }
 
 WL_EXPORT void
-notify_modifiers(struct wl_seat *wl_seat, uint32_t serial)
+notify_modifiers(struct weston_seat *seat, uint32_t serial)
 {
-	struct weston_seat *seat = (struct weston_seat *) wl_seat;
 	struct wl_keyboard *keyboard = &seat->keyboard;
 	struct wl_keyboard_grab *grab = keyboard->grab;
 	uint32_t mods_depressed, mods_latched, mods_locked, group;
@@ -1935,19 +1931,19 @@
 	 * broken keycode system, which starts at 8. */
 	xkb_state_update_key(seat->xkb_state.state, key + 8, direction);
 
-	notify_modifiers(&seat->seat, serial);
+	notify_modifiers(seat, serial);
 }
 
 WL_EXPORT void
-notify_key(struct wl_seat *seat, uint32_t time, uint32_t key,
+notify_key(struct weston_seat *seat, uint32_t time, uint32_t key,
 	   enum wl_keyboard_key_state state,
 	   enum weston_key_state_update update_state)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *compositor = ws->compositor;
+	struct weston_compositor *compositor = seat->compositor;
+	struct wl_keyboard *keyboard = seat->seat.keyboard;
 	struct weston_surface *focus =
-		(struct weston_surface *) seat->keyboard->focus;
-	struct wl_keyboard_grab *grab = seat->keyboard->grab;
+		(struct weston_surface *) keyboard->focus;
+	struct wl_keyboard_grab *grab = keyboard->grab;
 	uint32_t serial = wl_display_next_serial(compositor->wl_display);
 	uint32_t *k, *end;
 
@@ -1956,14 +1952,14 @@
 			compositor->ping_handler(focus, serial);
 
 		weston_compositor_idle_inhibit(compositor);
-		seat->keyboard->grab_key = key;
-		seat->keyboard->grab_time = time;
+		keyboard->grab_key = key;
+		keyboard->grab_time = time;
 	} else {
 		weston_compositor_idle_release(compositor);
 	}
 
-	end = seat->keyboard->keys.data + seat->keyboard->keys.size;
-	for (k = seat->keyboard->keys.data; k < end; k++) {
+	end = keyboard->keys.data + keyboard->keys.size;
+	for (k = keyboard->keys.data; k < end; k++) {
 		if (*k == key) {
 			/* Ignore server-generated repeats. */
 			if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
@@ -1971,22 +1967,22 @@
 			*k = *--end;
 		}
 	}
-	seat->keyboard->keys.size = (void *) end - seat->keyboard->keys.data;
+	keyboard->keys.size = (void *) end - keyboard->keys.data;
 	if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
-		k = wl_array_add(&seat->keyboard->keys, sizeof *k);
+		k = wl_array_add(&keyboard->keys, sizeof *k);
 		*k = key;
 	}
 
-	if (grab == &seat->keyboard->default_grab) {
-		weston_compositor_run_key_binding(compositor, ws, time, key,
+	if (grab == &keyboard->default_grab) {
+		weston_compositor_run_key_binding(compositor, seat, time, key,
 						  state);
-		grab = seat->keyboard->grab;
+		grab = keyboard->grab;
 	}
 
 	grab->interface->key(grab, time, key, state);
 
 	if (update_state == STATE_UPDATE_AUTOMATIC) {
-		update_modifier_state(ws,
+		update_modifier_state(seat,
 				      wl_display_get_serial(compositor->wl_display),
 				      key,
 				      state);
@@ -1994,19 +1990,19 @@
 }
 
 WL_EXPORT void
-notify_pointer_focus(struct wl_seat *seat, struct weston_output *output,
+notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
 		     wl_fixed_t x, wl_fixed_t y)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *compositor = ws->compositor;
+	struct weston_compositor *compositor = seat->compositor;
+	struct wl_pointer *pointer = seat->seat.pointer;
 
 	if (output) {
 		weston_seat_update_drag_surface(seat,
-						x - seat->pointer->x,
-						y - seat->pointer->y);
+						x - pointer->x,
+						y - pointer->y);
 
-		seat->pointer->x = x;
-		seat->pointer->y = y;
+		pointer->x = x;
+		pointer->y = y;
 		compositor->focus = 1;
 		weston_compositor_repick(compositor);
 	} else {
@@ -2028,70 +2024,67 @@
 }
 
 WL_EXPORT void
-notify_keyboard_focus_in(struct wl_seat *seat, struct wl_array *keys,
+notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
 			 enum weston_key_state_update update_state)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *compositor = ws->compositor;
+	struct weston_compositor *compositor = seat->compositor;
+	struct wl_keyboard *keyboard = seat->seat.keyboard;
 	struct wl_surface *surface;
 	uint32_t *k, serial;
 
 	serial = wl_display_next_serial(compositor->wl_display);
-	wl_array_copy(&seat->keyboard->keys, keys);
-	wl_array_for_each(k, &seat->keyboard->keys) {
+	wl_array_copy(&keyboard->keys, keys);
+	wl_array_for_each(k, &keyboard->keys) {
 		weston_compositor_idle_inhibit(compositor);
 		if (update_state == STATE_UPDATE_AUTOMATIC)
-			update_modifier_state(ws, serial, *k,
+			update_modifier_state(seat, serial, *k,
 					      WL_KEYBOARD_KEY_STATE_PRESSED);
 	}
 
 	/* Run key bindings after we've updated the state. */
-	wl_array_for_each(k, &seat->keyboard->keys) {
-		weston_compositor_run_key_binding(compositor, ws, 0, *k,
+	wl_array_for_each(k, &keyboard->keys) {
+		weston_compositor_run_key_binding(compositor, seat, 0, *k,
 						  WL_KEYBOARD_KEY_STATE_PRESSED);
 	}
 
-	surface = ws->saved_kbd_focus;
+	surface = seat->saved_kbd_focus;
 
 	if (surface) {
-		wl_list_remove(&ws->saved_kbd_focus_listener.link);
-		wl_keyboard_set_focus(ws->seat.keyboard, surface);
-		ws->saved_kbd_focus = NULL;
+		wl_list_remove(&seat->saved_kbd_focus_listener.link);
+		wl_keyboard_set_focus(keyboard, surface);
+		seat->saved_kbd_focus = NULL;
 	}
 }
 
 WL_EXPORT void
-notify_keyboard_focus_out(struct wl_seat *seat)
+notify_keyboard_focus_out(struct weston_seat *seat)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *compositor = ws->compositor;
-	struct wl_surface *surface;
+	struct weston_compositor *compositor = seat->compositor;
+	struct wl_keyboard *keyboard = seat->seat.keyboard;
 	uint32_t *k, serial;
 
 	serial = wl_display_next_serial(compositor->wl_display);
-	wl_array_for_each(k, &seat->keyboard->keys) {
+	wl_array_for_each(k, &keyboard->keys) {
 		weston_compositor_idle_release(compositor);
-		update_modifier_state(ws, serial, *k,
+		update_modifier_state(seat, serial, *k,
 				      WL_KEYBOARD_KEY_STATE_RELEASED);
 	}
 
-	ws->modifier_state = 0;
+	seat->modifier_state = 0;
 
-	surface = ws->seat.keyboard->focus;
-
-	if (surface) {
-		ws->saved_kbd_focus = surface;
-		ws->saved_kbd_focus_listener.notify =
+	if (keyboard->focus) {
+		seat->saved_kbd_focus = keyboard->focus;
+		seat->saved_kbd_focus_listener.notify =
 			destroy_device_saved_kbd_focus;
-		wl_signal_add(&surface->resource.destroy_signal,
-			      &ws->saved_kbd_focus_listener);
+		wl_signal_add(&keyboard->focus->resource.destroy_signal,
+			      &seat->saved_kbd_focus_listener);
 	}
 
-	wl_keyboard_set_focus(ws->seat.keyboard, NULL);
+	wl_keyboard_set_focus(keyboard, NULL);
 	/* FIXME: We really need keyboard grab cancel here to
 	 * let the grab shut down properly.  As it is we leak
 	 * the grab data. */
-	wl_keyboard_end_grab(ws->seat.keyboard);
+	wl_keyboard_end_grab(keyboard);
 }
 
 static void
@@ -2133,11 +2126,11 @@
  *
  */
 WL_EXPORT void
-notify_touch(struct wl_seat *seat, uint32_t time, int touch_id,
+notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
              wl_fixed_t x, wl_fixed_t y, int touch_type)
 {
-	struct weston_seat *ws = (struct weston_seat *) seat;
-	struct weston_compositor *ec = ws->compositor;
+	struct weston_compositor *ec = seat->compositor;
+	struct wl_touch *touch = seat->seat.touch;
 	struct weston_surface *es;
 	wl_fixed_t sx, sy;
 	uint32_t serial = 0;
@@ -2146,44 +2139,44 @@
 	case WL_TOUCH_DOWN:
 		weston_compositor_idle_inhibit(ec);
 
-		ws->num_tp++;
+		seat->num_tp++;
 
 		/* the first finger down picks the surface, and all further go
 		 * to that surface for the remainder of the touch session i.e.
 		 * until all touch points are up again. */
-		if (ws->num_tp == 1) {
+		if (seat->num_tp == 1) {
 			es = weston_compositor_pick_surface(ec, x, y, &sx, &sy);
-			touch_set_focus(ws, &es->surface);
-		} else if (seat->touch->focus) {
-			es = (struct weston_surface *)seat->touch->focus;
+			touch_set_focus(seat, &es->surface);
+		} else if (touch->focus) {
+			es = (struct weston_surface *) touch->focus;
 			weston_surface_from_global_fixed(es, x, y, &sx, &sy);
 		}
 
-		if (seat->touch->focus_resource && seat->touch->focus)
-			wl_touch_send_down(seat->touch->focus_resource,
+		if (touch->focus_resource && touch->focus)
+			wl_touch_send_down(touch->focus_resource,
 					   serial, time,
-					   &seat->touch->focus->resource,
+					   &touch->focus->resource,
 					   touch_id, sx, sy);
 		break;
 	case WL_TOUCH_MOTION:
-		es = (struct weston_surface *)seat->touch->focus;
+		es = (struct weston_surface *) touch->focus;
 		if (!es)
 			break;
 
 		weston_surface_from_global_fixed(es, x, y, &sx, &sy);
-		if (seat->touch->focus_resource)
-			wl_touch_send_motion(seat->touch->focus_resource,
+		if (touch->focus_resource)
+			wl_touch_send_motion(touch->focus_resource,
 					     time, touch_id, sx, sy);
 		break;
 	case WL_TOUCH_UP:
 		weston_compositor_idle_release(ec);
-		ws->num_tp--;
+		seat->num_tp--;
 
-		if (seat->touch->focus_resource)
-			wl_touch_send_up(seat->touch->focus_resource,
+		if (touch->focus_resource)
+			wl_touch_send_up(touch->focus_resource,
 					 serial, time, touch_id);
-		if (ws->num_tp == 0)
-			touch_set_focus(ws, NULL);
+		if (seat->num_tp == 0)
+			touch_set_focus(seat, NULL);
 		break;
 	}
 }
@@ -2418,7 +2411,7 @@
 	seat = container_of(listener, struct weston_seat,
 			    new_drag_icon_listener);
 
-	weston_seat_update_drag_surface(&seat->seat, 0, 0);
+	weston_seat_update_drag_surface(seat, 0, 0);
 }
 
 static void weston_compositor_xkb_init(struct weston_compositor *ec,
@@ -2714,49 +2707,48 @@
 }
 
 static  void
-weston_seat_update_drag_surface(struct wl_seat *seat,
+weston_seat_update_drag_surface(struct weston_seat *seat,
 				int dx, int dy)
 {
 	int surface_changed = 0;
-	struct weston_seat *ws = (struct weston_seat *) seat;
 
-	if (!ws->drag_surface && !seat->drag_surface)
+	if (!seat->drag_surface && !seat->seat.drag_surface)
 		return;
 
-	if (ws->drag_surface && seat->drag_surface &&
-	    (&ws->drag_surface->surface.resource !=
-	     &seat->drag_surface->resource))
+	if (seat->drag_surface && seat->seat.drag_surface &&
+	    (&seat->drag_surface->surface.resource !=
+	     &seat->seat.drag_surface->resource))
 		/* between calls to this funcion we got a new drag_surface */
 		surface_changed = 1;
 
-	if (!seat->drag_surface || surface_changed) {
-		device_release_drag_surface(ws);
+	if (!seat->seat.drag_surface || surface_changed) {
+		device_release_drag_surface(seat);
 		if (!surface_changed)
 			return;
 	}
 
-	if (!ws->drag_surface || surface_changed) {
+	if (!seat->drag_surface || surface_changed) {
 		struct weston_surface *surface = (struct weston_surface *)
-			seat->drag_surface;
-		if (!device_setup_new_drag_surface(ws, surface))
+			seat->seat.drag_surface;
+		if (!device_setup_new_drag_surface(seat, surface))
 			return;
 	}
 
 	/* the client may not have attached a buffer to the drag surface
 	 * when we setup it up, so check if map is needed on every update */
-	device_map_drag_surface(ws);
+	device_map_drag_surface(seat);
 
 	/* the client may have attached a buffer with a different size to
 	 * the drag surface, causing the input region to be reset */
-	if (region_is_undefined(&ws->drag_surface->input))
-		empty_region(&ws->drag_surface->input);
+	if (region_is_undefined(&seat->drag_surface->input))
+		empty_region(&seat->drag_surface->input);
 
 	if (!dx && !dy)
 		return;
 
-	weston_surface_set_position(ws->drag_surface,
-				    ws->drag_surface->geometry.x + wl_fixed_to_double(dx),
-				    ws->drag_surface->geometry.y + wl_fixed_to_double(dy));
+	weston_surface_set_position(seat->drag_surface,
+				    seat->drag_surface->geometry.x + wl_fixed_to_double(dx),
+				    seat->drag_surface->geometry.y + wl_fixed_to_double(dy));
 }
 
 WL_EXPORT void
@@ -2765,7 +2757,7 @@
 	struct weston_seat *seat;
 
 	wl_list_for_each(seat, &compositor->seat_list, link)
-		weston_seat_update_drag_surface(&seat->seat, 0, 0);
+		weston_seat_update_drag_surface(seat, 0, 0);
 }
 
 static void
diff --git a/src/compositor.h b/src/compositor.h
index ccac91e..b66b2e7 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -502,33 +502,33 @@
 		    struct weston_output *output, pixman_region32_t *damage);
 
 void
-notify_motion(struct wl_seat *seat, uint32_t time,
+notify_motion(struct weston_seat *seat, uint32_t time,
 	      wl_fixed_t x, wl_fixed_t y);
 void
-notify_button(struct wl_seat *seat, uint32_t time, int32_t button,
+notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
 	      enum wl_pointer_button_state state);
 void
-notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis,
+notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
 	    wl_fixed_t value);
 void
-notify_key(struct wl_seat *seat, uint32_t time, uint32_t key,
+notify_key(struct weston_seat *seat, uint32_t time, uint32_t key,
 	   enum wl_keyboard_key_state state,
 	   enum weston_key_state_update update_state);
 void
-notify_modifiers(struct wl_seat *seat, uint32_t serial);
+notify_modifiers(struct weston_seat *seat, uint32_t serial);
 
 void
-notify_pointer_focus(struct wl_seat *seat, struct weston_output *output,
+notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
 		     wl_fixed_t x, wl_fixed_t y);
 
 void
-notify_keyboard_focus_in(struct wl_seat *seat, struct wl_array *keys,
+notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
 			 enum weston_key_state_update update_state);
 void
-notify_keyboard_focus_out(struct wl_seat *seat);
+notify_keyboard_focus_out(struct weston_seat *seat);
 
 void
-notify_touch(struct wl_seat *seat, uint32_t time, int touch_id,
+notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
 	     wl_fixed_t x, wl_fixed_t y, int touch_type);
 
 void
diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c
index 16478b8..e453f9d 100644
--- a/src/evdev-touchpad.c
+++ b/src/evdev-touchpad.c
@@ -442,7 +442,7 @@
 	case BTN_FORWARD:
 	case BTN_BACK:
 	case BTN_TASK:
-		notify_button(&device->seat->seat,
+		notify_button(device->seat,
 			      time, e->code,
 			      e->value ? WL_POINTER_BUTTON_STATE_PRESSED :
 			                 WL_POINTER_BUTTON_STATE_RELEASED);
diff --git a/src/evdev.c b/src/evdev.c
index 3c7b2f4..8848736 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -73,14 +73,14 @@
 	case BTN_FORWARD:
 	case BTN_BACK:
 	case BTN_TASK:
-		notify_button(&device->seat->seat,
+		notify_button(device->seat,
 			      time, e->code,
 			      e->value ? WL_POINTER_BUTTON_STATE_PRESSED :
 					 WL_POINTER_BUTTON_STATE_RELEASED);
 		break;
 
 	default:
-		notify_key(&device->seat->seat,
+		notify_key(device->seat,
 			   time, e->code,
 			   e->value ? WL_KEYBOARD_KEY_STATE_PRESSED :
 				      WL_KEYBOARD_KEY_STATE_RELEASED,
@@ -161,13 +161,13 @@
 		device->pending_events |= EVDEV_RELATIVE_MOTION;
 		break;
 	case REL_WHEEL:
-		notify_axis(&device->seat->seat,
+		notify_axis(device->seat,
 			      time,
 			      WL_POINTER_AXIS_VERTICAL_SCROLL,
 			      wl_fixed_from_int(e->value));
 		break;
 	case REL_HWHEEL:
-		notify_axis(&device->seat->seat,
+		notify_axis(device->seat,
 			      time,
 			      WL_POINTER_AXIS_HORIZONTAL_SCROLL,
 			      wl_fixed_from_int(e->value));
@@ -217,7 +217,7 @@
 		return;
 
 	if (device->pending_events & EVDEV_RELATIVE_MOTION) {
-		notify_motion(&master->seat, time,
+		notify_motion(master, time,
 			      master->seat.pointer->x + device->rel.dx,
 			      master->seat.pointer->y + device->rel.dy);
 		device->pending_events &= ~EVDEV_RELATIVE_MOTION;
@@ -225,7 +225,7 @@
 		device->rel.dy = 0;
 	}
 	if (device->pending_events & EVDEV_ABSOLUTE_MT_DOWN) {
-		notify_touch(&master->seat, time,
+		notify_touch(master, time,
 			     device->mt.slot,
 			     wl_fixed_from_int(device->mt.x[device->mt.slot]),
 			     wl_fixed_from_int(device->mt.y[device->mt.slot]),
@@ -234,7 +234,7 @@
 		device->pending_events &= ~EVDEV_ABSOLUTE_MT_MOTION;
 	}
 	if (device->pending_events & EVDEV_ABSOLUTE_MT_MOTION) {
-		notify_touch(&master->seat, time,
+		notify_touch(master, time,
 			     device->mt.slot,
 			     wl_fixed_from_int(device->mt.x[device->mt.slot]),
 			     wl_fixed_from_int(device->mt.y[device->mt.slot]),
@@ -243,12 +243,12 @@
 		device->pending_events &= ~EVDEV_ABSOLUTE_MT_MOTION;
 	}
 	if (device->pending_events & EVDEV_ABSOLUTE_MT_UP) {
-		notify_touch(&master->seat, time, device->mt.slot, 0, 0,
+		notify_touch(master, time, device->mt.slot, 0, 0,
 			     WL_TOUCH_UP);
 		device->pending_events &= ~EVDEV_ABSOLUTE_MT_UP;
 	}
 	if (device->pending_events & EVDEV_ABSOLUTE_MOTION) {
-		notify_motion(&master->seat, time,
+		notify_motion(master, time,
 			      wl_fixed_from_int(device->abs.x),
 			      wl_fixed_from_int(device->abs.y));
 		device->pending_events &= ~EVDEV_ABSOLUTE_MOTION;
@@ -588,7 +588,7 @@
 		}
 	}
 
-	notify_keyboard_focus_in(&seat->seat, &keys, STATE_UPDATE_AUTOMATIC);
+	notify_keyboard_focus_in(seat, &keys, STATE_UPDATE_AUTOMATIC);
 
 	wl_array_release(&keys);
 }