aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs123
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();
}