pooliot-client
Version:
97 lines (73 loc) • 2.89 kB
JavaScript
import Logger from 'nightingale';
import { runSync, runPipeAsUser, runSyncAsUser } from './exec';
import { sendUpdate } from '../client';
import * as display from './display';
import * as screensaver from './screensaver';
const logger = new Logger('app:commands:screen');
type ScreenStateType = 'on' | 'off' | 'unavailable';
const getScreenState = (): ScreenStateType => runSync('./screen.sh', ['state']);
const getScreens = (): Array<string> =>
runSyncAsUser('./screen.sh', ['screens']).split('\n').filter(Boolean);
let currentScreenState: ScreenStateType = getScreenState();
let currentScreens: Array<string> = getScreens();
logger.info('init', { currentScreens, currentScreenState });
const filterTouchscreenIfHasHdmi = screens => {
if (screens.length < 2) return screens;
if (screens.some(screen => screen.startsWith('HDMI'))) {
return screens.filter(screen => !screen.startsWith('HDMI'));
}
return screens;
};
// const turnOnScreen = (screen: string) =>
// runSyncAsUser('xrandr', ['--display', ':0', '--output', screen, '--auto']);
const turnOffScreen = (screen: string) =>
runSyncAsUser('xrandr', ['--display', ':0', '--output', screen, '--off']);
const turnScreen = (state: 'on' | 'off'): void => {
runSyncAsUser('./screen.sh', [state]);
if (state === 'on') {
currentScreens = getScreens();
const screensWithoutTouchscreenIfHdmi = filterTouchscreenIfHasHdmi(currentScreens);
if (screensWithoutTouchscreenIfHdmi.length !== currentScreens.length) {
currentScreens
.filter(screen => screensWithoutTouchscreenIfHdmi.includes(screen))
.forEach(turnOffScreen);
}
// screensWithoutTouchscreenIfHdmi.forEach(turnOnScreen);
}
if (currentScreenState !== state) {
currentScreenState = state;
sendUpdate({
screenState: currentScreenState,
screen: { state: currentScreenState, screens: currentScreens },
});
}
};
export const getCurrentScreenState = (): ScreenStateType => currentScreenState;
export const getCurrentScreens = (): Array<string> => currentScreens;
export const on = (autoStartDisplay = true): void => {
logger.info('turning screen on');
turnScreen('on');
if (autoStartDisplay) display.start();
};
export const off = (): void => {
logger.info('turning screen off');
display.stop();
turnScreen('off');
};
export const update = (config: Object, firstTime = false) => {
if (!display.supports(config)) return off();
if ((firstTime || currentScreenState !== 'off') && currentScreens.length) {
runSyncAsUser('./screen.sh', ['waitForX']);
on(false);
screensaver.update(config);
display.update(config);
}
};
export const screenshot = () => {
if (currentScreenState !== 'on') {
logger.warn('screenshot: screen is not on');
return;
}
logger.info('getting screenshot');
return runPipeAsUser('./screen.sh', ['screenshot']);
};