Files
dotfiles/ags/HyprPanel/services/Wallpaper.ts
T
2024-10-23 21:12:15 +07:00

98 lines
2.4 KiB
TypeScript

import { dependencies, sh } from 'lib/utils';
import options from 'options';
const hyprland = await Service.import('hyprland');
const WP = `${Utils.HOME}/.config/background`;
class Wallpaper extends Service {
static {
Service.register(
this,
{},
{
wallpaper: ['string'],
},
);
}
#blockMonitor = false;
#isRunning = false;
#wallpaper(): void {
if (!dependencies('swww')) return;
hyprland.monitors.map((m) => m.name);
sh('hyprctl cursorpos').then((pos) => {
sh([
'swww',
'img',
'--invert-y',
'--transition-type',
'grow',
'--transition-duration',
'1.5',
'--transition-fps',
'30',
'--transition-pos',
pos.replace(' ', ''),
WP,
]).then(() => {
this.changed('wallpaper');
});
});
}
async #setWallpaper(path: string): Promise<void> {
this.#blockMonitor = true;
await sh(`cp ${path} ${WP}`);
this.#wallpaper();
this.#blockMonitor = false;
}
readonly set = (path: string): void => {
this.#setWallpaper(path);
};
readonly isRunning = (): boolean => {
return this.#isRunning;
};
get wallpaper(): string {
return WP;
}
constructor() {
super();
options.wallpaper.enable.connect('changed', () => {
if (options.wallpaper.enable.value) {
this.#isRunning = true;
Utils.execAsync('swww-daemon')
.then(() => {
this.#wallpaper();
})
.catch(() => null);
} else {
this.#isRunning = false;
Utils.execAsync('pkill swww-daemon').catch(() => null);
}
});
if (!dependencies('swww') || !options.wallpaper.enable.value) return this;
this.#isRunning = true;
Utils.monitorFile(WP, () => {
if (!this.#blockMonitor) this.#wallpaper();
});
Utils.execAsync('swww-daemon')
.then(() => {
this.#wallpaper();
})
.catch(() => null);
}
}
export default new Wallpaper();