80 lines
2.3 KiB
Rust
80 lines
2.3 KiB
Rust
#![feature(generic_associated_types, type_alias_impl_trait)]
|
|
|
|
use crate::acceptor::AcceptorError;
|
|
use crate::client::Clients;
|
|
use crate::clientmem::ClientMemError;
|
|
use crate::event_loop::EventLoopError;
|
|
use crate::globals::Globals;
|
|
use crate::ifs::wl_compositor::WlCompositorGlobal;
|
|
use crate::ifs::wl_shm::WlShmGlobal;
|
|
use crate::ifs::wl_subcompositor::WlSubcompositorGlobal;
|
|
use crate::ifs::xdg_wm_base::XdgWmBaseGlobal;
|
|
use crate::sighand::SighandError;
|
|
use crate::state::State;
|
|
use crate::utils::numcell::NumCell;
|
|
use anyhow::anyhow;
|
|
use log::LevelFilter;
|
|
use std::rc::Rc;
|
|
use thiserror::Error;
|
|
|
|
#[macro_use]
|
|
mod macros;
|
|
mod acceptor;
|
|
mod async_engine;
|
|
mod client;
|
|
mod clientmem;
|
|
mod event_loop;
|
|
mod globals;
|
|
mod ifs;
|
|
mod object;
|
|
mod pixman;
|
|
mod sighand;
|
|
mod state;
|
|
mod time;
|
|
mod utils;
|
|
mod wheel;
|
|
|
|
fn main() {
|
|
env_logger::builder()
|
|
.filter_level(LevelFilter::Trace)
|
|
.init();
|
|
if let Err(e) = main_() {
|
|
log::error!("A fatal error occurred: {:#}", anyhow!(e));
|
|
std::process::exit(1);
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Error)]
|
|
enum MainError {
|
|
#[error("The client acceptor caused an error")]
|
|
AcceptorError(#[from] AcceptorError),
|
|
#[error("The event loop caused an error")]
|
|
EventLoopError(#[from] EventLoopError),
|
|
#[error("The signal handler caused an error")]
|
|
SighandError(#[from] SighandError),
|
|
#[error("The clientmem subsystem caused an error")]
|
|
ClientmemError(#[from] ClientMemError),
|
|
}
|
|
|
|
fn main_() -> Result<(), MainError> {
|
|
clientmem::init()?;
|
|
let el = event_loop::EventLoop::new().unwrap();
|
|
sighand::install(&el.to_ref())?;
|
|
let wheel = wheel::WheelRef::new(&el.to_ref()).unwrap();
|
|
let engine = Rc::new(async_engine::AsyncEngine::new(&el.to_ref(), &wheel).unwrap());
|
|
let globals = Globals::new();
|
|
globals.insert_no_broadcast(Rc::new(WlCompositorGlobal::new(globals.name())));
|
|
globals.insert_no_broadcast(Rc::new(WlShmGlobal::new(globals.name())));
|
|
globals.insert_no_broadcast(Rc::new(WlSubcompositorGlobal::new(globals.name())));
|
|
globals.insert_no_broadcast(Rc::new(XdgWmBaseGlobal::new(globals.name())));
|
|
let state = Rc::new(State {
|
|
eng: engine,
|
|
el: el.to_ref(),
|
|
clients: Clients::new(),
|
|
next_name: NumCell::new(1),
|
|
globals,
|
|
});
|
|
acceptor::Acceptor::install(&state)?;
|
|
el.run()?;
|
|
Ok(())
|
|
}
|