aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/compositor.rs10
-rw-r--r--helix-term/src/ui/editor.rs8
-rw-r--r--helix-term/src/ui/prompt.rs8
-rw-r--r--helix-tui/src/terminal.rs4
-rw-r--r--helix-view/src/editor.rs5
-rw-r--r--helix-view/src/tree.rs10
-rw-r--r--helix-view/src/view.rs5
-rw-r--r--shell.nix2
8 files changed, 38 insertions, 14 deletions
diff --git a/helix-term/src/compositor.rs b/helix-term/src/compositor.rs
index 7753e0a5..9811655c 100644
--- a/helix-term/src/compositor.rs
+++ b/helix-term/src/compositor.rs
@@ -122,11 +122,17 @@ impl Compositor {
}
pub fn render(&mut self, cx: &mut Context) {
- self.terminal.autoresize().unwrap();
- let area = self.size();
+ let area = self
+ .terminal
+ .autoresize()
+ .expect("Unable to determine terminal size");
+
+ // TODO: need to recalculate view tree if necessary
let surface = self.terminal.current_buffer_mut();
+ let area = *surface.area();
+
for layer in &self.layers {
layer.render(area, surface, cx)
}
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index 47770ebd..e92cf4f1 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -240,7 +240,7 @@ impl EditorView {
for selection in doc
.selection(view.id)
.iter()
- .filter(|range| range.overlaps(&screen))
+ .filter(|range| screen.overlaps(&range))
{
// TODO: render also if only one of the ranges is in viewport
let mut start = view.screen_coords_at_pos(doc, text, selection.anchor);
@@ -261,7 +261,7 @@ impl EditorView {
Rect::new(
viewport.x + start.col as u16,
viewport.y + start.row as u16,
- (end.col - start.col) as u16 + 1,
+ ((end.col - start.col) as u16 + 1).min(viewport.width),
1,
),
selection_style,
@@ -633,6 +633,10 @@ impl Component for EditorView {
// clear with background color
surface.set_style(area, cx.editor.theme.get("ui.background"));
+ // if the terminal size suddenly changed, we need to trigger a resize
+ cx.editor
+ .resize(Rect::new(area.x, area.y, area.width, area.height - 1)); // - 1 to account for commandline
+
for (view, is_focused) in cx.editor.tree.views() {
let doc = cx.editor.document(view.doc).unwrap();
self.render_view(doc, view, area, surface, &cx.editor.theme, is_focused);
diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs
index 8bb6ba93..1f424878 100644
--- a/helix-term/src/ui/prompt.rs
+++ b/helix-term/src/ui/prompt.rs
@@ -160,7 +160,13 @@ impl Prompt {
if let Some(doc) = (self.doc_fn)(&self.line) {
let text = ui::Text::new(doc.to_string());
- let area = Rect::new(completion_area.x, completion_area.y - 3, BASE_WIDTH * 3, 3);
+ let viewport = area;
+ let area = viewport.intersection(Rect::new(
+ completion_area.x,
+ completion_area.y - 3,
+ BASE_WIDTH * 3,
+ 3,
+ ));
let background = theme.get("ui.help");
surface.clear_with(area, background);
diff --git a/helix-tui/src/terminal.rs b/helix-tui/src/terminal.rs
index 1a0cae3e..ad1e8da3 100644
--- a/helix-tui/src/terminal.rs
+++ b/helix-tui/src/terminal.rs
@@ -137,12 +137,12 @@ where
}
/// Queries the backend for size and resizes if it doesn't match the previous size.
- pub fn autoresize(&mut self) -> io::Result<()> {
+ pub fn autoresize(&mut self) -> io::Result<Rect> {
let size = self.size()?;
if size != self.viewport.area {
self.resize(size)?;
};
- Ok(())
+ Ok(size)
}
/// Synchronizes terminal size, calls the rendering closure, flushes the current internal state
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index e9f8b5a1..e7b25814 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -194,8 +194,9 @@ impl Editor {
}
pub fn resize(&mut self, area: Rect) {
- self.tree.resize(area);
- self._refresh();
+ if self.tree.resize(area) {
+ self._refresh();
+ };
}
pub fn focus_next(&mut self) {
diff --git a/helix-view/src/tree.rs b/helix-view/src/tree.rs
index b7c99e16..5b56156f 100644
--- a/helix-view/src/tree.rs
+++ b/helix-view/src/tree.rs
@@ -293,9 +293,13 @@ impl Tree {
}
}
- pub fn resize(&mut self, area: Rect) {
- self.area = area;
- self.recalculate();
+ pub fn resize(&mut self, area: Rect) -> bool {
+ if self.area != area {
+ self.area = area;
+ self.recalculate();
+ return true;
+ }
+ false
}
pub fn recalculate(&mut self) {
diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs
index f82de90e..b7bfaa17 100644
--- a/helix-view/src/view.rs
+++ b/helix-view/src/view.rs
@@ -143,8 +143,9 @@ impl View {
}
}
- let row = line - self.first_line as usize;
- let col = col - self.first_col as usize;
+ // It is possible for underflow to occur if the buffer length is larger than the terminal width.
+ let row = line.saturating_sub(self.first_line);
+ let col = col.saturating_sub(self.first_col);
Some(Position::new(row, col))
}
diff --git a/shell.nix b/shell.nix
index 180e8957..9e7bce9b 100644
--- a/shell.nix
+++ b/shell.nix
@@ -4,6 +4,8 @@ pkgs.mkShell {
nativeBuildInputs = with pkgs; [
(rust-bin.stable.latest.default.override { extensions = ["rust-src"]; })
lld_10
+ lldb
+ # pythonPackages.six
stdenv.cc.cc.lib
# pkg-config
];