diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index cbf9e461..f9cf3933 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -2038,8 +2038,7 @@ var pbar = (function () { t_redraw = setTimeout(r.drawpos, sm > 50 ? 20 : 50); }; - window.addEventListener('resize', r.onresize); - r.onresize(); + onresize100.add(r.onresize, true); return r; })(); @@ -2101,8 +2100,7 @@ var vbar = (function () { clearTimeout(untext); untext = setTimeout(r.draw, 1000); }; - window.addEventListener('resize', r.onresize); - r.onresize(); + onresize100.add(r.onresize, true); var rect; function mousedown(e) { @@ -5183,6 +5181,7 @@ document.onkeydown = function (e) { } })(); + function aligngriditems() { if (!treectl) return; @@ -5205,7 +5204,8 @@ function aligngriditems() { ebi('ggrid').style.justifyContent = treectl.hidden ? 'center' : 'space-between'; } } -window.addEventListener('resize', aligngriditems); +onresize100.add(aligngriditems); + var treectl = (function () { var r = { diff --git a/copyparty/web/up2k.js b/copyparty/web/up2k.js index ac39eac2..da359d33 100644 --- a/copyparty/web/up2k.js +++ b/copyparty/web/up2k.js @@ -2630,8 +2630,7 @@ function up2k_init(subtle) { } } } - window.addEventListener('resize', onresize); - onresize(); + onresize100.add(onresize, true); if (MOBILE) { // android-chrome wobbles for a bit; firefox / iOS-safari are OK diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 6a47a6fa..97122931 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -1051,6 +1051,67 @@ function cliptxt(txt, ok) { } +function Debounce(delay) { + var r = this; + r.delay = delay; + r.timer = 0; + r.t_hit = 0; + r.t_run = 0; + r.q = []; + + r.add = function (fun, run) { + r.rm(fun); + r.q.push(fun); + + if (run) + fun(); + }; + + r.rm = function (fun) { + apop(r.q, fun); + }; + + r.run = function () { + if (crashed) + return; + + r.t_run = Date.now(); + + var q = r.q.slice(0); + for (var a = 0; a < q.length; a++) + q[a](); + }; + + r.hit = function () { + if (crashed) + return; + + var now = Date.now(), + td_hit = now - r.t_hit, + td_run = now - r.t_run; + + if (td_run >= r.delay * 2) + r.t_run = now; + + if (td_run >= r.delay && td_run <= r.delay * 2) { + // r.delay is also deadline + clearTimeout(r.timer); + return r.run(); + } + + if (td_hit < r.delay / 5) + return; + + clearTimeout(r.timer); + r.timer = setTimeout(r.doit, r.delay); + r.t_hit = now; + }; +}; + +var onresize100 = new Debounce(100); +window.addEventListener('resize', onresize100.hit); + + var timer = (function () { var r = {}; r.q = [];