Skip to content

Commit

Permalink
Add default-column-width setting
Browse files Browse the repository at this point in the history
  • Loading branch information
YaLTeR committed Nov 3, 2023
1 parent 6a81d8f commit e1bfd98
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 19 deletions.
5 changes: 5 additions & 0 deletions resources/default-config.kdl
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ preset-column-widths {
// fixed 1920
}

// You can change the default width of the new windows.
default-column-width { proportion 0.5; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}

// Set gaps around windows in logical pixels.
gaps 16

Expand Down
8 changes: 8 additions & 0 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ pub struct Config {
pub cursor: Cursor,
#[knuffel(child, unwrap(children), default)]
pub preset_column_widths: Vec<PresetWidth>,
#[knuffel(child)]
pub default_column_width: Option<DefaultColumnWidth>,
#[knuffel(child, unwrap(argument), default = 16)]
pub gaps: u16,
#[knuffel(
Expand Down Expand Up @@ -207,6 +209,9 @@ pub enum PresetWidth {
Fixed(#[knuffel(argument)] i32),
}

#[derive(knuffel::Decode, Debug, Clone, PartialEq)]
pub struct DefaultColumnWidth(#[knuffel(children)] pub Vec<PresetWidth>);

#[derive(knuffel::Decode, Debug, Default, PartialEq)]
pub struct Binds(#[knuffel(children)] pub Vec<Bind>);

Expand Down Expand Up @@ -545,6 +550,8 @@ mod tests {
fixed 1280
}
default-column-width { proportion 0.25; }
gaps 8
screenshot-path "~/Screenshots/screenshot.png"
Expand Down Expand Up @@ -622,6 +629,7 @@ mod tests {
PresetWidth::Fixed(960),
PresetWidth::Fixed(1280),
],
default_column_width: Some(DefaultColumnWidth(vec![PresetWidth::Proportion(0.25)])),
gaps: 8,
screenshot_path: Some(String::from("~/Screenshots/screenshot.png")),
binds: Binds(vec![
Expand Down
8 changes: 1 addition & 7 deletions src/handlers/compositor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ use smithay::wayland::shm::{ShmHandler, ShmState};
use smithay::{delegate_compositor, delegate_shm};

use super::xdg_shell;
use crate::layout::ColumnWidth;
use crate::niri::{ClientState, State};

impl CompositorHandler for State {
Expand Down Expand Up @@ -99,12 +98,7 @@ impl CompositorHandler for State {
let window = entry.remove();
window.on_commit();

if let Some(output) = self
.niri
.layout
.add_window(window, true, ColumnWidth::default())
.cloned()
{
if let Some(output) = self.niri.layout.add_window(window, true, None).cloned() {
self.niri.queue_redraw(output);
}
return;
Expand Down
47 changes: 35 additions & 12 deletions src/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,8 @@ struct Options {
focus_ring: config::FocusRing,
/// Column widths that `toggle_width()` switches between.
preset_widths: Vec<ColumnWidth>,
/// Initial width for new windows.
default_width: Option<ColumnWidth>,
}

impl Default for Options {
Expand All @@ -220,6 +222,7 @@ impl Default for Options {
ColumnWidth::Proportion(0.5),
ColumnWidth::Proportion(2. / 3.),
],
default_width: None,
}
}
}
Expand All @@ -238,10 +241,19 @@ impl Options {
.collect()
};

// Missing default_column_width maps to Some(ColumnWidth::Proportion(0.5)),
// while present, but empty, maps to None.
let default_width = config
.default_column_width
.as_ref()
.map(|w| w.0.first().copied().map(ColumnWidth::from))
.unwrap_or(Some(ColumnWidth::Proportion(0.5)));

Self {
gaps: config.gaps.into(),
focus_ring: config.focus_ring,
preset_widths,
default_width,
}
}
}
Expand Down Expand Up @@ -457,12 +469,6 @@ impl ColumnWidth {
}
}

impl Default for ColumnWidth {
fn default() -> Self {
Self::Proportion(0.5)
}
}

impl<W: LayoutElement> Layout<W> {
pub fn new(config: &Config) -> Self {
Self {
Expand Down Expand Up @@ -631,7 +637,16 @@ impl<W: LayoutElement> Layout<W> {
/// Adds a new window to the layout.
///
/// Returns an output that the window was added to, if there were any outputs.
pub fn add_window(&mut self, window: W, activate: bool, width: ColumnWidth) -> Option<&Output> {
pub fn add_window(
&mut self,
window: W,
activate: bool,
width: Option<ColumnWidth>,
) -> Option<&Output> {
let width = width
.or(self.options.default_width)
.unwrap_or_else(|| ColumnWidth::Fixed(window.geometry().size.w));

match &mut self.monitor_set {
MonitorSet::Normal {
monitors,
Expand Down Expand Up @@ -1992,9 +2007,14 @@ impl<W: LayoutElement> Workspace<W> {
}

pub fn configure_new_window(&self, window: &Window) {
let width = ColumnWidth::default().resolve(&self.options, self.working_area.size.w);
let width = if let Some(width) = self.options.default_width {
max(1, width.resolve(&self.options, self.working_area.size.w))
} else {
0
};

let height = self.working_area.size.h - self.options.gaps * 2;
let size = Size::from((max(width, 1), max(height, 1)));
let size = Size::from((width, max(height, 1)));

let bounds = self.toplevel_bounds();

Expand Down Expand Up @@ -2332,10 +2352,11 @@ impl<W: LayoutElement> Workspace<W> {
return;
}

let width = source_column.width;
let window = source_column.windows[source_column.active_window_idx].clone();
self.remove_window(&window);

self.add_window(window, true, ColumnWidth::default());
self.add_window(window, true, width);
}

fn view_pos(&self) -> i32 {
Expand Down Expand Up @@ -2749,7 +2770,9 @@ impl<W: LayoutElement> Column<W> {
let width = match self.width {
ColumnWidth::Proportion(x) if x == 1. => {
// FIXME: would be good to restore to previous width here.
ColumnWidth::default()
self.options
.default_width
.unwrap_or(ColumnWidth::Proportion(0.5))
}
_ => ColumnWidth::Proportion(1.),
};
Expand Down Expand Up @@ -3111,7 +3134,7 @@ mod tests {
}

let win = TestWindow::new(id, bbox);
layout.add_window(win, activate, ColumnWidth::default());
layout.add_window(win, activate, None);
}
Op::CloseWindow(id) => {
let dummy = TestWindow::new(id, Rectangle::default());
Expand Down

0 comments on commit e1bfd98

Please sign in to comment.