image-copy: Do not panic on ImageCaptureSourceKind::Destroyed

The way this was handled previously is incorrect. We should still handle
creation of a capture session, just send `stopped` when it is created.

This can be tested by creating a capture source and session for a
workspace that has been removed. Toplevel and output sources have a
different issue in `smithay`: https://github.com/Smithay/smithay/pull/1961

Should fix https://github.com/pop-os/cosmic-epoch/issues/3319.
This commit is contained in:
Ian Douglas Scott 2026-03-12 16:33:45 -07:00 committed by Victoria Brekenfeld
parent b7c13369ee
commit 7fa5bd6b91

View file

@ -21,8 +21,9 @@ use smithay::{
dmabuf::get_dmabuf, dmabuf::get_dmabuf,
image_capture_source::ImageCaptureSource, image_capture_source::ImageCaptureSource,
image_copy_capture::{ image_copy_capture::{
BufferConstraints, CursorSession, CursorSessionRef, DmabufConstraints, Frame, FrameRef, BufferConstraints, CaptureFailureReason, CursorSession, CursorSessionRef,
ImageCopyCaptureHandler, ImageCopyCaptureState, Session, SessionRef, DmabufConstraints, Frame, FrameRef, ImageCopyCaptureHandler, ImageCopyCaptureState,
Session, SessionRef,
}, },
seat::WaylandFocus, seat::WaylandFocus,
}, },
@ -138,7 +139,9 @@ impl ImageCopyCaptureHandler for State {
}); });
toplevel.add_session(session); toplevel.add_session(session);
} }
ImageCaptureSourceKind::Destroyed => unreachable!(), ImageCaptureSourceKind::Destroyed => {
session.stop();
}
} }
} }
@ -258,7 +261,9 @@ impl ImageCopyCaptureHandler for State {
toplevel.add_cursor_session(session); toplevel.add_cursor_session(session);
} }
ImageCaptureSourceKind::Destroyed => unreachable!(), ImageCaptureSourceKind::Destroyed => {
session.stop();
}
} }
} }
@ -284,7 +289,9 @@ impl ImageCopyCaptureHandler for State {
ImageCaptureSourceKind::Toplevel(toplevel) => { ImageCaptureSourceKind::Toplevel(toplevel) => {
render_window_to_buffer(self, session, frame, &toplevel) render_window_to_buffer(self, session, frame, &toplevel)
} }
ImageCaptureSourceKind::Destroyed => unreachable!(), ImageCaptureSourceKind::Destroyed => {
frame.fail(CaptureFailureReason::Stopped);
}
} }
} }
@ -330,7 +337,7 @@ impl ImageCopyCaptureHandler for State {
} }
} }
ImageCaptureSourceKind::Toplevel(mut toplevel) => toplevel.remove_session(&session), ImageCaptureSourceKind::Toplevel(mut toplevel) => toplevel.remove_session(&session),
ImageCaptureSourceKind::Destroyed => unreachable!(), ImageCaptureSourceKind::Destroyed => {}
} }
} }
@ -361,7 +368,7 @@ impl ImageCopyCaptureHandler for State {
ImageCaptureSourceKind::Toplevel(mut toplevel) => { ImageCaptureSourceKind::Toplevel(mut toplevel) => {
toplevel.remove_cursor_session(&session) toplevel.remove_cursor_session(&session)
} }
ImageCaptureSourceKind::Destroyed => unreachable!(), ImageCaptureSourceKind::Destroyed => {}
} }
} }
} }