mirror of
https://github.com/balena-io/etcher.git
synced 2025-08-03 16:37:44 +00:00
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:
parent
66479739b9
commit
7cef51e421
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import * as debug_ from 'debug';
|
import * as debug_ from 'debug';
|
||||||
|
import { EventEmitter } from 'events';
|
||||||
import { cloneDeep } from 'lodash';
|
import { cloneDeep } from 'lodash';
|
||||||
|
|
||||||
import { createError } from '../modules/errors';
|
import { createError } from '../modules/errors';
|
||||||
@ -41,9 +42,11 @@ const DEFAULT_SETTINGS = {
|
|||||||
|
|
||||||
let settings: Dict<any> = cloneDeep(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> {
|
export async function reset(): Promise<void> {
|
||||||
debug('reset');
|
debug('reset');
|
||||||
// TODO: Remove default settings from config file (?)
|
|
||||||
settings = cloneDeep(DEFAULT_SETTINGS);
|
settings = cloneDeep(DEFAULT_SETTINGS);
|
||||||
await writeAll(settings);
|
await writeAll(settings);
|
||||||
}
|
}
|
||||||
@ -51,7 +54,14 @@ export async function reset(): Promise<void> {
|
|||||||
export async function load(): Promise<any> {
|
export async function load(): Promise<any> {
|
||||||
debug('load');
|
debug('load');
|
||||||
const loadedSettings = await readAll();
|
const loadedSettings = await readAll();
|
||||||
|
const oldSettings = cloneDeep(settings);
|
||||||
settings = { ...settings, ...loadedSettings };
|
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;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,6 +79,9 @@ export async function set(key: string, value: any): Promise<void> {
|
|||||||
settings[key] = previousValue;
|
settings[key] = previousValue;
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
if (value !== previousValue) {
|
||||||
|
events.emit(key, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get(key: string): any {
|
export function get(key: string): any {
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
import { execFile } from 'child_process';
|
import { execFile } from 'child_process';
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
|
|
||||||
|
import * as settings from '../models/settings';
|
||||||
|
|
||||||
const execFileAsync = promisify(execFile);
|
const execFileAsync = promisify(execFile);
|
||||||
const EVENT_TYPES = [
|
const EVENT_TYPES = [
|
||||||
'focus',
|
'focus',
|
||||||
@ -51,13 +53,47 @@ async function off() {
|
|||||||
await Promise.all([ledsOff(), screenOff()]);
|
await Promise.all([ledsOff(), screenOff()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function init(): void {
|
let timeout: NodeJS.Timeout;
|
||||||
let timeout = setTimeout(screenOff, SCREENSAVER_DELAY);
|
let delay: number | null = null;
|
||||||
for (const eventType of EVENT_TYPES) {
|
|
||||||
addEventListener(eventType, async () => {
|
async function listener() {
|
||||||
clearTimeout(timeout);
|
if (timeout !== undefined) {
|
||||||
timeout = setTimeout(off, SCREENSAVER_DELAY);
|
clearTimeout(timeout);
|
||||||
await ledsOn();
|
}
|
||||||
});
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user