aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/input.rs')
-rw-r--r--alacritty/src/input.rs54
1 files changed, 47 insertions, 7 deletions
diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs
index 935fc046..a9925088 100644
--- a/alacritty/src/input.rs
+++ b/alacritty/src/input.rs
@@ -63,6 +63,9 @@ const TOUCH_SCROLL_FACTOR: f64 = 0.35;
/// Distance before a touch input is considered a drag.
const MAX_TAP_DISTANCE: f64 = 20.;
+/// Threshold used for double_click/triple_click.
+const CLICK_THRESHOLD: Duration = Duration::from_millis(300);
+
/// Processes input from winit.
///
/// An escape sequence may be emitted in case specific keys or key combinations
@@ -555,19 +558,14 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> {
self.ctx.mouse_mut().last_click_timestamp = now;
// Update multi-click state.
- let mouse_config = &self.ctx.config().mouse;
self.ctx.mouse_mut().click_state = match self.ctx.mouse().click_state {
// Reset click state if button has changed.
_ if button != self.ctx.mouse().last_click_button => {
self.ctx.mouse_mut().last_click_button = button;
ClickState::Click
},
- ClickState::Click if elapsed < mouse_config.double_click.threshold() => {
- ClickState::DoubleClick
- },
- ClickState::DoubleClick if elapsed < mouse_config.triple_click.threshold() => {
- ClickState::TripleClick
- },
+ ClickState::Click if elapsed < CLICK_THRESHOLD => ClickState::DoubleClick,
+ ClickState::DoubleClick if elapsed < CLICK_THRESHOLD => ClickState::TripleClick,
_ => ClickState::Click,
};
@@ -1294,6 +1292,7 @@ mod tests {
initial_button: $initial_button:expr,
input: $input:expr,
end_state: $end_state:expr,
+ input_delay: $input_delay:expr,
} => {
#[test]
fn $name() {
@@ -1314,6 +1313,7 @@ mod tests {
let mut mouse = Mouse {
click_state: $initial_state,
last_click_button: $initial_button,
+ last_click_timestamp: Instant::now() - $input_delay,
..Mouse::default()
};
@@ -1384,6 +1384,7 @@ mod tests {
window_id: unsafe { WindowId::dummy() },
},
end_state: ClickState::Click,
+ input_delay: Duration::ZERO,
}
test_clickstate! {
@@ -1400,6 +1401,7 @@ mod tests {
window_id: unsafe { WindowId::dummy() },
},
end_state: ClickState::Click,
+ input_delay: Duration::ZERO,
}
test_clickstate! {
@@ -1416,6 +1418,7 @@ mod tests {
window_id: unsafe { WindowId::dummy() },
},
end_state: ClickState::Click,
+ input_delay: Duration::ZERO,
}
test_clickstate! {
@@ -1432,6 +1435,24 @@ mod tests {
window_id: unsafe { WindowId::dummy() },
},
end_state: ClickState::DoubleClick,
+ input_delay: Duration::ZERO,
+ }
+
+ test_clickstate! {
+ name: double_click_failed,
+ initial_state: ClickState::Click,
+ initial_button: MouseButton::Left,
+ input: WinitEvent::WindowEvent {
+ event: WindowEvent::MouseInput {
+ state: ElementState::Pressed,
+ button: MouseButton::Left,
+ device_id: unsafe { DeviceId::dummy() },
+ modifiers: ModifiersState::default(),
+ },
+ window_id: unsafe { WindowId::dummy() },
+ },
+ end_state: ClickState::Click,
+ input_delay: CLICK_THRESHOLD,
}
test_clickstate! {
@@ -1448,6 +1469,24 @@ mod tests {
window_id: unsafe { WindowId::dummy() },
},
end_state: ClickState::TripleClick,
+ input_delay: Duration::ZERO,
+ }
+
+ test_clickstate! {
+ name: triple_click_failed,
+ initial_state: ClickState::DoubleClick,
+ initial_button: MouseButton::Left,
+ input: WinitEvent::WindowEvent {
+ event: WindowEvent::MouseInput {
+ state: ElementState::Pressed,
+ button: MouseButton::Left,
+ device_id: unsafe { DeviceId::dummy() },
+ modifiers: ModifiersState::default(),
+ },
+ window_id: unsafe { WindowId::dummy() },
+ },
+ end_state: ClickState::Click,
+ input_delay: CLICK_THRESHOLD,
}
test_clickstate! {
@@ -1464,6 +1503,7 @@ mod tests {
window_id: unsafe { WindowId::dummy() },
},
end_state: ClickState::Click,
+ input_delay: Duration::ZERO,
}
test_process_binding! {