diff --git a/src/server/frontend_wayland/basic_surface_event_sink.cpp b/src/server/frontend_wayland/basic_surface_event_sink.cpp index 9d470e5799e..5ca50b003d7 100644 --- a/src/server/frontend_wayland/basic_surface_event_sink.cpp +++ b/src/server/frontend_wayland/basic_surface_event_sink.cpp @@ -72,7 +72,13 @@ void mf::BasicSurfaceEventSink::handle_event(EventUPtr&& event) void mf::BasicSurfaceEventSink::handle_resize_event(MirResizeEvent const* event) { - requested_size = {mir_resize_event_get_width(event), mir_resize_event_get_height(event)}; + geometry::Size const new_size{mir_resize_event_get_width(event), mir_resize_event_get_height(event)}; + handle_resize(new_size); +} + +void mf::BasicSurfaceEventSink::handle_resize(mir::geometry::Size const& new_size) +{ + requested_size = new_size; if (requested_size != window_size) window->handle_resize(requested_size); } diff --git a/src/server/frontend_wayland/basic_surface_event_sink.h b/src/server/frontend_wayland/basic_surface_event_sink.h index 897c70a51df..1f9d81311d7 100644 --- a/src/server/frontend_wayland/basic_surface_event_sink.h +++ b/src/server/frontend_wayland/basic_surface_event_sink.h @@ -38,6 +38,7 @@ class BasicSurfaceEventSink : public EventSink ~BasicSurfaceEventSink(); void handle_event(EventUPtr&& event) override; + void handle_resize(mir::geometry::Size const& new_size); void handle_lifecycle_event(MirLifecycleState) override {} void handle_display_config_change(graphics::DisplayConfiguration const&) override {} diff --git a/src/server/frontend_wayland/wl_surface_role.cpp b/src/server/frontend_wayland/wl_surface_role.cpp index e663b747552..e099e1d2587 100644 --- a/src/server/frontend_wayland/wl_surface_role.cpp +++ b/src/server/frontend_wayland/wl_surface_role.cpp @@ -211,7 +211,7 @@ void WlAbstractMirWindow::create_mir_window() auto const client_size = window->client_size(); if (client_size != params->size) - handle_resize(client_size); + sink->handle_resize(client_size); } geometry::Size WlAbstractMirWindow::window_size() diff --git a/src/server/frontend_wayland/xdg_shell_v6.cpp b/src/server/frontend_wayland/xdg_shell_v6.cpp index 04856ab9140..8c97c26c2fb 100644 --- a/src/server/frontend_wayland/xdg_shell_v6.cpp +++ b/src/server/frontend_wayland/xdg_shell_v6.cpp @@ -426,9 +426,14 @@ void mf::XdgSurfaceV6::commit(mf::WlSurfaceState const& state) void mf::XdgSurfaceV6::handle_resize(geometry::Size const& new_size) { + auto const action = [notify_resize=notify_resize, new_size, sink=sink] + { notify_resize(new_size, sink->state(), sink->is_active()); }; + auto const serial = wl_display_next_serial(wl_client_get_display(client)); - notify_resize(new_size, sink->state(), sink->is_active()); + action(); zxdg_surface_v6_send_configure(resource, serial); + + set_next_commit_action(action); } // XdgPopupV6 @@ -463,8 +468,6 @@ mf::XdgToplevelV6::XdgToplevelV6(struct wl_client* client, struct wl_resource* p self->set_notify_resize( [this](geom::Size const& new_size, MirWindowState state, bool active) { - this->self->clear_next_commit_action(); - wl_array states; wl_array_init(&states);