Add / remove listeners and timeouts when the sceensaver setting changes

Change-type: patch
Changelog-entry: Add / remove listeners and timeouts when the sceensaver setting changes
This commit is contained in:
Alexis Svinartchouk 2019-06-24 18:36:51 +02:00
parent 66479739b9
commit 7cef51e421
2 changed files with 58 additions and 9 deletions

View File

@ -15,6 +15,7 @@
*/
import * as debug_ from 'debug';
import { EventEmitter } from 'events';
import { cloneDeep } from 'lodash';
import { createError } from '../modules/errors';
@ -41,9 +42,11 @@ const DEFAULT_SETTINGS = {
let settings: Dict<any> = cloneDeep(DEFAULT_SETTINGS);
export const events = new EventEmitter();
// Exported for tests only, don't use that
export async function reset(): Promise<void> {
debug('reset');
// TODO: Remove default settings from config file (?)
settings = cloneDeep(DEFAULT_SETTINGS);
await writeAll(settings);
}
@ -51,7 +54,14 @@ export async function reset(): Promise<void> {
export async function load(): Promise<any> {
debug('load');
const loadedSettings = await readAll();
const oldSettings = cloneDeep(settings);
settings = { ...settings, ...loadedSettings };
for (const key of Object.keys(settings)) {
const value = settings[key];
if (!oldSettings.hasOwnProperty(key) || value !== oldSettings[key]) {
events.emit(key, value);
}
}
return settings;
}
@ -69,6 +79,9 @@ export async function set(key: string, value: any): Promise<void> {
settings[key] = previousValue;
throw error;
}
if (value !== previousValue) {
events.emit(key, value);
}
}
export function get(key: string): any {

View File

@ -17,6 +17,8 @@
import { execFile } from 'child_process';
import { promisify } from 'util';
import * as settings from '../models/settings';
const execFileAsync = promisify(execFile);
const EVENT_TYPES = [
'focus',
@ -51,13 +53,47 @@ async function off() {
await Promise.all([ledsOff(), screenOff()]);
}
export function init(): void {
let timeout = setTimeout(screenOff, SCREENSAVER_DELAY);
for (const eventType of EVENT_TYPES) {
addEventListener(eventType, async () => {
let timeout: NodeJS.Timeout;
let delay: number | null = null;
async function listener() {
if (timeout !== undefined) {
clearTimeout(timeout);
timeout = setTimeout(off, SCREENSAVER_DELAY);
}
if (delay !== null) {
timeout = setTimeout(off, delay);
}
await ledsOn();
});
}
async function setDelay($delay: number | null) {
const listenersSetUp = delay === null;
delay = $delay;
if (timeout !== undefined) {
clearTimeout(timeout);
}
if (delay === null) {
for (const eventType of EVENT_TYPES) {
removeEventListener(eventType, listener);
}
} else {
timeout = setTimeout(screenOff, delay);
if (!listenersSetUp) {
for (const eventType of EVENT_TYPES) {
addEventListener(eventType, listener);
}
}
}
}
async function getDelay() {
const enabled = await settings.get('enableScreensaver');
return enabled ? SCREENSAVER_DELAY : null;
}
export async function init(): Promise<void> {
setDelay(await getDelay());
settings.events.on('enableScreensaver', enabled => {
setDelay(enabled ? SCREENSAVER_DELAY : null);
});
}