aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server
diff options
context:
space:
mode:
authoruser <user@clank>2026-08-08 21:06:40 +0200
committeruser <user@clank>2026-08-08 21:06:40 +0200
commit97b744a57e3ba53169781a9357d8dc86b15d387e (patch)
tree258562cbe750017fc08180e3d92a96c12689a47d /zellij-server
parentsl0p: uniform pane gap + aspect-corrected horizontal gap (diff)
downloadsl0ppij-97b744a57e3ba53169781a9357d8dc86b15d387e.tar.gz
sl0ppij-97b744a57e3ba53169781a9357d8dc86b15d387e.tar.xz
sl0ppij-97b744a57e3ba53169781a9357d8dc86b15d387e.zip
sl0p: CSS-style 1/2/4-value shorthand for inner padding
`padding` now accepts: padding 1 -> all four sides padding 1 2 -> up/down = 1, left/right = 2 padding 1 2 3 4 -> up=1 down=2 left=3 right=4 NOTE the 4-value order is UP DOWN LEFT RIGHT as requested, deliberately NOT CSS's clockwise top-right-bottom-left. Documented on PanePadding and at the parser, since the similarity to CSS invites the wrong assumption. 3 or 5 values are rejected with a message naming the accepted forms, rather than being silently reinterpreted. Negative values clamp to 0. ASPECT: only the 1-value form is aspect-corrected (left/right multiplied by gap_aspect) so `padding 1` looks square on a non-square cell grid. The 2- and 4-value forms are literal: specifying axes separately means the caller is already controlling horizontal size, and silently doubling it would surprise. Style now carries a PanePadding {top,bottom,left,right} instead of an x/y pair, which also collapses the reconfigure plumbing back to a single field rather than growing another parameter per side. to_kdl always emits the explicit 4-value form: emitting the 1-value form would re-apply gap_aspect on the next read and silently double the padding on every config round-trip. Baselines held: zellij-utils 435/5, zellij-server 1421/30.
Diffstat (limited to 'zellij-server')
-rw-r--r--zellij-server/src/lib.rs9
-rw-r--r--zellij-server/src/panes/floating_panes/mod.rs8
-rw-r--r--zellij-server/src/panes/plugin_pane.rs14
-rw-r--r--zellij-server/src/panes/terminal_pane.rs14
-rw-r--r--zellij-server/src/panes/tiled_panes/mod.rs8
-rw-r--r--zellij-server/src/screen.rs16
-rw-r--r--zellij-server/src/tab/mod.rs15
7 files changed, 33 insertions, 51 deletions
diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs
index a80bda2b..fe5b3b19 100644
--- a/zellij-server/src/lib.rs
+++ b/zellij-server/src/lib.rs
@@ -462,8 +462,7 @@ impl SessionMetaData {
pane_title_alignment: new_config.ui.pane_frames.title_alignment,
pane_gap_x: new_config.ui.pane_frames.resolved_gap().0,
pane_gap_y: new_config.ui.pane_frames.resolved_gap().1,
- pane_padding_x: new_config.ui.pane_frames.resolved_padding().0,
- pane_padding_y: new_config.ui.pane_frames.resolved_padding().1,
+ pane_padding: new_config.ui.pane_frames.resolved_padding(),
stacked_resize: new_config.options.stacked_resize.unwrap_or(true),
stacked_pane_list: new_config.options.stacked_pane_list.unwrap_or(true),
default_editor: new_config.options.scrollback_editor.clone(),
@@ -1008,8 +1007,7 @@ pub fn start_server_impl(
pane_title_alignment: config.ui.pane_frames.title_alignment,
pane_gap_x: config.ui.pane_frames.resolved_gap().0,
pane_gap_y: config.ui.pane_frames.resolved_gap().1,
- pane_padding_x: config.ui.pane_frames.resolved_padding().0,
- pane_padding_y: config.ui.pane_frames.resolved_padding().1,
+ pane_padding: config.ui.pane_frames.resolved_padding(),
},
};
@@ -1196,8 +1194,7 @@ pub fn start_server_impl(
pane_title_alignment: config.ui.pane_frames.title_alignment,
pane_gap_x: config.ui.pane_frames.resolved_gap().0,
pane_gap_y: config.ui.pane_frames.resolved_gap().1,
- pane_padding_x: config.ui.pane_frames.resolved_padding().0,
- pane_padding_y: config.ui.pane_frames.resolved_padding().1,
+ pane_padding: config.ui.pane_frames.resolved_padding(),
},
};
diff --git a/zellij-server/src/panes/floating_panes/mod.rs b/zellij-server/src/panes/floating_panes/mod.rs
index 8252612c..3e5e80f8 100644
--- a/zellij-server/src/panes/floating_panes/mod.rs
+++ b/zellij-server/src/panes/floating_panes/mod.rs
@@ -1725,16 +1725,14 @@ impl FloatingPanes {
title_alignment: zellij_utils::data::PaneTitleAlignment,
gap_x: usize,
gap_y: usize,
- padding_x: usize,
- padding_y: usize,
+ padding: zellij_utils::data::PanePadding,
) {
self.style.pane_title_alignment = title_alignment;
self.style.pane_gap_x = gap_x;
self.style.pane_gap_y = gap_y;
- self.style.pane_padding_x = padding_x;
- self.style.pane_padding_y = padding_y;
+ self.style.pane_padding = padding;
for pane in self.panes.values_mut() {
- pane.update_frame_layout(title_alignment, gap_x, gap_y, padding_x, padding_y);
+ pane.update_frame_layout(title_alignment, gap_x, gap_y, padding);
}
// Unlike the tiled panes, `set_pane_frame_style` only re-runs the
// content-offset sweep for a fullscreen floating pane, so gap/padding
diff --git a/zellij-server/src/panes/plugin_pane.rs b/zellij-server/src/panes/plugin_pane.rs
index 4f4e138d..6c1e8707 100644
--- a/zellij-server/src/panes/plugin_pane.rs
+++ b/zellij-server/src/panes/plugin_pane.rs
@@ -773,10 +773,10 @@ impl Pane for PluginPane {
Offset::default()
} else {
Offset {
- top: self.gap_offset.top.saturating_add(self.style.pane_padding_y),
- bottom: self.gap_offset.bottom.saturating_add(self.style.pane_padding_y),
- left: self.gap_offset.left.saturating_add(self.style.pane_padding_x),
- right: self.gap_offset.right.saturating_add(self.style.pane_padding_x),
+ top: self.gap_offset.top.saturating_add(self.style.pane_padding.top),
+ bottom: self.gap_offset.bottom.saturating_add(self.style.pane_padding.bottom),
+ left: self.gap_offset.left.saturating_add(self.style.pane_padding.left),
+ right: self.gap_offset.right.saturating_add(self.style.pane_padding.right),
}
};
self.content_offset =
@@ -915,14 +915,12 @@ impl Pane for PluginPane {
title_alignment: zellij_utils::data::PaneTitleAlignment,
gap_x: usize,
gap_y: usize,
- padding_x: usize,
- padding_y: usize,
+ padding: zellij_utils::data::PanePadding,
) {
self.style.pane_title_alignment = title_alignment;
self.style.pane_gap_x = gap_x;
self.style.pane_gap_y = gap_y;
- self.style.pane_padding_x = padding_x;
- self.style.pane_padding_y = padding_y;
+ self.style.pane_padding = padding;
self.frame.clear();
}
fn set_should_be_suppressed(&mut self, should_be_suppressed: bool) {
diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs
index 8c44d7b1..7fb78171 100644
--- a/zellij-server/src/panes/terminal_pane.rs
+++ b/zellij-server/src/panes/terminal_pane.rs
@@ -991,10 +991,10 @@ impl Pane for TerminalPane {
Offset::default()
} else {
Offset {
- top: self.gap_offset.top.saturating_add(self.style.pane_padding_y),
- bottom: self.gap_offset.bottom.saturating_add(self.style.pane_padding_y),
- left: self.gap_offset.left.saturating_add(self.style.pane_padding_x),
- right: self.gap_offset.right.saturating_add(self.style.pane_padding_x),
+ top: self.gap_offset.top.saturating_add(self.style.pane_padding.top),
+ bottom: self.gap_offset.bottom.saturating_add(self.style.pane_padding.bottom),
+ left: self.gap_offset.left.saturating_add(self.style.pane_padding.left),
+ right: self.gap_offset.right.saturating_add(self.style.pane_padding.right),
}
};
self.content_offset =
@@ -1269,14 +1269,12 @@ impl Pane for TerminalPane {
title_alignment: zellij_utils::data::PaneTitleAlignment,
gap_x: usize,
gap_y: usize,
- padding_x: usize,
- padding_y: usize,
+ padding: zellij_utils::data::PanePadding,
) {
self.style.pane_title_alignment = title_alignment;
self.style.pane_gap_x = gap_x;
self.style.pane_gap_y = gap_y;
- self.style.pane_padding_x = padding_x;
- self.style.pane_padding_y = padding_y;
+ self.style.pane_padding = padding;
self.frame.clear();
}
fn drain_fake_cursors(&mut self) -> Option<HashSet<(usize, usize)>> {
diff --git a/zellij-server/src/panes/tiled_panes/mod.rs b/zellij-server/src/panes/tiled_panes/mod.rs
index 835c8e74..4d8f0a4a 100644
--- a/zellij-server/src/panes/tiled_panes/mod.rs
+++ b/zellij-server/src/panes/tiled_panes/mod.rs
@@ -3156,16 +3156,14 @@ impl TiledPanes {
title_alignment: zellij_utils::data::PaneTitleAlignment,
gap_x: usize,
gap_y: usize,
- padding_x: usize,
- padding_y: usize,
+ padding: zellij_utils::data::PanePadding,
) {
self.style.pane_title_alignment = title_alignment;
self.style.pane_gap_x = gap_x;
self.style.pane_gap_y = gap_y;
- self.style.pane_padding_x = padding_x;
- self.style.pane_padding_y = padding_y;
+ self.style.pane_padding = padding;
for pane in self.panes.values_mut() {
- pane.update_frame_layout(title_alignment, gap_x, gap_y, padding_x, padding_y);
+ pane.update_frame_layout(title_alignment, gap_x, gap_y, padding);
}
}
pub fn stack_panes(
diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs
index c3c06ca9..438fee2d 100644
--- a/zellij-server/src/screen.rs
+++ b/zellij-server/src/screen.rs
@@ -43,7 +43,7 @@ use zellij_utils::data::{
CommandOrPlugin, Direction, EventType, FloatingPaneCoordinates, GetFocusedPaneInfoResponse,
HostTerminalThemeMode, KeyWithModifier, LayoutInfo, LayoutWithError, ListPanesResponse,
ListTabsResponse, NewPanePlacement, PaneContents, PaneInfo, PaneListEntry, PaneManifest,
- PaneRenderReport, PaneScrollbackResponse, PaneTitleAlignment, PluginPermission,
+ PaneRenderReport, PanePadding, PaneScrollbackResponse, PaneTitleAlignment, PluginPermission,
RegexHighlight, Resize,
ResizeStrategy, SessionInfo, Styling, TabInfo, ThemeHue, WebSharing,
};
@@ -779,8 +779,7 @@ pub enum ScreenInstruction {
pane_title_alignment: PaneTitleAlignment,
pane_gap_x: usize,
pane_gap_y: usize,
- pane_padding_x: usize,
- pane_padding_y: usize,
+ pane_padding: PanePadding,
stacked_resize: bool,
stacked_pane_list: bool,
default_editor: Option<PathBuf>,
@@ -6270,8 +6269,7 @@ impl Screen {
pane_title_alignment: PaneTitleAlignment,
pane_gap_x: usize,
pane_gap_y: usize,
- pane_padding_x: usize,
- pane_padding_y: usize,
+ pane_padding: PanePadding,
stacked_resize: bool,
stacked_pane_list: bool,
default_editor: Option<PathBuf>,
@@ -6331,7 +6329,7 @@ impl Screen {
tab.update_copy_options(&self.copy_options);
// must precede set_pane_frames: gap/padding are baked into
// content_offset by the sweep that set_pane_frames triggers
- tab.update_frame_layout(pane_title_alignment, pane_gap_x, pane_gap_y, pane_padding_x, pane_padding_y);
+ tab.update_frame_layout(pane_title_alignment, pane_gap_x, pane_gap_y, pane_padding);
tab.set_pane_frames(pane_frame_style);
tab.update_arrow_fonts(should_support_arrow_fonts);
tab.update_advanced_mouse_actions(advanced_mouse_actions);
@@ -10850,8 +10848,7 @@ pub(crate) fn screen_thread_main(
pane_title_alignment,
pane_gap_x,
pane_gap_y,
- pane_padding_x,
- pane_padding_y,
+ pane_padding,
stacked_resize,
stacked_pane_list,
default_editor,
@@ -10882,8 +10879,7 @@ pub(crate) fn screen_thread_main(
pane_title_alignment,
pane_gap_x,
pane_gap_y,
- pane_padding_x,
- pane_padding_y,
+ pane_padding,
stacked_resize,
stacked_pane_list,
default_editor,
diff --git a/zellij-server/src/tab/mod.rs b/zellij-server/src/tab/mod.rs
index c9047d68..ec088422 100644
--- a/zellij-server/src/tab/mod.rs
+++ b/zellij-server/src/tab/mod.rs
@@ -751,8 +751,7 @@ pub trait Pane {
_title_alignment: zellij_utils::data::PaneTitleAlignment,
_gap_x: usize,
_gap_y: usize,
- _padding_x: usize,
- _padding_y: usize,
+ _padding: zellij_utils::data::PanePadding,
) {
}
fn set_should_be_suppressed(&mut self, _should_be_suppressed: bool) {}
@@ -7420,20 +7419,18 @@ impl Tab {
title_alignment: zellij_utils::data::PaneTitleAlignment,
gap_x: usize,
gap_y: usize,
- padding_x: usize,
- padding_y: usize,
+ padding: zellij_utils::data::PanePadding,
) {
self.style.pane_title_alignment = title_alignment;
self.style.pane_gap_x = gap_x;
self.style.pane_gap_y = gap_y;
- self.style.pane_padding_x = padding_x;
- self.style.pane_padding_y = padding_y;
+ self.style.pane_padding = padding;
self.floating_panes
- .update_pane_frame_layout(title_alignment, gap_x, gap_y, padding_x, padding_y);
+ .update_pane_frame_layout(title_alignment, gap_x, gap_y, padding);
self.tiled_panes
- .update_pane_frame_layout(title_alignment, gap_x, gap_y, padding_x, padding_y);
+ .update_pane_frame_layout(title_alignment, gap_x, gap_y, padding);
for (_, pane) in self.suppressed_panes.values_mut() {
- pane.update_frame_layout(title_alignment, gap_x, gap_y, padding_x, padding_y);
+ pane.update_frame_layout(title_alignment, gap_x, gap_y, padding);
}
}
pub fn update_arrow_fonts(&mut self, should_support_arrow_fonts: bool) {