From d9bd21d33f7f35d1362a581cefb1c897a821fcad Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Sat, 10 Mar 2018 12:14:58 +0100 Subject: [PATCH] Fix selection in scrollback There were a few issues with selection in scrollback that were mainly off-by-one errors. This aims at fixing these issues. This also fixes a bug that currently exists in master where the last cell is not selected when the mouse leaves the window to the right. --- src/input.rs | 5 ++++- src/selection.rs | 17 +++++++++++------ src/term/mod.rs | 1 - 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/input.rs b/src/input.rs index 16fddc2c..7b9eda56 100644 --- a/src/input.rs +++ b/src/input.rs @@ -278,7 +278,10 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> { let cell_x = (x as usize - size_info.padding_x as usize) % size_info.cell_width as usize; let half_cell_width = (size_info.cell_width / 2.0) as usize; - let cell_side = if cell_x > half_cell_width { + let cell_side = if cell_x > half_cell_width + // Edge case when mouse leaves the window + || x as f32 >= size_info.width - size_info.padding_x + { Side::Right } else { Side::Left diff --git a/src/selection.rs b/src/selection.rs index 31787bbb..8e7fa29b 100644 --- a/src/selection.rs +++ b/src/selection.rs @@ -191,8 +191,6 @@ impl Selection { (region.end, region.start) }; - println!("BEFORE front={:?}, start={:?}, tail={:?}, end={:?}", front, start, tail, end); - if front < tail && front.line == tail.line { start = grid.semantic_search_left(front); end = grid.semantic_search_right(tail); @@ -201,8 +199,6 @@ impl Selection { end = grid.semantic_search_left(tail); } - println!("AFTER front={:?}, start={:?}, tail={:?}, end={:?}", front, start, tail, end); - if start > end { ::std::mem::swap(&mut start, &mut end); } @@ -249,12 +245,21 @@ impl Selection { } fn span_simple(grid: &G, region: &Range) -> Option { - let start = region.start.point; + let mut start = region.start.point; let start_side = region.start.side; - let end = region.end.point; + let mut end = region.end.point; let end_side = region.end.side; let cols = grid.dimensions().col; + // Handle some edge cases + if start.line > end.line { + start.col += 1; + end.col -= 1; + } else if start.line < end.line { + start.col -= 1; + end.col += 1; + } + let (front, tail, front_side, tail_side) = if start > end { // Selected upward; start/end are swapped (end, start, end_side, start_side) diff --git a/src/term/mod.rs b/src/term/mod.rs index fd321fc6..6318c680 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -1060,7 +1060,6 @@ impl Term { let selection = self.grid.selection.as_ref() .and_then(|s| s.to_span(self)) .map(|span| { - // println!("span={:?}, locations={:?}", span, span.to_locations()); span.to_locations() }); let cursor = if window_focused {