@@ -88,7 +88,8 @@ pub struct Presenter {
8888 presenter_audio : PresenterAudio ,
8989 touch_points : Option < ( i16 , i16 ) > ,
9090 keymap : u32 ,
91- was_psn_btn_pressed : bool ,
91+ pressed_btn : u32 ,
92+ show_pause : bool ,
9293}
9394
9495impl Presenter {
@@ -119,7 +120,8 @@ impl Presenter {
119120 presenter_audio : PresenterAudio :: new ( ) ,
120121 touch_points : None ,
121122 keymap : 0xFFFFFFFF ,
122- was_psn_btn_pressed : false ,
123+ pressed_btn : 0 ,
124+ show_pause : true ,
123125 } ;
124126
125127 init_ui ( & mut instance) ;
@@ -133,11 +135,28 @@ impl Presenter {
133135 let mut pressed = pressed. assume_init ( ) ;
134136 sceCtrlPeekBufferPositive ( 0 , & mut pressed, 1 ) ;
135137
138+ let previous_pressed_btn = self . pressed_btn ;
139+ self . pressed_btn = pressed. buttons ;
140+
136141 if pressed. buttons & SCE_CTRL_PSBUTTON != 0 {
137- self . was_psn_btn_pressed = true ;
138- } else if self . was_psn_btn_pressed {
139- self . was_psn_btn_pressed = false ;
140- return PresentEvent :: Pause ;
142+ const SHORTCUT_EVENTS : [ ( PresentEvent , SceCtrlButtons ) ; 3 ] = [
143+ ( PresentEvent :: CycleScreenLayout { offset : -1 , swap : false } , SCE_CTRL_LTRIGGER ) ,
144+ ( PresentEvent :: CycleScreenLayout { offset : 1 , swap : false } , SCE_CTRL_RTRIGGER ) ,
145+ ( PresentEvent :: CycleScreenLayout { offset : 0 , swap : true } , SCE_CTRL_CROSS ) ,
146+ ] ;
147+
148+ for ( event, button) in SHORTCUT_EVENTS {
149+ if previous_pressed_btn & button != 0 && pressed. buttons & button == 0 {
150+ self . show_pause = false ;
151+ return event;
152+ }
153+ }
154+ } else if previous_pressed_btn & SCE_CTRL_PSBUTTON != 0 {
155+ if self . show_pause {
156+ return PresentEvent :: Pause ;
157+ } else {
158+ self . show_pause = true ;
159+ }
141160 }
142161
143162 for ( host_key, guest_key) in KEY_CODE_MAPPING {
@@ -197,16 +216,17 @@ impl Presenter {
197216 }
198217 }
199218
200- pub fn on_game_launched ( & self ) {
201- unsafe { sceShellUtilLock ( SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN | SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2 ) } ;
219+ pub fn on_game_launched ( & mut self ) {
220+ self . show_pause = true ;
221+ unsafe { sceShellUtilLock ( SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN | SCE_SHELL_UTIL_LOCK_TYPE_QUICK_MENU | SCE_SHELL_UTIL_LOCK_TYPE_USB_CONNECTION | SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2 ) } ;
202222 }
203223
204224 pub fn present_pause ( & mut self , gpu_renderer : & GpuRenderer , settings : & mut Settings ) -> UiPauseMenuReturn {
205- unsafe { sceShellUtilUnlock ( SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN | SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2 ) } ;
225+ unsafe { sceShellUtilUnlock ( SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN | SCE_SHELL_UTIL_LOCK_TYPE_QUICK_MENU | SCE_SHELL_UTIL_LOCK_TYPE_USB_CONNECTION | SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2 ) } ;
206226 let ret = show_pause_menu ( self , gpu_renderer, settings) ;
207227 match ret {
208228 UiPauseMenuReturn :: Resume => unsafe {
209- sceShellUtilLock ( SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN | SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2 ) ;
229+ sceShellUtilLock ( SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN | SCE_SHELL_UTIL_LOCK_TYPE_QUICK_MENU | SCE_SHELL_UTIL_LOCK_TYPE_USB_CONNECTION | SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2 ) ;
210230 } ,
211231 _ => { }
212232 }
0 commit comments