Handle user callbacks in surface_configure (#4220)

This commit is contained in:
Nicolas Silva 2023-10-09 18:06:00 +02:00 committed by GitHub
parent 51742e4353
commit 651299b870
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2262,7 +2262,12 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
Ok(())
}
// User callbacks must not be called while we are holding locks.
let mut user_callbacks = None;
log::info!("configuring surface with {:?}", config);
let error = 'outer: loop {
let hub = A::hub(self);
let mut token = Token::root();
@ -2270,7 +2275,6 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
let (adapter_guard, mut token) = hub.adapters.read(&mut token);
let (device_guard, mut token) = hub.devices.read(&mut token);
let error = 'outer: loop {
let device = match device_guard.get(device_id) {
Ok(device) => device,
Err(_) => break DeviceError::Invalid.into(),
@ -2346,9 +2350,14 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
}
// Wait for all work to finish before configuring the surface.
if let Err(e) = device.maintain(hub, wgt::Maintain::Wait, &mut token) {
match device.maintain(hub, wgt::Maintain::Wait, &mut token) {
Ok((closures, _)) => {
user_callbacks = Some(closures);
}
Err(e) => {
break e.into();
}
}
// All textures must be destroyed before the surface can be re-configured.
if let Some(present) = surface.presentation.take() {
@ -2395,6 +2404,10 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
return None;
};
if let Some(callbacks) = user_callbacks {
callbacks.fire();
}
Some(error)
}