split cli and helper, add bin entry to package.json

This commit is contained in:
Thomas Ruoff
2016-01-18 10:07:57 +01:00
parent 610fd07bec
commit d2e0e172f9
4 changed files with 42 additions and 31 deletions

90
swm.js Normal file
View File

@@ -0,0 +1,90 @@
'use strict';
const xrandrParse = require('xrandr-parse');
const exec = require('child_process').exec;
function getDevices() {
return new Promise((resolve, reject) => {
exec('xrandr', (err, stdout, stderr) => {
if (err || stderr) {
reject(err);
return;
}
resolve(xrandrParse(stdout));
});
});
}
function generateXrandrOptions(monitorList, devices) {
let xrandrOptions = '';
let deviceOrder = Object.keys(devices).sort();
// remove explicitly selected monitors inside the array and add them to the
// beginning in the order they have been specified.
monitorList.reverse().forEach((monitor) => {
const index = deviceOrder.indexOf(monitor);
if (index < 0) {
console.error('Unkown monitor', monitor, '(ignored)');
return;
}
deviceOrder.splice(index, 1);
deviceOrder.unshift(monitor);
});
let prevDevice;
deviceOrder.forEach(deviceKey => {
const device = devices[deviceKey];
const deviceStatus = device.connected ? '--auto' : '--off';
const monitorOptions = ['', '--output', deviceKey, deviceStatus];
if (device.connected) {
if (prevDevice) {
monitorOptions.push(['--right-of', prevDevice].join(' '));
}
prevDevice = deviceKey;
}
xrandrOptions += monitorOptions.join(' ');
});
// sanity check if at least one monitor is on
if (xrandrOptions.indexOf('--auto') === -1) {
throw 'Non of the given monitors are connected, aborting...';
}
return xrandrOptions;
}
function switchDevices(xrandrOptions) {
return new Promise((resolve, reject) => {
const cmd = 'xrandr ' + xrandrOptions;
exec(cmd, (err, stdout, stderr) => {
if (err || stderr) {
reject(err);
return;
}
resolve();
});
});
}
function executePostCmd(postCmd) {
if (!postCmd) {
return;
}
return new Promise((resolve, reject) => {
exec(postCmd, (err, stdout, stderr) => {
if (err || stderr) {
reject(err);
return;
}
resolve();
});
});
}
module.exports.getDevices = getDevices;
module.exports.generateXrandrOptions = generateXrandrOptions;
module.exports.switchDevices = switchDevices;
module.exports.executePostCmd = executePostCmd;