@@ -4,6 +4,8 @@ use chip8::{Chip8Emulator, SCREEN_WIDTH};
44use clap:: Parser ;
55use clap:: Subcommand ;
66use itertools:: Itertools ;
7+ use ratatui:: crossterm:: event:: KeyboardEnhancementFlags ;
8+ use ratatui:: crossterm:: event:: PushKeyboardEnhancementFlags ;
79use ratatui:: {
810 crossterm:: event:: { self , Event , KeyCode , KeyEvent , KeyEventKind } ,
911 layout:: { Constraint , Layout , Position , Rect } ,
@@ -39,6 +41,10 @@ pub struct App {
3941fn main ( ) -> io:: Result < ( ) > {
4042 let command = Args :: parse ( ) . commands ;
4143 let mut terminal = ratatui:: init ( ) ;
44+ ratatui:: crossterm:: execute!(
45+ io:: stderr( ) ,
46+ PushKeyboardEnhancementFlags ( KeyboardEnhancementFlags :: REPORT_EVENT_TYPES )
47+ ) ?;
4248 let app_result = App :: new ( command) . run ( & mut terminal) ;
4349 ratatui:: restore ( ) ;
4450 app_result
@@ -64,11 +70,13 @@ impl App {
6470
6571 pub fn run ( & mut self , terminal : & mut DefaultTerminal ) -> io:: Result < ( ) > {
6672 while !self . exit {
67- self . emulator . tick ( ) ;
73+ for _ in 0 ..10 {
74+ self . emulator . tick ( ) ;
75+ }
6876 self . emulator . tick_timers ( ) ;
6977 self . calculate_points ( ) ;
70- terminal. draw ( |frame| self . draw ( frame) ) ?;
7178 self . handle_events ( ) ?;
79+ terminal. draw ( |frame| self . draw ( frame) ) ?;
7280 }
7381 Ok ( ( ) )
7482 }
@@ -80,35 +88,47 @@ impl App {
8088 }
8189
8290 fn handle_events ( & mut self ) -> io:: Result < ( ) > {
83- if event:: poll ( Duration :: from_micros ( 10 ) ) ? {
91+ if event:: poll ( Duration :: from_millis ( 10 ) ) ? {
8492 match event:: read ( ) ? {
85- Event :: Key ( key_event) if key_event. kind == KeyEventKind :: Press => {
86- self . handle_key_event ( key_event)
93+ Event :: Key ( key_event) => {
94+ let pressed = if key_event. kind == KeyEventKind :: Press {
95+ true
96+ } else {
97+ false
98+ } ;
99+ self . handle_key_event ( key_event, pressed)
87100 }
88101 _ => { }
89102 } ;
90103 }
91104 Ok ( ( ) )
92105 }
93- fn handle_key_event ( & mut self , key_event : KeyEvent ) {
94- match key_event. code {
95- KeyCode :: Char ( 'q' ) => self . exit ( ) ,
96- KeyCode :: Char ( c) => match c {
97- '0' ..='9' => {
98- let idx = c as usize - '0' as usize ;
99- self . emulator . keypress ( idx, true ) ;
100- }
101- 'a' ..='f' => {
102- let idx = c as usize - 'a' as usize ;
103- self . emulator . keypress ( idx, true ) ;
104- }
105- 'A' ..='F' => {
106- let idx = c as usize - 'A' as usize ;
107- self . emulator . keypress ( idx, true ) ;
108- }
109- _ => { }
110- } ,
111- _ => { }
106+ fn handle_key_event ( & mut self , key_event : KeyEvent , pressed : bool ) {
107+ if key_event. code == KeyCode :: Esc {
108+ self . exit ( ) ;
109+ }
110+ let x = match key_event. code {
111+ KeyCode :: Char ( '1' ) => Some ( 0x1 ) ,
112+ KeyCode :: Char ( '2' ) => Some ( 0x2 ) ,
113+ KeyCode :: Char ( '3' ) => Some ( 0x3 ) ,
114+ KeyCode :: Char ( '4' ) => Some ( 0xC ) ,
115+ KeyCode :: Char ( 'q' ) | KeyCode :: Char ( 'Q' ) => Some ( 0x4 ) ,
116+ KeyCode :: Char ( 'w' ) | KeyCode :: Char ( 'W' ) => Some ( 0x5 ) ,
117+ KeyCode :: Char ( 'e' ) | KeyCode :: Char ( 'E' ) => Some ( 0x6 ) ,
118+ KeyCode :: Char ( 'r' ) | KeyCode :: Char ( 'R' ) => Some ( 0xD ) ,
119+ KeyCode :: Char ( 'a' ) | KeyCode :: Char ( 'A' ) => Some ( 0x7 ) ,
120+ KeyCode :: Char ( 's' ) | KeyCode :: Char ( 'S' ) => Some ( 0x8 ) ,
121+ KeyCode :: Char ( 'd' ) | KeyCode :: Char ( 'D' ) => Some ( 0x9 ) ,
122+ KeyCode :: Char ( 'f' ) | KeyCode :: Char ( 'F' ) => Some ( 0xE ) ,
123+ KeyCode :: Char ( 'z' ) | KeyCode :: Char ( 'Z' ) => Some ( 0xA ) ,
124+ KeyCode :: Char ( 'x' ) | KeyCode :: Char ( 'X' ) => Some ( 0x0 ) ,
125+ KeyCode :: Char ( 'c' ) | KeyCode :: Char ( 'C' ) => Some ( 0xB ) ,
126+ KeyCode :: Char ( 'v' ) | KeyCode :: Char ( 'V' ) => Some ( 0xB ) ,
127+ _ => None ,
128+ } ;
129+
130+ if let Some ( idx) = x {
131+ self . emulator . keypress ( idx, pressed) ;
112132 }
113133 }
114134
0 commit comments