From 58027c095f51bd4f68e45b0bc21a7ed3edb8c747 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 16:51:46 -0700 Subject: [PATCH] snapshot previous buffer so that we don't have ghosting anymore on rotate (this also makes resizing A Bit better) --- include/Mw/LowLevel/Wayland.h | 2 ++ src/backend/wayland/wayland.c | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index 9123458..c176ee2 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -428,6 +428,8 @@ struct _MwLLWayland { MwBool do_cascading_draw; int cascading_child_num; + cairo_surface_t* snapshot; + MwBool dispatching_resize; struct _MwLLWaylandShmBuffer framebuffer; diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index 650e949..24c6a1b 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -939,6 +939,13 @@ static void draw_children(MwLL handle) { cairo_reset_clip(handle->wayland.cairo.front_cairo_back); + if(handle->wayland.snapshot) { + cairo_set_operator(handle->wayland.cairo.front_cairo_back, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface(handle->wayland.cairo.front_cairo_back, handle->wayland.snapshot, 0, 0); + cairo_paint(handle->wayland.cairo.front_cairo_back); + cairo_set_operator(handle->wayland.cairo.front_cairo_back, CAIRO_OPERATOR_OVER); + } + MwLLWaylandChildrenIterate(handle, draw_child); if(handle->wayland.configured) MwLLWaylandBufferUpdate(handle, &handle->wayland.framebuffer); @@ -1299,6 +1306,21 @@ static void MwLLEndDrawImpl(MwLL handle) { } root->wayland.do_cascading_draw = MwTRUE; + if(handle->wayland.snapshot) { + cairo_surface_destroy(handle->wayland.snapshot); + handle->wayland.snapshot = NULL; + } + if(handle->wayland.ww > 0 && handle->wayland.wh > 0) { + cairo_t* snap_cr; + + handle->wayland.snapshot = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, handle->wayland.ww, handle->wayland.wh); + snap_cr = cairo_create(handle->wayland.snapshot); + cairo_set_operator(snap_cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface(snap_cr, handle->wayland.cairo.front_cs_back, 0, 0); + cairo_paint(snap_cr); + cairo_destroy(snap_cr); + } + if(handle->wayland.configured) { if(handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) { MwLLWaylandBufferUpdate(handle, &handle->wayland.backbuffer);