1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge pull request #1542 from dmitrylyzo/fix-osd-lock

Fix OSD lock

(cherry picked from commit 04b2763447)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
This commit is contained in:
dkanada 2020-07-25 00:01:15 +09:00 committed by Joshua M. Boniface
parent 5c37ee6276
commit ccb74610aa

View file

@ -45,6 +45,10 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
return null; return null;
} }
function getOpenedDialog() {
return document.querySelector('.dialogContainer .dialog.opened');
}
return function (view, params) { return function (view, params) {
function onVerticalSwipe(e, elem, data) { function onVerticalSwipe(e, elem, data) {
var player = currentPlayer; var player = currentPlayer;
@ -333,21 +337,15 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
osdPoster.innerHTML = ''; osdPoster.innerHTML = '';
} }
let osdLockCount = 0; let mouseIsDown = false;
function showOsd() { function showOsd() {
slideDownToShow(headerElement); slideDownToShow(headerElement);
showMainOsdControls(); showMainOsdControls();
if (!osdLockCount) { resetIdle();
startOsdHideTimer();
}
} }
function hideOsd() { function hideOsd() {
if (osdLockCount) {
return;
}
slideUpToHide(headerElement); slideUpToHide(headerElement);
hideMainOsdControls(); hideMainOsdControls();
} }
@ -360,19 +358,6 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
} }
} }
function lockOsd() {
osdLockCount++;
stopOsdHideTimer();
}
function unlockOsd() {
osdLockCount--;
// Restart hide timer if OSD is currently visible
if (currentVisibleMenu && !osdLockCount) {
startOsdHideTimer();
}
}
function startOsdHideTimer() { function startOsdHideTimer() {
stopOsdHideTimer(); stopOsdHideTimer();
osdHideTimeout = setTimeout(hideOsd, 3e3); osdHideTimeout = setTimeout(hideOsd, 3e3);
@ -444,6 +429,17 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
} }
} }
// TODO: Move all idle-related code to `inputManager` or `idleManager` or `idleHelper` (per dialog thing) and listen event from there.
function resetIdle() {
// Restart hide timer if OSD is currently visible and there is no opened dialog
if (currentVisibleMenu && !mouseIsDown && !getOpenedDialog()) {
startOsdHideTimer();
} else {
stopOsdHideTimer();
}
}
function onPointerMove(e) { function onPointerMove(e) {
if ('mouse' === (e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'))) { if ('mouse' === (e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'))) {
var eventX = e.screenX || 0; var eventX = e.screenX || 0;
@ -960,7 +956,11 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
stats: true, stats: true,
suboffset: showSubOffset, suboffset: showSubOffset,
onOption: onSettingsOption onOption: onSettingsOption
}).finally(() => {
resetIdle();
}); });
setTimeout(resetIdle, 0);
} }
}); });
} }
@ -1029,7 +1029,11 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
if (index !== currentIndex) { if (index !== currentIndex) {
playbackManager.setAudioStreamIndex(index, player); playbackManager.setAudioStreamIndex(index, player);
} }
}).finally(() => {
resetIdle();
}); });
setTimeout(resetIdle, 0);
}); });
} }
@ -1073,7 +1077,11 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
} }
toggleSubtitleSync(); toggleSubtitleSync();
}).finally(() => {
resetIdle();
}); });
setTimeout(resetIdle, 0);
}); });
} }
@ -1102,7 +1110,7 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
var clickedElement; var clickedElement;
function onKeyDown(e) { function onKeyDown(e) {
clickedElement = e.srcElement; clickedElement = e.target;
var key = keyboardnavigation.getKeyName(e); var key = keyboardnavigation.getKeyName(e);
@ -1124,7 +1132,7 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
case 'Escape': case 'Escape':
case 'Back': case 'Back':
// Ignore key when some dialog is opened // Ignore key when some dialog is opened
if (currentVisibleMenu === 'osd' && !document.querySelector('.dialogContainer')) { if (currentVisibleMenu === 'osd' && !getOpenedDialog()) {
hideOsd(); hideOsd();
e.stopPropagation(); e.stopPropagation();
} }
@ -1216,28 +1224,35 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
} }
function onKeyDownCapture() { function onKeyDownCapture() {
// Restart hide timer if OSD is currently visible resetIdle();
if (currentVisibleMenu) {
showOsd();
}
} }
function onWindowMouseDown(e) { function onWindowMouseDown(e) {
clickedElement = e.srcElement; clickedElement = e.target;
lockOsd(); mouseIsDown = true;
resetIdle();
} }
function onWindowMouseUp() { function onWindowMouseUp() {
unlockOsd(); mouseIsDown = false;
resetIdle();
} }
function onWindowTouchStart(e) { function onWindowTouchStart(e) {
clickedElement = e.srcElement; clickedElement = e.target;
lockOsd(); mouseIsDown = true;
resetIdle();
} }
function onWindowTouchEnd() { function onWindowTouchEnd() {
unlockOsd(); mouseIsDown = false;
resetIdle();
}
function onWindowDragEnd() {
// mousedown -> dragstart -> dragend !!! no mouseup :(
mouseIsDown = false;
resetIdle();
} }
function getImgUrl(item, chapter, index, maxWidth, apiClient) { function getImgUrl(item, chapter, index, maxWidth, apiClient) {
@ -1373,24 +1388,33 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
inputManager.on(window, onInputCommand); inputManager.on(window, onInputCommand);
document.addEventListener('keydown', onKeyDown); document.addEventListener('keydown', onKeyDown);
dom.addEventListener(document, 'keydown', onKeyDownCapture, { dom.addEventListener(document, 'keydown', onKeyDownCapture, {
capture: true capture: true,
passive: true
}); });
/* eslint-disable-next-line compat/compat */ /* eslint-disable-next-line compat/compat */
dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, { dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
capture: true,
passive: true passive: true
}); });
/* eslint-disable-next-line compat/compat */ /* eslint-disable-next-line compat/compat */
dom.addEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, { dom.addEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, {
capture: true,
passive: true passive: true
}); });
dom.addEventListener(window, 'touchstart', onWindowTouchStart, { dom.addEventListener(window, 'touchstart', onWindowTouchStart, {
capture: true,
passive: true passive: true
}); });
['touchend', 'touchcancel'].forEach((event) => { ['touchend', 'touchcancel'].forEach((event) => {
dom.addEventListener(window, event, onWindowTouchEnd, { dom.addEventListener(window, event, onWindowTouchEnd, {
capture: true,
passive: true passive: true
}); });
}); });
dom.addEventListener(window, 'dragend', onWindowDragEnd, {
capture: true,
passive: true
});
} catch (e) { } catch (e) {
require(['appRouter'], function(appRouter) { require(['appRouter'], function(appRouter) {
appRouter.goHome(); appRouter.goHome();
@ -1404,24 +1428,33 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
document.removeEventListener('keydown', onKeyDown); document.removeEventListener('keydown', onKeyDown);
dom.removeEventListener(document, 'keydown', onKeyDownCapture, { dom.removeEventListener(document, 'keydown', onKeyDownCapture, {
capture: true capture: true,
passive: true
}); });
/* eslint-disable-next-line compat/compat */ /* eslint-disable-next-line compat/compat */
dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, { dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
capture: true,
passive: true passive: true
}); });
/* eslint-disable-next-line compat/compat */ /* eslint-disable-next-line compat/compat */
dom.removeEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, { dom.removeEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, {
capture: true,
passive: true passive: true
}); });
dom.removeEventListener(window, 'touchstart', onWindowTouchStart, { dom.removeEventListener(window, 'touchstart', onWindowTouchStart, {
capture: true,
passive: true passive: true
}); });
['touchend', 'touchcancel'].forEach((event) => { ['touchend', 'touchcancel'].forEach((event) => {
dom.removeEventListener(window, event, onWindowTouchEnd, { dom.removeEventListener(window, event, onWindowTouchEnd, {
capture: true,
passive: true passive: true
}); });
}); });
dom.removeEventListener(window, 'dragend', onWindowDragEnd, {
capture: true,
passive: true
});
stopOsdHideTimer(); stopOsdHideTimer();
headerElement.classList.remove('osdHeader'); headerElement.classList.remove('osdHeader');
headerElement.classList.remove('osdHeader-hidden'); headerElement.classList.remove('osdHeader-hidden');