diff options
Diffstat (limited to 'src/clients/tile.rs')
-rw-r--r-- | src/clients/tile.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/clients/tile.rs b/src/clients/tile.rs new file mode 100644 index 0000000..4a2d4fc --- /dev/null +++ b/src/clients/tile.rs @@ -0,0 +1,68 @@ +use std::cmp::min; + +use crate::conn_info::Connection; + +use super::{MonitorGeometry, MonitorInfo}; + +/// A simple tiling function +#[allow( + clippy::cast_sign_loss, + clippy::cast_possible_wrap, + clippy::cast_possible_truncation, + clippy::cast_lossless +)] +pub fn tile(mon: &mut MonitorInfo, conn: &Connection<'_>) { + if mon.clients.is_empty() { + return; + } + + let n = mon.clients_tiled_mut().count(); + let nmaster = 1; + let mfact = 0.6; + + let MonitorGeometry { + x_org, + y_org, + width: mon_width, + height: mon_height, + } = mon.screen_info; + + let main_width = if nmaster == 0 { + 0 + } else if n > nmaster { + ((mon.screen_info.width as f64) * mfact) as u16 + } else { + mon.screen_info.width + }; + + let (mut main_y, mut second_y) = (0, 0); + for (i, c) in mon.clients_tiled_mut().enumerate() { + if i < nmaster { + let h = (mon_height - main_y) / (min(nmaster, n) - i) as u16; + c.set_geom( + conn, + x_org, + y_org + main_y as i16, + main_width - (2 * c.border_width()), + h - (2 * c.border_width()), + c.border_width(), + ); + + main_y += h; + } else { + let h = (mon_height - second_y) / (n - i) as u16; + c.set_geom( + conn, + x_org + main_width as i16, + y_org + second_y as i16, + mon_width - main_width - (2 * c.border_width()), + h - (2 * c.border_width()), + c.border_width(), + ); + + second_y += h; + } + + c.ensure_mapped(conn); + } +} |