@@ -335,6 +335,10 @@ pub fn run() -> Result<(), Error> {
335335 BATTERY_REFRESH_INTERVAL , & tx, & mut tasks) ;
336336 tx. send ( Event :: WakeUp ) . ok ( ) ;
337337
338+ let ( mut back_pressed, mut fwd_pressed) = ( false , false ) ;
339+ let ( mut swallow_back_release, mut swallow_fwd_release) = ( false , false ) ;
340+ let mut is_screen_locked = false ;
341+
338342 while let Ok ( evt) = rx. recv ( ) {
339343 match evt {
340344 Event :: Device ( de) => {
@@ -357,9 +361,74 @@ pub fn run() -> Result<(), Error> {
357361 view. children_mut ( ) . push ( Box :: new ( interm) as Box < dyn View > ) ;
358362 }
359363 } ,
360- DeviceEvent :: Button { code : ButtonCode :: Light , status : ButtonStatus :: Pressed , .. } => {
364+ DeviceEvent :: Button { code : ButtonCode :: Light , status, .. } => {
361365 tx. send ( Event :: ToggleFrontlight ) . ok ( ) ;
362366 } ,
367+ DeviceEvent :: Button { code, status : ButtonStatus :: Pressed , .. } => {
368+ // IDK how we can catch the initial starting press.
369+ // Seems impossible without delay.
370+ if is_screen_locked {
371+ match code {
372+ ButtonCode :: Backward => {
373+ back_pressed = true ;
374+
375+ // When both buttons are pressed during lock screen
376+ // then unlock the screen.
377+ if fwd_pressed {
378+ is_screen_locked = false ;
379+ continue ;
380+ }
381+ } ,
382+ ButtonCode :: Forward => {
383+ fwd_pressed = true ;
384+
385+ // When both buttons are pressed during lock screen
386+ // then unlock the screen.
387+ if back_pressed {
388+ is_screen_locked = false ;
389+ continue ;
390+ }
391+ } ,
392+ _ => ( ) ,
393+ }
394+ }
395+
396+ handle_event ( view. as_mut ( ) , & evt, & tx, & mut bus, & mut rq, & mut context) ;
397+ } ,
398+ DeviceEvent :: Button { code, status : ButtonStatus :: Released , .. } => {
399+ match code {
400+ ButtonCode :: Backward => {
401+ // User was holding both buttons, but released back first
402+ // Now catch the foward release event and swallow it.
403+ if fwd_pressed && back_pressed {
404+ swallow_fwd_release = true ;
405+ }
406+
407+ back_pressed = false ;
408+
409+ if swallow_back_release {
410+ swallow_back_release = false ;
411+ continue ;
412+ }
413+ } ,
414+ ButtonCode :: Forward => {
415+ // Same but the user released forward first. We catch back release.
416+ if fwd_pressed && back_pressed {
417+ swallow_back_release = true ;
418+ }
419+
420+ fwd_pressed = false ;
421+
422+ if swallow_fwd_release {
423+ swallow_fwd_release = false ;
424+ continue
425+ }
426+ } ,
427+ _ => ( ) ,
428+ }
429+
430+ handle_event ( view. as_mut ( ) , & evt, & tx, & mut bus, & mut rq, & mut context) ;
431+ } ,
363432 DeviceEvent :: CoverOn => {
364433 if context. covered {
365434 continue ;
@@ -699,28 +768,32 @@ pub fn run() -> Result<(), Error> {
699768 break ;
700769 } ,
701770 GestureEvent :: MultiTap ( mut points) => {
702- if points[ 0 ] . x > points[ 1 ] . x {
703- points. swap ( 0 , 1 ) ;
704- }
705- let rect = context. fb . rect ( ) ;
706- let r1 = Region :: from_point ( points[ 0 ] , rect,
707- context. settings . reader . strip_width ,
708- context. settings . reader . corner_width ) ;
709- let r2 = Region :: from_point ( points[ 1 ] , rect,
710- context. settings . reader . strip_width ,
711- context. settings . reader . corner_width ) ;
712- match ( r1, r2) {
713- ( Region :: Corner ( DiagDir :: SouthWest ) , Region :: Corner ( DiagDir :: NorthEast ) ) => {
714- rq. add ( RenderData :: new ( view. id ( ) , context. fb . rect ( ) , UpdateMode :: Full ) ) ;
715- } ,
716- ( Region :: Corner ( DiagDir :: NorthWest ) , Region :: Corner ( DiagDir :: SouthEast ) ) => {
717- tx. send ( Event :: Select ( EntryId :: TakeScreenshot ) ) . ok ( ) ;
718- } ,
719- _ => ( ) ,
771+ if !is_screen_locked {
772+ if points[ 0 ] . x > points[ 1 ] . x {
773+ points. swap ( 0 , 1 ) ;
774+ }
775+ let rect = context. fb . rect ( ) ;
776+ let r1 = Region :: from_point ( points[ 0 ] , rect,
777+ context. settings . reader . strip_width ,
778+ context. settings . reader . corner_width ) ;
779+ let r2 = Region :: from_point ( points[ 1 ] , rect,
780+ context. settings . reader . strip_width ,
781+ context. settings . reader . corner_width ) ;
782+ match ( r1, r2) {
783+ ( Region :: Corner ( DiagDir :: SouthWest ) , Region :: Corner ( DiagDir :: NorthEast ) ) => {
784+ rq. add ( RenderData :: new ( view. id ( ) , context. fb . rect ( ) , UpdateMode :: Full ) ) ;
785+ } ,
786+ ( Region :: Corner ( DiagDir :: NorthWest ) , Region :: Corner ( DiagDir :: SouthEast ) ) => {
787+ tx. send ( Event :: Select ( EntryId :: TakeScreenshot ) ) . ok ( ) ;
788+ } ,
789+ _ => ( ) ,
790+ }
720791 }
721792 } ,
722793 _ => {
723- handle_event ( view. as_mut ( ) , & evt, & tx, & mut bus, & mut rq, & mut context) ;
794+ if !is_screen_locked {
795+ handle_event ( view. as_mut ( ) , & evt, & tx, & mut bus, & mut rq, & mut context) ;
796+ }
724797 } ,
725798 }
726799 } ,
@@ -951,6 +1024,10 @@ pub fn run() -> Result<(), Error> {
9511024 let notif = Notification :: new ( msg, & tx, & mut rq, & mut context) ;
9521025 view. children_mut ( ) . push ( Box :: new ( notif) as Box < dyn View > ) ;
9531026 } ,
1027+ Event :: Select ( EntryId :: LockScreenInput ) => {
1028+ is_screen_locked = true ;
1029+ tx. send ( Event :: Toggle ( ViewId :: TopBottomBars ) ) . ok ( ) ;
1030+ }
9541031 Event :: CheckFetcher ( ..) |
9551032 Event :: FetcherAddDocument ( ..) |
9561033 Event :: FetcherRemoveDocument ( ..) |
@@ -988,6 +1065,10 @@ pub fn run() -> Result<(), Error> {
9881065 }
9891066 } ,
9901067 _ => {
1068+ if is_screen_locked && is_gesture_event ( & evt) {
1069+ // Skip this event
1070+ continue ;
1071+ }
9911072 handle_event ( view. as_mut ( ) , & evt, & tx, & mut bus, & mut rq, & mut context) ;
9921073 } ,
9931074 }
@@ -1026,3 +1107,11 @@ pub fn run() -> Result<(), Error> {
10261107
10271108 Ok ( ( ) )
10281109}
1110+
1111+ fn is_gesture_event ( evt : & Event ) -> bool {
1112+ match evt {
1113+ Event :: Gesture ( _) => true ,
1114+ _ => false ,
1115+ }
1116+ }
1117+
0 commit comments