diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2022-08-19 15:23:06 +0300 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2022-08-22 18:22:57 +0300 |
commit | 32791eae1fa3d5c354b2e6b684ca2e63397df917 (patch) | |
tree | 4fadd802078f0a10b9c07a88add1dc8330decbfb | |
parent | 8f1ca8204a4ca7fba132b9656717f1a30bff6798 (diff) | |
download | weston-32791eae1fa3d5c354b2e6b684ca2e63397df917.tar.gz |
simple-egl: Update buffer_size dimensions when starting as maximized
With commit 62ab6891db9763dd44228, 'clients/simple-egl: Handle buffer
scale and transform' we changed the way we resized the client, by
encapsulating the resize in update_buffer_geometry() function.
we didn't correct that when creating the EGL window, which might be
problematic if you attempt to start the window with different a
different state, like maximized.
Fixes 62ab6891db9763dd4
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
-rw-r--r-- | clients/simple-egl.c | 172 |
1 files changed, 89 insertions, 83 deletions
diff --git a/clients/simple-egl.c b/clients/simple-egl.c index c6fcc313..657ec49f 100644 --- a/clients/simple-egl.c +++ b/clients/simple-egl.c @@ -283,6 +283,92 @@ create_shader(struct window *window, const char *source, GLenum shader_type) return shader; } +static int32_t +compute_buffer_scale(struct window *window) +{ + struct window_output *window_output; + int32_t scale = 1; + + wl_list_for_each(window_output, &window->window_output_list, link) { + if (window_output->output->scale > scale) + scale = window_output->output->scale; + } + + return scale; +} + +static enum wl_output_transform +compute_buffer_transform(struct window *window) +{ + struct window_output *window_output; + enum wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL; + + wl_list_for_each(window_output, &window->window_output_list, link) { + /* If the surface spans over multiple outputs the optimal + * transform value can be ambiguous. Thus just return the value + * from the oldest entered output. + */ + transform = window_output->output->transform; + break; + } + + return transform; +} + +static void +update_buffer_geometry(struct window *window) +{ + enum wl_output_transform new_buffer_transform; + int32_t new_buffer_scale; + struct geometry new_buffer_size; + + new_buffer_transform = compute_buffer_transform(window); + if (window->buffer_transform != new_buffer_transform) { + window->buffer_transform = new_buffer_transform; + wl_surface_set_buffer_transform(window->surface, + window->buffer_transform); + } + + new_buffer_scale = compute_buffer_scale(window); + if (window->buffer_scale != new_buffer_scale) { + window->buffer_scale = new_buffer_scale; + wl_surface_set_buffer_scale(window->surface, + window->buffer_scale); + } + + switch (window->buffer_transform) { + case WL_OUTPUT_TRANSFORM_NORMAL: + case WL_OUTPUT_TRANSFORM_180: + case WL_OUTPUT_TRANSFORM_FLIPPED: + case WL_OUTPUT_TRANSFORM_FLIPPED_180: + new_buffer_size.width = window->logical_size.width; + new_buffer_size.height = window->logical_size.height; + break; + case WL_OUTPUT_TRANSFORM_90: + case WL_OUTPUT_TRANSFORM_270: + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + new_buffer_size.width = window->logical_size.height; + new_buffer_size.height = window->logical_size.width; + break; + } + + new_buffer_size.width *= window->buffer_scale; + new_buffer_size.height *= window->buffer_scale; + + if (window->buffer_size.width != new_buffer_size.width || + window->buffer_size.height != new_buffer_size.height) { + window->buffer_size = new_buffer_size; + if (window->native) + wl_egl_window_resize(window->native, + window->buffer_size.width, + window->buffer_size.height, 0, 0); + } + + window->needs_buffer_geometry_update = false; +} + + static void init_gl(struct window *window) { @@ -291,6 +377,9 @@ init_gl(struct window *window) GLint status; EGLBoolean ret; + if (window->needs_buffer_geometry_update) + update_buffer_geometry(window); + window->native = wl_egl_window_create(window->surface, window->buffer_size.width, window->buffer_size.height); @@ -515,89 +604,6 @@ destroy_surface(struct window *window) wl_surface_destroy(window->surface); } -static int32_t -compute_buffer_scale(struct window *window) -{ - struct window_output *window_output; - int32_t scale = 1; - - wl_list_for_each(window_output, &window->window_output_list, link) { - if (window_output->output->scale > scale) - scale = window_output->output->scale; - } - - return scale; -} - -static enum wl_output_transform -compute_buffer_transform(struct window *window) -{ - struct window_output *window_output; - enum wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL; - - wl_list_for_each(window_output, &window->window_output_list, link) { - /* If the surface spans over multiple outputs the optimal - * transform value can be ambiguous. Thus just return the value - * from the oldest entered output. - */ - transform = window_output->output->transform; - break; - } - - return transform; -} - -static void -update_buffer_geometry(struct window *window) -{ - enum wl_output_transform new_buffer_transform; - int32_t new_buffer_scale; - struct geometry new_buffer_size; - - new_buffer_transform = compute_buffer_transform(window); - if (window->buffer_transform != new_buffer_transform) { - window->buffer_transform = new_buffer_transform; - wl_surface_set_buffer_transform(window->surface, - window->buffer_transform); - } - - new_buffer_scale = compute_buffer_scale(window); - if (window->buffer_scale != new_buffer_scale) { - window->buffer_scale = new_buffer_scale; - wl_surface_set_buffer_scale(window->surface, - window->buffer_scale); - } - - switch (window->buffer_transform) { - case WL_OUTPUT_TRANSFORM_NORMAL: - case WL_OUTPUT_TRANSFORM_180: - case WL_OUTPUT_TRANSFORM_FLIPPED: - case WL_OUTPUT_TRANSFORM_FLIPPED_180: - new_buffer_size.width = window->logical_size.width; - new_buffer_size.height = window->logical_size.height; - break; - case WL_OUTPUT_TRANSFORM_90: - case WL_OUTPUT_TRANSFORM_270: - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - new_buffer_size.width = window->logical_size.height; - new_buffer_size.height = window->logical_size.width; - break; - } - - new_buffer_size.width *= window->buffer_scale; - new_buffer_size.height *= window->buffer_scale; - - if (window->buffer_size.width != new_buffer_size.width || - window->buffer_size.height != new_buffer_size.height) { - window->buffer_size = new_buffer_size; - wl_egl_window_resize(window->native, - window->buffer_size.width, - window->buffer_size.height, 0, 0); - } - - window->needs_buffer_geometry_update = false; -} static void redraw(struct window *window) |