UNPKG

pooliot-client

Version:
97 lines (73 loc) 2.89 kB
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']); };