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,
_lane: crate::wire::lane::LaneThread,
}
impl Engine {
pub fn window_wire(&mut self, world: &Env) -> Option<WindowWire> {
if let Err(reason) = self.window_seat(world) {
self.model.refuse_wire(reason);
return None;
}
Some(WindowWire {
_asker: self.asker(world)?.start(),
_poster: self.poster(world)?.start(),
_searcher: self.searcher(world)?.start(),
_lane: self.lane(world)?.start(),
})
}
pub fn asker(&mut self, world: &Env) -> Option<crate::wire::asker::Asker> {
Some(crate::wire::asker::Asker::new(
self.window_seat(world).ok()?,
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).ok()?,
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).ok()?,
self.model.search_cell(),
))
}
pub fn lane(&mut self, world: &Env) -> Option<crate::wire::lane::Lane> {
Some(crate::wire::lane::Lane::new(
self.window_seat(world).ok()?,
self.lane_end.take()?,
Arc::clone(&self.repaint),
))
}
fn window_seat(&self, world: &Env) -> Result<crate::wire::client::Seat, String> {
let Some(wire) = self.wire.as_ref() else {
return Err("this engine has no listener".to_owned());
};
let bound = wire.address();
let material = crate::wire::material::read(world, crate::wire::material::Role::Window)?
.ok_or_else(|| {
format!(
"no window leaf at {} — run `{}`",
crate::wire::material::dir(world).display(),
crate::wire::material::REMEDY
)
})?;
crate::wire::client::Seat::open(&crate::wire::material::Material {
address: crate::wire::loopback(&bound),
..material
})
}
}