feat(pkgs/Profpatsch/alacritty): register color dbus interface
Adds a simple-stupid dbus interface for this daemon which allows on-the-fly changing of the alacritty color scheme. Example call: ``` busctl --user call de.profpatsch.alacritty.ColorScheme \ /de/profpatsch/alacritty/ColorScheme \ de.profpatsch.alacritty.ColorScheme \ SetColorScheme s 'prefer-dark' ``` Change-Id: Ic895fedefb3f5bd95f2279edf53fe179e8f24f89 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12875 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
parent
6477428c36
commit
821ff7ffe4
1 changed files with 52 additions and 7 deletions
|
@ -3,6 +3,9 @@ const dbus = require('dbus-native');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
|
||||||
|
// NB: this code is like 80% copilot generated, and seriously missing error handling.
|
||||||
|
// It might break at any time, but for now it seems to work lol.
|
||||||
|
|
||||||
const programName = process.argv[1];
|
const programName = process.argv[1];
|
||||||
let themeDir = process.argv[2];
|
let themeDir = process.argv[2];
|
||||||
// read the dark alacritty theme file as first argument
|
// read the dark alacritty theme file as first argument
|
||||||
|
@ -74,8 +77,10 @@ function getColorScheme() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define the callback function
|
/** write respective alacritty config if the colorscheme changes.
|
||||||
function onColorSchemeChanged(cs) {
|
* Colorscheme changes are only tracked in-between calls to this function in-memory.
|
||||||
|
*/
|
||||||
|
function writeAlacrittyColorConfigIfDifferent(cs) {
|
||||||
// only change the color scheme if it's different from the previous one
|
// only change the color scheme if it's different from the previous one
|
||||||
let previous = null;
|
let previous = null;
|
||||||
if (previous === cs) {
|
if (previous === cs) {
|
||||||
|
@ -88,6 +93,7 @@ function onColorSchemeChanged(cs) {
|
||||||
writeAlacrittyColorConfig(cs, cs === 'prefer-dark' ? darkTheme : lightTheme);
|
writeAlacrittyColorConfig(cs, cs === 'prefer-dark' ? darkTheme : lightTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Listen on the freedesktop SettingChanged dbus interface for the color-scheme setting to change. */
|
||||||
function listenForColorschemeChange() {
|
function listenForColorschemeChange() {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
bus
|
bus
|
||||||
|
@ -106,7 +112,7 @@ function listenForColorschemeChange() {
|
||||||
interfaceName === 'org.gnome.desktop.interface' &&
|
interfaceName === 'org.gnome.desktop.interface' &&
|
||||||
key == 'color-scheme'
|
key == 'color-scheme'
|
||||||
) {
|
) {
|
||||||
onColorSchemeChanged(newValue);
|
writeAlacrittyColorConfigIfDifferent(newValue);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -116,16 +122,55 @@ function listenForColorschemeChange() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Create a dbus service that binds against the interface de.profpatsch.alacritty.ColorScheme and implements the method SetColorScheme */
|
||||||
|
function exportColorSchemeDbusInterface() {
|
||||||
|
console.log('Exporting color scheme interface de.profpatsch.alacritty.ColorScheme');
|
||||||
|
const ifaceName = 'de.profpatsch.alacritty.ColorScheme';
|
||||||
|
const iface = {
|
||||||
|
name: 'de.profpatsch.alacritty.ColorScheme',
|
||||||
|
methods: {
|
||||||
|
SetColorScheme: ['s', ''],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const ifaceImpl = {
|
||||||
|
SetColorScheme: function (cs) {
|
||||||
|
console.log(`SetColorScheme called with ${cs}`);
|
||||||
|
writeAlacrittyColorConfigIfDifferent(cs);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
bus.requestName(ifaceName, 0, (err, retCode) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(
|
||||||
|
'Error requesting name for interface de.profpatsch.alacritty.ColorScheme',
|
||||||
|
);
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
console.log(
|
||||||
|
`Request name returned ${retCode} for interface de.profpatsch.alacritty.ColorScheme`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
bus.exportInterface(ifaceImpl, '/de/profpatsch/alacritty/ColorScheme', iface);
|
||||||
|
console.log('Exported interface de.profpatsch.alacritty.ColorScheme');
|
||||||
|
} catch (err) {
|
||||||
|
console.log('Error exporting interface de.profpatsch.alacritty.ColorScheme');
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
|
// TODO: proper error handling, through proper callback promises for dbus function.
|
||||||
|
|
||||||
|
exportColorSchemeDbusInterface();
|
||||||
|
|
||||||
// get the current color scheme
|
// get the current color scheme
|
||||||
const currentColorScheme = await getColorScheme();
|
const currentColorScheme = await getColorScheme();
|
||||||
console.log(`Current color scheme: ${currentColorScheme}`);
|
console.log(`Current color scheme: ${currentColorScheme}`);
|
||||||
|
|
||||||
// write the color scheme
|
// write the color scheme
|
||||||
writeAlacrittyColorConfig(
|
writeAlacrittyColorConfig(currentColorScheme);
|
||||||
currentColorScheme,
|
|
||||||
currentColorScheme === 'prefer-dark' ? darkTheme : lightTheme,
|
|
||||||
);
|
|
||||||
|
|
||||||
// listen for color scheme changes
|
// listen for color scheme changes
|
||||||
await listenForColorschemeChange();
|
await listenForColorschemeChange();
|
||||||
|
|
Loading…
Add table
Reference in a new issue