From 104b866cb6fa1b0674abdd2bdd3668f280939ca8 Mon Sep 17 00:00:00 2001 From: Lado Tonia Date: Mon, 4 Mar 2019 11:20:15 -0500 Subject: [PATCH] Fix selection starting inside padding This fixes #2109. --- CHANGELOG.md | 1 + src/input.rs | 2 +- src/term/mod.rs | 19 ++++++++++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6f6d565..46a86069 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Cursor jumping around when leaving alt screen while not in the alt screen - Text lingering around when resetting while scrolled up in the history - Terminfo support for extended capabilities +- Allow mouse presses and beginning of mouse selection in padding ## Version 0.2.9 diff --git a/src/input.rs b/src/input.rs index 7779dca9..32e4dcbd 100644 --- a/src/input.rs +++ b/src/input.rs @@ -411,7 +411,7 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> { } else if self.ctx.terminal().mode().intersects(motion_mode) // Only report motion when changing cells && (prev_line != self.ctx.mouse().line || prev_col != self.ctx.mouse().column) - && size_info.contains_point(x, y) + && size_info.contains_point(x, y, false) { if self.ctx.mouse().left_button_state == ElementState::Pressed { self.mouse_report(32, ElementState::Pressed, modifiers); diff --git a/src/term/mod.rs b/src/term/mod.rs index 966ac182..30a1a214 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -838,11 +838,15 @@ impl SizeInfo { Column(((self.width - 2. * self.padding_x) / self.cell_width) as usize) } - pub fn contains_point(&self, x: usize, y:usize) -> bool { - x < (self.width - self.padding_x) as usize - && x >= self.padding_x as usize - && y < (self.height - self.padding_y) as usize - && y >= self.padding_y as usize + pub fn contains_point(&self, x: usize, y: usize, include_padding: bool) -> bool { + if include_padding { + x < self.width as usize && y < self.height as usize + } else { + x < (self.width - self.padding_x) as usize + && x >= self.padding_x as usize + && y < (self.height - self.padding_y) as usize + && y >= self.padding_y as usize + } } pub fn pixels_to_coords(&self, x: usize, y: usize) -> Point { @@ -1104,9 +1108,10 @@ impl Term { /// The mouse coordinates are expected to be relative to the top left. The /// line and column returned are also relative to the top left. /// - /// Returns None if the coordinates are outside the screen + /// Returns None if the coordinates are outside the window, + /// padding pixels are considered inside the window pub fn pixels_to_coords(&self, x: usize, y: usize) -> Option { - if self.size_info.contains_point(x, y) { + if self.size_info.contains_point(x, y, true) { Some(self.size_info.pixels_to_coords(x, y)) } else { None