diff options
author | Sebastian Thiel <sebastian.thiel@icloud.com> | 2023-12-26 20:50:06 +0100 |
---|---|---|
committer | Sebastian Thiel <sebastian.thiel@icloud.com> | 2023-12-26 20:55:27 +0100 |
commit | b5b8aa26b648d8a034667bca8320ba7952a27780 (patch) | |
tree | 3a13a41d7864cb712524bffea5c6fedd89d6ed07 /src | |
parent | 90b65d59f5dde888f81c42e3c812670929b1740a (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.rs | 4 | ||||
-rw-r--r-- | src/interactive/widgets/glob.rs | 4 | ||||
-rw-r--r-- | src/interactive/widgets/help.rs | 5 | ||||
-rw-r--r-- | src/interactive/widgets/mark.rs | 5 |
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)) |