window: Replace widget focus handler with a enter/leave handler pair
diff --git a/clients/window.c b/clients/window.c
index d3507e9..00850a0 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -152,7 +152,8 @@
 	struct window *window;
 	struct wl_list link;
 	struct rectangle allocation;
-	widget_focus_handler_t focus_handler;
+	widget_enter_handler_t enter_handler;
+	widget_leave_handler_t leave_handler;
 	void *user_data;
 };
 
@@ -1102,9 +1103,15 @@
 }
 
 void
-widget_set_focus_handler(struct widget *widget, widget_focus_handler_t handler)
+widget_set_enter_handler(struct widget *widget, widget_enter_handler_t handler)
 {
-	widget->focus_handler = handler;
+	widget->enter_handler = handler;
+}
+
+void
+widget_set_leave_handler(struct widget *widget, widget_leave_handler_t handler)
+{
+	widget->leave_handler = handler;
 }
 
 void
@@ -1237,17 +1244,27 @@
 }
 
 static void
-window_set_focus_widget(struct window *window, struct widget *focus)
+window_set_focus_widget(struct window *window, struct widget *focus,
+			struct input *input, uint32_t time, int32_t x, int32_t y)
 {
-	void *data;
+	struct widget *old;
 
 	if (focus == window->focus_widget)
 		return;
 
-	window->focus_widget = focus;
-	data = focus ? focus->user_data : NULL;
-	if (focus && focus->focus_handler)
-		focus->focus_handler(focus, data);
+	old = window->focus_widget;
+	if (old) {
+		if (old->leave_handler)
+			old->leave_handler(old, input, old->user_data);
+		window->focus_widget = NULL;
+	}
+
+	if (focus) {
+		if (focus->enter_handler)
+			focus->enter_handler(focus, input, time,
+					     x, y, focus->user_data);
+		window->focus_widget = focus;
+	}
 }
 
 static void
@@ -1267,7 +1284,7 @@
 
 	if (!window->focus_widget || !window->widget_grab_button) {
 		widget = window_find_widget(window, sx, sy);
-		window_set_focus_widget(window, widget);
+		window_set_focus_widget(window, widget, input, time, sx, sy);
 	}
 
 	if (window->motion_handler)
@@ -1383,7 +1400,8 @@
 	    window->widget_grab_button == button && !state) {
 		window->widget_grab_button = 0;
 		widget = window_find_widget(window, input->sx, input->sy);
-		window_set_focus_widget(window, widget);
+		window_set_focus_widget(window, widget, input, time,
+					input->sx, input->sy);
 	}
 }
 
@@ -1425,7 +1443,7 @@
 	if (!window)
 		return;
 
-	window_set_focus_widget(window, NULL);
+	window_set_focus_widget(window, NULL, NULL, 0, 0, 0);
 
 	if (window->leave_handler)
 		window->leave_handler(window, input, time, window->user_data);
@@ -1464,7 +1482,7 @@
 							window->user_data);
 
 		widget = window_find_widget(window, x, y);
-		window_set_focus_widget(window, widget);
+		window_set_focus_widget(window, widget, input, time, sx, sy);
 
 		pointer = input_get_pointer_image_for_location(input, pointer);
 		input_set_pointer_image(input, time, pointer);