use crate::{ShellError, ShellEvent, WindowId};
use super::protocol::wayland::wl_surface;
use super::{ObjectKind, WaylandShell, WlProxy};
impl WaylandShell {
pub(super) fn request_frame_callback(&mut self, window: WindowId) -> Result<(), ShellError> {
let state = self.window(window)?;
if !state.frame_callback.is_null() {
return Ok(());
}
let callback = unsafe { wl_surface::frame(state.surface) };
if callback.is_null() {
return Err(ShellError::Backend("wl_surface.frame failed".to_string()));
}
self.conn.watch(callback, ObjectKind::FrameCallback);
self.window_mut(window)?.frame_callback = callback;
self.conn.flush();
Ok(())
}
pub(super) fn frame_done(&mut self, callback: usize) {
let Some(window) = self.window_by_proxy(callback, |w| w.frame_callback as usize) else {
return;
};
let Ok(state) = self.window_mut(window) else {
return;
};
let proxy: *mut WlProxy =
core::mem::replace(&mut state.frame_callback, core::ptr::null_mut());
self.conn.destroy(proxy);
self.queue.push_back(ShellEvent::FrameReady { window });
}
}