diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index 11442214..6f1049f2 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -829,7 +829,7 @@ impl WlSurface { if self.need_extents_update.get() { self.calculate_extents(); } - if buffer_transform_changed || transform_changed { + if buffer_changed || transform_changed { for (_, cursor) in &self.cursors { cursor.handle_buffer_change(); } diff --git a/src/ifs/wl_surface/cursor.rs b/src/ifs/wl_surface/cursor.rs index 11fb17d8..6df8b60f 100644 --- a/src/ifs/wl_surface/cursor.rs +++ b/src/ifs/wl_surface/cursor.rs @@ -6,9 +6,9 @@ use { leaks::Tracker, rect::Rect, render::Renderer, - tree::OutputNode, + tree::{Node, NodeVisitorBase, OutputNode}, }, - std::{cell::Cell, rc::Rc}, + std::{cell::Cell, ops::Deref, rc::Rc}, }; pub struct CursorSurface { @@ -82,6 +82,22 @@ impl Cursor for CursorSurface { fn render_hardware_cursor(&self, renderer: &mut Renderer) { let extents = self.surface.extents.get(); renderer.render_surface(&self.surface, -extents.x1(), -extents.y1()); + + struct FrameRequests; + impl NodeVisitorBase for FrameRequests { + fn visit_surface(&mut self, node: &Rc) { + for fr in node.frame_requests.borrow_mut().drain(..) { + fr.send_done(); + let _ = fr.client.remove_obj(fr.deref()); + } + for fr in node.presentation_feedback.borrow_mut().drain(..) { + fr.send_discarded(); + let _ = fr.client.remove_obj(fr.deref()); + } + node.node_visit_children(self); + } + } + FrameRequests.visit_surface(&self.surface); } fn extents_at_scale(&self, scale: Fixed) -> Rect {