diff --git a/src/server/frontend_wayland/window_wl_surface_role.cpp b/src/server/frontend_wayland/window_wl_surface_role.cpp index 955d90732e..408410f10b 100644 --- a/src/server/frontend_wayland/window_wl_surface_role.cpp +++ b/src/server/frontend_wayland/window_wl_surface_role.cpp @@ -272,7 +272,7 @@ void mf::WindowWlSurfaceRole::set_fullscreen(std::experimental::optionalstate = mir_window_state_fullscreen; if (output) params->output_id = output_manager->output_id_for(client, output.value()); - create_mir_window(); + create_scene_surface(); } } @@ -299,7 +299,7 @@ void mf::WindowWlSurfaceRole::set_state_now(MirWindowState state) else { params->state = state; - create_mir_window(); + create_scene_surface(); } } @@ -386,7 +386,7 @@ void mf::WindowWlSurfaceRole::commit(WlSurfaceState const& state) } else { - create_mir_window(); + create_scene_surface(); } committed_size = size; @@ -427,8 +427,11 @@ mir::shell::SurfaceSpecification& mf::WindowWlSurfaceRole::spec() return *pending_changes; } -void mf::WindowWlSurfaceRole::create_mir_window() +void mf::WindowWlSurfaceRole::create_scene_surface() { + if (weak_scene_surface.lock()) + return; + params->size = pending_size(); params->streams = std::vector{}; params->input_shape = std::vector{}; diff --git a/src/server/frontend_wayland/window_wl_surface_role.h b/src/server/frontend_wayland/window_wl_surface_role.h index 1ebb2394e2..f66975a88c 100644 --- a/src/server/frontend_wayland/window_wl_surface_role.h +++ b/src/server/frontend_wayland/window_wl_surface_role.h @@ -88,6 +88,7 @@ class WindowWlSurfaceRole : public WlSurfaceRole void set_server_side_decorated(bool server_side_decorated); void set_state_now(MirWindowState state); + void create_scene_surface(); /// Gets called after the surface has committed (so current_size() may return the committed buffer size) but before /// the Mir window is modified (so if a pending size is set or a spec is applied those changes will take effect) @@ -153,7 +154,6 @@ class WindowWlSurfaceRole : public WlSurfaceRole void visiblity(bool visible) override; shell::SurfaceSpecification& spec(); - void create_mir_window(); }; } diff --git a/src/server/frontend_wayland/wl_pointer.cpp b/src/server/frontend_wayland/wl_pointer.cpp index 83c807b0a6..16a89d3890 100644 --- a/src/server/frontend_wayland/wl_pointer.cpp +++ b/src/server/frontend_wayland/wl_pointer.cpp @@ -55,13 +55,12 @@ class BufferCursorImage : public mg::CursorImage auto pixel_source = dynamic_cast(buffer.native_buffer_base()); if (pixel_source) { - pixel_source->read([&](unsigned char const* buffer_pixels) + size_t const buffer_size_bytes = buffer_size.width.as_int() * buffer_size.height.as_int() + * MIR_BYTES_PER_PIXEL(buffer.pixel_format()); + pixels = std::unique_ptr(new unsigned char[buffer_size_bytes]); + + pixel_source->read([this, buffer_size_bytes](unsigned char const* buffer_pixels) { - size_t buffer_size_bytes = buffer_size.width.as_int() * buffer_size.height.as_int() - * MIR_BYTES_PER_PIXEL(buffer.pixel_format()); - pixels = std::unique_ptr( - new unsigned char[buffer_size_bytes] - ); memcpy(pixels.get(), buffer_pixels, buffer_size_bytes); }); } diff --git a/src/server/frontend_xwayland/xwayland_wm_surface.cpp b/src/server/frontend_xwayland/xwayland_wm_surface.cpp index 169e1bac38..10957328bf 100644 --- a/src/server/frontend_xwayland/xwayland_wm_surface.cpp +++ b/src/server/frontend_xwayland/xwayland_wm_surface.cpp @@ -99,7 +99,10 @@ void mf::XWaylandWMSurface::set_surface(WlSurface *wls) if (!properties.title.empty()) shell_surface->set_title(properties.title); - shell_surface->set_state_now(mir_window_state_restored); + // If a buffer has alread been committed, we need to create the scene::Surface without waiting for next commit + if (wls->buffer_size()) + shell_surface->create_scene_surface(); + xcb_flush(xwm->get_xcb_connection()); }