Skip to content

Commit

Permalink
fix: avoid dup key press on windows
Browse files Browse the repository at this point in the history
Addresses #65

Windows sends two separate key events for each key:
	KeyEventKind::Press and KeyEventKind::Release

Before processing a key event, we ensure it is a `Press` thereby
ignoring `Release` events
  • Loading branch information
dan-da authored and Sword-Smith committed Jan 4, 2024
1 parent 3025ff2 commit dfde0e5
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 137 deletions.
84 changes: 45 additions & 39 deletions src/bin/dashboard_src/dashboard_app.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use core::fmt;
use crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode},
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
Expand Down Expand Up @@ -311,43 +311,45 @@ impl DashboardApp {
self.output = error_message + "\n";
} else if self.menu_in_focus {
if let DashboardEvent::ConsoleEvent(Event::Key(key)) = event {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => {
if self.current_menu_item != MenuItem::Quit {
self.current_menu_item = MenuItem::Quit;
} else {
self.running = false;
}
}
KeyCode::Enter => {
if self.current_menu_item == MenuItem::Quit {
self.running = false;
} else {
self.menu_in_focus = false;
if self.have_current_screen() {
self.current_screen().focus();
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => {
if self.current_menu_item != MenuItem::Quit {
self.current_menu_item = MenuItem::Quit;
} else {
self.running = false;
}
}
}
KeyCode::Up => {
if self.have_current_screen() {
self.current_screen().deactivate();
}
self.current_menu_item = self.current_menu_item.previous();
if self.have_current_screen() {
self.current_screen().activate();
KeyCode::Enter => {
if self.current_menu_item == MenuItem::Quit {
self.running = false;
} else {
self.menu_in_focus = false;
if self.have_current_screen() {
self.current_screen().focus();
}
}
}
}
KeyCode::Down => {
if self.have_current_screen() {
self.current_screen().deactivate();
KeyCode::Up => {
if self.have_current_screen() {
self.current_screen().deactivate();
}
self.current_menu_item = self.current_menu_item.previous();
if self.have_current_screen() {
self.current_screen().activate();
}
}
self.current_menu_item = self.current_menu_item.next();
if self.have_current_screen() {
self.current_screen().activate();
KeyCode::Down => {
if self.have_current_screen() {
self.current_screen().deactivate();
}
self.current_menu_item = self.current_menu_item.next();
if self.have_current_screen() {
self.current_screen().activate();
}
}
_ => {}
}
_ => {}
}
}
}
Expand All @@ -374,15 +376,19 @@ impl DashboardApp {
};

match escalated {
Some(DashboardEvent::ConsoleEvent(Event::Key(key))) => match key.code {
KeyCode::Char('q') | KeyCode::Esc => {
if self.have_current_screen() {
self.current_screen().unfocus();
Some(DashboardEvent::ConsoleEvent(Event::Key(key)))
if key.kind == KeyEventKind::Press =>
{
match key.code {
KeyCode::Char('q') | KeyCode::Esc => {
if self.have_current_screen() {
self.current_screen().unfocus();
}
self.menu_in_focus = true;
}
self.menu_in_focus = true;
_ => {}
}
_ => {}
},
}
Some(DashboardEvent::ConsoleEvent(_non_key_event)) => {}
Some(DashboardEvent::ConsoleMode(console_io)) => {
let mut console_io_mut = self.console_io.lock().await;
Expand Down
38 changes: 20 additions & 18 deletions src/bin/dashboard_src/receive_screen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use super::{
overview_screen::VerticalRectifier,
screen::Screen,
};
use crossterm::event::{Event, KeyCode};
use crossterm::event::{Event, KeyCode, KeyEventKind};
use neptune_core::{config_models::network::Network, rpc_server::RPCClient};
use ratatui::{
layout::{Alignment, Margin},
Expand Down Expand Up @@ -96,24 +96,26 @@ impl ReceiveScreen {
let mut escalate_event = None;
if self.in_focus {
if let DashboardEvent::ConsoleEvent(Event::Key(key)) = event {
match key.code {
KeyCode::Enter => {
self.generate_new_receiving_address_async(
self.server.clone(),
self.data.clone(),
self.generating.clone(),
);
escalate_event = None;
}
KeyCode::Char('c') => {
if let Some(address) = self.data.lock().unwrap().as_ref() {
return Ok(Some(DashboardEvent::ConsoleMode(
ConsoleIO::InputRequested(format!("{}\n\n", address)),
)));
if key.kind == KeyEventKind::Press {
match key.code {
KeyCode::Enter => {
self.generate_new_receiving_address_async(
self.server.clone(),
self.data.clone(),
self.generating.clone(),
);
escalate_event = None;
}
KeyCode::Char('c') => {
if let Some(address) = self.data.lock().unwrap().as_ref() {
return Ok(Some(DashboardEvent::ConsoleMode(
ConsoleIO::InputRequested(format!("{}\n\n", address)),
)));
}
}
_ => {
escalate_event = Some(event);
}
}
_ => {
escalate_event = Some(event);
}
}
}
Expand Down
164 changes: 84 additions & 80 deletions src/bin/dashboard_src/send_screen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use super::{
overview_screen::VerticalRectifier,
screen::Screen,
};
use crossterm::event::{Event, KeyCode};
use crossterm::event::{Event, KeyCode, KeyEventKind};
use neptune_core::{
config_models::network::Network,
models::{blockchain::transaction::amount::Amount, state::wallet::address::generation_address},
Expand Down Expand Up @@ -163,100 +163,104 @@ impl SendScreen {
let mut escalate_event = None;
if self.in_focus {
match event {
DashboardEvent::ConsoleEvent(Event::Key(key)) => match key.code {
KeyCode::Enter => {
if let Ok(mut own_focus) = self.focus.try_lock() {
match own_focus.to_owned() {
SendScreenWidget::Address => {
return Ok(Some(DashboardEvent::ConsoleMode(
ConsoleIO::InputRequested(
"Please enter recipient address:\n".to_string(),
),
)));
}
SendScreenWidget::Amount => {
*own_focus = SendScreenWidget::Ok;
escalate_event = None;
}
SendScreenWidget::Ok => {
// clone outside of async section
let rpc_client = self.rpc_client.clone();
let address = self.address.clone();
let amount = self.amount.clone();
let notice = self.notice.clone();
let focus = self.focus.clone();
let reset_me = self.reset_me.clone();
let network = self.network;
DashboardEvent::ConsoleEvent(Event::Key(key))
if key.kind == KeyEventKind::Press =>
{
match key.code {
KeyCode::Enter => {
if let Ok(mut own_focus) = self.focus.try_lock() {
match own_focus.to_owned() {
SendScreenWidget::Address => {
return Ok(Some(DashboardEvent::ConsoleMode(
ConsoleIO::InputRequested(
"Please enter recipient address:\n".to_string(),
),
)));
}
SendScreenWidget::Amount => {
*own_focus = SendScreenWidget::Ok;
escalate_event = None;
}
SendScreenWidget::Ok => {
// clone outside of async section
let rpc_client = self.rpc_client.clone();
let address = self.address.clone();
let amount = self.amount.clone();
let notice = self.notice.clone();
let focus = self.focus.clone();
let reset_me = self.reset_me.clone();
let network = self.network;

tokio::spawn(async move {
Self::check_and_pay_sequence(
rpc_client, address, amount, notice, focus, reset_me,
network,
)
.await;
});
escalate_event = None;
}
_ => {
escalate_event = None;
tokio::spawn(async move {
Self::check_and_pay_sequence(
rpc_client, address, amount, notice, focus,
reset_me, network,
)
.await;
});
escalate_event = None;
}
_ => {
escalate_event = None;
}
}
}
}
}
KeyCode::Up => {
if let Ok(mut own_focus) = self.focus.try_lock() {
*own_focus = match own_focus.to_owned() {
SendScreenWidget::Address => SendScreenWidget::Ok,
SendScreenWidget::Amount => SendScreenWidget::Address,
SendScreenWidget::Ok => SendScreenWidget::Amount,
SendScreenWidget::Notice => SendScreenWidget::Notice,
};
escalate_event = None;
} else {
escalate_event = Some(event);
}
}
KeyCode::Down => {
if let Ok(mut own_focus) = self.focus.try_lock() {
*own_focus = match own_focus.to_owned() {
SendScreenWidget::Address => SendScreenWidget::Amount,
SendScreenWidget::Amount => SendScreenWidget::Ok,
SendScreenWidget::Ok => SendScreenWidget::Address,
SendScreenWidget::Notice => SendScreenWidget::Notice,
};
escalate_event = None;
} else {
escalate_event = Some(event);
KeyCode::Up => {
if let Ok(mut own_focus) = self.focus.try_lock() {
*own_focus = match own_focus.to_owned() {
SendScreenWidget::Address => SendScreenWidget::Ok,
SendScreenWidget::Amount => SendScreenWidget::Address,
SendScreenWidget::Ok => SendScreenWidget::Amount,
SendScreenWidget::Notice => SendScreenWidget::Notice,
};
escalate_event = None;
} else {
escalate_event = Some(event);
}
}
}
KeyCode::Char(c) => {
if let Ok(own_focus) = self.focus.try_lock() {
if own_focus.to_owned() == SendScreenWidget::Amount {
self.amount = format!("{}{}", self.amount, c);
KeyCode::Down => {
if let Ok(mut own_focus) = self.focus.try_lock() {
*own_focus = match own_focus.to_owned() {
SendScreenWidget::Address => SendScreenWidget::Amount,
SendScreenWidget::Amount => SendScreenWidget::Ok,
SendScreenWidget::Ok => SendScreenWidget::Address,
SendScreenWidget::Notice => SendScreenWidget::Notice,
};
escalate_event = None;
} else {
escalate_event = Some(event);
}
} else {
escalate_event = Some(event);
}
}
KeyCode::Backspace => {
if let Ok(own_focus) = self.focus.try_lock() {
if own_focus.to_owned() == SendScreenWidget::Amount {
if !self.amount.is_empty() {
self.amount.drain(self.amount.len() - 1..);
KeyCode::Char(c) => {
if let Ok(own_focus) = self.focus.try_lock() {
if own_focus.to_owned() == SendScreenWidget::Amount {
self.amount = format!("{}{}", self.amount, c);
escalate_event = None;
} else {
escalate_event = Some(event);
}
escalate_event = None;
} else {
escalate_event = Some(event);
}
} else {
}
KeyCode::Backspace => {
if let Ok(own_focus) = self.focus.try_lock() {
if own_focus.to_owned() == SendScreenWidget::Amount {
if !self.amount.is_empty() {
self.amount.drain(self.amount.len() - 1..);
}
escalate_event = None;
}
} else {
escalate_event = Some(event);
}
}
_ => {
escalate_event = Some(event);
}
}
_ => {
escalate_event = Some(event);
}
},
}
DashboardEvent::ConsoleMode(ConsoleIO::InputSupplied(string)) => {
if let Ok(mut own_focus) = self.focus.try_lock() {
self.address = string.trim().to_owned();
Expand Down

0 comments on commit dfde0e5

Please sign in to comment.