use super::Engine;
use crate::xdg::Env;
use std::sync::Arc;
pub struct WindowWire {
_asker: crate::wire::asker::AskerThread,
_poster: std::thread::JoinHandle<()>,
_searcher: crate::search::SearchThread,
}
impl Engine {
pub fn window_wire(&mut self, world: &Env) -> Option<WindowWire> {
Some(WindowWire {
_asker: self.asker(world)?.spawn(),
_poster: self.poster(world)?.spawn(),
_searcher: self.searcher(world)?.spawn(),
})
}
pub fn asker(&mut self, world: &Env) -> Option<crate::wire::asker::Asker> {
Some(crate::wire::asker::Asker::new(
self.window_seat(world)?,
self.wire_end.take()?,
self.model.snapshot_cell(),
world.yog_state_root(),
Arc::clone(&self.repaint),
))
}
pub fn poster(&mut self, world: &Env) -> Option<crate::wire::poster::Poster> {
Some(crate::wire::poster::Poster::new(
self.window_seat(world)?,
self.post_end.take()?,
Arc::clone(&self.repaint),
))
}
pub fn searcher(&mut self, world: &Env) -> Option<crate::search::Searcher> {
Some(crate::search::Searcher::new(
self.window_seat(world)?,
self.model.search_cell(),
))
}
fn window_seat(&self, world: &Env) -> Option<crate::wire::client::Seat> {
let bound = self.wire.as_ref()?.address();
let material = crate::wire::material::read(world, crate::wire::material::Role::Window)
.ok()
.flatten()?;
crate::wire::client::Seat::open(&crate::wire::material::Material {
address: crate::wire::loopback(&bound),
..material
})
.ok()
}
}