Keep screen awake via Wake Lock API while stopwatch is running

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Simon Kühn 2026-05-02 09:53:41 +02:00
parent e9995bb5d2
commit 4e1028e1a1

View file

@ -955,6 +955,18 @@ var sw = (function(){
var swEl = document.getElementById('sw'); var swEl = document.getElementById('sw');
var state = 0; // 0=stopped, 1=running, 2=paused var state = 0; // 0=stopped, 1=running, 2=paused
var start = 0, elapsed = 0, raf = null; var start = 0, elapsed = 0, raf = null;
var wakeLock = null;
function acquireWakeLock(){
if(!('wakeLock' in navigator)) return;
navigator.wakeLock.request('screen').then(function(s){ wakeLock = s; }).catch(function(){});
}
function releaseWakeLock(){
if(wakeLock){ wakeLock.release(); wakeLock = null; }
}
document.addEventListener('visibilitychange', function(){
if(document.visibilityState === 'visible' && state === 1) acquireWakeLock();
});
function getMs(){ return state === 1 ? elapsed + (Date.now() - start) : elapsed; } function getMs(){ return state === 1 ? elapsed + (Date.now() - start) : elapsed; }
@ -975,18 +987,18 @@ var sw = (function(){
if(state === 0){ if(state === 0){
start = Date.now(); elapsed = 0; start = Date.now(); elapsed = 0;
swEl.classList.add('running'); swEl.classList.add('running');
state = 1; tick(); state = 1; tick(); acquireWakeLock();
} else if(state === 1){ } else if(state === 1){
cancelAnimationFrame(raf); cancelAnimationFrame(raf);
elapsed += Date.now() - start; elapsed += Date.now() - start;
swEl.textContent = fmt(elapsed); swEl.textContent = fmt(elapsed);
swEl.classList.remove('running'); swEl.classList.remove('running');
state = 2; updateFillBtns(); state = 2; updateFillBtns(); releaseWakeLock();
} else { } else {
cancelAnimationFrame(raf); cancelAnimationFrame(raf);
elapsed = 0; swEl.textContent = '0.00s'; elapsed = 0; swEl.textContent = '0.00s';
swEl.classList.remove('running'); swEl.classList.remove('running');
state = 0; updateFillBtns(); state = 0; updateFillBtns(); releaseWakeLock();
} }
}); });