mirror of
https://github.com/tomru/switchmon.git
synced 2026-03-03 06:27:23 +01:00
switch to node.js
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
||||||
89
index.js
Executable file
89
index.js
Executable file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const exec = require('child_process').exec;
|
||||||
|
const argv = require('minimist')(process.argv.slice(2));
|
||||||
|
const xrandrParse = require('xrandr-parse');
|
||||||
|
|
||||||
|
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() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
exec('xrandr', (err, stdout, stderr) => {
|
||||||
|
if (err || stderr) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(xrandrParse(stdout));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDeviceStatus(deviceKey, device) {
|
||||||
|
if (monitorsSelected.indexOf(deviceKey) > -1 && device.connected) {
|
||||||
|
return '--auto';
|
||||||
|
}
|
||||||
|
return '--off';
|
||||||
|
}
|
||||||
|
|
||||||
|
function genXrandrOptions(devices) {
|
||||||
|
var xrandrOptions = '';
|
||||||
|
|
||||||
|
Object.keys(devices).forEach(deviceKey => {
|
||||||
|
const device = devices[deviceKey];
|
||||||
|
const deviceStatus = getDeviceStatus(deviceKey, device);
|
||||||
|
xrandrOptions += ['', '--output', deviceKey, deviceStatus].join(' ');
|
||||||
|
});
|
||||||
|
|
||||||
|
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() {
|
||||||
|
if (!argv.postCmd) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
exec(argv.postCmd, (err, stdout, stderr) => {
|
||||||
|
if (err || stderr) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getDevices()
|
||||||
|
.then(genXrandrOptions)
|
||||||
|
.then(switchDevices)
|
||||||
|
.then(executePostCmd)
|
||||||
|
.catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
27
package.json
Normal file
27
package.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "switchmon",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Simple helper for turning on/off connected/disconnected monitors with xrandr",
|
||||||
|
"main": "indes.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/tomru/switchmon.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"xrandr",
|
||||||
|
"monitor"
|
||||||
|
],
|
||||||
|
"author": "Thomas Ruoff",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/tomru/switchmon/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/tomru/switchmon#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"minimist": "^1.2.0",
|
||||||
|
"xrandr-parse": "^0.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
84
swm
84
swm
@@ -1,84 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Enable all connected montiors, disable all disconnected ones.
|
|
||||||
# Multiple monitors will be added to the right of previous ones.
|
|
||||||
#
|
|
||||||
# Author Thomas Ruoff <ThomasRuoff@gmail.com>
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo "swm - a helper to switch connected monitors";
|
|
||||||
echo;
|
|
||||||
echo "usage: swm [monitor]";
|
|
||||||
echo;
|
|
||||||
echo "If monitor is not passed it turns on all connected devices";
|
|
||||||
echo "and lays them out next to each other in the order detected.";
|
|
||||||
echo;
|
|
||||||
echo "monitor: The string as reported by the script. If provided only";
|
|
||||||
echo "this monitor will be turned on.";
|
|
||||||
}
|
|
||||||
|
|
||||||
echoerr() { echo "$@" 1>&2; }
|
|
||||||
|
|
||||||
getFirstWord() {
|
|
||||||
awk '{print $1}'
|
|
||||||
}
|
|
||||||
|
|
||||||
linesToWords() {
|
|
||||||
awk 'BEGIN{ORS=" "} {print}'
|
|
||||||
}
|
|
||||||
|
|
||||||
wordsToLines() {
|
|
||||||
awk 'BEGIN{RS=" "} {print}'
|
|
||||||
}
|
|
||||||
|
|
||||||
without() {
|
|
||||||
comm -3 <(echo "$1") <(echo "$2")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $1 == "-h" ]] || [[ $1 == "--help" ]] ; then
|
|
||||||
usage
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
TARGET=$1;
|
|
||||||
CONNECTED=$( xrandr | grep " connected" | sort | getFirstWord);
|
|
||||||
DISCONNECTED=$( xrandr | grep "disconnected" | sort | getFirstWord);
|
|
||||||
|
|
||||||
POSTCMD="herbstclient reload";
|
|
||||||
|
|
||||||
echo connected devices: $(echo $CONNECTED | wordsToLines);
|
|
||||||
echo disconnected devices: $(echo $DISCONNECTED | wordsToLines);
|
|
||||||
|
|
||||||
if [[ -n "$TARGET" ]] && [[ ! "$CONNECTED" =~ "$TARGET" ]] ; then
|
|
||||||
echoerr "error: device $1 is not connected";
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
|
|
||||||
FORON=${@-$CONNECTED};
|
|
||||||
|
|
||||||
FOROFF="$DISCONNECTED $(without "$CONNECTED" "$FORON")";
|
|
||||||
|
|
||||||
# turn off all disconnected monitors
|
|
||||||
XRANDR_OFF_OPTIONS="";
|
|
||||||
for mon in $FOROFF; do
|
|
||||||
XRANDR_OFF_OPTIONS+=" --output $mon --off";
|
|
||||||
done
|
|
||||||
|
|
||||||
# turn on all connected monitors
|
|
||||||
XRANDR_ON_OPTIONS="";
|
|
||||||
LAST="";
|
|
||||||
for mon in $FORON; do
|
|
||||||
XRANDR_ON_OPTIONS+=" --output $mon --auto";
|
|
||||||
if [ ! -z $LAST ]; then
|
|
||||||
XRANDR_ON_OPTIONS+=" --right-of $LAST";
|
|
||||||
fi
|
|
||||||
LAST=$mon;
|
|
||||||
done
|
|
||||||
|
|
||||||
xrandr $XRANDR_ON_OPTIONS $XRANDR_OFF_OPTIONS &&\
|
|
||||||
echo Activated monitors: ${FORON} &&\
|
|
||||||
$POSTCMD;
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user