// retoor <retoor@molodetz.nl>
const BASE_Z = 2147480000;
const CEILING_Z = 2147483400;
export default class WindowManager {
constructor() {
this._z = BASE_Z;
this._windows = new Set();
}
register(win) {
this._windows.add(win);
this.focus(win);
}
unregister(win) {
this._windows.delete(win);
}
focus(win) {
if (!win) return;
if (this._z >= CEILING_Z) this._renormalize();
this._z += 1;
try {
win.style.zIndex = String(this._z);
} catch (error) {
return;
}
}
_renormalize() {
const ordered = Array.from(this._windows).sort(
(a, b) => (parseInt(a.style.zIndex, 10) || 0) - (parseInt(b.style.zIndex, 10) || 0),
);
this._z = BASE_Z;
ordered.forEach((win) => {
this._z += 1;
try {
win.style.zIndex = String(this._z);
} catch (error) {
return;
}
});
}
}