diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 70734efe..9dfa1792 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -925,7 +925,7 @@ impl MetalConnector { rr.output_id = node.id; let fb = self.prepare_present_fb(&mut rr, buffer, &plane, &node, try_direct_scanout)?; - rr.dispatch_frame_requests(); + rr.dispatch_frame_requests(self.state.now_msec()); let (crtc_x, crtc_y, crtc_w, crtc_h, src_width, src_height) = match &fb.direct_scanout_data { None => { diff --git a/src/ifs/wl_callback.rs b/src/ifs/wl_callback.rs index c4f16ed1..f6b78d33 100644 --- a/src/ifs/wl_callback.rs +++ b/src/ifs/wl_callback.rs @@ -24,10 +24,10 @@ impl WlCallback { } } - pub fn send_done(&self) { + pub fn send_done(&self, data: u32) { self.client.event(Done { self_id: self.id, - callback_data: 0, + callback_data: data, }); } } diff --git a/src/ifs/wl_display.rs b/src/ifs/wl_display.rs index 47153044..d71ddf0b 100644 --- a/src/ifs/wl_display.rs +++ b/src/ifs/wl_display.rs @@ -39,7 +39,7 @@ impl WlDisplayRequestHandler for WlDisplay { let cb = Rc::new(WlCallback::new(req.callback, &self.client)); track!(self.client, cb); self.client.add_client_obj(&cb)?; - cb.send_done(); + cb.send_done(0); self.client.remove_obj(&*cb)?; Ok(()) } diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index 103b1e50..ea9018e4 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -1227,8 +1227,9 @@ impl WlSurface { self.ext.get().after_apply_commit(); if self.visible.get() { if self.buffer_presented.get() { + let now = self.client.state.now_msec() as _; for fr in self.frame_requests.borrow_mut().drain(..) { - fr.send_done(); + fr.send_done(now); let _ = fr.client.remove_obj(&*fr); } } diff --git a/src/ifs/wl_surface/cursor.rs b/src/ifs/wl_surface/cursor.rs index 2d6208c5..44900ca0 100644 --- a/src/ifs/wl_surface/cursor.rs +++ b/src/ifs/wl_surface/cursor.rs @@ -86,11 +86,11 @@ impl Cursor for CursorSurface { let extents = self.surface.extents.get(); renderer.render_surface(&self.surface, -extents.x1(), -extents.y1(), None); - struct FrameRequests; + struct FrameRequests(u64); impl NodeVisitorBase for FrameRequests { fn visit_surface(&mut self, node: &Rc) { for fr in node.frame_requests.borrow_mut().drain(..) { - fr.send_done(); + fr.send_done(self.0 as _); let _ = fr.client.remove_obj(fr.deref()); } for fr in node.presentation_feedback.borrow_mut().drain(..) { @@ -100,7 +100,7 @@ impl Cursor for CursorSurface { node.node_visit_children(self); } } - FrameRequests.visit_surface(&self.surface); + FrameRequests(self.surface.client.state.now_msec()).visit_surface(&self.surface); } fn extents_at_scale(&self, scale: Scale) -> Rect { diff --git a/src/renderer.rs b/src/renderer.rs index 7ee9106e..f9353103 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -48,9 +48,9 @@ impl Default for RenderResult { } impl RenderResult { - pub fn dispatch_frame_requests(&mut self) { + pub fn dispatch_frame_requests(&mut self, now: u64) { for fr in self.frame_requests.drain(..) { - fr.send_done(); + fr.send_done(now as _); let _ = fr.client.remove_obj(&*fr); } } diff --git a/src/state.rs b/src/state.rs index 8d24ee02..c0c74536 100644 --- a/src/state.rs +++ b/src/state.rs @@ -856,7 +856,7 @@ impl State { render_hw_cursor, )?; output.perform_screencopies(tex, !render_hw_cursor, 0, 0, None); - rr.dispatch_frame_requests(); + rr.dispatch_frame_requests(self.now_msec()); Ok(sync_file) }