summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSebastian Thiel <sebastian.thiel@icloud.com>2023-12-26 20:50:06 +0100
committerSebastian Thiel <sebastian.thiel@icloud.com>2023-12-26 20:55:27 +0100
commitb5b8aa26b648d8a034667bca8320ba7952a27780 (patch)
tree3a13a41d7864cb712524bffea5c6fedd89d6ed07 /src
parent90b65d59f5dde888f81c42e3c812670929b1740a (diff)
fix: avoid duplicate key input on windows (#203).
On Windows, key-states like press/release/repeat are made available separately, which means we should avoid responding to key-releases as it would incorrectly double the actual user inputs.
Diffstat (limited to 'src')
-rw-r--r--src/interactive/app/eventloop.rs4
-rw-r--r--src/interactive/widgets/glob.rs4
-rw-r--r--src/interactive/widgets/help.rs5
-rw-r--r--src/interactive/widgets/mark.rs5
4 files changed, 14 insertions, 4 deletions
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs
index c25b350..18e4bf7 100644
--- a/src/interactive/app/eventloop.rs
+++ b/src/interactive/app/eventloop.rs
@@ -6,7 +6,7 @@ use crate::interactive::{
SortMode,
};
use anyhow::Result;
-use crosstermion::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
+use crosstermion::crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use crosstermion::input::{input_channel, Event};
use dua::{
traverse::{EntryData, Traversal},
@@ -115,7 +115,7 @@ impl AppState {
for event in events {
let key = match event {
- Event::Key(key) => key,
+ Event::Key(key) if key.kind != KeyEventKind::Release => key,
Event::Resize(_, _) => refresh_key(),
_ => continue,
};
diff --git a/src/interactive/widgets/glob.rs b/src/interactive/widgets/glob.rs
index 01c8e91..bad9fd9 100644
--- a/src/interactive/widgets/glob.rs
+++ b/src/interactive/widgets/glob.rs
@@ -1,5 +1,6 @@
use anyhow::{anyhow, Context, Result};
use bstr::BString;
+use crosstermion::crossterm::event::KeyEventKind;
use crosstermion::input::Key;
use dua::traverse::{Tree, TreeIndex};
use petgraph::Direction;
@@ -37,6 +38,9 @@ pub struct GlobPane {
impl GlobPane {
pub fn process_events(&mut self, key: Key) {
use crosstermion::crossterm::event::KeyCode::*;
+ if key.kind == KeyEventKind::Release {
+ return;
+ }
match key.code {
Char(to_insert) => {
self.enter_char(to_insert);
diff --git a/src/interactive/widgets/help.rs b/src/interactive/widgets/help.rs
index 0edc53e..092fb00 100644
--- a/src/interactive/widgets/help.rs
+++ b/src/interactive/widgets/help.rs
@@ -1,6 +1,6 @@
use crate::interactive::CursorDirection;
pub use crosstermion::crossterm::event::KeyCode::*;
-use crosstermion::crossterm::event::KeyModifiers;
+use crosstermion::crossterm::event::{KeyEventKind, KeyModifiers};
use crosstermion::input::Key;
use std::{borrow::Borrow, cell::RefCell};
use tui::{
@@ -36,6 +36,9 @@ fn margin(r: Rect, margin: u16) -> Rect {
impl HelpPane {
pub fn process_events(&mut self, key: Key) {
+ if key.kind == KeyEventKind::Release {
+ return;
+ }
match key.code {
Char('H') => self.scroll_help(CursorDirection::ToTop),
Char('G') => self.scroll_help(CursorDirection::ToBottom),
diff --git a/src/interactive/widgets/mark.rs b/src/interactive/widgets/mark.rs
index dc0021e..a774c73 100644
--- a/src/interactive/widgets/mark.rs
+++ b/src/interactive/widgets/mark.rs
@@ -3,7 +3,7 @@ use crate::interactive::{
app::tree_view::TreeView, fit_string_graphemes_with_ellipsis, widgets::entry_color,
CursorDirection,
};
-use crosstermion::crossterm::event::KeyModifiers;
+use crosstermion::crossterm::event::{KeyEventKind, KeyModifiers};
use crosstermion::input::Key;
use dua::{traverse::TreeIndex, ByteFormat};
use itertools::Itertools;
@@ -117,6 +117,9 @@ impl MarkPane {
pub fn process_events(mut self, key: Key) -> Option<(Self, Option<MarkMode>)> {
use crosstermion::crossterm::event::KeyCode::*;
let action = None;
+ if key.kind == KeyEventKind::Release {
+ return Some((self, action));
+ }
match key.code {
Char('r') if key.modifiers.contains(KeyModifiers::CONTROL) => {
return Some(self.prepare_deletion(MarkMode::Delete))