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) {