~kennylevinsen/clayrs

8a95c42a0961273c190b4df9367cb4d3c5badf96 — Kenny Levinsen 6 months ago fdb2d71
Initial fullscreen support
4 files changed, 41 insertions(+), 3 deletions(-)

M src/config.rs
M src/mgr/container.rs
M src/mgr/mod.rs
M src/mgr/output.rs
M src/config.rs => src/config.rs +1 -0
@@ 43,6 43,7 @@ pub enum BindingAction {
    ContainerDestroy,
    ContainerViewClose,
    ContainerViewAdvance(Direction),
    ContainerFullscreenToggle,
    OutputLayoutAdvance(Direction),
    OutputLayoutModeNext,
    OutputLayoutIncSplit(f32),

M src/mgr/container.rs => src/mgr/container.rs +0 -3
@@ 5,7 5,6 @@ pub struct Container {
    pub id: Uuid,
    pub position: (i32, i32),
    pub size: (u32, u32),
    pub dirty: bool,
}

impl Container {


@@ 14,12 13,10 @@ impl Container {
            id: Uuid::new_v4(),
            position: (0, 0),
            size: (0, 0),
            dirty: true,
        }
    }

    pub fn set_dimensions(&mut self, position: (i32, i32), size: (u32, u32)) {
        self.dirty = self.dirty || position != self.position || size != self.size;
        self.position = position;
        self.size = size;
    }

M src/mgr/mod.rs => src/mgr/mod.rs +29 -0
@@ 143,6 143,7 @@ impl Mgr {
            config::BindingAction::ContainerCreate => self.container_create(),
            config::BindingAction::ContainerDestroy => self.container_destroy(),
            config::BindingAction::ContainerViewAdvance(dir) => self.container_view_advance(*dir),
            config::BindingAction::ContainerFullscreenToggle => self.container_fullscreen_toggle(),
            config::BindingAction::OutputLayoutAdvance(dir) => self.output_layout_advance(*dir),
            config::BindingAction::OutputLayoutModeNext => self.output_layout_next(),
            config::BindingAction::OutputLayoutIncSplit(s) => self.output_layout_inc_split(*s),


@@ 253,6 254,34 @@ impl Mgr {
        }
    }

    fn container_fullscreen_toggle(&mut self) {
        let con = self.active_container();
        let pointer = self.clay.input_pointer_position();
        for output in self.outputs.iter_mut() {
            if !output.contains_point(pointer) {
                continue;
            }

            if output.fullscreen.is_some() {
                output.fullscreen = None;
            } else {
                if let Some(c) = con {
                    output.fullscreen = Some(c);
                }
            }
            output.layout(&mut self.containers);
        }
        self.apply();
        if let Some(p) = &mut self.presentation {
            p.all_change(
                &mut self.views,
                &mut self.containers,
                &mut self.outputs,
                &mut self.font,
            );
        }
    }

    fn container_create(&mut self) {
        let pointer = self.clay.input_pointer_position();
        for output in self.outputs.iter_mut() {

M src/mgr/output.rs => src/mgr/output.rs +11 -0
@@ 14,6 14,7 @@ pub struct Output {
    pub layout: Vec<Uuid>,
    pub layouts: Vec<Box<dyn Layout>>,
    pub active_layout: usize,
    pub fullscreen: Option<Uuid>,
}

impl Output {


@@ 33,16 34,26 @@ impl Output {
                Box::new(TopLayout::new(1, 0.85)),
            ],
            active_layout: 0,
            fullscreen: None,
        }
    }

    pub fn remove_container(&mut self, id: Uuid) {
        self.layout.retain(|c| *c != id);
        if self.fullscreen == Some(id) {
            self.fullscreen = None;
        }
    }

    pub fn layout(&self, containers: &mut HashMap<Uuid, Container>) {
        let layout = &self.layouts[self.active_layout];
        layout.layout(&self.layout, containers, &self.usable_area);
        if let Some(fullscreen) = self.fullscreen {
            let container = containers
                .get_mut(&fullscreen)
                .expect("no container with that ID");
            container.set_dimensions((self.usable_area.x, self.usable_area.y), (self.usable_area.width as u32, self.usable_area.height as u32));
        }
    }

    pub fn layout_control(&mut self, control: LayoutControl) {