fix(wayland): allow multiple frame callbacks
This commit is contained in:
@@ -70,7 +70,7 @@ pub struct Surface {
|
|||||||
state: Mutex<DoubleBuffer<SurfaceState>>,
|
state: Mutex<DoubleBuffer<SurfaceState>>,
|
||||||
pub message_sink: MessageSink,
|
pub message_sink: MessageSink,
|
||||||
pub role: Mutex<Option<SurfaceRole>>,
|
pub role: Mutex<Option<SurfaceRole>>,
|
||||||
frame_callback_object: Mutex<Option<Arc<Callback>>>,
|
frame_callbacks: Registry<Callback>,
|
||||||
on_commit_handlers: Mutex<Vec<OnCommitCallback>>,
|
on_commit_handlers: Mutex<Vec<OnCommitCallback>>,
|
||||||
material: OnceLock<Handle<BevyMaterial>>,
|
material: OnceLock<Handle<BevyMaterial>>,
|
||||||
pending_material_applications: Registry<ModelPart>,
|
pending_material_applications: Registry<ModelPart>,
|
||||||
@@ -81,7 +81,6 @@ impl std::fmt::Debug for Surface {
|
|||||||
.field("state", &self.state)
|
.field("state", &self.state)
|
||||||
.field("message_sink", &self.message_sink)
|
.field("message_sink", &self.message_sink)
|
||||||
.field("role", &self.role)
|
.field("role", &self.role)
|
||||||
.field("frame_callback_object", &self.frame_callback_object)
|
|
||||||
.field(
|
.field(
|
||||||
"on_commit_handlers",
|
"on_commit_handlers",
|
||||||
&format!("<{} handlers>", self.on_commit_handlers.lock().len()),
|
&format!("<{} handlers>", self.on_commit_handlers.lock().len()),
|
||||||
@@ -97,7 +96,7 @@ impl Surface {
|
|||||||
state: Default::default(),
|
state: Default::default(),
|
||||||
message_sink: client.message_sink(),
|
message_sink: client.message_sink(),
|
||||||
role: Mutex::new(None),
|
role: Mutex::new(None),
|
||||||
frame_callback_object: Default::default(),
|
frame_callbacks: Registry::new(),
|
||||||
on_commit_handlers: Mutex::new(Vec::new()),
|
on_commit_handlers: Mutex::new(Vec::new()),
|
||||||
material: OnceLock::new(),
|
material: OnceLock::new(),
|
||||||
pending_material_applications: Registry::new(),
|
pending_material_applications: Registry::new(),
|
||||||
@@ -181,8 +180,8 @@ impl Surface {
|
|||||||
}
|
}
|
||||||
#[tracing::instrument(level = "debug", skip_all)]
|
#[tracing::instrument(level = "debug", skip_all)]
|
||||||
pub fn frame_event(&self) {
|
pub fn frame_event(&self) {
|
||||||
if let Some(callback_obj) = self.frame_callback_object.lock().take() {
|
for callback in self.frame_callbacks.take_valid_contents() {
|
||||||
let _ = self.message_sink.send(Message::Frame(callback_obj));
|
let _ = self.message_sink.send(Message::Frame(callback));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// pub fn size(&self) -> Option<Vector2<u32>> {
|
// pub fn size(&self) -> Option<Vector2<u32>> {
|
||||||
@@ -259,7 +258,7 @@ impl WlSurface for Surface {
|
|||||||
callback_id: ObjectId,
|
callback_id: ObjectId,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let callback = client.insert(callback_id, Callback(callback_id));
|
let callback = client.insert(callback_id, Callback(callback_id));
|
||||||
self.frame_callback_object.lock().replace(callback);
|
self.frame_callbacks.add_raw(&callback);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user