use std::collections::VecDeque;
use std::slice::IterMut;
use sctk::reexports::client::protocol::wl_seat::WlSeat;
use super::seat_data::SeatData;
pub struct ClipboardDispatchData {
observed_seats: VecDeque<(WlSeat, u32)>,
seats: Vec<SeatData>,
}
impl ClipboardDispatchData {
pub fn new(seats: Vec<SeatData>) -> Self {
Self { observed_seats: Default::default(), seats }
}
pub fn get_seat_data_or_add(&mut self, seat: WlSeat) -> &mut SeatData {
let pos = self.seats.iter().position(|st| st.seat == seat);
let index = pos.unwrap_or_else(|| {
self.seats.push(SeatData::new(seat, None, None));
self.seats.len() - 1
});
&mut self.seats[index]
}
pub fn seats(&mut self) -> IterMut<'_, SeatData> {
self.seats.iter_mut()
}
pub fn set_last_observed_seat(&mut self, seat: WlSeat, serial: u32) {
self.remove_observed_seat(&seat);
self.observed_seats.push_front((seat, serial));
}
pub fn remove_observed_seat(&mut self, seat: &WlSeat) {
if let Some(pos) = self.observed_seats.iter().position(|st| &st.0 == seat) {
self.observed_seats.remove(pos);
}
}
pub fn last_observed_seat(&self) -> Option<&(WlSeat, u32)> {
self.observed_seats.front()
}
}