Update to enter/leave events for pointer and keyboard
diff --git a/clients/window.c b/clients/window.c
index ac26f52..8c5d17b 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1575,7 +1575,7 @@
 }
 
 static void
-input_handle_pointer_focus(void *data,
+input_handle_pointer_enter(void *data,
 			   struct wl_input_device *input_device,
 			   uint32_t time, struct wl_surface *surface,
 			   int32_t sx, int32_t sy)
@@ -1584,20 +1584,24 @@
 	struct window *window;
 	struct widget *widget;
 
+	input->pointer_focus = wl_surface_get_user_data(surface);
 	window = input->pointer_focus;
-	if (window && window->surface != surface)
-		input_remove_pointer_focus(input, time);
 
-	if (surface) {
-		input->pointer_focus = wl_surface_get_user_data(surface);
-		window = input->pointer_focus;
+	input->sx = sx;
+	input->sy = sy;
 
-		input->sx = sx;
-		input->sy = sy;
+	widget = widget_find_widget(window->widget, sx, sy);
+	input_set_focus_widget(input, widget, time, sx, sy);
+}
 
-		widget = widget_find_widget(window->widget, sx, sy);
-		input_set_focus_widget(input, widget, time, sx, sy);
-	}
+static void
+input_handle_pointer_leave(void *data,
+			   struct wl_input_device *input_device,
+			   uint32_t time, struct wl_surface *surface)
+{
+	struct input *input = data;
+
+	input_remove_pointer_focus(input, time);
 }
 
 static void
@@ -1617,7 +1621,7 @@
 }
 
 static void
-input_handle_keyboard_focus(void *data,
+input_handle_keyboard_enter(void *data,
 			    struct wl_input_device *input_device,
 			    uint32_t time,
 			    struct wl_surface *surface,
@@ -1628,10 +1632,7 @@
 	struct display *d = input->display;
 	uint32_t *k, *end;
 
-	input_remove_keyboard_focus(input);
-
-	if (surface)
-		input->keyboard_focus = wl_surface_get_user_data(surface);
+	input->keyboard_focus = wl_surface_get_user_data(surface);
 
 	end = keys->data + keys->size;
 	input->modifiers = 0;
@@ -1639,13 +1640,22 @@
 		input->modifiers |= d->xkb->map->modmap[*k];
 
 	window = input->keyboard_focus;
-	if (window) {
-		window->keyboard_device = input;
-		if (window->keyboard_focus_handler)
-			(*window->keyboard_focus_handler)(window,
-							  window->keyboard_device,
-							  window->user_data);
-	}
+	window->keyboard_device = input;
+	if (window->keyboard_focus_handler)
+		(*window->keyboard_focus_handler)(window,
+						  window->keyboard_device,
+						  window->user_data);
+}
+
+static void
+input_handle_keyboard_leave(void *data,
+			    struct wl_input_device *input_device,
+			    uint32_t time,
+			    struct wl_surface *surface)
+{
+	struct input *input = data;
+
+	input_remove_keyboard_focus(input);
 }
 
 static void
@@ -1686,8 +1696,10 @@
 	input_handle_motion,
 	input_handle_button,
 	input_handle_key,
-	input_handle_pointer_focus,
-	input_handle_keyboard_focus,
+	input_handle_pointer_enter,
+	input_handle_pointer_leave,
+	input_handle_keyboard_enter,
+	input_handle_keyboard_leave,
 	input_handle_touch_down,
 	input_handle_touch_up,
 	input_handle_touch_motion,
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index d6757f0..386f9b6 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -531,7 +531,7 @@
 }
 
 static void
-input_handle_pointer_focus(void *data,
+input_handle_pointer_enter(void *data,
 			   struct wl_input_device *input_device,
 			   uint32_t time, struct wl_surface *surface,
 			   int32_t sx, int32_t sy)
@@ -540,43 +540,58 @@
 	struct wayland_output *output;
 	struct wayland_compositor *c = input->compositor;
 
-	if (surface) {
-		output = wl_surface_get_user_data(surface);
-		notify_pointer_focus(c->base.input_device,
-				     time, &output->base, sx, sy);
-
-		wl_input_device_attach(input->input_device, time, NULL, 0, 0);
-	} else {
-		notify_pointer_focus(c->base.input_device, time, NULL, 0, 0);
-	}
+	output = wl_surface_get_user_data(surface);
+	notify_pointer_focus(c->base.input_device,
+			     time, &output->base, sx, sy);
+	wl_input_device_attach(input->input_device, time, NULL, 0, 0);
 }
 
 static void
-input_handle_keyboard_focus(void *data,
-			     struct wl_input_device *input_device,
-			     uint32_t time,
-			     struct wl_surface *surface,
-			     struct wl_array *keys)
+input_handle_pointer_leave(void *data,
+			   struct wl_input_device *input_device,
+			   uint32_t time, struct wl_surface *surface)
+{
+	struct wayland_input *input = data;
+	struct wayland_compositor *c = input->compositor;
+
+	notify_pointer_focus(c->base.input_device, time, NULL, 0, 0);
+}
+
+static void
+input_handle_keyboard_enter(void *data,
+			    struct wl_input_device *input_device,
+			    uint32_t time,
+			    struct wl_surface *surface,
+			    struct wl_array *keys)
 {
 	struct wayland_input *input = data;
 	struct wayland_compositor *c = input->compositor;
 	struct wayland_output *output;
 
-	if (surface) {
-		output = wl_surface_get_user_data(surface);
-		notify_keyboard_focus(c->base.input_device,
-				      time, &output->base, keys);
-	} else {
-		notify_keyboard_focus(c->base.input_device, time, NULL, NULL);
-	}
+	output = wl_surface_get_user_data(surface);
+	notify_keyboard_focus(c->base.input_device, time, &output->base, keys);
+}
+
+static void
+input_handle_keyboard_leave(void *data,
+			    struct wl_input_device *input_device,
+			    uint32_t time,
+			    struct wl_surface *surface)
+{
+	struct wayland_input *input = data;
+	struct wayland_compositor *c = input->compositor;
+
+	notify_keyboard_focus(c->base.input_device, time, NULL, NULL);
 }
 
 static const struct wl_input_device_listener input_device_listener = {
 	input_handle_motion,
 	input_handle_button,
 	input_handle_key,
-	input_handle_pointer_focus,
-	input_handle_keyboard_focus,
+	input_handle_pointer_enter,
+	input_handle_pointer_leave,
+	input_handle_keyboard_enter,
+	input_handle_keyboard_leave,
 };
 
 static void