[PATCH 1/2] shell: Fix setting a random position when buffer size changed.

zhiwen.wu at linux.intel.com zhiwen.wu at linux.intel.com
Tue Mar 13 02:12:45 PDT 2012


From: Alex Wu <zhiwen.wu at linux.intel.com>

When the configure() is triggered by a change of buffer size,
a toplevel surface which has not ever been switched to maximazied
or fullscreen will set a random position.

Modified the position restoring logic for toplevel surface. Store
the surface position when it switches from toplevel to other types
and restore the saved position in shell_surface_set_toplevel.
---
 src/shell.c |   35 ++++++++++-------------------------
 1 files changed, 10 insertions(+), 25 deletions(-)

diff --git a/src/shell.c b/src/shell.c
index 5abfdb5..25a4bd2 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -405,8 +405,12 @@ reset_shell_surface_type(struct shell_surface *surface)
 				       WL_DISPLAY_ERROR_INVALID_METHOD,
 				       "cannot reassign surface type");
 		return -1;
-	case SHELL_SURFACE_NONE:
 	case SHELL_SURFACE_TOPLEVEL:
+		surface->saved_x = surface->surface->geometry.x;
+		surface->saved_y = surface->surface->geometry.y;
+		surface->saved_position_valid = true;
+		break;
+	case SHELL_SURFACE_NONE:
 	case SHELL_SURFACE_TRANSIENT:
 	case SHELL_SURFACE_POPUP:
 		break;
@@ -427,6 +431,11 @@ shell_surface_set_toplevel(struct wl_client *client,
 	if (reset_shell_surface_type(surface))
 		return;
 
+	if (surface->saved_position_valid)
+		weston_surface_set_position(surface->surface,
+					    surface->saved_x,
+					    surface->saved_y);
+
 	surface->type = SHELL_SURFACE_TOPLEVEL;
 }
 
@@ -499,10 +508,6 @@ shell_surface_set_maximized(struct wl_client *client,
 	if (reset_shell_surface_type(shsurf))
 		return;
 
-	shsurf->saved_x = es->geometry.x;
-	shsurf->saved_y = es->geometry.y;
-	shsurf->saved_position_valid = true;
-
 	wlshell = shell_surface_get_shell(shsurf);
 	panel_height = get_output_panel_height(wlshell, es->output);
 	edges = WL_SHELL_SURFACE_RESIZE_TOP|WL_SHELL_SURFACE_RESIZE_LEFT;
@@ -623,12 +628,6 @@ shell_surface_set_fullscreen(struct wl_client *client,
 	if (reset_shell_surface_type(shsurf))
 		return;
 
-	if (shsurf->prev_type != SHELL_SURFACE_FULLSCREEN) {
-		shsurf->saved_x = es->geometry.x;
-		shsurf->saved_y = es->geometry.y;
-		shsurf->saved_position_valid = true;
-	}
-
 	shsurf->fullscreen_output = shsurf->output;
 	shsurf->fullscreen.type = method;
 	shsurf->fullscreen.framerate = framerate;
@@ -1723,20 +1722,6 @@ configure(struct weston_shell *base, struct weston_surface *surface,
 		surface->geometry.y = surface->output->y +
 			get_output_panel_height(shell,surface->output);
 		break;
-	case SHELL_SURFACE_TOPLEVEL:
-		if (prev_surface_type != SHELL_SURFACE_TOPLEVEL) {
-			if (shsurf->saved_position_valid &&
-			    shsurf->saved_x != surface->geometry.x &&
-			    shsurf->saved_y != surface->geometry.y) {
-				weston_surface_set_position(surface,
-							    shsurf->saved_x,
-							    shsurf->saved_y);
-			} else if (!shsurf->saved_position_valid) {
-				weston_surface_set_position(surface, 10 + random() % 400,
-							    10 + random() % 400);
-			}
-		}
-		break;
 	default:
 		break;
 	}
-- 
1.7.5.4



More information about the wayland-devel mailing list