66 lines
1.9 KiB
JavaScript
Executable File
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"`);
|
|
}
|