Skip to main content

river_rs/
layout.rs

1//! # Layout
2//!
3//! Basic struct for holding RiverWM layout generator and its arguments.
4//! For more complex layout generator configurations consider using multiline
5//! strings.
6use std::process::Command;
7
8#[derive(Debug)]
9pub struct Layout {
10    generator: String,
11    arguments: String,
12}
13impl Default for Layout {
14    fn default() -> Self {
15        Layout {
16            generator: String::from("rivertile"),
17            arguments: String::from("-view-padding 6 -outer-padding 6"),
18        }
19    }
20}
21impl Layout {
22    pub fn set_generator(&mut self, generator: &str) -> &mut Self {
23        self.generator = String::from(generator);
24        self
25    }
26
27    /// Consider writing args in multiline strings
28    /// # Example
29    /// ```
30    /// use river_rs::layout::Layout;
31    /// let mut layout = Layout::default();
32    /// let args = "-view-padding 6 \
33    ///             -outer-padding 6";
34    /// layout.set_generator("rivertile");
35    /// layout.set_args(args);
36    /// ```
37    pub fn set_args(&mut self, args: &str) -> &mut Self {
38        self.arguments = String::from(args);
39        self
40    }
41
42    pub fn spawn(&self) {
43        let args: Vec<&str> = self.arguments.split_whitespace().collect();
44
45        Command::new("riverctl")
46            .args(["default-layout", self.generator.as_str()])
47            .spawn()
48            .expect("Can't set default layout generator")
49            .wait()
50            .unwrap();
51
52        Command::new(self.generator.as_str())
53            .args(args)
54            .spawn()
55            .expect("Can't launch layout generator")
56            .wait()
57            .unwrap();
58    }
59}