Use Weak<Capture> in session state
This commit is contained in:
parent
82951822b9
commit
5269356089
2 changed files with 15 additions and 13 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue