import { execAsync, readFileAsync, timeout } from 'resource:///com/github/Aylur/ags/utils.js'; const { get_home_dir } = imports.gi.GLib; /** * @typedef {Object} Persist * @property {string} name * @property {typeof imports.gi.GObject} gobject * @property {string} prop * @property {boolean|string=} condition - if string, compare following props to this * @property {boolean|string=} whenTrue * @property {boolean|string=} whenFalse * @property {string=} signal * * @param {Persist} props */ export default ({ name, gobject, prop, condition = true, whenTrue = condition, whenFalse = false, signal = 'changed', }) => { const cacheFile = `${get_home_dir()}/.cache/ags/.${name}`; const stateCmd = () => ['bash', '-c', `echo ${gobject[prop] === condition} > ${cacheFile}`]; const monitorState = () => { gobject.connect(signal, () => { execAsync(stateCmd()).catch(print); }); }; readFileAsync(cacheFile) .then((content) => { // JSON.parse was the only way I found to reliably // convert a string of 'true' or 'false' into a bool gobject[prop] = JSON.parse(content) ? whenTrue : whenFalse; timeout(1000, () => { monitorState(); }); }) .catch(() => { execAsync(stateCmd()) .then(() => { monitorState(); }) .catch(print); }); };