desktop-shell: Invalidate saved position when output is destroyed

If the saved position for a fullscreen or maximized output view is in an
output that has been unplugged, the coordinates don't make sense
anymore. In that case, invalidate them and use the initial position
algorithm when changing them back to the basic state.

Signed-off-by: Zhang, Xiong Y <xiong.y.zhang@intel.com>
Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 9fbac00..f70b310 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -2206,6 +2206,10 @@
 }
 
 static void
+weston_view_set_initial_position(struct weston_view *view,
+				 struct desktop_shell *shell);
+
+static void
 unset_fullscreen(struct shell_surface *shsurf)
 {
 	/* Unset the fullscreen output, driver configuration and transforms. */
@@ -2225,8 +2229,12 @@
 		weston_surface_destroy(shsurf->fullscreen.black_view->surface);
 	shsurf->fullscreen.black_view = NULL;
 
-	weston_view_set_position(shsurf->view,
-				 shsurf->saved_x, shsurf->saved_y);
+	if (shsurf->saved_position_valid)
+		weston_view_set_position(shsurf->view,
+					 shsurf->saved_x, shsurf->saved_y);
+	else
+		weston_view_set_initial_position(shsurf->view, shsurf->shell);
+
 	if (shsurf->saved_rotation_valid) {
 		wl_list_insert(&shsurf->view->geometry.transformation_list,
 		               &shsurf->rotation.transform.link);
@@ -2323,9 +2331,12 @@
 {
 	/* undo all maximized things here */
 	shsurf->output = get_default_output(shsurf->surface->compositor);
-	weston_view_set_position(shsurf->view,
-				 shsurf->saved_x,
-				 shsurf->saved_y);
+
+	if (shsurf->saved_position_valid)
+		weston_view_set_position(shsurf->view,
+					 shsurf->saved_x, shsurf->saved_y);
+	else
+		weston_view_set_initial_position(shsurf->view, shsurf->shell);
 
 	if (shsurf->saved_rotation_valid) {
 		wl_list_insert(&shsurf->view->geometry.transformation_list,
@@ -2907,6 +2918,8 @@
 
 static void
 shell_surface_configure(struct weston_surface *, int32_t, int32_t);
+static void
+shell_surface_output_destroyed(struct weston_surface *);
 
 struct shell_surface *
 get_shell_surface(struct weston_surface *surface)
@@ -2943,6 +2956,7 @@
 
 	surface->configure = shell_surface_configure;
 	surface->configure_private = shsurf;
+	surface->output_destroyed = shell_surface_output_destroyed;
 
 	shsurf->shell = (struct desktop_shell *) shell;
 	shsurf->unresponsive = 0;
@@ -4955,6 +4969,14 @@
 	}
 }
 
+static void
+shell_surface_output_destroyed(struct weston_surface *es)
+{
+	struct shell_surface *shsurf = get_shell_surface(es);
+
+	shsurf->saved_position_valid = false;
+}
+
 static void launch_desktop_shell_process(void *data);
 
 static void