diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index 9cc4bb3d..fbc67207 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -310,7 +310,7 @@ pub struct WlSurface { pub buf_y: NumCell, pub children: RefCell>>, ext: CloneCell>, - frame_requests: RefCell>>, + frame_requests: RefCell>, presentation_feedback: RefCell>>, latched_presentation_feedback: RefCell>>, seat_state: NodeSeatState, @@ -465,7 +465,7 @@ struct PendingState { offset: (i32, i32), opaque_region: Option>>, input_region: Option>>, - frame_request: Vec>, + frame_request: Vec, damage_full: bool, buffer_damage: Vec, surface_damage: Vec, @@ -1094,7 +1094,10 @@ impl WlSurfaceRequestHandler for WlSurface { let cb = Rc::new(WlCallback::new(req.callback, &self.client)); track!(self.client, cb); self.client.add_client_obj(&cb)?; - self.pending.borrow_mut().frame_request.push(cb); + self.pending + .borrow_mut() + .frame_request + .push(FrameRequest { now: 0, cb }); Ok(()) } @@ -2197,10 +2200,10 @@ efrom!(WlSurfaceError, CommitTimelineError); impl VblankListener for WlSurface { fn after_vblank(self: Rc) { if self.visible.get() { - let now = self.client.state.now_msec(); - for fr in self.frame_requests.borrow_mut().drain(..) { - fr.send_done(now as _); - let _ = fr.client.remove_obj(&*fr); + let now = self.client.state.now_msec() as u32; + for mut fr in self.frame_requests.borrow_mut().drain(..) { + fr.now = now; + drop(fr); } } if self.clear_fifo_on_vblank.take() { @@ -2274,3 +2277,15 @@ impl PresentationListener for WlSurface { self.presentation_listener.detach(); } } + +pub struct FrameRequest { + now: u32, + cb: Rc, +} + +impl Drop for FrameRequest { + fn drop(&mut self) { + self.cb.send_done(self.now); + let _ = self.cb.client.remove_obj(&*self.cb); + } +} diff --git a/src/ifs/wl_surface/cursor.rs b/src/ifs/wl_surface/cursor.rs index 54f9aa51..68f41796 100644 --- a/src/ifs/wl_surface/cursor.rs +++ b/src/ifs/wl_surface/cursor.rs @@ -96,12 +96,12 @@ impl Cursor for CursorSurface { let extents = self.surface.extents.get(); renderer.render_surface(&self.surface, -extents.x1(), -extents.y1(), None); - struct FrameRequests(u64); + struct FrameRequests(u32); impl NodeVisitorBase for FrameRequests { fn visit_surface(&mut self, node: &Rc) { - for fr in node.frame_requests.borrow_mut().drain(..) { - fr.send_done(self.0 as _); - let _ = fr.client.remove_obj(fr.deref()); + for mut fr in node.frame_requests.borrow_mut().drain(..) { + fr.now = self.0; + drop(fr); } for fr in node.presentation_feedback.borrow_mut().drain(..) { fr.send_discarded(); @@ -114,7 +114,7 @@ impl Cursor for CursorSurface { node.node_visit_children(self); } } - FrameRequests(self.surface.client.state.now_msec()).visit_surface(&self.surface); + FrameRequests(self.surface.client.state.now_msec() as u32).visit_surface(&self.surface); } fn extents_at_scale(&self, scale: Scale) -> Rect {