diff --git a/src/main.rs b/src/main.rs index 5845e3f8..66bdbe9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,12 @@ use std::{env, ffi::OsString, process, sync::Arc}; use tracing::{error, info, warn}; use crate::{ - state::BackendData, utils::prelude::SeatExt, - wayland::handlers::compositor::client_compositor_state, + state::BackendData, + utils::prelude::SeatExt, + wayland::{ + handlers::{compositor::client_compositor_state, screencopy::PendingScreencopyBuffers}, + protocols::screencopy::SessionType, + }, }; pub mod backend; @@ -97,6 +101,42 @@ fn main() -> Result<()> { state.common.shell.refresh(); state::Common::refresh_focus(state); + if state.common.shell.animations_going() { + for output in state + .common + .shell + .outputs() + .cloned() + .collect::>() + .into_iter() + { + let mut scheduled_sessions = state.workspace_session_for_output(&output); + if let Some(sessions) = output.user_data().get::() { + scheduled_sessions + .get_or_insert_with(Vec::new) + .extend(sessions.borrow_mut().drain(..)); + } + state.backend.schedule_render( + &state.common.event_loop_handle, + &output, + scheduled_sessions.as_ref().map(|sessions| { + sessions + .iter() + .filter(|(s, _)| match s.session_type() { + SessionType::Output(o) | SessionType::Workspace(o, _) + if o == output => + { + true + } + _ => false, + }) + .cloned() + .collect::>() + }), + ); + } + } + // send out events let _ = state.common.display_handle.flush_clients();