1
0
Fork 0
forked from wry/wry

wl_surface: handle frame callback cleanup automatically

This commit is contained in:
Julian Orth 2026-02-28 01:44:19 +01:00
parent d87a5827b5
commit 7b0dc8879a
2 changed files with 27 additions and 12 deletions

View file

@ -310,7 +310,7 @@ pub struct WlSurface {
pub buf_y: NumCell<i32>,
pub children: RefCell<Option<Box<ParentData>>>,
ext: CloneCell<Rc<dyn SurfaceExt>>,
frame_requests: RefCell<Vec<Rc<WlCallback>>>,
frame_requests: RefCell<Vec<FrameRequest>>,
presentation_feedback: RefCell<Vec<Rc<WpPresentationFeedback>>>,
latched_presentation_feedback: RefCell<Vec<Rc<WpPresentationFeedback>>>,
seat_state: NodeSeatState,
@ -465,7 +465,7 @@ struct PendingState {
offset: (i32, i32),
opaque_region: Option<Option<Rc<Region>>>,
input_region: Option<Option<Rc<Region>>>,
frame_request: Vec<Rc<WlCallback>>,
frame_request: Vec<FrameRequest>,
damage_full: bool,
buffer_damage: Vec<Rect>,
surface_damage: Vec<Rect>,
@ -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<Self>) {
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<WlCallback>,
}
impl Drop for FrameRequest {
fn drop(&mut self) {
self.cb.send_done(self.now);
let _ = self.cb.client.remove_obj(&*self.cb);
}
}

View file

@ -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<WlSurface>) {
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 {