@ -17,9 +17,20 @@ struct sway_session_lock_surface {
 
			
		
	
		
			
				
						struct  wl_listener  output_commit ; 
 
			
		
	
		
			
				
					} ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  set_lock_focused_surface ( struct  wlr_surface  * focused )  {  
			
		
	
		
			
				
						server . session_lock . focused  =  focused ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						struct  sway_seat  * seat ; 
 
			
		
	
		
			
				
						wl_list_for_each ( seat ,  & server . input - > seats ,  link )  { 
 
			
		
	
		
			
				
							seat_set_focus_surface ( seat ,  focused ,  false ) ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  handle_surface_map ( struct  wl_listener  * listener ,  void  * data )  {  
			
		
	
		
			
				
						struct  sway_session_lock_surface  * surf  =  wl_container_of ( listener ,  surf ,  map ) ; 
 
			
		
	
		
			
				
						sway_force_focus ( surf - > surface ) ; 
 
			
		
	
		
			
				
						if  ( server . session_lock . focused  = =  NULL )  { 
 
			
		
	
		
			
				
							set_lock_focused_surface ( surf - > surface ) ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						output_damage_whole ( surf - > output ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -48,6 +59,21 @@ static void handle_output_commit(struct wl_listener *listener, void *data) {
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  handle_surface_destroy ( struct  wl_listener  * listener ,  void  * data )  {  
			
		
	
		
			
				
						struct  sway_session_lock_surface  * surf  =  wl_container_of ( listener ,  surf ,  destroy ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						// Move the seat focus to another surface if one is available
 
 
			
		
	
		
			
				
						if  ( server . session_lock . focused  = =  surf - > surface )  { 
 
			
		
	
		
			
				
							struct  wlr_surface  * next_focus  =  NULL ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							struct  wlr_session_lock_surface_v1  * other ; 
 
			
		
	
		
			
				
							wl_list_for_each ( other ,  & server . session_lock . lock - > surfaces ,  link )  { 
 
			
		
	
		
			
				
								if  ( other  ! =  surf - > lock_surface  & &  other - > mapped )  { 
 
			
		
	
		
			
				
									next_focus  =  other - > surface ; 
 
			
		
	
		
			
				
									break ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
							set_lock_focused_surface ( next_focus ) ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						wl_list_remove ( & surf - > map . link ) ; 
 
			
		
	
		
			
				
						wl_list_remove ( & surf - > destroy . link ) ; 
 
			
		
	
		
			
				
						wl_list_remove ( & surf - > surface_commit . link ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -88,6 +114,7 @@ static void handle_unlock(struct wl_listener *listener, void *data) {
 
			
		
	
		
			
				
						sway_log ( SWAY_DEBUG ,  " session unlocked " ) ; 
 
			
		
	
		
			
				
						server . session_lock . locked  =  false ; 
 
			
		
	
		
			
				
						server . session_lock . lock  =  NULL ; 
 
			
		
	
		
			
				
						server . session_lock . focused  =  NULL ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						wl_list_remove ( & server . session_lock . lock_new_surface . link ) ; 
 
			
		
	
		
			
				
						wl_list_remove ( & server . session_lock . lock_unlock . link ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -115,6 +142,7 @@ static void handle_unlock(struct wl_listener *listener, void *data) {
 
			
		
	
		
			
				
					static  void  handle_abandon ( struct  wl_listener  * listener ,  void  * data )  {  
			
		
	
		
			
				
						sway_log ( SWAY_INFO ,  " session lock abandoned " ) ; 
 
			
		
	
		
			
				
						server . session_lock . lock  =  NULL ; 
 
			
		
	
		
			
				
						server . session_lock . focused  =  NULL ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						wl_list_remove ( & server . session_lock . lock_new_surface . link ) ; 
 
			
		
	
		
			
				
						wl_list_remove ( & server . session_lock . lock_unlock . link ) ;