aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2018-03-10 12:14:58 +0100
committerJoe Wilm <jwilm@users.noreply.github.com>2018-03-13 16:58:15 -0700
commitf8e36d166342d9ee4a91f8e89f55677cd0fd0644 (patch)
treea7bb8ff817301779d5d61e5e7a2976fe227daa71
parenta741193bc0f96595e8b618322440669125bf08a6 (diff)
downloadalacritty-f8e36d166342d9ee4a91f8e89f55677cd0fd0644.tar.gz
alacritty-f8e36d166342d9ee4a91f8e89f55677cd0fd0644.zip
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.
-rw-r--r--src/input.rs5
-rw-r--r--src/selection.rs17
-rw-r--r--src/term/mod.rs1
3 files changed, 15 insertions, 8 deletions
diff --git a/src/input.rs b/src/input.rs
index f1e63299..af45c6ef 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -274,7 +274,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<G: Dimensions>(grid: &G, region: &Range<Anchor>) -> Option<Span> {
- 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 52d56ec8..511d6fbd 100644
--- a/src/term/mod.rs
+++ b/src/term/mod.rs
@@ -1058,7 +1058,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 {