summaryrefslogtreecommitdiff
path: root/utils/icons.ts
blob: 029361122f6f08d950e53294b454893b9bd88aa8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { Gio } from "astal";
import { Astal } from "astal/gtk3";
import { Apps } from "../services/apps";

// Code points from https://www.github.com/lukas-w/font-logos
export const osIcons: Record<string, number> = {
    almalinux: 0xf31d,
    alpine: 0xf300,
    arch: 0xf303,
    arcolinux: 0xf346,
    centos: 0x304,
    debian: 0xf306,
    elementary: 0xf309,
    endeavouros: 0xf322,
    fedora: 0xf30a,
    gentoo: 0xf30d,
    kali: 0xf327,
    linuxmint: 0xf30e,
    mageia: 0xf310,
    manjaro: 0xf312,
    nixos: 0xf313,
    opensuse: 0xf314,
    suse: 0xf314,
    sles: 0xf314,
    sles_sap: 0xf314,
    pop: 0xf32a,
    raspbian: 0xf315,
    rhel: 0xf316,
    rocky: 0xf32b,
    slackware: 0xf318,
    ubuntu: 0xf31b,
};

const appIcons: Record<string, string> = {
    "code-url-handler": "visual-studio-code",
    code: "visual-studio-code",
    "codium-url-handler": "vscodium",
    codium: "vscodium",
    "GitHub Desktop": "github-desktop",
    "gnome-tweaks": "org.gnome.tweaks",
    "org.pulseaudio.pavucontrol": "pavucontrol",
    "pavucontrol-qt": "pavucontrol",
    "jetbrains-pycharm-ce": "pycharm-community",
    "Spotify Free": "Spotify",
    safeeyes: "io.github.slgobinath.SafeEyes",
    "yad-icon-browser": "yad",
    xterm: "uxterm",
    "com-atlauncher-App": "atlauncher",
    avidemux3_qt5: "avidemux",
};

const appRegex = [
    { regex: /^steam_app_(\d+)$/, replace: "steam_icon_$1" },
    { regex: /^Minecraft\* [0-9\.]+$/, replace: "minecraft" },
];

export const getAppIcon = (name: string) => {
    if (appIcons.hasOwnProperty(name)) return appIcons[name];
    for (const { regex, replace } of appRegex) {
        const postSub = name.replace(regex, replace);
        if (postSub !== name) return postSub;
    }

    if (Astal.Icon.lookup_icon(name)) return name;

    const apps = Apps.fuzzy_query(name);
    if (apps.length > 0) return apps[0].iconName;

    return "image";
};

const categoryIcons: Record<string, string> = {
    WebBrowser: "web",
    Printing: "print",
    Security: "security",
    Network: "chat",
    Archiving: "archive",
    Compression: "archive",
    Development: "code",
    IDE: "code",
    TextEditor: "edit_note",
    Audio: "music_note",
    Music: "music_note",
    Player: "music_note",
    Recorder: "mic",
    Game: "sports_esports",
    FileTools: "files",
    FileManager: "files",
    Filesystem: "files",
    FileTransfer: "files",
    Settings: "settings",
    DesktopSettings: "settings",
    HardwareSettings: "settings",
    TerminalEmulator: "terminal",
    ConsoleOnly: "terminal",
    Utility: "build",
    Monitor: "monitor_heart",
    Midi: "graphic_eq",
    Mixer: "graphic_eq",
    AudioVideoEditing: "video_settings",
    AudioVideo: "music_video",
    Video: "videocam",
    Building: "construction",
    Graphics: "photo_library",
    "2DGraphics": "photo_library",
    RasterGraphics: "photo_library",
    TV: "tv",
    System: "host",
};

export const getAppCategoryIcon = (name: string) => {
    const categories =
        Gio.DesktopAppInfo.new(`${name}.desktop`)?.get_categories()?.split(";") ??
        Apps.fuzzy_query(name)[0]?.categories;
    if (categories)
        for (const [key, value] of Object.entries(categoryIcons)) if (categories.includes(key)) return value;
    return "terminal";
};