218 lines
5.7 KiB
TypeScript
218 lines
5.7 KiB
TypeScript
export const ScreenSaverMixin = (SuperClass) => {
|
|
class ScreenSaverMixinClass extends SuperClass {
|
|
|
|
private _panel;
|
|
private _listeners = {};
|
|
private _brightness = 255;
|
|
|
|
constructor() {
|
|
super();
|
|
|
|
const panel = this._panel = document.createElement("div")
|
|
panel.setAttribute("browser-mod", "");
|
|
panel.attachShadow({ mode: "open" });
|
|
const styleEl = document.createElement("style");
|
|
styleEl.innerHTML = `
|
|
:host {
|
|
background: rgba(0,0,0, var(--darkness));
|
|
position: fixed;
|
|
left: 0;
|
|
top: 0;
|
|
bottom: 0;
|
|
right: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
z-index: 10000;
|
|
display: block;
|
|
pointer-events: none;
|
|
}
|
|
:host([dark]) {
|
|
background: rgba(0,0,0,1);
|
|
}
|
|
`
|
|
panel.shadowRoot.appendChild(styleEl);
|
|
document.body.appendChild(panel);
|
|
|
|
this.addEventListener("command-screen_off", () => this._screen_off());
|
|
this.addEventListener("command-screen_on", (ev) => this._screen_on(ev));
|
|
|
|
this.connectionPromise.then(() => this._screen_on());
|
|
}
|
|
|
|
private _screen_off() {
|
|
this._panel.setAttribute("dark", "");
|
|
|
|
this.sendUpdate({
|
|
screen_on: false,
|
|
screen_brightness: 0,
|
|
});
|
|
|
|
const l = () => this._screen_on();
|
|
for (const ev of ["pointerdown", "pointermove", "keydown"]) {
|
|
this._listeners[ev] = l;
|
|
window.addEventListener(ev, l);
|
|
}
|
|
}
|
|
|
|
private _screen_on(ev=undefined) {
|
|
if (ev?.detail?.brightness) {
|
|
this._brightness = ev.detail.brightness;
|
|
this._panel.style.setProperty("--darkness", 1-ev.detail.brightness/255)
|
|
}
|
|
this._panel.removeAttribute("dark");
|
|
this.sendUpdate({
|
|
screen_on: true,
|
|
screen_brightness: this._brightness,
|
|
});
|
|
|
|
for (const ev of ["pointerdown", "pointermove", "keydown"]) {
|
|
if (this._listeners[ev]) {
|
|
window.removeEventListener(ev, this._listeners[ev])
|
|
this._listeners[ev] = undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
return ScreenSaverMixinClass
|
|
}
|
|
|
|
export const BrowserModScreensaverMixin = (C) =>
|
|
class extends C {
|
|
constructor() {
|
|
super();
|
|
this._blackout_panel = document.createElement("div");
|
|
|
|
this._screenSaver = undefined;
|
|
this._screenSaverTimer = undefined;
|
|
this._screenSaverTimeOut = 0;
|
|
|
|
this._screenSaver = {
|
|
fn: undefined,
|
|
clearfn: undefined,
|
|
timer: undefined,
|
|
timeout: undefined,
|
|
listeners: {},
|
|
active: false,
|
|
};
|
|
|
|
this._blackout_panel.style.cssText = `
|
|
position: fixed;
|
|
left: 0;
|
|
top: 0;
|
|
padding: 0;
|
|
margin: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background: black;
|
|
display: none;
|
|
`;
|
|
document.body.appendChild(this._blackout_panel);
|
|
}
|
|
|
|
screensaver_set(fn, clearfn, time) {
|
|
this._ss_clear();
|
|
this._screenSaver = {
|
|
fn,
|
|
clearfn,
|
|
timer: undefined,
|
|
timeout: time,
|
|
listeners: {},
|
|
active: false,
|
|
};
|
|
const l = () => this.screensaver_update();
|
|
for (const event of ["mousemove", "mousedown", "keydown", "touchstart"]) {
|
|
window.addEventListener(event, l);
|
|
this._screenSaver.listeners[event] = l;
|
|
}
|
|
this._screenSaver.timer = window.setTimeout(
|
|
() => this._ss_run(),
|
|
time * 1000
|
|
);
|
|
}
|
|
|
|
screensaver_update() {
|
|
if (this._screenSaver.active) {
|
|
this.screensaver_stop();
|
|
} else {
|
|
window.clearTimeout(this._screenSaver.timer);
|
|
this._screenSaver.timer = window.setTimeout(
|
|
() => this._ss_run(),
|
|
this._screenSaver.timeout * 1000
|
|
);
|
|
}
|
|
}
|
|
|
|
screensaver_stop() {
|
|
this._ss_clear();
|
|
this._screenSaver.active = false;
|
|
if (this._screenSaver.clearfn) this._screenSaver.clearfn();
|
|
if (this._screenSaver.timeout) {
|
|
this.screensaver_set(
|
|
this._screenSaver.fn,
|
|
this._screenSaver.clearfn,
|
|
this._screenSaver.timeout
|
|
);
|
|
}
|
|
}
|
|
|
|
_ss_clear() {
|
|
window.clearTimeout(this._screenSaverTimer);
|
|
for (const [k, v] of Object.entries(this._screenSaver.listeners)) {
|
|
window.removeEventListener(k as any, v as any);
|
|
}
|
|
}
|
|
|
|
_ss_run() {
|
|
this._screenSaver.active = true;
|
|
this._screenSaver.fn();
|
|
}
|
|
|
|
do_blackout(timeout) {
|
|
this.screensaver_set(
|
|
() => {
|
|
if (this.isFully) {
|
|
if (this.config.screensaver) window.fully.startScreensaver();
|
|
else window.fully.turnScreenOff(true);
|
|
} else {
|
|
this._blackout_panel.style.display = "block";
|
|
}
|
|
this.screen_update();
|
|
},
|
|
() => {
|
|
if ((this._blackout_panel.style.display = "block"))
|
|
this._blackout_panel.style.display = "none";
|
|
if (this.isFully) {
|
|
if (!window.fully.getScreenOn()) window.fully.turnScreenOn();
|
|
window.fully.stopScreensaver();
|
|
}
|
|
this.screen_update();
|
|
},
|
|
timeout || 0
|
|
);
|
|
}
|
|
|
|
no_blackout() {
|
|
if (this.isFully) {
|
|
window.fully.turnScreenOn();
|
|
window.fully.stopScreensaver();
|
|
}
|
|
this.screensaver_stop();
|
|
}
|
|
|
|
screen_update() {
|
|
this.sendUpdate({
|
|
screen: {
|
|
blackout: this.isFully
|
|
? this.fully_screensaver !== undefined
|
|
? this.fully_screensaver
|
|
: !window.fully.getScreenOn()
|
|
: Boolean(this._blackout_panel.style.display === "block"),
|
|
brightness: this.isFully
|
|
? window.fully.getScreenBrightness()
|
|
: undefined,
|
|
},
|
|
});
|
|
}
|
|
};
|