Use Weak<Capture> in session state

This commit is contained in:
Ian Douglas Scott 2024-01-24 13:58:12 -08:00
parent 82951822b9
commit 5269356089
2 changed files with 15 additions and 13 deletions

View file

@ -11,7 +11,7 @@ use cosmic::cctk;
use std::sync::{ use std::sync::{
atomic::{AtomicBool, Ordering}, atomic::{AtomicBool, Ordering},
Arc, Mutex, Arc, Mutex, Weak,
}; };
use super::{AppData, Buffer}; use super::{AppData, Buffer};
@ -49,10 +49,16 @@ impl Capture {
} }
} }
// Returns `None` if capture is no longer active
// (or if `session` wasn't created with `SessionData`)
pub fn for_session( pub fn for_session(
session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1, session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1,
) -> Option<&Arc<Self>> { ) -> Option<Arc<Self>> {
Some(&session.data::<SessionData>()?.capture) session
.data::<SessionData>()?
.capture
.upgrade()
.filter(|c| c.running())
} }
pub fn running(&self) -> bool { pub fn running(&self) -> bool {
@ -79,7 +85,7 @@ impl Capture {
let udata = SessionData { let udata = SessionData {
session_data: Default::default(), session_data: Default::default(),
capture: self.clone(), capture: Arc::downgrade(self),
}; };
match &self.source { match &self.source {
CaptureSource::Toplevel(toplevel) => { CaptureSource::Toplevel(toplevel) => {
@ -105,7 +111,7 @@ impl Capture {
struct SessionData { struct SessionData {
session_data: ScreencopySessionData, session_data: ScreencopySessionData,
capture: Arc<Capture>, capture: Weak<Capture>,
} }
impl ScreencopySessionDataExt for SessionData { impl ScreencopySessionDataExt for SessionData {

View file

@ -19,11 +19,10 @@ impl ScreencopyHandler for AppData {
session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1, session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1,
buffer_infos: &[BufferInfo], buffer_infos: &[BufferInfo],
) { ) {
let capture = Capture::for_session(session).unwrap(); let Some(capture) = Capture::for_session(session) else {
if !capture.running() {
session.destroy(); session.destroy();
return; return;
} };
let mut buffer = capture.buffer.lock().unwrap(); let mut buffer = capture.buffer.lock().unwrap();
// Create new buffer if none, or different format // Create new buffer if none, or different format
@ -53,11 +52,10 @@ impl ScreencopyHandler for AppData {
_qh: &QueueHandle<Self>, _qh: &QueueHandle<Self>,
session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1, session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1,
) { ) {
let capture = Capture::for_session(session).unwrap(); let Some(capture) = Capture::for_session(session) else {
if !capture.running() {
session.destroy(); session.destroy();
return; return;
} };
let mut buffer = capture.buffer.lock().unwrap(); let mut buffer = capture.buffer.lock().unwrap();
if buffer.is_none() { if buffer.is_none() {
@ -95,8 +93,6 @@ impl ScreencopyHandler for AppData {
println!("Failed"); println!("Failed");
if let Some(capture) = Capture::for_session(session) { if let Some(capture) = Capture::for_session(session) {
capture.cancel(); capture.cancel();
} else {
println!("Capture not found?")
} }
session.destroy(); session.destroy();
} }