diff --git a/src/compositor.c b/src/compositor.c index db5a32d5..f3823401 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 8e0b33b2..2fba05b2 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 14433288..7db0f49b 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)