const { execAsync, readFileAsync, timeout } = Utils; const { get_home_dir } = imports.gi.GLib; import GObject from 'types/@girs/gobject-2.0/gobject-2.0'; type Persist = { name: string gobject: GObject.Object prop: string condition?: boolean | string // If string, compare following props to this whenTrue?: boolean | string whenFalse?: boolean | string signal?: string }; export default ({ name, gobject, prop, condition = true, whenTrue = condition, whenFalse = false, signal = 'changed', }: Persist) => { 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); }); };