input: add a weston_pointer_clear_focus() helper function

Valgrind has shown that in at least one place (default_grab_pointer_focus)
we're testing uninitialized values coming out of weston_compositor_pick_view.

This is happening when default_grab_pointer_focus is called when there is
nothing on the view list, and during the first repaint when only the black
surface with no input region exists.

This patch adds a function to clear pointer focus and also set the sx,sy
co-ordinates to a sentinel value we shouldn't compute with.

Assertions are added to make sure any time pointer focus is set to NULL
these values are used.

weston_compositor_pick_view() now returns these values too.

Now the values are always initialized, even when no view exists, and
they're initialized in such a way that actually doing computation
with them should fail in an obvious way, but we can compare them
safely for equality.

Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
diff --git a/src/input.c b/src/input.c
index 3227db4..e230c83 100644
--- a/src/input.c
+++ b/src/input.c
@@ -82,7 +82,7 @@
 		container_of(listener, struct weston_pointer,
 			     focus_view_listener);
 
-	weston_pointer_set_focus(pointer, NULL, 0, 0);
+	weston_pointer_clear_focus(pointer);
 }
 
 static void
@@ -92,7 +92,7 @@
 		container_of(listener, struct weston_pointer,
 			     focus_resource_listener);
 
-	weston_pointer_set_focus(pointer, NULL, 0, 0);
+	weston_pointer_clear_focus(pointer);
 }
 
 static void
@@ -498,6 +498,9 @@
 	wl_signal_add(&seat->compositor->output_destroyed_signal,
 		      &pointer->output_destroy_listener);
 
+	pointer->sx = wl_fixed_from_int(-1000000);
+	pointer->sy = wl_fixed_from_int(-1000000);
+
 	return pointer;
 }
 
@@ -628,6 +631,26 @@
 	wl_signal_emit(&seat->updated_caps_signal, seat);
 }
 
+
+/** Clear the pointer focus
+ *
+ * \param pointer the pointer to clear focus for.
+ *
+ * This can be used to unset pointer focus and set the co-ordinates to the
+ * arbitrary values we use for the no focus case.
+ *
+ * There's no requirement to use this function.  For example, passing the
+ * results of a weston_compositor_pick_view() directly to
+ * weston_pointer_set_focus() will do the right thing when no view is found.
+ */
+WL_EXPORT void
+weston_pointer_clear_focus(struct weston_pointer *pointer)
+{
+	weston_pointer_set_focus(pointer, NULL,
+				 wl_fixed_from_int(-1000000),
+				 wl_fixed_from_int(-1000000));
+}
+
 WL_EXPORT void
 weston_pointer_set_focus(struct weston_pointer *pointer,
 			 struct weston_view *view,
@@ -699,6 +722,9 @@
 	pointer->sx = sx;
 	pointer->sy = sy;
 
+	assert(view || sx == wl_fixed_from_int(-1000000));
+	assert(view || sy == wl_fixed_from_int(-1000000));
+
 	wl_signal_emit(&pointer->focus_signal, pointer);
 }
 
@@ -2271,9 +2297,7 @@
 
 	seat->pointer_device_count--;
 	if (seat->pointer_device_count == 0) {
-		weston_pointer_set_focus(pointer, NULL,
-					 wl_fixed_from_int(0),
-					 wl_fixed_from_int(0));
+		weston_pointer_clear_focus(pointer);
 		weston_pointer_cancel_grab(pointer);
 
 		if (pointer->sprite)