[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