1) Width and height of Panel and Background depend on output's, therefore they should be bound with output changes including mode, transform and scale.
2) Update the min_allocation before resize the panel and background window. Add window_set_min_allocation function because it is invisible outside window.c. Signed-off-by: Quanxian Wang <[email protected]> --- clients/desktop-shell.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++-- clients/window.c | 7 +++++ clients/window.h | 2 ++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index a0c6b6d..dc98ea1 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -103,6 +103,15 @@ struct output { struct panel *panel; struct background *background; + struct { + int height; + int width; + uint32_t refresh; + } mode; + + uint32_t interface_version; + uint32_t transform; + uint32_t scale; }; struct panel_launcher { @@ -1145,6 +1154,39 @@ desktop_destroy_outputs(struct desktop *desktop) } static void +update_output(struct output *output) +{ + struct panel *panel = output->panel; + struct background *background = output->background; + int width, height; + + width = output->mode.width; + height = output->mode.height; + + switch (output->transform) { + case WL_OUTPUT_TRANSFORM_90: + case WL_OUTPUT_TRANSFORM_270: + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + /* Swap width and height */ + width = output->mode.height; + height = output->mode.width; + break; + default: + break; + } + + width /= output->scale; + height /= output->scale; + + window_set_min_allocation(panel->window, width, 32); + window_set_min_allocation(background->window, width, height); + + window_schedule_resize(background->window, width, height); + window_schedule_resize(panel->window, width, 32); +} + +static void output_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, @@ -1157,6 +1199,11 @@ output_handle_geometry(void *data, { struct output *output = data; + output->transform = transform; + + if (output->interface_version < 2) + update_output(output); + window_set_buffer_transform(output->panel->window, transform); window_set_buffer_transform(output->background->window, transform); } @@ -1169,12 +1216,28 @@ output_handle_mode(void *data, int height, int refresh) { + struct output *output = data; + + if (flags & WL_OUTPUT_MODE_CURRENT) { + if (!output) + return; + + output->mode.width = width; + output->mode.height = height; + output->mode.refresh = refresh; + + if (output->interface_version < 2) + update_output(output); + } } static void output_handle_done(void *data, struct wl_output *wl_output) { + struct output *output = data; + + update_output(output); } static void @@ -1184,6 +1247,8 @@ output_handle_scale(void *data, { struct output *output = data; + output->scale = scale; + window_set_buffer_scale(output->panel->window, scale); window_set_buffer_scale(output->background->window, scale); } @@ -1212,7 +1277,7 @@ output_init(struct output *output, struct desktop *desktop) } static void -create_output(struct desktop *desktop, uint32_t id) +create_output(struct desktop *desktop, uint32_t id, uint32_t version) { struct output *output; @@ -1220,9 +1285,13 @@ create_output(struct desktop *desktop, uint32_t id) if (!output) return; + output->interface_version = (version < 2) ? version : 2; output->output = - display_bind(desktop->display, id, &wl_output_interface, 2); + display_bind(desktop->display, id, + &wl_output_interface, + output->interface_version); output->server_output_id = id; + output->scale = 1; wl_output_add_listener(output->output, &output_listener, output); @@ -1247,7 +1316,7 @@ global_handler(struct display *display, uint32_t id, desktop->interface_version); desktop_shell_add_listener(desktop->shell, &listener, desktop); } else if (!strcmp(interface, "wl_output")) { - create_output(desktop, id); + create_output(desktop, id, version); } } diff --git a/clients/window.c b/clients/window.c index c8287e2..6c01222 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3839,6 +3839,13 @@ undo_resize(struct window *window) } void +window_set_min_allocation(struct window *window, int width, int height) +{ + window->min_allocation.width = width; + window->min_allocation.height = height; +} + +void window_schedule_resize(struct window *window, int width, int height) { /* We should probably get these numbers from the theme. */ diff --git a/clients/window.h b/clients/window.h index 54b848b..b221b76 100644 --- a/clients/window.h +++ b/clients/window.h @@ -336,6 +336,8 @@ void window_schedule_redraw(struct window *window); void window_schedule_resize(struct window *window, int width, int height); +void +window_set_min_allocation(struct window *window, int width, int height); void window_damage(struct window *window, int32_t x, int32_t y, -- 1.8.1.2 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
