@@ -8,7 +8,12 @@ use std::{
88
99use clap:: Parser ;
1010use color_eyre:: Result ;
11- use crossterm:: event:: { self , Event , KeyCode , KeyEvent , KeyEventKind , KeyModifiers } ;
11+ use crossterm:: {
12+ event:: {
13+ self , DisableMouseCapture , EnableMouseCapture , Event , KeyCode , KeyEvent , KeyModifiers ,
14+ } ,
15+ execute,
16+ } ;
1217use futures_util:: { pin_mut, StreamExt as _} ;
1318use imbl:: Vector ;
1419use layout:: Flex ;
@@ -110,6 +115,7 @@ async fn main() -> Result<()> {
110115 event_cache. enable_storage ( ) ?;
111116
112117 let terminal = ratatui:: init ( ) ;
118+ execute ! ( stdout( ) , EnableMouseCapture ) ?;
113119 let mut app = App :: new ( client) . await ?;
114120
115121 app. run ( terminal) . await
@@ -315,37 +321,46 @@ impl App {
315321 self . state . global_mode = mode;
316322 }
317323
318- async fn handle_global_key_press ( & mut self , key : KeyEvent ) -> Result < bool > {
324+ async fn handle_global_event ( & mut self , event : Event ) -> Result < bool > {
319325 use KeyCode :: * ;
320326
321- match ( key. modifiers , key. code ) {
322- ( KeyModifiers :: NONE , F ( 1 ) ) => self . set_global_mode ( GlobalMode :: Help ) ,
327+ match event {
328+ Event :: Key ( KeyEvent { code : F ( 1 ) , modifiers : KeyModifiers :: NONE , .. } ) => {
329+ self . set_global_mode ( GlobalMode :: Help )
330+ }
323331
324- ( KeyModifiers :: NONE , F ( 10 ) ) => self . set_global_mode ( GlobalMode :: Settings {
325- view : SettingsView :: new ( self . client . clone ( ) , self . sync_service . clone ( ) ) ,
326- } ) ,
332+ Event :: Key ( KeyEvent { code : F ( 10 ) , modifiers : KeyModifiers :: NONE , .. } ) => self
333+ . set_global_mode ( GlobalMode :: Settings {
334+ view : SettingsView :: new ( self . client . clone ( ) , self . sync_service . clone ( ) ) ,
335+ } ) ,
327336
328- ( KeyModifiers :: CONTROL , Char ( 'j' ) | Down ) => {
337+ Event :: Key ( KeyEvent {
338+ code : Char ( 'j' ) | Down ,
339+ modifiers : KeyModifiers :: CONTROL ,
340+ ..
341+ } ) => {
329342 self . room_list . next_room ( ) ;
330343 let room_id = self . room_list . get_selected_room_id ( ) ;
331344 self . room_view . set_selected_room ( room_id) ;
332345 }
333346
334- ( KeyModifiers :: CONTROL , Char ( 'k' ) | Up ) => {
347+ Event :: Key ( KeyEvent {
348+ code : Char ( 'k' ) | Up , modifiers : KeyModifiers :: CONTROL , ..
349+ } ) => {
335350 self . room_list . previous_room ( ) ;
336351 let room_id = self . room_list . get_selected_room_id ( ) ;
337352 self . room_view . set_selected_room ( room_id) ;
338353 }
339354
340- ( KeyModifiers :: CONTROL , Char ( 'q' ) ) => {
355+ Event :: Key ( KeyEvent { code : Char ( 'q' ) , modifiers : KeyModifiers :: CONTROL , .. } ) => {
341356 if !matches ! ( self . state. global_mode, GlobalMode :: Default ) {
342357 self . set_global_mode ( GlobalMode :: Default ) ;
343358 } else {
344359 return Ok ( true ) ;
345360 }
346361 }
347362
348- _ => self . room_view . handle_key_press ( key ) . await ,
363+ _ => self . room_view . handle_event ( event ) . await ,
349364 }
350365
351366 Ok ( false )
@@ -369,43 +384,44 @@ impl App {
369384 terminal. draw ( |f| f. render_widget ( & mut * self , f. area ( ) ) ) ?;
370385
371386 if event:: poll ( Duration :: from_millis ( 100 ) ) ? {
372- if let Event :: Key ( key) = event:: read ( ) ? {
373- if key. kind == KeyEventKind :: Press {
374- match & mut self . state . global_mode {
375- GlobalMode :: Default => {
376- if self . handle_global_key_press ( key) . await ? {
377- let sync_service = self . sync_service . clone ( ) ;
378- let timelines = self . timelines . clone ( ) ;
379- let listen_task = self . listen_task . abort_handle ( ) ;
380-
381- let shutdown_task = spawn ( async move {
382- sync_service. stop ( ) . await ;
383-
384- listen_task. abort ( ) ;
385-
386- for timeline in timelines. lock ( ) . values ( ) {
387- timeline. task . abort ( ) ;
388- }
389- } ) ;
390-
391- self . set_global_mode ( GlobalMode :: Exiting { shutdown_task } ) ;
392- }
393- }
394- GlobalMode :: Help => {
395- if let ( KeyModifiers :: NONE , Char ( 'q' ) | Esc ) =
396- ( key. modifiers , key. code )
397- {
398- self . set_global_mode ( GlobalMode :: Default )
387+ let event = event:: read ( ) ?;
388+
389+ match & mut self . state . global_mode {
390+ GlobalMode :: Default => {
391+ if self . handle_global_event ( event) . await ? {
392+ let sync_service = self . sync_service . clone ( ) ;
393+ let timelines = self . timelines . clone ( ) ;
394+ let listen_task = self . listen_task . abort_handle ( ) ;
395+
396+ let shutdown_task = spawn ( async move {
397+ sync_service. stop ( ) . await ;
398+
399+ listen_task. abort ( ) ;
400+
401+ for timeline in timelines. lock ( ) . values ( ) {
402+ timeline. task . abort ( ) ;
399403 }
404+ } ) ;
405+
406+ self . set_global_mode ( GlobalMode :: Exiting { shutdown_task } ) ;
407+ }
408+ }
409+ GlobalMode :: Help => {
410+ if let Event :: Key ( key) = event {
411+ if let ( KeyModifiers :: NONE , Char ( 'q' ) | Esc ) = ( key. modifiers , key. code )
412+ {
413+ self . set_global_mode ( GlobalMode :: Default )
400414 }
401- GlobalMode :: Settings { view } => {
402- if view. handle_key_press ( key) . await {
403- self . set_global_mode ( GlobalMode :: Default ) ;
404- }
415+ }
416+ }
417+ GlobalMode :: Settings { view } => {
418+ if let Event :: Key ( key) = event {
419+ if view. handle_key_press ( key) . await {
420+ self . set_global_mode ( GlobalMode :: Default ) ;
405421 }
406- GlobalMode :: Exiting { .. } => { }
407422 }
408423 }
424+ GlobalMode :: Exiting { .. } => { }
409425 }
410426 }
411427
@@ -432,6 +448,7 @@ impl App {
432448
433449 // At this point the user has exited the loop, so shut down the application.
434450 ratatui:: restore ( ) ;
451+ execute ! ( stdout( ) , DisableMouseCapture ) ?;
435452
436453 Ok ( ( ) )
437454 }
0 commit comments