Files
TheaninovOS/home/desktops/hyprland/ags/js/utils.js
2023-12-30 20:38:47 +01:00

100 lines
2.6 KiB
JavaScript

import * as Utils from "resource:///com/github/Aylur/ags/utils.js";
import cairo from "cairo";
import icons from "./icons.js";
import Gdk from "gi://Gdk";
import GLib from "gi://GLib";
/**
* @param {number} length
* @param {number=} start
* @returns {Array<number>}
*/
export function range(length, start = 1) {
return Array.from({ length }, (_, i) => i + start);
}
/**
* @param {Array<[string, string] | string[]>} collection
* @param {string} item
* @returns {string}
*/
export function substitute(collection, item) {
return collection.find(([from]) => from === item)?.[1] || item;
}
/**
* @param {(monitor: number) => any} widget
* @returns {Array<import('types/widgets/window').default>}
*/
export function forMonitors(widget) {
const n = Gdk.Display.get_default()?.get_n_monitors() || 1;
return range(n, 0).map(widget).flat(1);
}
/**
* @param {import('gi://Gtk').Gtk.Widget} widget
* @returns {any} - missing cairo type
*/
export function createSurfaceFromWidget(widget) {
const alloc = widget.get_allocation();
const surface = new cairo.ImageSurface(
cairo.Format.ARGB32,
alloc.width,
alloc.height,
);
const cr = new cairo.Context(surface);
cr.setSourceRGBA(255, 255, 255, 0);
cr.rectangle(0, 0, alloc.width, alloc.height);
cr.fill();
widget.draw(cr);
return surface;
}
/** @param {string} icon */
export function getAudioTypeIcon(icon) {
const substitues = [
["audio-headset-bluetooth", icons.audio.type.headset],
["audio-card-analog-usb", icons.audio.type.speaker],
["audio-card-analog-pci", icons.audio.type.card],
];
return substitute(substitues, icon);
}
/** @param {import('types/service/applications').Application} app */
export function launchApp(app) {
Utils.execAsync(["hyprctl", "dispatch", "exec", `sh -c ${app.executable}`]);
app.frequency += 1;
}
/** @param {Array<string>} bins */
export function dependencies(bins) {
const deps = bins.map((bin) => {
const has = Utils.exec(`which ${bin}`);
if (!has) print(`missing dependency: ${bin}`);
return !!has;
});
return deps.every((has) => has);
}
/** @param {string} img - path to an img file */
export function blurImg(img) {
const cache = Utils.CACHE_DIR + "/media";
return new Promise((resolve) => {
if (!img) resolve("");
const dir = cache + "/blurred";
const blurred = dir + img.substring(cache.length);
if (GLib.file_test(blurred, GLib.FileTest.EXISTS)) return resolve(blurred);
Utils.ensureDirectory(dir);
Utils.execAsync(["convert", img, "-blur", "0x22", blurred])
.then(() => resolve(blurred))
.catch(() => resolve(""));
});
}