diff --git a/src/backend/kms/device.rs b/src/backend/kms/device.rs index 9313d765..d042503f 100644 --- a/src/backend/kms/device.rs +++ b/src/backend/kms/device.rs @@ -494,8 +494,9 @@ impl State { if let Some(mut leasing_global) = device.inner.leasing_global.take() { leasing_global.disable_global::(); } - for surface in device.inner.surfaces.values_mut() { + for (_, surface) in device.inner.surfaces.drain() { outputs_removed.push(surface.output.clone()); + surface.drop_and_join(); } if let Some(token) = device.event_token.take() { self.common.event_loop_handle.remove(token); diff --git a/src/backend/kms/mod.rs b/src/backend/kms/mod.rs index 0f451fb5..9a48cf4d 100644 --- a/src/backend/kms/mod.rs +++ b/src/backend/kms/mod.rs @@ -705,11 +705,9 @@ impl<'a> KmsGuard<'a> { .crtcs() .iter() .filter(|crtc| { - !device - .inner - .surfaces - .get(crtc) - .is_some_and(|surface| surface.output.is_enabled()) + !device.inner.surfaces.get(crtc).is_some() + // TODO: We can't do this. See https://github.com/Smithay/smithay/pull/1820 + //.is_some_and(|surface| surface.output.is_enabled()) }) .copied() .collect::>(); diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 989419d9..3c20a4b6 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -468,6 +468,16 @@ impl Surface { } } } + + pub fn drop_and_join(mut self) { + let thread = self.thread.take(); + let _ = self; + if let Some(thread) = thread { + let name = thread.thread().name().unwrap().to_string(); + let _ = thread.join(); + info!("Thread {} terminated.", name) + } + } } impl Drop for Surface { @@ -475,9 +485,13 @@ impl Drop for Surface { let _ = self.thread_command.send(ThreadCommand::End); self.loop_handle.remove(self.thread_token); if let Some(thread) = self.thread.take() { - let name = thread.thread().name().unwrap().to_string(); - let _ = thread.join(); - info!("Thread {} terminated.", name) + let _ = thread; + // We want to do this, but this currently deadlocks on `apply_config_for_outputs`. + /* + let name = thread.thread().name().unwrap().to_string(); + let _ = thread.join(); + info!("Thread {} terminated.", name) + */ } } }