[weston PATCH v6 4/7] shell:update the scale and fill method
juan.j.zhao at linux.intel.com
juan.j.zhao at linux.intel.com
Thu Feb 16 23:26:13 PST 2012
From: Juan Zhao <juan.j.zhao at linux.intel.com>
---
src/compositor.h | 2 ++
src/shell.c | 30 +++++++++++++++++++++++++-----
2 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/src/compositor.h b/src/compositor.h
index aa62c81..94f5cc3 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -292,6 +292,8 @@ struct weston_surface {
uint32_t framerate;
uint32_t fs_method;
struct weston_output *fullscreen_output;
+ struct weston_transform fullscreen_transform; /* matrix from x, y */
+ int setted;
} fs_support;
/*
diff --git a/src/shell.c b/src/shell.c
index 03c4059..1d95313 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -352,6 +352,10 @@ reset_shell_surface_type(struct shell_surface *surface)
surface->saved_x,
surface->saved_y);
surface->surface->fs_support.fullscreen_output = NULL;
+ surface->surface->fs_support.setted = 0;
+ if (surface->surface->fs_support.fullscreen_transform.link.prev ||
+ surface->surface->fs_support.fullscreen_transform.link.next)
+ wl_list_remove(&surface->surface->fs_support.fullscreen_transform.link);
break;
case SHELL_SURFACE_PANEL:
case SHELL_SURFACE_BACKGROUND:
@@ -1303,14 +1307,30 @@ static int
weston_surface_set_fullscreen(struct weston_surface *surface)
{
struct weston_output *output = surface->fs_support.fullscreen_output;
+ struct weston_matrix *matrix = &surface->fs_support.fullscreen_transform.matrix;
+ struct shell_surface *shsurf;
+
center_on_output(surface, output);
+ surface->output = output;
switch(surface->fs_support.fs_method) {
case WESTON_SURFACE_FULLSCREEN_DEFAULT:
weston_surface_damage(surface);
break;
case WESTON_SURFACE_FULLSCREEN_SCALE:
+ if (!surface->fs_support.setted){
+ wl_list_init(&surface->fs_support.fullscreen_transform.link);
+ weston_matrix_init(matrix);
+ weston_matrix_scale(matrix,
+ (float)output->current->width/(float)surface->geometry.width,
+ (float)output->current->width/(float)surface->geometry.width,
+ 1.0);
+ wl_list_insert(surface->geometry.transformation_list.prev,
+ &surface->fs_support.fullscreen_transform.link);
+ }
+ weston_surface_set_position(surface, output->x, output->y);
weston_surface_damage(surface);
+ weston_output_damage(output);
break;
case WESTON_SURFACE_FULLSCREEN_DRIVER:
break;
@@ -1321,6 +1341,8 @@ weston_surface_set_fullscreen(struct weston_surface *surface)
break;
}
+ surface->fs_support.setted = 1;
+
return 0;
}
@@ -1365,14 +1387,11 @@ top_regular_surface (struct weston_shell *base)
static bool
is_fullscreen_surface (struct weston_surface *base)
{
- struct shell_surface *shsurf;
enum shell_surface_type surf_type;
-
+
if (!base) {
return false;
}
-
- shsurf = get_shell_surface (base);
surf_type = get_shell_surface_type (base);
if (surf_type == SHELL_SURFACE_FULLSCREEN)
@@ -1393,7 +1412,7 @@ prepare_repaint (struct weston_shell *base, struct weston_output *output)
top_regular_surf = top_regular_surface (base);
- if (is_fullscreen_surface (top_regular_surf)){
+ if (is_fullscreen_surface (top_regular_surf)){
if (wl_list_empty (&shell->hidden_panels) && !wl_list_empty (&shell->panels)) {
/*hide panels*/
wl_list_for_each(panel, &shell->panels, link) {
@@ -1403,6 +1422,7 @@ prepare_repaint (struct weston_shell *base, struct weston_output *output)
}
do_damage = true;
}
+ weston_surface_set_fullscreen(top_regular_surf);
} else {
if (!wl_list_empty (&shell->hidden_panels)) {
/*unhide panels*/
--
1.7.5.4
More information about the wayland-devel
mailing list