diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 123 |
1 files changed, 89 insertions, 34 deletions
diff --git a/src/main.rs b/src/main.rs index 3e285536..7a977bd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,54 +1,109 @@ +#[macro_use] +extern crate tracing; + mod handlers; +mod backend; mod grabs; mod input; -mod state; +mod niri; +mod tty; mod winit; +use std::env; +use std::ffi::OsString; + +use backend::Backend; +use clap::Parser; +use niri::Niri; use smithay::reexports::calloop::EventLoop; -use smithay::reexports::wayland_server::Display; -pub use state::Smallvil; +use smithay::reexports::wayland_server::{Display, DisplayHandle}; +use tracing_subscriber::EnvFilter; +use tty::Tty; +use winit::Winit; -pub struct CalloopData { - state: Smallvil, - display: Display<Smallvil>, +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Cli { + #[arg(last = true)] + command: Option<OsString>, } -fn main() -> Result<(), Box<dyn std::error::Error>> { - if let Ok(env_filter) = tracing_subscriber::EnvFilter::try_from_default_env() { - tracing_subscriber::fmt() - .compact() - .with_env_filter(env_filter) - .init(); - } else { - tracing_subscriber::fmt().compact().init(); - } +pub struct LoopData { + niri: Niri, + display_handle: DisplayHandle, - let mut event_loop: EventLoop<CalloopData> = EventLoop::try_new()?; + // Last so that it's dropped after the Smithay state in Niri. + display: Display<Niri>, - let mut display: Display<Smallvil> = Display::new()?; - let state = Smallvil::new(&event_loop, &mut display); + tty: Option<Tty>, + winit: Option<Winit>, +} + +fn main() { + env::set_var("RUST_BACKTRACE", "1"); - let mut data = CalloopData { state, display }; + let directives = env::var("RUST_LOG").unwrap_or_else(|_| "niri=debug,info".to_owned()); + let env_filter = EnvFilter::builder().parse_lossy(directives); + tracing_subscriber::fmt() + .compact() + .with_env_filter(env_filter) + .init(); - crate::winit::init_winit(&event_loop, &mut data)?; + let cli = Cli::parse(); - let mut args = std::env::args().skip(1); - let flag = args.next(); - let arg = args.next(); + let mut event_loop = EventLoop::try_new().unwrap(); - match (flag.as_deref(), arg) { - (Some("-c") | Some("--command"), Some(command)) => { - std::process::Command::new(command).spawn().ok(); - } - _ => { - std::process::Command::new("weston-terminal").spawn().ok(); - } + let has_display = env::var_os("WAYLAND_DISPLAY").is_some() || env::var_os("DISPLAY").is_some(); + + let mut winit = None; + let mut tty = None; + let backend: &mut dyn Backend = if has_display { + winit = Some(Winit::new(event_loop.handle())); + winit.as_mut().unwrap() + } else { + tty = Some(Tty::new(event_loop.handle())); + tty.as_mut().unwrap() + }; + + let mut display = Display::new().unwrap(); + let display_handle = display.handle(); + let niri = Niri::new( + event_loop.handle(), + event_loop.get_signal(), + &mut display, + backend.seat_name(), + ); + + let mut data = LoopData { + niri, + display_handle, + display, + + tty, + winit, + }; + + if let Some(tty) = data.tty.as_mut() { + tty.init(&mut data.niri); + } + if let Some(winit) = data.winit.as_mut() { + winit.init(&mut data.niri); } - event_loop.run(None, &mut data, move |_| { - // Smallvil is running - })?; + let res = if let Some(command) = &cli.command { + std::process::Command::new(command).spawn() + } else { + std::process::Command::new("weston-terminal").spawn() + }; + if let Err(err) = res { + warn!("error spawning command: {err}"); + } - Ok(()) + event_loop + .run(None, &mut data, move |data| { + // niri is running. + data.display.flush_clients().unwrap(); + }) + .unwrap(); } |
