refactored to support --right-of

This commit is contained in:
Thomas Ruoff
2016-01-18 00:05:23 +01:00
parent 04a8bf17eb
commit 985d394872
5 changed files with 109 additions and 44 deletions

14
.editorconfig Normal file
View File

@@ -0,0 +1,14 @@
# This file is for unifying the coding style for different editors and IDEs
# editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
trim_trailing_whitespace = true
[**.{js,json,md}]
insert_final_newline = true

22
.jshintrc Normal file
View File

@@ -0,0 +1,22 @@
{
"node": true,
"browser": false,
"esnext": true,
"bitwise": true,
"camelcase": true,
"curly": true,
"eqeqeq": true,
"immed": true,
"indent": 4,
"latedef": true,
"newcap": true,
"noarg": true,
"quotmark": "single",
"regexp": true,
"undef": true,
"unused": true,
"strict": true,
"trailing": true,
"smarttabs": true,
"globals" : {}
}

View File

@@ -2,13 +2,17 @@
Simple helper for turning on/off connected/disconnected monitors with `xrandr`. Simple helper for turning on/off connected/disconnected monitors with `xrandr`.
It uses `xrandr` to detect on which connectors there are monitors connected. It ## Usage
then runs `xrandr` and sets all disconnected monitors to `off` and all connected
monitors to `on`.
Monitors will be turned on with xrandr `--auto` option which tries to detect `swm [monitor-1...montior-n]` e.g. `swm LVDS1 HDMI1`
the optimal video setting.
If there are multiple monitors connected, each monitor is placed to the right If `monitor-1` to `monitor-n` is specified `swm` will turn on these monitors
of the previous monitor. This order is currently driven as xrandr lists the and place them from left to right in the order given. If a provided monitor is
connectors. not connected it will be skipped.
If no monitors are specified all connected monitors will be turned on and
placed from left to right in alphabetical order of their name.
## Requirements
Node.js > 4.x on your PATH.

View File

@@ -1,3 +0,0 @@
# TODO
- use `--leftOf` to align monitors in the order given

View File

@@ -1,25 +1,9 @@
#!/usr/bin/env node #!/usr/bin/env node
const exec = require('child_process').exec; 'use strict';
const argv = require('minimist')(process.argv.slice(2)); const argv = require('minimist')(process.argv.slice(2));
const xrandrParse = require('xrandr-parse'); const xrandrParse = require('xrandr-parse');
const exec = require('child_process').exec;
if (argv.help || argv.h) {
console.log(
`swm - a helper to switch connected monitors
usage: swm [monitor1 [monitor2]...] [--postCmd "<some commmand>"]
If monitor is not passed it turns on all connected devices
and lays them out next to each other in the order detected.
monitor: The string as reported by the script. If provided only
this monitor will be turned on.`
);
return;
}
const monitorsSelected = argv._;
function getDevices() { function getDevices() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@@ -33,22 +17,47 @@ function getDevices() {
}); });
} }
function getDeviceStatus(deviceKey, device) { function generateXrandrOptions(monitorList, devices) {
if (monitorsSelected.indexOf(deviceKey) > -1 && device.connected) { let xrandrOptions = '';
return '--auto'; 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;
} }
return '--off'; deviceOrder.splice(index, 1);
} deviceOrder.unshift(monitor);
function genXrandrOptions(devices) {
var xrandrOptions = '';
Object.keys(devices).forEach(deviceKey => {
const device = devices[deviceKey];
const deviceStatus = getDeviceStatus(deviceKey, device);
xrandrOptions += ['', '--output', deviceKey, deviceStatus].join(' ');
}); });
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(' ');
});
console.log(xrandrOptions);
// 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; return xrandrOptions;
} }
@@ -80,8 +89,27 @@ function executePostCmd() {
}); });
} }
if (argv.help || argv.h) {
console.log(
`Simple helper for turning on/off connected/disconnected monitors with 'xrandr'.
Usage:
'swm [monitor-1...montior-n]' e.g. 'swm LVDS1 HDMI1'
If 'monitor-1' to 'monitor-n' is specified 'swm' will turn on these monitors
and place them from left to right in the order given. If a provided monitor is
not connected it will be skipped.
If no monitors are specified all connected monitors will be turned on and
placed from left to right in alphabetical order of their name.`
);
process.exit(2);
}
getDevices() getDevices()
.then(genXrandrOptions) .then(generateXrandrOptions.bind(null, argv._))
.then(switchDevices) .then(switchDevices)
.then(executePostCmd) .then(executePostCmd)
.catch(err => { .catch(err => {