pub mod normie; pub mod tiling; use x11rb::protocol::xproto::Window; pub struct GapConfig { pub inner_horizontal: u32, pub inner_vertical: u32, pub outer_horizontal: u32, pub outer_vertical: u32, } pub const TILING: &str = "tiling"; pub const NORMIE: &str = "normie"; pub const FLOATING: &str = "floating"; pub fn layout_from_str(s: &str) -> Result, String> { match s.to_lowercase().as_str() { TILING => Ok(Box::new(tiling::TilingLayout)), NORMIE | FLOATING => Ok(Box::new(normie::NormieLayout)), _ => Err(format!("Unknown layout: {}", s)), } } pub fn next_layout(current_name: &str) -> &'static str { match current_name { TILING => NORMIE, NORMIE => TILING, _ => TILING, } } pub trait Layout { fn arrange( &self, windows: &[Window], screen_width: u32, screen_height: u32, gaps: &GapConfig, ) -> Vec; fn name(&self) -> &'static str; } pub struct WindowGeometry { pub x_coordinate: i32, pub y_coordinate: i32, pub width: u32, pub height: u32, }