From 355748e3b5db5d6d4de55095a2b5f5ec86c95a38 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 28 May 2013 16:23:38 +0200 Subject: [PATCH] shell: Use buffer_scale as output scale on fullscreen DRIVER It may happen that you e.g. fullscreen a 800x600 surface with buffer_scale 1 (e.g. a 800x600 buffer) on an output that is otherwise scale 2. In this case we want to temporarily set the output scale to 1, as we're really scanning out of a scale 1 buffer. This causes us to e.g. report the input positions in the right place, etc. When we restore the original mode we also restore the original scale. Note that the scale change is a purely compositor internal change, to clients it still looks like the output is scale 2. --- src/compositor.c | 4 +++- src/compositor.h | 2 +- src/shell.c | 12 +++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index db5a32d..f382340 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -96,7 +96,7 @@ weston_output_transform_scale_init(struct weston_output *output, uint32_t transform, uint32_t scale); WL_EXPORT int -weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode) +weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, int32_t scale) { struct weston_seat *seat; pixman_region32_t old_output_region; @@ -109,6 +109,8 @@ weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode if (ret < 0) return ret; + output->scale = scale; + pixman_region32_init(&old_output_region); pixman_region32_copy(&old_output_region, &output->region); diff --git a/src/compositor.h b/src/compositor.h index 8e0b33b..2fba05b 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1141,7 +1141,7 @@ void weston_surface_destroy(struct weston_surface *surface); int -weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode); +weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, int32_t scale); int noop_renderer_init(struct weston_compositor *ec); diff --git a/src/shell.c b/src/shell.c index 1443328..7db0f49 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1503,7 +1503,8 @@ shell_unset_fullscreen(struct shell_surface *shsurf) if (shsurf->fullscreen.type == WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER && shell_surface_is_top_fullscreen(shsurf)) { weston_output_switch_mode(shsurf->fullscreen_output, - shsurf->fullscreen_output->origin); + shsurf->fullscreen_output->origin, + shsurf->fullscreen_output->origin_scale); } shsurf->fullscreen.type = WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT; shsurf->fullscreen.framerate = 0; @@ -1797,11 +1798,11 @@ shell_configure_fullscreen(struct shell_surface *shsurf) case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER: if (shell_surface_is_top_fullscreen(shsurf)) { struct weston_mode mode = {0, - surf_width, - surf_height, + surf_width * surface->buffer_scale, + surf_height * surface->buffer_scale, shsurf->fullscreen.framerate}; - if (weston_output_switch_mode(output, &mode) == 0) { + if (weston_output_switch_mode(output, &mode, surface->buffer_scale) == 0) { weston_surface_configure(shsurf->fullscreen.black_surface, output->x - surf_x, output->y - surf_y, @@ -2148,7 +2149,8 @@ destroy_shell_surface(struct shell_surface *shsurf) if (shsurf->fullscreen.type == WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER && shell_surface_is_top_fullscreen(shsurf)) { weston_output_switch_mode(shsurf->fullscreen_output, - shsurf->fullscreen_output->origin); + shsurf->fullscreen_output->origin, + shsurf->fullscreen_output->origin_scale); } if (shsurf->fullscreen.black_surface) -- 2.7.4