| let gamepads = []; |
|
|
| window.addEventListener('gamepadconnected', (e) => { |
| const index = e.gamepad.index; |
| let isWaiting = false; |
| gamepads[index] = setInterval(async() => { |
| if (!opts.js_modal_lightbox_gamepad || isWaiting) return; |
| const gamepad = navigator.getGamepads()[index]; |
| const xValue = gamepad.axes[0]; |
| if (xValue <= -0.3) { |
| modalPrevImage(e); |
| isWaiting = true; |
| } else if (xValue >= 0.3) { |
| modalNextImage(e); |
| isWaiting = true; |
| } |
| if (isWaiting) { |
| await sleepUntil(() => { |
| const xValue = navigator.getGamepads()[index].axes[0]; |
| if (xValue < 0.3 && xValue > -0.3) { |
| return true; |
| } |
| }, opts.js_modal_lightbox_gamepad_repeat); |
| isWaiting = false; |
| } |
| }, 10); |
| }); |
|
|
| window.addEventListener('gamepaddisconnected', (e) => { |
| clearInterval(gamepads[e.gamepad.index]); |
| }); |
|
|
| |
| |
| |
| |
| 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); |
| } |
|
|
| setTimeout(() => { |
| isScrolling = false; |
| }, opts.js_modal_lightbox_gamepad_repeat); |
| }); |
|
|
| 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); |
| }); |
| } |
|
|