@@ -8,7 +8,12 @@ use std::{
8
8
9
9
use clap:: Parser ;
10
10
use 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
+ } ;
12
17
use futures_util:: { pin_mut, StreamExt as _} ;
13
18
use imbl:: Vector ;
14
19
use layout:: Flex ;
@@ -110,6 +115,7 @@ async fn main() -> Result<()> {
110
115
event_cache. enable_storage ( ) ?;
111
116
112
117
let terminal = ratatui:: init ( ) ;
118
+ execute ! ( stdout( ) , EnableMouseCapture ) ?;
113
119
let mut app = App :: new ( client) . await ?;
114
120
115
121
app. run ( terminal) . await
@@ -315,37 +321,46 @@ impl App {
315
321
self . state . global_mode = mode;
316
322
}
317
323
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 > {
319
325
use KeyCode :: * ;
320
326
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
+ }
323
331
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
+ } ) ,
327
336
328
- ( KeyModifiers :: CONTROL , Char ( 'j' ) | Down ) => {
337
+ Event :: Key ( KeyEvent {
338
+ code : Char ( 'j' ) | Down ,
339
+ modifiers : KeyModifiers :: CONTROL ,
340
+ ..
341
+ } ) => {
329
342
self . room_list . next_room ( ) ;
330
343
let room_id = self . room_list . get_selected_room_id ( ) ;
331
344
self . room_view . set_selected_room ( room_id) ;
332
345
}
333
346
334
- ( KeyModifiers :: CONTROL , Char ( 'k' ) | Up ) => {
347
+ Event :: Key ( KeyEvent {
348
+ code : Char ( 'k' ) | Up , modifiers : KeyModifiers :: CONTROL , ..
349
+ } ) => {
335
350
self . room_list . previous_room ( ) ;
336
351
let room_id = self . room_list . get_selected_room_id ( ) ;
337
352
self . room_view . set_selected_room ( room_id) ;
338
353
}
339
354
340
- ( KeyModifiers :: CONTROL , Char ( 'q' ) ) => {
355
+ Event :: Key ( KeyEvent { code : Char ( 'q' ) , modifiers : KeyModifiers :: CONTROL , .. } ) => {
341
356
if !matches ! ( self . state. global_mode, GlobalMode :: Default ) {
342
357
self . set_global_mode ( GlobalMode :: Default ) ;
343
358
} else {
344
359
return Ok ( true ) ;
345
360
}
346
361
}
347
362
348
- _ => self . room_view . handle_key_press ( key ) . await ,
363
+ _ => self . room_view . handle_event ( event ) . await ,
349
364
}
350
365
351
366
Ok ( false )
@@ -369,43 +384,44 @@ impl App {
369
384
terminal. draw ( |f| f. render_widget ( & mut * self , f. area ( ) ) ) ?;
370
385
371
386
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 ( ) ;
399
403
}
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 )
400
414
}
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 ) ;
405
421
}
406
- GlobalMode :: Exiting { .. } => { }
407
422
}
408
423
}
424
+ GlobalMode :: Exiting { .. } => { }
409
425
}
410
426
}
411
427
@@ -432,6 +448,7 @@ impl App {
432
448
433
449
// At this point the user has exited the loop, so shut down the application.
434
450
ratatui:: restore ( ) ;
451
+ execute ! ( stdout( ) , DisableMouseCapture ) ?;
435
452
436
453
Ok ( ( ) )
437
454
}
0 commit comments