diff --git a/lib/gui/app/models/settings.ts b/lib/gui/app/models/settings.ts index 3f649cf2..87159157 100644 --- a/lib/gui/app/models/settings.ts +++ b/lib/gui/app/models/settings.ts @@ -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 = cloneDeep(DEFAULT_SETTINGS); +export const events = new EventEmitter(); + +// Exported for tests only, don't use that export async function reset(): Promise { 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 { export async function load(): Promise { 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 { settings[key] = previousValue; throw error; } + if (value !== previousValue) { + events.emit(key, value); + } } export function get(key: string): any { diff --git a/lib/gui/app/modules/screensaver.ts b/lib/gui/app/modules/screensaver.ts index b42cd7cc..7da91adb 100644 --- a/lib/gui/app/modules/screensaver.ts +++ b/lib/gui/app/modules/screensaver.ts @@ -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 () => { - clearTimeout(timeout); - timeout = setTimeout(off, SCREENSAVER_DELAY); - await ledsOn(); - }); +let timeout: NodeJS.Timeout; +let delay: number | null = null; + +async function listener() { + if (timeout !== undefined) { + clearTimeout(timeout); + } + 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 { + setDelay(await getDelay()); + settings.events.on('enableScreensaver', enabled => { + setDelay(enabled ? SCREENSAVER_DELAY : null); + }); +}