Files
nix-config/.config/hypr/monitor-config.js

66 lines
1.9 KiB
JavaScript
Executable File

#!/usr/bin/env node
import { exec } from 'child_process';
async function execCommand(command) {
console.log(`Executing command: ${command}`);
return new Promise((resolve, reject) => {
let child = exec(command);
let stdoutData = '';
child.stdout.on('data', (data) => {
stdoutData += data;
process.stdout.write(data.toString());
});
child.stderr.on('data', (data) => {
process.stderr.write(data.toString());
});
child.on('close', (code) => {
if (code !== 0) {
reject(new Error(`Command failed with exit code ${code}`));
} else {
resolve(stdoutData.trim());
}
});
child.on('error', (err) => {
reject(err);
});
});
}
/** @type(String) */
let monitors = {};
let result = await execCommand('hyprctl -j monitors all');
result = JSON.parse(result);
result.forEach(monitor => {
monitors[monitor.name] = {
name: monitor.name,
availableModes: monitor.availableModes
};
});
console.log(monitors);
let zenity_monitors = Object.keys(monitors).join(' \\\n');
let selectedMonitor = await execCommand(`zenity --list --title "Choose a monitor" \
--column="Name" \
${zenity_monitors}`);
let zenity_modes = monitors[selectedMonitor].availableModes.join(' \\\n');
let selectedMode = await execCommand(`zenity --list --title "Choose a mode" \
--column="Mode" \
${zenity_modes}`);
console.log(`monitor = ${selectedMonitor}, ${selectedMode}, auto, auto`);
let mirror = false;
try {
await execCommand(`zenity --question --text="Do you want to mirror to this display?"`);
mirror = true;
} catch (e) {
}
if (mirror) {
let otherMonitor = Object.keys(monitors).filter(m => m !== selectedMonitor);
await execCommand(`hyprctl keyword monitor "${selectedMonitor}, ${selectedMode},auto,auto,mirror,${otherMonitor}"`);
} else {
await execCommand(`hyprctl keyword monitor "${selectedMonitor}, ${selectedMode}, auto, auto"`);
}