import { Applications } from "resource:///com/github/Aylur/ags/service/applications.js"; import GLib from "gi://GLib?version=2.0"; const app_icons = new Applications().list.reduce( (acc, app) => { if (app.icon_name) { acc.classOrNames[app.wm_class ?? app.name] = app.icon_name; acc.executables[app.executable] = app.icon_name; } return acc; }, { classOrNames: {}, executables: {} }, ); function fileExists(path) { return GLib.file_test(path, GLib.FileTest.EXISTS); } export function getIconName(client) { if (!client) { return ""; } let icon = app_icons.classOrNames[client.class]; if (!icon) { // TODO cache? const filePath = `${App.configDir}/assets/${client.class}.png`; if (fileExists(filePath)) { icon = filePath; app_icons.classOrNames[client.class] = icon; } } if (!icon) { // TODO cache? const filePath = `${App.configDir}/assets/${client.class}.svg`; if (fileExists(filePath)) { icon = filePath; app_icons.classOrNames[client.class] = icon; } } if (!icon) { const binaryName = Utils.exec(`ps -p ${client.pid} -o comm=`); icon = app_icons.executables[binaryName]; if (!icon) { let key = Object.keys(app_icons.executables).find((key) => key.startsWith(binaryName)); if (key) { icon = app_icons.executables[key]; } } if (icon) { app_icons[client.class] = icon; } } if (!icon) { const icon_key = Object.keys(app_icons.classOrNames).find( (key) => key.includes(client.title) || key.includes(client.initialTitle) || key.includes(client.initialClass) || key.includes(client.class), ); if (icon_key) { icon = app_icons.classOrNames[icon_key]; app_icons.classOrNames[client.class] = icon; } } if (!icon) { app_icons.classOrNames[client.class] = ""; } return icon; }