| 
									
										
										
										
											2023-05-28 20:42:47 -06:00
										 |  |  | let gamepads = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-05 22:48:27 -06:00
										 |  |  | window.addEventListener('gamepadconnected', (e) => { | 
					
						
							| 
									
										
										
										
											2023-05-06 22:47:35 -06:00
										 |  |  |     const index = e.gamepad.index; | 
					
						
							|  |  |  |     let isWaiting = false; | 
					
						
							| 
									
										
										
										
											2023-05-28 20:42:47 -06:00
										 |  |  |     gamepads[index] = setInterval(async() => { | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |         if (!opts.js_modal_lightbox_gamepad || isWaiting) return; | 
					
						
							| 
									
										
										
										
											2023-05-06 22:47:35 -06:00
										 |  |  |         const gamepad = navigator.getGamepads()[index]; | 
					
						
							| 
									
										
										
										
											2023-05-05 22:48:27 -06:00
										 |  |  |         const xValue = gamepad.axes[0]; | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |         if (xValue <= -0.3) { | 
					
						
							| 
									
										
										
										
											2023-03-13 03:39:02 -05:00
										 |  |  |             modalPrevImage(e); | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |             isWaiting = true; | 
					
						
							|  |  |  |         } else if (xValue >= 0.3) { | 
					
						
							| 
									
										
										
										
											2023-03-13 03:39:02 -05:00
										 |  |  |             modalNextImage(e); | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |             isWaiting = true; | 
					
						
							| 
									
										
										
										
											2023-03-13 03:39:02 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |         if (isWaiting) { | 
					
						
							|  |  |  |             await sleepUntil(() => { | 
					
						
							| 
									
										
										
										
											2023-05-06 22:47:35 -06:00
										 |  |  |                 const xValue = navigator.getGamepads()[index].axes[0]; | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |                 if (xValue < 0.3 && xValue > -0.3) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-06 22:16:51 -06:00
										 |  |  |             }, opts.js_modal_lightbox_gamepad_repeat); | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  |             isWaiting = false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }, 10); | 
					
						
							| 
									
										
										
										
											2023-05-29 23:52:19 -06:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | window.addEventListener('gamepaddisconnected', (e) => { | 
					
						
							|  |  |  |     clearInterval(gamepads[e.gamepad.index]); | 
					
						
							| 
									
										
										
										
											2023-05-05 22:48:27 -06:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | Primarily for vr controller type pointer devices. | 
					
						
							|  |  |  | I use the wheel event because there's currently no way to do it properly with web xr. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | let isScrolling = false; | 
					
						
							|  |  |  | window.addEventListener('wheel', (e) => { | 
					
						
							|  |  |  |     if (!opts.js_modal_lightbox_gamepad || isScrolling) return; | 
					
						
							|  |  |  |     isScrolling = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (e.deltaX <= -0.6) { | 
					
						
							|  |  |  |         modalPrevImage(e); | 
					
						
							|  |  |  |     } else if (e.deltaX >= 0.6) { | 
					
						
							|  |  |  |         modalNextImage(e); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-03-13 03:39:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-05 22:48:27 -06:00
										 |  |  |     setTimeout(() => { | 
					
						
							|  |  |  |         isScrolling = false; | 
					
						
							| 
									
										
										
										
											2023-05-06 22:16:51 -06:00
										 |  |  |     }, opts.js_modal_lightbox_gamepad_repeat); | 
					
						
							| 
									
										
										
										
											2023-05-05 22:48:27 -06:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-05-06 22:00:13 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | function sleepUntil(f, timeout) { | 
					
						
							|  |  |  |     return new Promise((resolve) => { | 
					
						
							|  |  |  |         const timeStart = new Date(); | 
					
						
							|  |  |  |         const wait = setInterval(function() { | 
					
						
							|  |  |  |             if (f() || new Date() - timeStart > timeout) { | 
					
						
							|  |  |  |                 clearInterval(wait); | 
					
						
							|  |  |  |                 resolve(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, 20); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } |