diff --git a/Cargo.lock b/Cargo.lock index 6e094c6..c2e5154 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -397,7 +397,7 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-protocols#1615d9048198d3beac93184259046cf546d63657" +source = "git+https://github.com/pop-os/cosmic-protocols#1ebab50966cfa91afc988f6d8cf83307cbe30446" dependencies = [ "cosmic-protocols", "gl_generator", @@ -409,7 +409,7 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-protocols#1615d9048198d3beac93184259046cf546d63657" +source = "git+https://github.com/pop-os/cosmic-protocols#1ebab50966cfa91afc988f6d8cf83307cbe30446" dependencies = [ "bitflags", "wayland-backend", diff --git a/src/wayland.rs b/src/wayland.rs index bbf085d..95b3c2a 100644 --- a/src/wayland.rs +++ b/src/wayland.rs @@ -13,7 +13,10 @@ use cctk::{ toplevel_management::v1::client::zcosmic_toplevel_manager_v1, workspace::v1::client::{zcosmic_workspace_handle_v1, zcosmic_workspace_manager_v1}, }, - screencopy::{BufferInfo, ScreencopyHandler, ScreencopyState}, + screencopy::{ + BufferInfo, ScreencopyHandler, ScreencopySessionData, ScreencopySessionDataExt, + ScreencopyState, + }, sctk::{ self, output::{OutputHandler, OutputState}, @@ -37,7 +40,7 @@ use cosmic::iced::{ widget::image, }; use futures_channel::mpsc; -use std::{collections::HashMap, thread}; +use std::{collections::HashMap, sync::Mutex, thread}; // TODO define subscription for a particular output/workspace/toplevel (but we want to rate limit?) @@ -74,11 +77,18 @@ enum CaptureSource { } struct Frame { - buffer: Option<(RawPool, wl_buffer::WlBuffer, BufferInfo)>, + session_data: ScreencopySessionData, + buffer: Mutex>, source: CaptureSource, first_frame: bool, } +impl ScreencopySessionDataExt for Frame { + fn screencopy_session_data(&self) -> &ScreencopySessionData { + &self.session_data + } +} + pub struct AppData { qh: QueueHandle, output_state: OutputState, @@ -90,7 +100,6 @@ pub struct AppData { shm_state: ShmState, toplevel_manager_state: ToplevelManagerState, sender: mpsc::Sender, - frames: HashMap, output_names: HashMap>, seats: Vec, } @@ -199,20 +208,18 @@ impl ToplevelInfoHandler for AppData { let info = self.toplevel_info_state.info(&toplevel).unwrap(); self.send_event(Event::NewToplevel(toplevel.clone(), info.clone())); + // XXX first_frame + let udata = Frame { + session_data: Default::default(), + buffer: Mutex::new(None), + source: CaptureSource::Toplevel(toplevel.clone()), + first_frame: true, + }; let frame = self.screencopy_state.screencopy_manager.capture_toplevel( toplevel, zcosmic_screencopy_manager_v1::CursorMode::Hidden, &self.qh, - Default::default(), // TODO - ); - // XXX first_frame - self.frames.insert( - frame.id(), - Frame { - buffer: None, - source: CaptureSource::Toplevel(toplevel.clone()), - first_frame: true, - }, + udata, ); } @@ -249,21 +256,19 @@ impl WorkspaceHandler for AppData { let output_name = self.output_names.get(&output.id()).unwrap().clone(); workspaces.push((output_name, workspace.clone())); + // XXX first_frame + let udata = Frame { + session_data: Default::default(), + buffer: Mutex::new(None), + source: CaptureSource::Workspace(workspace.handle.clone()), + first_frame: true, + }; let frame = self.screencopy_state.screencopy_manager.capture_workspace( &workspace.handle, output, zcosmic_screencopy_manager_v1::CursorMode::Hidden, &self.qh, - Default::default(), // TODO - ); - // XXX first_frame - self.frames.insert( - frame.id(), - Frame { - buffer: None, - source: CaptureSource::Workspace(workspace.handle.clone()), - first_frame: true, - }, + udata, ); } } @@ -306,7 +311,7 @@ impl ScreencopyHandler for AppData { qh, ); - let mut frame = self.frames.get_mut(&session.id()).unwrap(); + let frame = session.data::().unwrap(); session.attach_buffer(&buffer, None, 0); // XXX age? if frame.first_frame { @@ -317,7 +322,7 @@ impl ScreencopyHandler for AppData { } conn.flush().unwrap(); - frame.buffer = Some((pool, buffer, buffer_info.clone())); + *frame.buffer.lock().unwrap() = Some((pool, buffer, buffer_info.clone())); } fn ready( @@ -326,8 +331,8 @@ impl ScreencopyHandler for AppData { qh: &QueueHandle, session: &zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1, ) { - let frame = self.frames.get_mut(&session.id()).unwrap(); - let (mut pool, buffer, buffer_info) = frame.buffer.take().unwrap(); + let frame = session.data::().unwrap(); + let (mut pool, buffer, buffer_info) = frame.buffer.lock().unwrap().take().unwrap(); // XXX is this at all a performance issue? let image = image::Handle::from_pixels(buffer_info.width, buffer_info.height, pool.mmap().to_vec()); @@ -400,7 +405,6 @@ fn start() -> mpsc::Receiver { seat_state: SeatState::new(&globals, &qh), shm_state: ShmState::bind(&globals, &qh).unwrap(), sender, - frames: HashMap::new(), output_names: HashMap::new(), seats: Vec::new(), }; @@ -428,4 +432,4 @@ sctk::delegate_shm!(AppData); cctk::delegate_toplevel_info!(AppData); cctk::delegate_toplevel_manager!(AppData); cctk::delegate_workspace!(AppData); -cctk::delegate_screencopy!(AppData); +cctk::delegate_screencopy!(AppData, session: [Frame]);