From f65ff75a43ca143c033605f029cc91ea6dc0651c Mon Sep 17 00:00:00 2001 From: Maksim Totmin Date: Tue, 16 Jun 2026 22:30:38 +0700 Subject: [PATCH] Initial commit: Stream Deck daemon with web UI - Web-based key editor (Alpine.js SPA) - Actions: shell commands, scripts, built-in media/volume/brightness, page switching - Keyboard shortcut action (wtype/xdotool) - On-device display with periodic command output - Auto page switching (Hyprland, Sway, Niri, GNOME, KDE, X11) - Screensaver with idle detection - Config hot-reload - Multi-device support --- .gitignore | 5 + README.md | 137 ++ action.go | 311 +++ assets/Font_Awesome_7_BrandsRegular400.otf | Bin 0 -> 215132 bytes assets/Font_Awesome_7_FreeRegular400.otf | Bin 0 -> 87340 bytes assets/Font_Awesome_7_FreeSolid900.otf | Bin 0 -> 414664 bytes autoswitch.go | 451 +++++ autoswitch_test.go | 223 +++ cbdt.go | 209 +++ config.example.json | 46 + daemon.go | 256 +++ deck.go | 331 ++++ emoji.go | 209 +++ fontawesome.go | 138 ++ fontawesome_data.go | 71 + fontawesome_icons.go | 1979 ++++++++++++++++++++ go.mod | 16 + go.sum | 22 + icons.go | 205 ++ internal/config/config.go | 266 +++ main.go | 94 + media.go | 11 + page.go | 781 ++++++++ render.go | 132 ++ screensaver.go | 92 + static/app.js | 557 ++++++ static/index.html | 440 +++++ static/styles.css | 697 +++++++ web.go | 529 ++++++ 29 files changed, 8208 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 action.go create mode 100644 assets/Font_Awesome_7_BrandsRegular400.otf create mode 100644 assets/Font_Awesome_7_FreeRegular400.otf create mode 100644 assets/Font_Awesome_7_FreeSolid900.otf create mode 100644 autoswitch.go create mode 100644 autoswitch_test.go create mode 100644 cbdt.go create mode 100644 config.example.json create mode 100644 daemon.go create mode 100644 deck.go create mode 100644 emoji.go create mode 100644 fontawesome.go create mode 100644 fontawesome_data.go create mode 100644 fontawesome_icons.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 icons.go create mode 100644 internal/config/config.go create mode 100644 main.go create mode 100644 media.go create mode 100644 page.go create mode 100644 render.go create mode 100644 screensaver.go create mode 100644 static/app.js create mode 100644 static/index.html create mode 100644 static/styles.css create mode 100644 web.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e98506 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +streamdeck-lets-go +*.test +*.out +*.exe +/images/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad8a72e --- /dev/null +++ b/README.md @@ -0,0 +1,137 @@ +# streamdeck-lets-go + +> A lightweight daemon for controlling Elgato Stream Deck devices with a built-in web UI. + +--- + +## Features + +- **Web-based editor** — Alpine.js SPA for managing pages, keys, icons, and actions +- **Multi-action support** — assign shell commands, scripts, page switching, media/volume/brightness controls, and **keyboard shortcuts** to any key +- **On-device display** — render icons, text labels, and periodic command output directly on Stream Deck keys +- **Auto page switching** — automatically change pages based on the focused window (Hyprland, Sway, Niri, GNOME, KDE, X11) +- **Screensaver** — dim or blank the deck after a configurable idle timeout +- **Hot-reload** — config changes via the web UI are applied live; manual edits to `config.json` are detected and reloaded automatically +- **No cloud, no Electron** — single Go binary with an embedded web frontend + +--- + +## Quick Start + +### Prerequisites + +- Linux with **CGO** enabled (required by `bearsh/hid` / libusb) +- Stream Deck connected via USB + +### Install from source + +```bash +go build -o streamdeck-lets-go . +``` + +### Run + +```bash +# Full daemon (deck hardware + web UI) +./streamdeck-lets-go daemon + +# Web UI only (config editor without deck) +./streamdeck-lets-go serve -addr :9090 + +# List connected devices +./streamdeck-lets-go discover +``` + +Open `http://localhost:9090` in your browser. + +--- + +## Configuration + +The config file is stored at `~/.config/streamdeck-lets-go/config.json`. You can edit it manually or through the web UI. + +### Key actions + +| Type | Field | Description | +|---|---|---| +| `command` | `command` | Run a shell command | +| `script` | `script` | Run an executable script | +| `builtin` | `builtin` | Built-in media/volume/brightness controls | +| `page` | `page` | Switch to another page | +| `keyboard` | `keys` | Send a keyboard shortcut (e.g. `ctrl+t`, `super+return`) | + +### Keyboard actions + +Sends a key combination to the currently focused window. + +| Platform | Tool required | +|---|---| +| Wayland | `wtype` | +| X11 | `xdotool` | + +The daemon warns on startup if the required tool is missing. + +### Built-in actions + +| Value | Action | +|---|---| +| `volume_up` / `volume_down` / `volume_mute` | PipeWire volume (via `wpctl`) | +| `brightness_up` / `brightness_down` | Display brightness (via `brightnessctl`) | +| `media_play_pause` / `media_next` / `media_prev` / `media_stop` | MPRIS media (via `playerctl`) | + +### Periodic display + +Any key can display the output of a command or script, updated on an interval. Use this for weather, system stats, calendar, etc. + +### Auto-switch rules + +Automatically change pages based on the focused window: + +```json +{ + "wm_class": "firefox", + "page": "browser" +} +``` + +Supported compositors: Hyprland, Sway, Niri, GNOME, KDE, X11. + +### Screensaver + +After a configurable idle period the deck dims or shows a custom image. + +--- + +## Building from source + +```bash +git clone git@git.totmin.ru:en2zmax/streamdeck-lets-go.git +cd streamdeck-lets-go +go build -o streamdeck-lets-go . +``` + +Dependencies: + +| Package | Purpose | +|---|---| +| `libusb-1.0` | HID communication via CGO | +| `librsvg` | SVG icon rendering (optional) | +| `fontconfig` | System font detection | + +--- + +## Supported devices + +| Model | PID | Keys | +|---|---|---| +| Stream Deck Original | `0x006d` | 15 | +| Stream Deck Mini | `0x0063` | 6 | +| Stream Deck XL | `0x006c` | 32 | +| Stream Deck MK.2 | `0x0080` | 15 | +| Stream Deck Pedal | `0x0086` | 3 | + +--- + +## License + +MIT diff --git a/action.go b/action.go new file mode 100644 index 0000000..c9aad41 --- /dev/null +++ b/action.go @@ -0,0 +1,311 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "log/slog" + "os" + "os/exec" + "strings" + "time" + + "streamdeck-lets-go/internal/config" +) + +func ExecuteAction(a *config.Action, deck *Deck, pm *PageManager) error { + if a == nil { + return nil + } + + slog.Debug("execute action", "type", a.Type) + + switch a.Type { + case "command": + return execCommand(a) + case "builtin": + return execBuiltin(a, deck, pm) + case "script": + return execScript(a) + case "page": + if pm != nil { + return pm.ActivatePage(a.Page) + } + return fmt.Errorf("page manager not available") + case "keyboard": + return execKeyboard(a) + default: + return fmt.Errorf("unknown action type: %s", a.Type) + } +} + +func execCommand(a *config.Action) error { + cmd := exec.Command("sh", "-c", a.Command) + + if a.Background { + cmd.Stdout = nil + cmd.Stderr = nil + if err := cmd.Start(); err != nil { + return fmt.Errorf("start command: %w", err) + } + go func() { + if err := cmd.Wait(); err != nil { + slog.Warn("command finished", "cmd", a.Command, "error", err) + } + }() + return nil + } + + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("run command: %w", err) + } + return nil +} + +func execScript(a *config.Action) error { + cmd := exec.Command(a.Script) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("run script: %w", err) + } + return nil +} + +func execDisplayCapture(d *config.DisplayCfg, timeout time.Duration) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + var cmd *exec.Cmd + if d.Command != "" { + cmd = exec.CommandContext(ctx, "sh", "-c", d.Command) + } else { + cmd = exec.CommandContext(ctx, d.Script) + } + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + err := cmd.Run() + output := stdout.String() + if stderr.Len() > 0 { + if output != "" { + output += "\n" + } + output += stderr.String() + } + return output, err +} + +func execBuiltin(a *config.Action, deck *Deck, pm *PageManager) error { + parts := strings.SplitN(a.Builtin, ":", 2) + if len(parts) < 1 { + return fmt.Errorf("invalid builtin: %s", a.Builtin) + } + + category := parts[0] + action := "" + if len(parts) > 1 { + action = parts[1] + } + + slog.Debug("builtin", "category", category, "action", action) + + switch category { + case "media": + return mediaAction(action) + case "volume": + return volumeAction(action) + case "brightness": + return brightnessAction(action) + case "page": + if pm != nil { + return pageBuiltinAction(action, pm) + } + return fmt.Errorf("page manager not available") + case "deck": + return deckBuiltinAction(action, deck) + default: + return fmt.Errorf("unknown builtin category: %s", category) + } +} + +func mediaAction(action string) error { + var cmd string + switch action { + case "playpause": + cmd = "playerctl play-pause" + case "next": + cmd = "playerctl next" + case "prev": + cmd = "playerctl previous" + case "stop": + cmd = "playerctl stop" + default: + return fmt.Errorf("unknown media action: %s", action) + } + return exec.Command("sh", "-c", cmd).Run() +} + +func volumeAction(action string) error { + var cmd string + switch action { + case "up": + cmd = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + case "down": + cmd = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + case "mute": + cmd = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + default: + return fmt.Errorf("unknown volume action: %s", action) + } + return exec.Command("sh", "-c", cmd).Run() +} + +func brightnessAction(action string) error { + var cmd string + switch action { + case "up": + cmd = "brightnessctl s +10%" + case "down": + cmd = "brightnessctl s 10%-" + default: + return fmt.Errorf("unknown brightness action: %s", action) + } + return exec.Command("sh", "-c", cmd).Run() +} + +func pageBuiltinAction(action string, pm *PageManager) error { + switch action { + case "next": + pageNames := pm.PageNames() + current := pm.ActivePageName() + for i, name := range pageNames { + if name == current { + next := (i + 1) % len(pageNames) + return pm.ActivatePage(pageNames[next]) + } + } + if len(pageNames) > 0 { + return pm.ActivatePage(pageNames[0]) + } + case "prev": + pageNames := pm.PageNames() + current := pm.ActivePageName() + for i, name := range pageNames { + if name == current { + prev := (i - 1 + len(pageNames)) % len(pageNames) + return pm.ActivatePage(pageNames[prev]) + } + } + if len(pageNames) > 0 { + return pm.ActivatePage(pageNames[0]) + } + default: + return fmt.Errorf("unknown page action: %s", action) + } + return nil +} + +func deckBuiltinAction(action string, deck *Deck) error { + switch action { + case "brightness-up": + current := deck.Brightness() + next := current + 25 + if next > 100 { + next = 25 + } + return deck.SetBrightness(next) + case "brightness-down": + current := deck.Brightness() + next := current - 25 + if next < 25 { + next = 100 + } + return deck.SetBrightness(next) + default: + return fmt.Errorf("unknown deck action: %s", action) + } +} + +func keyboardTool() string { + if os.Getenv("WAYLAND_DISPLAY") != "" { + if _, err := exec.LookPath("wtype"); err == nil { + return "wtype" + } + return "" + } + if _, err := exec.LookPath("xdotool"); err == nil { + return "xdotool" + } + return "" +} + +func execKeyboard(a *config.Action) error { + tool := keyboardTool() + if tool == "" { + wayland := os.Getenv("WAYLAND_DISPLAY") != "" + if wayland { + return fmt.Errorf("keyboard action requires wtype — install it (e.g. apk add wtype) and restart") + } + return fmt.Errorf("keyboard action requires xdotool — install it (e.g. apk add xdotool) and restart") + } + + keys := strings.ToLower(strings.TrimSpace(a.Keys)) + if keys == "" { + return fmt.Errorf("keyboard action: keys is empty") + } + + parts := strings.Split(keys, "+") + if len(parts) == 0 { + return fmt.Errorf("keyboard action: invalid keys format %q", a.Keys) + } + + switch tool { + case "wtype": + return execWType(parts) + case "xdotool": + return execXDoTool(keys) + default: + return fmt.Errorf("keyboard action: unsupported tool %q", tool) + } +} + +func execWType(parts []string) error { + mainKey := parts[len(parts)-1] + mods := parts[:len(parts)-1] + + args := make([]string, 0, 2+len(mods)*2) + + for _, m := range mods { + args = append(args, "-M", m) + } + args = append(args, "-P", mainKey, "-p", mainKey) + for i := len(mods) - 1; i >= 0; i-- { + args = append(args, "-m", mods[i]) + } + + cmd := exec.Command("wtype", args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + +func execXDoTool(keys string) error { + cmd := exec.Command("xdotool", "key", keys) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + +func (pm *PageManager) PageNames() []string { + pm.mu.RLock() + defer pm.mu.RUnlock() + names := make([]string, 0, len(pm.pages)) + for name := range pm.pages { + names = append(names, name) + } + return names +} diff --git a/assets/Font_Awesome_7_BrandsRegular400.otf b/assets/Font_Awesome_7_BrandsRegular400.otf new file mode 100644 index 0000000000000000000000000000000000000000..08b8ce0f0e8246a75c1d3cbcd23f3205ed38965a GIT binary patch literal 215132 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 Mfj3c8QtSEuAC>J~y8r+H literal 0 HcmV?d00001 diff --git a/assets/Font_Awesome_7_FreeRegular400.otf b/assets/Font_Awesome_7_FreeRegular400.otf new file mode 100644 index 0000000000000000000000000000000000000000..fb469d288137abcda28e5c40ceb99dae09ca6d1a GIT binary patch literal 87340 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 V^sJ^&Ga`7?_bvwn^5Jdy{{Ye(P5uA? literal 0 HcmV?d00001 diff --git a/assets/Font_Awesome_7_FreeSolid900.otf b/assets/Font_Awesome_7_FreeSolid900.otf new file mode 100644 index 0000000000000000000000000000000000000000..25133ed74a2328d6201cd5a884c45490585e4138 GIT binary patch literal 414664 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%0AU@ZJ%bh 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

+ + diff --git a/static/styles.css b/static/styles.css new file mode 100644 index 0000000..c581c5c --- /dev/null +++ b/static/styles.css @@ -0,0 +1,697 @@ +:root { + --bg: #0a0a10; + --surface: #141420; + --surface-hover: #1a1a2a; + --border: #252540; + --border-light: #333358; + --text: #e4e4f0; + --text-muted: #7a7a90; + --accent: #6366f1; + --accent-glow: rgba(99, 102, 241, 0.3); + --danger: #ef4444; + --success: #22c55e; + --radius: 12px; + --radius-sm: 8px; + --radius-xs: 6px; + --shadow: 0 4px 24px rgba(0, 0, 0, 0.4); + --transition: 150ms cubic-bezier(0.4, 0, 0.2, 1); +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +html, body { + height: 100%; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', sans-serif; + background: var(--bg); + color: var(--text); + font-size: 14px; + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +.app { + display: flex; + flex-direction: column; + height: 100vh; + max-width: 780px; + margin: 0 auto; + padding: 0 16px; +} + +/* ── Header ── */ +header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 0; + gap: 12px; + flex-shrink: 0; +} + +header h1 { + font-size: 16px; + font-weight: 600; + letter-spacing: -0.3px; +} + +.page-nav { + display: flex; + align-items: center; + gap: 6px; +} + +.page-nav .dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--border); + cursor: pointer; + transition: background var(--transition); +} +.page-nav .dot:hover { background: var(--text-muted); } +.page-nav .dot.active { background: var(--accent); box-shadow: 0 0 8px var(--accent-glow); } + +.header-actions { + display: flex; + gap: 8px; +} + +.icon-btn { + background: var(--surface); + border: 1px solid var(--border); + color: var(--text-muted); + width: 32px; + height: 32px; + border-radius: var(--radius-xs); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all var(--transition); + font-size: 14px; +} +.icon-btn:hover { + background: var(--surface-hover); + border-color: var(--border-light); + color: var(--text); +} + +/* ── Grid ── */ +main { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.deck-grid { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 8px; + padding: 20px; + background: var(--surface); + border-radius: var(--radius); + border: 1px solid var(--border); +} + +.key-btn { + aspect-ratio: 1; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: #0d0d18; + cursor: pointer; + overflow: hidden; + position: relative; + transition: all var(--transition); + padding: 8px; + display: flex; + align-items: center; + justify-content: center; + width: 100%; +} + +.key-btn:hover { + border-color: var(--accent); + box-shadow: 0 0 12px var(--accent-glow); + transform: scale(1.03); +} + +.key-btn:active { transform: scale(0.97); } + +.key-btn img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: inherit; +} + +.key-btn.empty { + opacity: 0.3; +} +.key-btn.empty:hover { + opacity: 0.5; + border-color: var(--border-light); + box-shadow: none; +} + +.key-label { + position: absolute; + bottom: 3px; + left: 4px; + right: 4px; + font-size: 9px; + color: rgba(255, 255, 255, 0.75); + text-align: center; + text-shadow: 0 1px 2px rgba(0,0,0,0.8); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + pointer-events: none; + line-height: 1; +} + +.fa-preview { + font-size: 34px; + color: #fff; +} + +/* ── Modal ── */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(4px); + z-index: 100; + display: flex; + align-items: center; + justify-content: center; + animation: fadeIn 150ms ease; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.modal { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 24px; + width: 360px; + max-width: calc(100vw - 32px); + box-shadow: var(--shadow); + animation: slideUp 200ms cubic-bezier(0.16, 1, 0.3, 1); + max-height: 85vh; + overflow-y: auto; +} + +@keyframes slideUp { + from { transform: translateY(16px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +.modal h3 { + font-size: 15px; + font-weight: 600; + margin-bottom: 16px; + letter-spacing: -0.2px; +} + +.preview-box { + width: 100px; + height: 100px; + margin: 0 auto 16px; + border-radius: var(--radius-xs); + overflow: hidden; + border: 1px solid var(--border); + position: relative; + background: #0d0d18; + cursor: pointer; +} + +.preview-box img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.preview-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + opacity: 0; + transition: opacity var(--transition); + border-radius: var(--radius-xs); +} + +.preview-box:hover .preview-overlay { opacity: 1; } + +.preview-overlay i { + font-size: 24px; + color: #fff; +} + +.form-group { + margin-bottom: 12px; +} + +.form-group label { + display: block; + font-size: 11px; + font-weight: 600; + color: var(--text-muted); + margin-bottom: 4px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.form-group input, +.form-group select { + width: 100%; + padding: 8px 10px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius-xs); + color: var(--text); + font-size: 13px; + font-family: inherit; + outline: none; + transition: border-color var(--transition); +} + +.form-group input:focus, +.form-group select:focus { + border-color: var(--accent); + box-shadow: 0 0 0 2px var(--accent-glow); +} + +.form-group input::placeholder { + color: var(--text-muted); + opacity: 0.5; +} + +.form-group select { + cursor: pointer; + -webkit-appearance: none; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 5l3 3 3-3' fill='none' stroke='%237a7a90' stroke-width='1.5'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 10px center; + padding-right: 28px; +} + +.form-row { + display: flex; + gap: 8px; +} + +.form-row .form-group { flex: 1; } + +.checkbox-row { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 12px; +} + +.checkbox-row input[type="checkbox"] { + width: 16px; + height: 16px; + accent-color: var(--accent); + cursor: pointer; +} + +.checkbox-row label { + font-size: 13px; + color: var(--text); + cursor: pointer; +} + +/* Collapsible */ +.collapse-toggle { + display: flex; + align-items: center; + gap: 6px; + background: none; + border: none; + color: var(--text-muted); + cursor: pointer; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 4px 0; + margin-bottom: 8px; + font-family: inherit; +} + +.collapse-toggle:hover { color: var(--accent); } +.collapse-toggle i { font-size: 10px; transition: transform var(--transition); } +.collapse-toggle.open i { transform: rotate(90deg); } + +.modal-actions { + display: flex; + gap: 8px; + margin-top: 20px; +} + +.btn { + padding: 8px 16px; + border-radius: var(--radius-xs); + font-size: 13px; + font-weight: 600; + cursor: pointer; + font-family: inherit; + border: 1px solid transparent; + transition: all var(--transition); +} + +.btn-primary { + background: var(--accent); + color: #fff; + border-color: var(--accent); + flex: 1; +} + +.btn-primary:hover { + background: #4f46e5; + box-shadow: 0 0 16px var(--accent-glow); +} + +.btn-outline { + background: transparent; + border-color: var(--border); + color: var(--text); +} + +.btn-outline:hover { + background: var(--surface-hover); + border-color: var(--border-light); +} + +.btn-danger { + color: var(--danger); + border-color: transparent; + background: transparent; +} + +.btn-danger:hover { + background: rgba(239, 68, 68, 0.12); + border-color: rgba(239, 68, 68, 0.3); +} + +/* ── Settings / Backup panels ── */ +.panel { + width: 100%; + padding: 20px; + background: var(--surface); + border-radius: var(--radius); + border: 1px solid var(--border); +} + +.panel h3 { + font-size: 14px; + font-weight: 600; + margin-bottom: 16px; +} + +.panel-section { + margin-bottom: 20px; + padding-bottom: 20px; + border-bottom: 1px solid var(--border); +} + +.panel-section:last-child { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: none; +} + +.panel-section h4 { + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 8px; +} + +.backup-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 0; + border-bottom: 1px solid var(--border); + font-size: 12px; +} + +.backup-item:last-child { border-bottom: none; } + +.backup-item .meta { + color: var(--text-muted); + font-size: 11px; +} + +.status-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + background: var(--bg); + border-radius: 20px; + font-size: 12px; + border: 1px solid var(--border); +} + +.status-badge .dot { + width: 6px; + height: 6px; + border-radius: 50%; +} + +.status-badge .dot.online { background: var(--success); } +.status-badge .dot.offline { background: var(--text-muted); } + +/* ── Toasts ── */ +.toast { + position: fixed; + bottom: 24px; + left: 50%; + transform: translateX(-50%); + background: var(--surface); + border: 1px solid var(--border); + padding: 12px 24px; + border-radius: var(--radius); + font-size: 13px; + z-index: 200; + box-shadow: var(--shadow); + animation: slideUp 200ms cubic-bezier(0.16, 1, 0.3, 1); +} + +.toast.success { border-color: var(--success); } +.toast.error { border-color: var(--danger); } + +.slider-group { + display: flex; + align-items: center; + gap: 10px; +} + +.slider-group input[type="range"] { + flex: 1; + -webkit-appearance: none; + appearance: none; + height: 4px; + border-radius: 2px; + background: var(--border); + outline: none; +} + +.slider-group input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--accent); + cursor: pointer; + border: 2px solid var(--bg); +} + +.slider-group .value { + font-size: 12px; + color: var(--text-muted); + min-width: 36px; + text-align: right; + font-variant-numeric: tabular-nums; +} + +/* ── Toolbar ── */ +.toolbar { + display: flex; + align-items: center; + gap: 6px; + margin-top: 12px; + flex-shrink: 0; +} + +.toolbar .btn { + font-size: 12px; + padding: 6px 14px; +} + +/* ── Scrollbar ── */ +::-webkit-scrollbar { width: 6px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; } +::-webkit-scrollbar-thumb:hover { background: var(--border-light); } + +/* ── Auto-switch rule item ── */ +.rule-item { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 10px; + background: var(--bg); + border-radius: var(--radius-xs); + margin-bottom: 6px; + font-size: 12px; +} + +.rule-item code { + background: var(--surface); + padding: 2px 6px; + border-radius: 3px; + font-size: 11px; + color: var(--accent); +} + +/* ── Display indicator on grid keys ── */ +.display-indicator { + position: absolute; + bottom: 4px; + right: 4px; + font-size: 7px; + color: var(--accent); + opacity: 0.6; + pointer-events: none; +} + +/* ── Tab buttons ── */ +.tab-row { + display: flex; + gap: 0; + border: 1px solid var(--border); + border-radius: var(--radius-xs); + overflow: hidden; +} + +.tab-btn { + flex: 1; + padding: 6px 8px; + background: var(--bg); + border: none; + color: var(--text-muted); + font-size: 11px; + font-weight: 600; + font-family: inherit; + cursor: pointer; + transition: all var(--transition); + border-right: 1px solid var(--border); +} + +.tab-btn:last-child { border-right: none; } +.tab-btn:hover { color: var(--text); } +.tab-btn.active { + background: var(--accent); + color: #fff; +} + +/* ── Modifier buttons ── */ +.mod-row { + display: flex; + gap: 4px; + margin-bottom: 8px; +} +.mod-btn { + flex: 1; + padding: 6px 8px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius-xs); + color: var(--text-muted); + font-size: 11px; + font-weight: 600; + font-family: inherit; + cursor: pointer; + transition: all var(--transition); + text-align: center; +} +.mod-btn:hover { color: var(--text); border-color: var(--border-light); } +.mod-btn.active { + background: var(--accent); + color: #fff; + border-color: var(--accent); +} + +/* ── Key capture ── */ +.key-capture { + border: 1px dashed var(--border); + border-radius: var(--radius-xs); + padding: 8px; + min-height: 34px; + cursor: pointer; + text-align: center; + transition: all var(--transition); + outline: none; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; +} +.key-capture:hover { border-color: var(--accent); } +.key-capture:focus-visible { border-color: var(--accent); } +.key-capture.capturing { + border-color: var(--accent); + box-shadow: 0 0 12px var(--accent-glow); + animation: recorderPulse 1s infinite; +} +.captured-key { + font-weight: 600; + font-family: 'SF Mono', 'Fira Code', monospace; + color: var(--accent); + font-size: 13px; +} +.capture-hint { color: var(--accent); font-weight: 600; } +.capture-placeholder { color: var(--text-muted); opacity: 0.6; } + +@keyframes recorderPulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.6; } +} +.key-chips { + display: flex; + align-items: center; + gap: 2px; + flex-wrap: wrap; + justify-content: center; +} +.key-chip { + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + padding: 2px 8px; + font-size: 12px; + font-weight: 600; + font-family: 'SF Mono', 'Fira Code', monospace; + color: var(--accent); +} +.key-plus { + color: var(--text-muted); + font-size: 11px; + margin: 0 2px; +} diff --git a/web.go b/web.go new file mode 100644 index 0000000..2e643d8 --- /dev/null +++ b/web.go @@ -0,0 +1,529 @@ +package main + +import ( + "context" + "embed" + "encoding/json" + "fmt" + "image/png" + "io" + "io/fs" + "log/slog" + "net/http" + "os" + "path/filepath" + "sort" + "strings" + "sync" + "time" + + "streamdeck-lets-go/internal/config" +) + +//go:embed static/* +var staticFS embed.FS + +var staticRoot fs.FS + +func init() { + var err error + staticRoot, err = fs.Sub(staticFS, "static") + if err != nil { + panic(fmt.Sprintf("static embed: %v", err)) + } +} + +type WebServer struct { + cfg *config.Config + configPath string + pm *PageManager + mu sync.RWMutex +} + +func NewWebServer(cfg *config.Config, configPath string) *WebServer { + return &WebServer{cfg: cfg, configPath: configPath} +} + +func (s *WebServer) UpdateConfig(cfg *config.Config) { + s.mu.Lock() + defer s.mu.Unlock() + s.cfg = cfg +} + +func (s *WebServer) SetPageManager(pm *PageManager) { + s.mu.Lock() + defer s.mu.Unlock() + s.pm = pm +} + +func (s *WebServer) Serve(ctx context.Context, addr string) error { + mux := http.NewServeMux() + + mux.HandleFunc("GET /api/config", s.handleGetConfig) + mux.HandleFunc("PUT /api/config", s.handlePutConfig) + mux.HandleFunc("GET /api/config/download", s.handleDownloadConfig) + mux.HandleFunc("POST /api/config/restore", s.handleRestoreConfig) + + mux.HandleFunc("GET /api/pages", s.handleGetPages) + + mux.HandleFunc("GET /api/render", s.handleRender) + + mux.HandleFunc("GET /api/display-outputs", s.handleDisplayOutputs) + + mux.HandleFunc("GET /api/backups", s.handleListBackups) + mux.HandleFunc("GET /api/backups/{filename}", s.handleGetBackup) + + mux.HandleFunc("GET /api/models", s.handleGetModels) + + mux.HandleFunc("GET /api/status", s.handleGetStatus) + + mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticRoot)))) + + mux.HandleFunc("/", s.handleSPA) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "POST" && r.URL.Path == "/api/upload" { + s.handleUpload(w, r) + return + } + mux.ServeHTTP(w, r) + }) + + srv := &http.Server{Addr: addr, Handler: handler} + + go func() { + <-ctx.Done() + slog.Info("shutting down web server") + srv.Close() + }() + + slog.Info("web server listening", "addr", addr) + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + return fmt.Errorf("web server: %w", err) + } + return nil +} + +func (s *WebServer) handleSPA(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + data, err := fs.ReadFile(staticRoot, "index.html") + if err != nil { + http.Error(w, "not found", http.StatusNotFound) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Write(data) +} + +func (s *WebServer) handleGetConfig(w http.ResponseWriter, r *http.Request) { + s.mu.RLock() + defer s.mu.RUnlock() + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(s.cfg) +} + +func (s *WebServer) handlePutConfig(w http.ResponseWriter, r *http.Request) { + var newCfg config.Config + if err := json.NewDecoder(r.Body).Decode(&newCfg); err != nil { + http.Error(w, fmt.Sprintf("invalid JSON: %v", err), http.StatusBadRequest) + return + } + if err := newCfg.Validate(); err != nil { + http.Error(w, fmt.Sprintf("invalid config: %v", err), http.StatusBadRequest) + return + } + + path := config.ConfigPath(s.configPath) + + s.mu.Lock() + oldCfg := s.cfg + s.cfg = &newCfg + s.mu.Unlock() + + if err := s.cfg.Save(s.configPath); err != nil { + s.mu.Lock() + s.cfg = oldCfg + s.mu.Unlock() + slog.Error("save config", "error", err) + http.Error(w, fmt.Sprintf("save failed: %v", err), http.StatusInternalServerError) + return + } + + backupOldConfig(path) + gcImages(&newCfg) + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"status": "saved"}) +} + +func (s *WebServer) handleDownloadConfig(w http.ResponseWriter, r *http.Request) { + s.mu.RLock() + defer s.mu.RUnlock() + + data, err := json.MarshalIndent(s.cfg, "", " ") + if err != nil { + http.Error(w, "serialization error", http.StatusInternalServerError) + return + } + + filename := fmt.Sprintf("streamdeck-config-%s.json", time.Now().Format("2006-01-02")) + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) + w.Write(data) +} + +func (s *WebServer) handleRestoreConfig(w http.ResponseWriter, r *http.Request) { + ct := r.Header.Get("Content-Type") + var newCfg config.Config + + if strings.HasPrefix(ct, "multipart/form-data") { + if err := r.ParseMultipartForm(10 << 20); err != nil { + http.Error(w, fmt.Sprintf("parse form: %v", err), http.StatusBadRequest) + return + } + file, _, err := r.FormFile("file") + if err != nil { + http.Error(w, fmt.Sprintf("file field 'file' required: %v", err), http.StatusBadRequest) + return + } + defer file.Close() + if err := json.NewDecoder(file).Decode(&newCfg); err != nil { + http.Error(w, fmt.Sprintf("invalid JSON: %v", err), http.StatusBadRequest) + return + } + } else { + if err := json.NewDecoder(r.Body).Decode(&newCfg); err != nil { + http.Error(w, fmt.Sprintf("invalid JSON: %v", err), http.StatusBadRequest) + return + } + } + + if err := newCfg.Validate(); err != nil { + http.Error(w, fmt.Sprintf("invalid config: %v", err), http.StatusBadRequest) + return + } + + path := config.ConfigPath(s.configPath) + backupOldConfig(path) + + s.mu.Lock() + s.cfg = &newCfg + s.mu.Unlock() + + if err := s.cfg.Save(s.configPath); err != nil { + http.Error(w, fmt.Sprintf("save failed: %v", err), http.StatusInternalServerError) + return + } + gcImages(&newCfg) + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"status": "restored"}) +} + +func (s *WebServer) handleGetPages(w http.ResponseWriter, r *http.Request) { + s.mu.RLock() + defer s.mu.RUnlock() + + type pageInfo struct { + Name string `json:"name"` + Keys []config.KeyConfig `json:"keys"` + Icon string `json:"icon,omitempty"` + } + + pages := make([]pageInfo, 0, len(s.cfg.Pages)) + for _, p := range s.cfg.Pages { + pages = append(pages, pageInfo{ + Name: p.Name, + Keys: p.Keys, + Icon: p.Icon, + }) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(pages) +} + +func (s *WebServer) handleRender(w http.ResponseWriter, r *http.Request) { + q := r.URL.Query() + + keySize := 72 + if s := q.Get("key_size"); s != "" { + fmt.Sscanf(s, "%d", &keySize) + } + + kc := &config.KeyConfig{} + + if page := q.Get("page"); page != "" { + key := q.Get("key") + s.mu.RLock() + for _, p := range s.cfg.Pages { + if p.Name == page { + for _, k := range p.Keys { + if fmt.Sprintf("%d", k.Index) == key { + kc = &k + break + } + } + break + } + } + s.mu.RUnlock() + } + + if icon := q.Get("icon"); icon != "" { + kc.Icon = icon + if s := q.Get("icon_scale"); s != "" { + v := 0.0 + fmt.Sscanf(s, "%f", &v) + kc.IconScale = &v + } + } + if label := q.Get("label"); label != "" { + kc.Label = label + } + if fs := q.Get("font_size"); fs != "" { + v := 0.0 + fmt.Sscanf(fs, "%f", &v) + kc.FontSize = &v + } + if bg := q.Get("background"); bg != "" { + kc.Background = bg + } + + img := RenderKeyToImage(kc, keySize) + + w.Header().Set("Content-Type", "image/png") + w.Header().Set("Cache-Control", "no-cache") + png.Encode(w, img) +} + +func (s *WebServer) handleDisplayOutputs(w http.ResponseWriter, r *http.Request) { + s.mu.RLock() + pm := s.pm + s.mu.RUnlock() + + if pm == nil { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{}")) + return + } + + outputs := pm.GetDisplayOutputs() + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(outputs) +} + +func backupOldConfig(path string) { + backupDir := filepath.Join(filepath.Dir(path), "backups") + if err := os.MkdirAll(backupDir, 0755); err != nil { + slog.Warn("backup: create dir", "error", err) + return + } + + data, err := os.ReadFile(path) + if err != nil { + return + } + + name := fmt.Sprintf("config.%s.json", time.Now().Format("2006-01-02T15-04-05")) + dst := filepath.Join(backupDir, name) + if err := os.WriteFile(dst, data, 0644); err != nil { + slog.Warn("backup: write", "error", err) + return + } + + entries, _ := os.ReadDir(backupDir) + if len(entries) > 10 { + sort.Slice(entries, func(i, j int) bool { + fi, _ := entries[i].Info() + fj, _ := entries[j].Info() + return fi.ModTime().Before(fj.ModTime()) + }) + for _, e := range entries[:len(entries)-10] { + os.Remove(filepath.Join(backupDir, e.Name())) + } + } +} + +func gcImages(cfg *config.Config) { + imgDir := filepath.Join(configDir(), "images") + entries, err := os.ReadDir(imgDir) + if err != nil { + return + } + + used := make(map[string]bool, len(entries)) + for _, p := range cfg.Pages { + for _, k := range p.Keys { + if k.Icon != "" { + used[k.Icon] = true + } + } + } + + for _, e := range entries { + if e.IsDir() { + continue + } + path := filepath.Join(imgDir, e.Name()) + if !used[path] { + if err := os.Remove(path); err != nil { + slog.Warn("gc: remove orphan image", "path", path, "error", err) + } else { + slog.Debug("gc: removed orphan image", "path", path) + } + } + } +} + +func (s *WebServer) handleListBackups(w http.ResponseWriter, r *http.Request) { + path := config.ConfigPath(s.configPath) + backupDir := filepath.Join(filepath.Dir(path), "backups") + + entries, err := os.ReadDir(backupDir) + if err != nil { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode([]map[string]interface{}{}) + return + } + + type backupInfo struct { + Name string `json:"name"` + Size int64 `json:"size"` + Time string `json:"time"` + } + + var backups []backupInfo + for _, e := range entries { + if e.IsDir() || !strings.HasPrefix(e.Name(), "config.") || !strings.HasSuffix(e.Name(), ".json") { + continue + } + fi, err := e.Info() + if err != nil { + continue + } + backups = append(backups, backupInfo{ + Name: e.Name(), + Size: fi.Size(), + Time: fi.ModTime().Format(time.RFC3339), + }) + } + + sort.Slice(backups, func(i, j int) bool { + return backups[i].Time > backups[j].Time + }) + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(backups) +} + +func (s *WebServer) handleGetBackup(w http.ResponseWriter, r *http.Request) { + filename := r.PathValue("filename") + if filename == "" || strings.Contains(filename, "/") || strings.Contains(filename, "..") { + http.Error(w, "invalid filename", http.StatusBadRequest) + return + } + + path := config.ConfigPath(s.configPath) + backupDir := filepath.Join(filepath.Dir(path), "backups") + fullPath := filepath.Join(backupDir, filename) + + if !strings.HasPrefix(fullPath, backupDir) { + http.Error(w, "invalid path", http.StatusBadRequest) + return + } + + data, err := os.ReadFile(fullPath) + if err != nil { + http.Error(w, "backup not found", http.StatusNotFound) + return + } + + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) + w.Write(data) +} + +func (s *WebServer) handleGetModels(w http.ResponseWriter, r *http.Request) { + type modelInfo struct { + PID uint16 `json:"pid"` + Name string `json:"name"` + KeysX int `json:"keys_x"` + KeysY int `json:"keys_y"` + KeySize int `json:"key_size"` + } + + models := make([]modelInfo, 0, len(knownDecks)) + for _, d := range knownDecks { + models = append(models, modelInfo{ + PID: d.PID, + Name: d.Name, + KeysX: d.KeysX, + KeysY: d.KeysY, + KeySize: d.KeySize, + }) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(models) +} + +func (s *WebServer) handleGetStatus(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]interface{}{ + "config_version": s.cfg.Version, + "default_page": s.cfg.DefaultPage, + "page_count": len(s.cfg.Pages), + "device_count": len(s.cfg.Devices), + }) +} + +func (s *WebServer) handleUpload(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + + if err := r.ParseMultipartForm(10 << 20); err != nil { + http.Error(w, fmt.Sprintf("parse form: %v", err), http.StatusBadRequest) + return + } + + file, handler, err := r.FormFile("file") + if err != nil { + http.Error(w, fmt.Sprintf("file field 'file' required: %v", err), http.StatusBadRequest) + return + } + defer file.Close() + + uploadDir := filepath.Join(configDir(), "images") + if err := os.MkdirAll(uploadDir, 0755); err != nil { + http.Error(w, fmt.Sprintf("create upload dir: %v", err), http.StatusInternalServerError) + return + } + + ext := filepath.Ext(handler.Filename) + if ext == "" { + ext = ".png" + } + filename := fmt.Sprintf("%d%s", time.Now().UnixNano(), ext) + savePath := filepath.Join(uploadDir, filename) + + dst, err := os.Create(savePath) + if err != nil { + http.Error(w, fmt.Sprintf("create file: %v", err), http.StatusInternalServerError) + return + } + defer dst.Close() + + if _, err := io.Copy(dst, file); err != nil { + http.Error(w, fmt.Sprintf("write file: %v", err), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"path": savePath}) +}

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 H?Kt-j+KfY9 literal 0 HcmV?d00001 diff --git a/autoswitch.go b/autoswitch.go new file mode 100644 index 0000000..9b3625a --- /dev/null +++ b/autoswitch.go @@ -0,0 +1,451 @@ +package main + +import ( + "context" + "encoding/json" + "log/slog" + "os" + "os/exec" + "regexp" + "strings" + "sync" + "time" + + "streamdeck-lets-go/internal/config" +) + +type WindowDetector interface { + Start(ctx context.Context) (<-chan Window, error) + Close() +} + +type Window struct { + WMClass string + Title string +} + +func NewWindowDetector() WindowDetector { + desktop := os.Getenv("XDG_CURRENT_DESKTOP") + wayland := os.Getenv("WAYLAND_DISPLAY") + + slog.Debug("detecting desktop environment", "XDG_CURRENT_DESKTOP", desktop, "WAYLAND_DISPLAY", wayland) + + switch { + case desktop == "Hyprland": + slog.Info("auto-switch: using Hyprland detector") + d := &hyprlandDetector{} + d.PollInterval = 200 * time.Millisecond + return d + + case desktop == "sway": + slog.Info("auto-switch: using Sway detector") + d := &swayDetector{} + d.PollInterval = 500 * time.Millisecond + return d + + case desktop == "niri": + slog.Info("auto-switch: using Niri detector") + d := &niriDetector{} + d.PollInterval = 200 * time.Millisecond + return d + + case desktop == "GNOME" || strings.Contains(desktop, "GNOME"): + slog.Info("auto-switch: GNOME detector (stub)") + d := &gnomeDetector{} + d.PollInterval = 500 * time.Millisecond + return d + + case strings.Contains(desktop, "KDE") || strings.Contains(desktop, "plasma"): + slog.Info("auto-switch: KDE detector (stub)") + d := &kdeDetector{} + d.PollInterval = 500 * time.Millisecond + return d + + case wayland != "": + slog.Warn("auto-switch: unknown Wayland compositor, using portal fallback") + d := &portalDetector{} + d.PollInterval = 500 * time.Millisecond + return d + + default: + slog.Info("auto-switch: using X11 detector") + d := &x11Detector{} + d.PollInterval = 200 * time.Millisecond + return d + } +} + +type basePoll struct { + PollInterval time.Duration + pollFn func(context.Context) Window + cancel context.CancelFunc + lastRaw string +} + +func (b *basePoll) start(ctx context.Context, ch chan<- Window) { + ticker := time.NewTicker(b.PollInterval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + win := b.pollFn(ctx) + raw := win.WMClass + "|" + win.Title + if raw != b.lastRaw { + b.lastRaw = raw + select { + case ch <- win: + default: + } + } + case <-ctx.Done(): + return + } + } +} + +func (b *basePoll) stop() { + if b.cancel != nil { + b.cancel() + } +} + +func runCmd(ctx context.Context, cmd string, args ...string) (string, error) { + c := exec.CommandContext(ctx, cmd, args...) + out, err := c.Output() + if err != nil { + return "", err + } + return strings.TrimSpace(string(out)), nil +} + +func runCmdJSON(ctx context.Context, cmd string, args ...string) ([]byte, error) { + c := exec.CommandContext(ctx, cmd, args...) + return c.Output() +} + +type hyprlandDetector struct { + basePoll +} + +func (d *hyprlandDetector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} + +func (d *hyprlandDetector) Close() { d.basePoll.stop() } + +type hyprlandWindow struct { + Class string `json:"class"` + Title string `json:"title"` +} + +func (d *hyprlandDetector) getWindow(ctx context.Context) Window { + data, err := runCmdJSON(ctx, "hyprctl", "activewindow", "-j") + if err != nil { + return Window{} + } + + var win hyprlandWindow + if err := json.Unmarshal(data, &win); err != nil { + return Window{} + } + return Window{WMClass: win.Class, Title: win.Title} +} + +type swayDetector struct { + basePoll +} + +func (d *swayDetector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} + +func (d *swayDetector) Close() { d.basePoll.stop() } + +type swayNode struct { + Type string `json:"type"` + Focused bool `json:"focused"` + AppID *string `json:"app_id"` + Name string `json:"name"` + Nodes []swayNode `json:"nodes"` + Floating []swayNode `json:"floating_nodes"` + Props *swayWindowProps `json:"window_properties"` +} + +type swayWindowProps struct { + Class string `json:"class"` +} + +func (d *swayDetector) getWindow(ctx context.Context) Window { + data, err := runCmdJSON(ctx, "swaymsg", "-t", "get_tree") + if err != nil { + return Window{} + } + + var root swayNode + if err := json.Unmarshal(data, &root); err != nil { + return Window{} + } + + node := findFocusedSwayNode(&root) + if node == nil { + return Window{} + } + + wmClass := "" + if node.AppID != nil { + wmClass = *node.AppID + } else if node.Props != nil { + wmClass = node.Props.Class + } + + return Window{WMClass: wmClass, Title: node.Name} +} + +func findFocusedSwayNode(node *swayNode) *swayNode { + if node.Type == "con" && node.Focused { + return node + } + for i := range node.Nodes { + if found := findFocusedSwayNode(&node.Nodes[i]); found != nil { + return found + } + } + for i := range node.Floating { + if found := findFocusedSwayNode(&node.Floating[i]); found != nil { + return found + } + } + return nil +} + +type niriDetector struct { + basePoll +} + +func (d *niriDetector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} + +func (d *niriDetector) Close() { d.basePoll.stop() } + +type niriWindow struct { + AppID *string `json:"app_id"` + Title string `json:"title"` +} + +func (d *niriDetector) getWindow(ctx context.Context) Window { + data, err := runCmdJSON(ctx, "niri", "msg", "--json", "focused-window") + if err != nil { + return Window{} + } + + var win niriWindow + if err := json.Unmarshal(data, &win); err != nil { + return Window{} + } + if win.AppID == nil { + return Window{} + } + + return Window{WMClass: *win.AppID, Title: win.Title} +} + +type gnomeDetector struct{ basePoll } +func (d *gnomeDetector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} +func (d *gnomeDetector) Close() { d.basePoll.stop() } + +func (d *gnomeDetector) getWindow(ctx context.Context) Window { + rawClass, err := runCmd(ctx, "gdbus", "call", "--session", + "--dest", "org.gnome.Shell", + "--object-path", "/org/gnome/Shell", + "--method", "org.gnome.Shell.Eval", + "global.display.focus_window?.get_wm_class() ?? ''") + if err != nil { + return Window{} + } + rawTitle, err := runCmd(ctx, "gdbus", "call", "--session", + "--dest", "org.gnome.Shell", + "--object-path", "/org/gnome/Shell", + "--method", "org.gnome.Shell.Eval", + "global.display.focus_window?.title ?? ''") + if err != nil { + _ = rawClass + return Window{} + } + + wmClass := parseGnomeEval(rawClass) + title := parseGnomeEval(rawTitle) + return Window{WMClass: wmClass, Title: title} +} + +func parseGnomeEval(out string) string { + out = strings.TrimSpace(out) + out = strings.TrimPrefix(out, "(true, ") + out = strings.TrimSuffix(out, ")") + out = strings.Trim(out, `"'`) + return out +} + +type kdeDetector struct{ basePoll } +func (d *kdeDetector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} +func (d *kdeDetector) Close() { d.basePoll.stop() } + +func (d *kdeDetector) getWindow(ctx context.Context) Window { + wmClass, _ := runCmd(ctx, "kdotool", "getactivewindow", "getclassname") + title, _ := runCmd(ctx, "kdotool", "getactivewindow", "getwindowname") + return Window{WMClass: wmClass, Title: title} +} + +type x11Detector struct{ basePoll } +func (d *x11Detector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} +func (d *x11Detector) Close() { d.basePoll.stop() } + +func (d *x11Detector) getWindow(ctx context.Context) Window { + wmClass, _ := runCmd(ctx, "xdotool", "getactivewindow", "getclassname") + title, _ := runCmd(ctx, "xdotool", "getactivewindow", "getwindowname") + return Window{WMClass: wmClass, Title: title} +} + +type portalDetector struct{ basePoll } +func (d *portalDetector) Start(ctx context.Context) (<-chan Window, error) { + d.pollFn = d.getWindow + ctx, d.cancel = context.WithCancel(ctx) + ch := make(chan Window, 4) + go d.basePoll.start(ctx, ch) + return ch, nil +} +func (d *portalDetector) Close() { d.basePoll.stop() } + +func (d *portalDetector) getWindow(ctx context.Context) Window { + return Window{} +} + +type AutoSwitchManager struct { + mu sync.RWMutex + rules []compiledRule + lastManualPage string + autoPage string + autoStay bool +} + +type compiledRule struct { + wmClass *regexp.Regexp + title *regexp.Regexp + rule config.SwitchRule +} + +func NewAutoSwitchManager(rules []config.SwitchRule, defaultPage string) *AutoSwitchManager { + m := &AutoSwitchManager{ + lastManualPage: defaultPage, + } + m.Reload(rules) + return m +} + +func (m *AutoSwitchManager) Reload(rules []config.SwitchRule) { + m.mu.Lock() + defer m.mu.Unlock() + + m.rules = make([]compiledRule, 0, len(rules)) + for _, r := range rules { + cr := compiledRule{rule: r} + if r.WMClass != "" { + re, err := regexp.Compile(r.WMClass) + if err != nil { + slog.Warn("auto-switch: invalid wm_class regex", "pattern", r.WMClass, "error", err) + continue + } + cr.wmClass = re + } + if r.Title != "" { + re, err := regexp.Compile(r.Title) + if err != nil { + slog.Warn("auto-switch: invalid title regex", "pattern", r.Title, "error", err) + continue + } + cr.title = re + } + m.rules = append(m.rules, cr) + } + + slog.Info("auto-switch: rules loaded", "count", len(m.rules)) +} + +func (m *AutoSwitchManager) NotifyManualPage(name string) { + m.mu.Lock() + defer m.mu.Unlock() + m.lastManualPage = name + m.autoPage = "" + slog.Debug("auto-switch: manual page set", "page", name) +} + +func (m *AutoSwitchManager) Evaluate(win Window, currentPage string) (page string, shouldSwitch bool) { + m.mu.Lock() + defer m.mu.Unlock() + + if win.WMClass == "" && win.Title == "" { + if m.autoPage != "" && m.autoPage == currentPage && !m.autoStay { + m.autoPage = "" + slog.Debug("auto-switch: no focused window, reverting to manual page", "page", m.lastManualPage) + return m.lastManualPage, true + } + return "", false + } + + for _, r := range m.rules { + if r.wmClass == nil && r.title == nil { + continue + } + if r.wmClass != nil && !r.wmClass.MatchString(win.WMClass) { + continue + } + if r.title != nil && !r.title.MatchString(win.Title) { + continue + } + + m.autoPage = r.rule.Page + m.autoStay = r.rule.Stay + slog.Debug("auto-switch: rule matched", + "wm_class", win.WMClass, "page", r.rule.Page, "stay", r.rule.Stay) + return r.rule.Page, true + } + + if m.autoPage != "" && m.autoPage == currentPage && !m.autoStay { + m.autoPage = "" + slog.Debug("auto-switch: reverting to manual page", "page", m.lastManualPage) + return m.lastManualPage, true + } + + return "", false +} diff --git a/autoswitch_test.go b/autoswitch_test.go new file mode 100644 index 0000000..a4e60b3 --- /dev/null +++ b/autoswitch_test.go @@ -0,0 +1,223 @@ +package main + +import ( + "encoding/json" + "testing" + + "streamdeck-lets-go/internal/config" +) + +func TestFindFocusedSwayNode(t *testing.T) { + input := `{ + "id": 0, + "type": "root", + "nodes": [ + { + "type": "output", + "name": "eDP-1", + "nodes": [ + { + "type": "workspace", + "name": "1", + "nodes": [ + { + "type": "con", + "focused": false, + "app_id": "firefox", + "name": "Firefox", + "nodes": [] + } + ] + }, + { + "type": "workspace", + "name": "2", + "nodes": [ + { + "type": "con", + "focused": true, + "app_id": "Alacritty", + "name": "Alacritty", + "nodes": [] + } + ] + } + ], + "floating_nodes": [] + } + ] + }` + + var root swayNode + if err := json.Unmarshal([]byte(input), &root); err != nil { + t.Fatal(err) + } + + node := findFocusedSwayNode(&root) + if node == nil { + t.Fatal("expected focused node, got nil") + } + if node.AppID == nil || *node.AppID != "Alacritty" { + t.Fatalf("expected Alacritty, got %v", node.AppID) + } + if node.Name != "Alacritty" { + t.Fatalf("expected name Alacritty, got %s", node.Name) + } +} + +func TestFindFocusedSwayNode_XWayland(t *testing.T) { + input := `{ + "id": 0, + "type": "root", + "nodes": [ + { + "type": "output", + "nodes": [ + { + "type": "workspace", + "nodes": [ + { + "type": "con", + "focused": true, + "app_id": null, + "name": "Steam", + "window_properties": {"class": "steam"}, + "nodes": [] + } + ] + } + ] + } + ] + }` + + var root swayNode + json.Unmarshal([]byte(input), &root) + + node := findFocusedSwayNode(&root) + if node == nil { + t.Fatal("expected focused node, got nil") + } + if node.Props == nil || node.Props.Class != "steam" { + t.Fatal("expected window_properties.class = steam") + } +} + +func TestFindFocusedSwayNode_NoFocus(t *testing.T) { + input := `{ + "id": 0, + "type": "root", + "nodes": [ + { + "type": "output", + "nodes": [ + { + "type": "workspace", + "nodes": [ + { + "type": "con", + "focused": false, + "app_id": "kitty", + "name": "kitty", + "nodes": [] + } + ] + } + ] + } + ] + }` + + var root swayNode + json.Unmarshal([]byte(input), &root) + node := findFocusedSwayNode(&root) + if node != nil { + t.Fatal("expected nil when no focused node") + } +} + +func TestAutoSwitchManager_Evaluate(t *testing.T) { + rules := []config.SwitchRule{ + {WMClass: "firefox", Page: "browser"}, + {WMClass: "Alacritty|kitty", Title: ".*vim.*", Page: "coding", Stay: true}, + } + + m := NewAutoSwitchManager(rules, "default") + + page, ok := m.Evaluate(Window{WMClass: "firefox", Title: "Mozilla Firefox"}, "default") + if !ok || page != "browser" { + t.Fatalf("expected browser, got %s/%v", page, ok) + } + + page, ok = m.Evaluate(Window{WMClass: "Alacritty", Title: "nvim main.go"}, "default") + if !ok || page != "coding" { + t.Fatalf("expected coding, got %s/%v", page, ok) + } + + page, ok = m.Evaluate(Window{WMClass: "firefox", Title: "YouTube"}, "browser") + if !ok || page != "browser" { + t.Fatalf("expected browser again, got %s/%v", page, ok) + } +} + +func TestAutoSwitchManager_Stay(t *testing.T) { + rules := []config.SwitchRule{ + {WMClass: "firefox", Page: "browser", Stay: false}, + } + + m := NewAutoSwitchManager(rules, "home") + + m.Evaluate(Window{WMClass: "firefox", Title: "Mozilla Firefox"}, "home") + + page, ok := m.Evaluate(Window{WMClass: "thunar", Title: "Files"}, "browser") + if !ok || page != "home" { + t.Fatalf("expected revert to home, got %s/%v", page, ok) + } +} + +func TestAutoSwitchManager_StayTrue(t *testing.T) { + rules := []config.SwitchRule{ + {WMClass: "firefox", Page: "browser", Stay: true}, + } + + m := NewAutoSwitchManager(rules, "home") + + m.Evaluate(Window{WMClass: "firefox", Title: "Mozilla Firefox"}, "home") + + page, ok := m.Evaluate(Window{WMClass: "thunar", Title: "Files"}, "browser") + if ok { + t.Fatalf("expected no switch (stay=true), got %s", page) + } +} + +func TestAutoSwitchManager_ManualOverride(t *testing.T) { + rules := []config.SwitchRule{ + {WMClass: "firefox", Page: "browser", Stay: false}, + } + + m := NewAutoSwitchManager(rules, "home") + + // 1. Firefox opens → auto-switch to "browser" + m.Evaluate(Window{WMClass: "firefox", Title: "Mozilla Firefox"}, "home") + + // 2. User manually switches to "settings" + m.NotifyManualPage("settings") + + // 3. Window changes to thunar on "settings" → no match → stay on settings + page, ok := m.Evaluate(Window{WMClass: "thunar", Title: "Files"}, "settings") + if ok { + t.Fatalf("expected no switch (already on manual page), got %s", page) + } + + // 4. Firefox comes back → auto-switch to "browser" again + page, ok = m.Evaluate(Window{WMClass: "firefox", Title: "Mozilla Firefox"}, "settings") + if !ok || page != "browser" { + t.Fatalf("expected browser, got %s/%v", page, ok) + } + + // 5. Thunar again, current page is "browser" (auto) → no match → revert to "settings" + page, ok = m.Evaluate(Window{WMClass: "thunar", Title: "Files"}, "browser") + if !ok || page != "settings" { + t.Fatalf("expected revert to settings, got %s/%v", page, ok) + } +} diff --git a/cbdt.go b/cbdt.go new file mode 100644 index 0000000..18bcc56 --- /dev/null +++ b/cbdt.go @@ -0,0 +1,209 @@ +package main + +import ( + "bytes" + "encoding/binary" + "fmt" + "image" + "image/draw" + "image/png" + "log/slog" + "sync" + + _ "image/jpeg" + + "github.com/disintegration/gift" +) + +type cbdtIndex struct { + once sync.Once + imgs []image.Image + scale int +} + +var emojiCBDT cbdtIndex + +func loadCBDT(data []byte) ([]byte, []byte, error) { + if len(data) < 12 { + return nil, nil, fmt.Errorf("font too small") + } + numTables := int(binary.BigEndian.Uint16(data[4:6])) + off := 12 + var cmapData, cbdtData []byte + for i := 0; i < numTables; i++ { + if off+16 > len(data) { + break + } + tag := string(data[off : off+4]) + tblOff := int(binary.BigEndian.Uint32(data[off+8 : off+12])) + tblLen := int(binary.BigEndian.Uint32(data[off+12 : off+16])) + switch tag { + case "cmap": + if tblOff+tblLen <= len(data) { + cmapData = data[tblOff : tblOff+tblLen] + } + case "CBDT": + if tblOff+tblLen <= len(data) { + cbdtData = data[tblOff : tblOff+tblLen] + } + } + off += 16 + } + if cmapData == nil { + return nil, nil, fmt.Errorf("cmap table not found") + } + if cbdtData == nil { + return nil, nil, fmt.Errorf("CBDT table not found") + } + return cmapData, cbdtData, nil +} + +func cmapGlyphIndex(cmap []byte, r rune) (int, bool) { + if len(cmap) < 4 { + return 0, false + } + numTables := int(binary.BigEndian.Uint16(cmap[2:4])) + for i := 0; i < numTables; i++ { + boff := 4 + i*8 + if boff+8 > len(cmap) { + break + } + platform := binary.BigEndian.Uint16(cmap[boff : boff+2]) + encoding := binary.BigEndian.Uint16(cmap[boff+2 : boff+4]) + if platform != 3 || encoding != 10 { + continue + } + subOff := int(binary.BigEndian.Uint32(cmap[boff+4 : boff+8])) + if subOff+2 > len(cmap) { + continue + } + fmtRaw := binary.BigEndian.Uint16(cmap[subOff:]) + if fmtRaw != 12 { + continue + } + return cmapFormat12(cmap[subOff:], r) + } + return 0, false +} + +func cmapFormat12(data []byte, r rune) (int, bool) { + if len(data) < 16 { + return 0, false + } + numGroups := int(binary.BigEndian.Uint32(data[12:16])) + cp := uint32(r) + lo, hi := 0, numGroups-1 + for lo <= hi { + mid := (lo + hi) / 2 + goff := 16 + mid*12 + if goff+12 > len(data) { + break + } + start := binary.BigEndian.Uint32(data[goff:]) + end := binary.BigEndian.Uint32(data[goff+4:]) + startGlyph := binary.BigEndian.Uint32(data[goff+8:]) + if cp < start { + hi = mid - 1 + } else if cp > end { + lo = mid + 1 + } else { + return int(startGlyph + (cp - start)), true + } + } + return 0, false +} + +func scanCBDTImages(cbdt []byte, firstGlyph int) ([]image.Image, error) { + if len(cbdt) < 4 { + return nil, fmt.Errorf("CBDT too small") + } + pos := 4 + var imgs []image.Image + for pos < len(cbdt) { + if pos+9 > len(cbdt) { + break + } + dataSize := int(binary.BigEndian.Uint16(cbdt[pos+7 : pos+9])) + pngOff := pos + 9 + if pngOff+dataSize > len(cbdt) { + break + } + img, err := png.Decode(bytes.NewReader(cbdt[pngOff : pngOff+dataSize])) + if err != nil { + pos += 9 + dataSize + continue + } + imgs = append(imgs, img) + pos += 9 + dataSize + } + if len(imgs) == 0 { + return nil, fmt.Errorf("no valid PNG images found in CBDT") + } + slog.Debug("CBDT scan", "images", len(imgs), "firstGlyph", firstGlyph) + return imgs, nil +} + +func renderCBDTGlyph(r rune, targetSize int, scale float64) (image.Image, bool) { + fontData := loadColorEmojiFont() + if fontData == nil { + return nil, false + } + cmap, cbdt, err := loadCBDT(fontData) + if err != nil { + slog.Debug("CBDT load", "error", err) + return nil, false + } + gid, ok := cmapGlyphIndex(cmap, r) + if !ok { + return nil, false + } + emojiCBDT.once.Do(func() { + imgs, err := scanCBDTImages(cbdt, 4) + if err != nil { + slog.Warn("CBDT scan", "error", err) + return + } + emojiCBDT.imgs = imgs + }) + if emojiCBDT.imgs == nil { + return nil, false + } + idx := gid - 5 + if idx < 0 || idx >= len(emojiCBDT.imgs) { + return nil, false + } + raw := emojiCBDT.imgs[idx] + + displaySize := int(float64(targetSize) * scale) + if displaySize < 1 { + displaySize = targetSize + } + + scaled := raw + if raw.Bounds().Dx() != displaySize || raw.Bounds().Dy() != displaySize { + g := gift.New(gift.Resize(displaySize, displaySize, gift.LanczosResampling)) + rgba := image.NewRGBA(image.Rect(0, 0, displaySize, displaySize)) + g.Draw(rgba, raw) + scaled = rgba + } + + out := image.NewRGBA(image.Rect(0, 0, targetSize, targetSize)) + + offX := (targetSize - scaled.Bounds().Dx()) / 2 + offY := (targetSize - scaled.Bounds().Dy()) / 2 + rect := image.Rect(offX, offY, offX+scaled.Bounds().Dx(), offY+scaled.Bounds().Dy()) + draw.Draw(out, rect, scaled, image.Point{}, draw.Over) + + return out, true +} + +func scaleToTarget(img image.Image, targetSize int) image.Image { + b := img.Bounds() + if b.Dx() == targetSize && b.Dy() == targetSize { + return img + } + g := gift.New(gift.Resize(targetSize, targetSize, gift.LanczosResampling)) + rgba := image.NewRGBA(image.Rect(0, 0, targetSize, targetSize)) + g.Draw(rgba, img) + return rgba +} diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..e1ec623 --- /dev/null +++ b/config.example.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "log_level": "info", + "default_page": "main", + "devices": [ + { + "serial": "", + "brightness": 75 + } + ], + "pages": [ + { + "name": "main", + "keys": [ + { + "index": 0, + "icon": "fa:terminal", + "action": { + "type": "command", + "command": "kitty", + "background": true + } + }, + { + "index": 1, + "icon": "fab:firefox", + "label": "Browser", + "font": "medium", + "font_size": 11, + "action": { + "type": "command", + "command": "firefox", + "background": true + } + } + ] + } + ], + "auto_switch": [], + "screensaver": { + "enabled": false, + "idle_seconds": 30, + "image": "", + "brightness": 10 + } +} diff --git a/daemon.go b/daemon.go new file mode 100644 index 0000000..8c39785 --- /dev/null +++ b/daemon.go @@ -0,0 +1,256 @@ +package main + +import ( + "context" + "log/slog" + "os" + "os/exec" + "time" + + "streamdeck-lets-go/internal/config" +) + +type RunOptions struct { + ConfigPath string + HTTPAddr string + HTTPEnabled bool + NoDeck bool +} + +func Run(ctx context.Context, cfg *config.Config, opts RunOptions) error { + web := NewWebServer(cfg, opts.ConfigPath) + + if !opts.NoDeck || opts.HTTPEnabled { + checkKeyboardTool() + } + + if opts.HTTPEnabled { + go func() { + if err := web.Serve(ctx, opts.HTTPAddr); err != nil { + slog.Error("web server error", "error", err) + } + }() + } + + if opts.NoDeck { + <-ctx.Done() + return nil + } + + var deck *Deck + var err error + + for { + deck, err = OpenDeck("") + if err == nil { + break + } + slog.Warn("no stream deck found, retrying in 5s", "error", err) + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(5 * time.Second): + } + } + defer deck.Close() + + deck.SetBrightness(deviceBrightness(cfg)) + + pm := NewPageManager(deck) + pm.LoadPages(cfg.Pages) + web.SetPageManager(pm) + + if err := pm.ActivatePage(cfg.DefaultPage); err != nil { + slog.Warn("activate default page", "error", err) + } + pm.startPeriodicKeys() + + var windowCh <-chan Window + var detector WindowDetector + + defer func() { + if detector != nil { + detector.Close() + } + }() + + if len(cfg.AutoSwitch) > 0 { + detector = NewWindowDetector() + windowCh, _ = detector.Start(ctx) + } + + asm := NewAutoSwitchManager(cfg.AutoSwitch, cfg.DefaultPage) + + ssCtrl := NewScreensaver(&cfg.Screensaver) + + reconnectTicker := time.NewTicker(5 * time.Second) + defer reconnectTicker.Stop() + + ssTicker := time.NewTicker(5 * time.Second) + defer ssTicker.Stop() + + configTicker := time.NewTicker(3 * time.Second) + defer configTicker.Stop() + var lastConfigMod time.Time + + slog.Info("daemon started") + defer slog.Info("daemon stopped") + + for { + select { + case evt, ok := <-deck.Events(): + if !ok { + slog.Warn("deck event channel closed, attempting reconnect...") + deck.Close() + deck = reconnectDeck(ctx, cfg, &pm, asm) + if deck == nil { + return ctx.Err() + } + deck.SetBrightness(deviceBrightness(cfg)) + continue + } + + wasSsActive := ssCtrl.IsActive() + ssCtrl.NotifyInput() + + if evt.Kind == EventKeyPressed { + if wasSsActive { + ssCtrl.Deactivate(deck) + + savedOutputs := pm.GetDisplayOutputs() + + if page := pm.ActivePage(); page != nil { + if err := pm.ActivatePage(pm.ActivePageName()); err != nil { + slog.Warn("screensaver: re-render page", "error", err) + } + } + + for idx, output := range savedOutputs { + pm.ReRenderDisplayKey(idx, output) + } + } + + page := pm.ActivePage() + if page == nil { + continue + } + for _, k := range page.Keys { + if k.Index == evt.Index && k.Action != nil { + slog.Debug("key pressed", "index", evt.Index, "action", k.Action.Type) + + if k.Action.Type == "page" { + asm.NotifyManualPage(k.Action.Page) + } + + go func(a *config.Action) { + if err := ExecuteAction(a, deck, pm); err != nil { + slog.Error("execute action", "error", err) + } + }(k.Action) + break + } + } + } + + case win := <-windowCh: + if page, ok := asm.Evaluate(win, pm.ActivePageName()); ok { + if err := pm.ActivatePage(page); err != nil { + slog.Warn("auto-switch: activate page", "error", err) + } + pm.startPeriodicKeys() + } + + case <-configTicker.C: + path := config.ConfigPath(opts.ConfigPath) + fi, err := os.Stat(path) + if err != nil { + continue + } + mt := fi.ModTime() + if mt.After(lastConfigMod) && !lastConfigMod.IsZero() { + lastConfigMod = mt + slog.Info("config file changed, reloading") + newCfg, err := config.LoadConfig(opts.ConfigPath) + if err != nil { + slog.Error("reload config", "error", err) + continue + } + cfg = newCfg + web.UpdateConfig(cfg) + ssCtrl = NewScreensaver(&cfg.Screensaver) + deck.SetBrightness(deviceBrightness(cfg)) + pm.stopPeriodicKeys() + pm.LoadPages(cfg.Pages) + asm.Reload(cfg.AutoSwitch) + if len(cfg.AutoSwitch) > 0 && detector == nil { + detector = NewWindowDetector() + windowCh, _ = detector.Start(ctx) + } + if err := pm.ActivatePage(cfg.DefaultPage); err != nil { + slog.Warn("reload: activate default page", "error", err) + } + pm.startPeriodicKeys() + } + if lastConfigMod.IsZero() { + lastConfigMod = mt + } + + case <-reconnectTicker.C: + if err := deck.SetBrightness(deck.Brightness()); err != nil { + slog.Warn("deck connection lost, reconnecting...", "error", err) + deck.Close() + deck = reconnectDeck(ctx, cfg, &pm, asm) + if deck == nil { + return ctx.Err() + } + deck.SetBrightness(deviceBrightness(cfg)) + } + + case <-ssTicker.C: + if ssCtrl.Check() { + ssCtrl.Activate(deck, &cfg.Screensaver) + } + + case <-ctx.Done(): + return nil + } + } +} + +func checkKeyboardTool() { + if os.Getenv("WAYLAND_DISPLAY") != "" { + if _, err := exec.LookPath("wtype"); err != nil { + slog.Warn("keyboard actions require wtype on Wayland — install it (e.g. apk add wtype) and restart") + } + } else { + if _, err := exec.LookPath("xdotool"); err != nil { + slog.Warn("keyboard actions require xdotool on X11 — install it (e.g. apk add xdotool) and restart") + } + } +} + +func deviceBrightness(cfg *config.Config) int { + if len(cfg.Devices) > 0 && cfg.Devices[0].Brightness > 0 { + return cfg.Devices[0].Brightness + } + return 75 +} + +func reconnectDeck(ctx context.Context, cfg *config.Config, pm **PageManager, asm *AutoSwitchManager) *Deck { + for { + newDeck, err := OpenDeck("") + if err == nil { + *pm = NewPageManager(newDeck) + (*pm).LoadPages(cfg.Pages) + (*pm).ActivatePage(cfg.DefaultPage) + (*pm).startPeriodicKeys() + asm.NotifyManualPage(cfg.DefaultPage) + return newDeck + } + select { + case <-ctx.Done(): + return nil + case <-time.After(3 * time.Second): + } + } +} diff --git a/deck.go b/deck.go new file mode 100644 index 0000000..58d6c4d --- /dev/null +++ b/deck.go @@ -0,0 +1,331 @@ +package main + +import ( + "fmt" + "image" + "image/color" + "image/draw" + "log/slog" + "sync" + + "github.com/bearsh/hid" + "github.com/dh1tw/streamdeck" + "github.com/disintegration/gift" +) + +type DeviceInfo struct { + Serial string + Model string + PID uint16 +} + +type DeckConfig struct { + PID uint16 + Name string + KeysX int + KeysY int + KeySize int + ImageFmt string + Rotate bool + Convert bool + HasDials bool + HasTouch bool +} + +var knownDecks = []DeckConfig{ + {PID: 0x60, Name: "Mini", KeysX: 3, KeysY: 2, KeySize: 80, ImageFmt: "bmp", Convert: true}, + {PID: 0x6d, Name: "Original", KeysX: 5, KeysY: 3, KeySize: 72, ImageFmt: "jpg", Rotate: true}, + {PID: 0x63, Name: "OriginalV2",KeysX: 5, KeysY: 3, KeySize: 72, ImageFmt: "bmp"}, + {PID: 0x80, Name: "MK2", KeysX: 5, KeysY: 3, KeySize: 72, ImageFmt: "jpg", Rotate: true}, + {PID: 0x6c, Name: "XL", KeysX: 8, KeysY: 4, KeySize: 96, ImageFmt: "jpg"}, +} + +func findConfig(pid uint16) (DeckConfig, bool) { + for _, d := range knownDecks { + if d.PID == pid { + return d, true + } + } + return DeckConfig{}, false +} + +func EnumerateDevices() ([]DeviceInfo, error) { + devices := hid.Enumerate(streamdeck.VendorID, 0) + if len(devices) == 0 { + return nil, nil + } + var infos []DeviceInfo + for _, d := range devices { + info := DeviceInfo{Serial: d.Serial, PID: d.ProductID} + if cfg, ok := findConfig(d.ProductID); ok { + info.Model = cfg.Name + } else { + info.Model = fmt.Sprintf("Unknown (0x%04x)", d.ProductID) + } + infos = append(infos, info) + } + return infos, nil +} + +func toStreamDeckConfig(dc DeckConfig) *streamdeck.Config { + return &streamdeck.Config{ + ProductID: dc.PID, + NumButtonColumns: dc.KeysX, + NumButtonRows: dc.KeysY, + Spacer: 19, + ButtonSize: dc.KeySize, + ImageFormat: dc.ImageFmt, + ImageRotate: dc.Rotate, + ConvertKey: dc.Convert, + } +} + +type Event struct { + Kind int + Index int +} + +const ( + EventKeyPressed = 1 + EventKeyReleased = 2 +) + +type Deck struct { + sd *streamdeck.StreamDeck + cfg DeckConfig + serial string + + mu sync.Mutex + events chan Event + closed bool + brightness int +} + +func OpenDeck(serial string) (*Deck, error) { + desiredSerial := serial + if serial == "first" || serial == "" { + desiredSerial = "" + } + + sd, err := streamdeck.NewStreamDeck(desiredSerial) + if err != nil { + return nil, fmt.Errorf("opening streamdeck: %w", err) + } + + cfg, ok := findConfig(sd.Config.ProductID) + if !ok { + sd.Close() + return nil, fmt.Errorf("unsupported device PID: 0x%04x", sd.Config.ProductID) + } + + d := &Deck{ + sd: sd, + cfg: cfg, + serial: sd.Serial(), + events: make(chan Event, 64), + brightness: 75, + } + + sd.SetBtnEventCb(func(s streamdeck.State, e streamdeck.Event) { + kind := 0 + switch e.Kind { + case streamdeck.EventKeyPressed: + kind = EventKeyPressed + case streamdeck.EventKeyReleased: + kind = EventKeyReleased + default: + return + } + select { + case d.events <- Event{Kind: kind, Index: e.Which}: + default: + slog.Warn("event channel full, dropping event", "kind", e.Kind, "index", e.Which) + } + }) + + slog.Info("deck opened", "serial", d.serial, "model", cfg.Name, "keys", cfg.KeysX*cfg.KeysY) + return d, nil +} + +func (d *Deck) Close() { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return + } + d.closed = true + close(d.events) + d.sd.Close() +} + +func (d *Deck) Serial() string { return d.serial } +func (d *Deck) Events() <-chan Event { return d.events } +func (d *Deck) NumKeys() int { return d.cfg.KeysX * d.cfg.KeysY } +func (d *Deck) KeySize() int { return d.cfg.KeySize } +func (d *Deck) Config() DeckConfig { return d.cfg } + +func (d *Deck) SetBrightness(val int) error { + if val < 0 { + val = 0 + } + if val > 100 { + val = 100 + } + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + d.brightness = val + return d.sd.SetBrightness(uint16(val)) +} + +func (d *Deck) Brightness() int { + d.mu.Lock() + defer d.mu.Unlock() + return d.brightness +} + +func (d *Deck) FillColor(keyIndex int, r, g, b uint8) error { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + return d.sd.FillColor(keyIndex, int(r), int(g), int(b)) +} + +func (d *Deck) FillImage(keyIndex int, img image.Image) error { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + return d.sd.FillImage(keyIndex, img) +} + +func (d *Deck) FillPanel(img image.Image) error { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + return d.sd.FillPanel(img) +} + +func (d *Deck) ClearAll() error { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + return d.sd.ClearAllBtns() +} + +func (d *Deck) ClearKey(idx int) error { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + return d.sd.ClearBtn(idx) +} + +func (d *Deck) WriteText(keyIndex int, text string, bg color.Color, fontName string, fontSize float64) error { + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + if fontSize <= 0 { + fontSize = 18 + } + font := streamdeck.MonoMedium + if fontName == "regular" { + font = streamdeck.MonoRegular + } + + ks := d.cfg.KeySize + charW := fontSize * 0.55 + textW := int(float64(len(text)) * charW) + posX := (ks - textW) / 2 + if posX < 2 { + posX = 2 + } + posY := ks/2 - 24 + int(fontSize/3) + if posY < 2 { + posY = 2 + } + + return d.sd.WriteText(keyIndex, streamdeck.TextButton{ + Lines: []streamdeck.TextLine{ + { + Text: text, + PosX: posX, + PosY: posY, + Font: font, + FontSize: fontSize, + FontColor: color.White, + }, + }, + BgColor: bg, + }) +} + +func (d *Deck) WriteTextOnImage(keyIndex int, img image.Image, text, fontName string, fontSize float64) error { + ks := d.cfg.KeySize + + g := gift.New( + gift.Resize(ks, ks, gift.LanczosResampling), + ) + rgba := image.NewRGBA(image.Rect(0, 0, ks, ks)) + g.Draw(rgba, img) + + lines := []streamdeck.TextLine{} + if text != "" { + if fontSize <= 0 { + fontSize = 16 + } + font := streamdeck.MonoRegular + if fontName == "medium" { + font = streamdeck.MonoMedium + } + + barHeight := 20 + if ks < 72 { + barHeight = 18 + } + barRect := image.Rect(0, ks-barHeight, ks, ks) + draw.Draw(rgba, barRect, &image.Uniform{color.RGBA{0, 0, 0, 180}}, image.Point{}, draw.Over) + + offsetY := 24 + baselineY := ks - 6 + posY := baselineY - offsetY + if posY < 2 { + posY = 2 + } + + charW := fontSize * 0.55 + textW := int(float64(len(text)) * charW) + posX := (ks - textW) / 2 + if posX < 2 { + posX = 2 + } + + lines = append(lines, streamdeck.TextLine{ + Text: text, + PosX: posX, + PosY: posY, + Font: font, + FontSize: fontSize, + FontColor: color.White, + }) + } + + d.mu.Lock() + defer d.mu.Unlock() + if d.closed { + return fmt.Errorf("deck closed") + } + return d.sd.WriteTextOnImage(keyIndex, rgba, lines) +} diff --git a/emoji.go b/emoji.go new file mode 100644 index 0000000..93d83c6 --- /dev/null +++ b/emoji.go @@ -0,0 +1,209 @@ +package main + +import "sync" + +var emojiShortcodes = map[string]rune{ + // media + "play_pause": 0x25B6, + "stop": 0x23F9, + "record": 0x23FA, + "eject": 0x23CF, + "track_previous": 0x23EE, + "track_next": 0x23ED, + "fast_forward": 0x23E9, + "rewind": 0x23EA, + "shuffle": 0x1F500, + "repeat": 0x1F501, + "repeat_one": 0x1F502, + + // volume + "speaker": 0x1F50A, + "mute": 0x1F507, + "sound": 0x1F509, + + // navigation + "arrow_up": 0x2B06, + "arrow_down": 0x2B07, + "arrow_left": 0x2B05, + "arrow_right": 0x27A1, + "arrows_clockwise": 0x1F503, + "arrows_counterclockwise": 0x1F504, + + // status + "check": 0x2705, + "heavy_check_mark": 0x2714, + "x": 0x274C, + "heavy_multiplication_x": 0x2716, + "warning": 0x26A0, + "information_source": 0x2139, + "question": 0x2753, + "exclamation": 0x2757, + "white_check_mark": 0x2705, + "heavy_plus_sign": 0x2795, + "heavy_minus_sign": 0x2796, + "heavy_division_sign": 0x2797, + + // actions + "gear": 0x2699, + "hammer": 0x1F528, + "wrench": 0x1F527, + "key": 0x1F511, + "lock": 0x1F512, + "unlocked": 0x1F513, + "magnifying_glass": 0x1F50D, + "home": 0x1F3E0, + "bookmark": 0x1F516, + "bell": 0x1F514, + "clock": 0x1F550, + "alarm_clock": 0x23F0, + "hourglass": 0x231B, + "calendar": 0x1F4C5, + "envelope": 0x2709, + "camera": 0x1F4F7, + "video_camera": 0x1F4F9, + "microphone": 0x1F3A4, + "telephone": 0x260E, + "phone": 0x1F4DE, + "computer": 0x1F4BB, + "laptop": 0x1F4BB, + "folder": 0x1F4C1, + "open_file_folder": 0x1F4C2, + "clipboard": 0x1F4CB, + "memo": 0x1F4DD, + "pencil": 0x270F, + "scissors": 0x2702, + "link": 0x1F517, + "paperclip": 0x1F4CE, + "pushpin": 0x1F4CC, + "trash": 0x1F5D1, + "star": 0x2B50, + "trophy": 0x1F3C6, + "medal": 0x1F3C5, + "target": 0x1F3AF, + "dart": 0x1F3AF, + + // objects + "lightbulb": 0x1F4A1, + "bulb": 0x1F4A1, + "battery": 0x1F50B, + "electric_plug": 0x1F50C, + "rocket": 0x1F680, + "airplane": 0x2708, + "car": 0x1F697, + "bicycle": 0x1F6B2, + "headphones": 0x1F3A7, + "gamepad": 0x1F3AE, + "joystick": 0x1F579, + "musical_note": 0x1F3B5, + "notes": 0x1F3B6, + "printer": 0x1F5A8, + "keyboard": 0x2328, + + // weather + "sun": 0x2600, + "sunny": 0x2600, + "moon": 0x1F319, + "cloud": 0x2601, + "rainbow": 0x1F308, + "fire": 0x1F525, + "flame": 0x1F525, + "zap": 0x26A1, + "lightning": 0x26A1, + "snowflake": 0x2744, + "umbrella": 0x2602, + + // hearts + "heart": 0x2764, + "yellow_heart": 0x1F49B, + "green_heart": 0x1F49A, + "blue_heart": 0x1F499, + "purple_heart": 0x1F49C, + "black_heart": 0x1F5A4, + "broken_heart": 0x1F494, + "two_hearts": 0x1F495, + "sparkling_heart": 0x1F496, + "heartpulse": 0x1F497, + "heart_beat": 0x1F493, + "revolving_hearts": 0x1F49E, + "cupid": 0x1F498, + "gift_heart": 0x1F49D, + + // faces + "smile": 0x1F600, + "smiley": 0x1F603, + "grinning": 0x1F604, + "blush": 0x1F60A, + "wink": 0x1F609, + "heart_eyes": 0x1F60D, + "kissing_heart": 0x1F618, + "kissing": 0x1F617, + "smirk": 0x1F60F, + "stuck_out_tongue": 0x1F61B, + "stuck_out_tongue_winking_eye": 0x1F61C, + "sunglasses": 0x1F60E, + "innocent": 0x1F607, + "neutral_face": 0x1F610, + "expressionless": 0x1F611, + "thinking": 0x1F914, + "confused": 0x1F615, + "worried": 0x1F61F, + "frown": 0x1F641, + "persevere": 0x1F623, + "tired": 0x1F62B, + "weary": 0x1F629, + "cry": 0x1F622, + "sob": 0x1F62D, + "sweat_smile": 0x1F605, + "joy": 0x1F602, + "relaxed": 0x263A, + "angry": 0x1F620, + "rage": 0x1F621, + "skull": 0x1F480, + "ghost": 0x1F47B, + "robot": 0x1F916, + "sleeping": 0x1F634, + "sleep": 0x1F634, + "zzz": 0x1F4A4, + "dizzy": 0x1F4AB, + "boom": 0x1F4A5, + "collision": 0x1F4A5, + "sweat_drops": 0x1F4A6, + "dash": 0x1F4A8, + "alien": 0x1F47D, + "poop": 0x1F4A9, + + // hands & gestures + "thumbsup": 0x1F44D, + "thumbsdown": 0x1F44E, + "ok_hand": 0x1F44C, + "wave": 0x1F44B, + "clap": 0x1F44F, + "open_hands": 0x1F450, + "raised_hands": 0x1F64C, + "pray": 0x1F64F, + "muscle": 0x1F4AA, + "point_up": 0x261D, + "point_down": 0x1F447, + "point_left": 0x1F448, + "point_right": 0x1F449, + "fist": 0x270A, + "raised_hand": 0x270B, + "v": 0x270C, + "victory": 0x270C, + "crossed_fingers": 0x1F91E, + "writing_hand": 0x270D, + "call_me": 0x1F919, + "hand": 0x270B, +} + +var ( + emojiColorFontOnce sync.Once + emojiColorFontData []byte +) + +func loadColorEmojiFont() []byte { + emojiColorFontOnce.Do(func() { + emojiColorFontData = fcRead("emoji") + }) + return emojiColorFontData +} diff --git a/fontawesome.go b/fontawesome.go new file mode 100644 index 0000000..2c090ca --- /dev/null +++ b/fontawesome.go @@ -0,0 +1,138 @@ +package main + +import ( + "fmt" + "image" + "image/color" + "strings" + + "golang.org/x/image/font" + "golang.org/x/image/font/opentype" + "golang.org/x/image/math/fixed" +) + +func parseFAIcon(ref string) (faStyle, string, error) { + if !strings.HasPrefix(ref, "fa") { + return 0, "", fmt.Errorf("not a font awesome ref") + } + + var style faStyle + var name string + + switch { + case strings.HasPrefix(ref, "fab:"): + style = faBrands + name = strings.TrimPrefix(ref, "fab:") + case strings.HasPrefix(ref, "far:"): + style = faRegular + name = strings.TrimPrefix(ref, "far:") + case strings.HasPrefix(ref, "fa:"): + style = faSolid + name = strings.TrimPrefix(ref, "fa:") + default: + return 0, "", fmt.Errorf("invalid font awesome ref: %s", ref) + } + + if name == "" { + return 0, "", fmt.Errorf("empty icon name") + } + + return style, name, nil +} + +func faCodepoint(style faStyle, name string) (rune, error) { + m, ok := faCodepoints[style] + if !ok { + return 0, fmt.Errorf("unknown style") + } + + if cp, ok := m[name]; ok { + return cp, nil + } + + if cp, ok := m[normalizeFAName(name)]; ok { + return cp, nil + } + + return 0, fmt.Errorf("icon %q not found", name) +} + +func normalizeFAName(name string) string { + if len(name) == 0 { + return name + } + parts := strings.Split(name, "-") + for i, p := range parts { + if len(p) > 0 { + parts[i] = strings.ToUpper(p[:1]) + p[1:] + } + } + camel := strings.Join(parts, "") + return strings.ToLower(camel[:1]) + camel[1:] +} + +func faFontBytes(style faStyle) ([]byte, error) { + return faFonts.ReadFile(style.otfPath()) +} + +func loadFAFace(style faStyle, pointSize float64) (font.Face, error) { + data, err := faFontBytes(style) + if err != nil { + return nil, fmt.Errorf("read font: %w", err) + } + + fnt, err := opentype.Parse(data) + if err != nil { + return nil, fmt.Errorf("parse font: %w", err) + } + + face, err := opentype.NewFace(fnt, &opentype.FaceOptions{ + Size: pointSize, + DPI: 72, + Hinting: font.HintingFull, + }) + if err != nil { + return nil, fmt.Errorf("new face: %w", err) + } + return face, nil +} + +func renderFAGlyph(style faStyle, name string, size int, scale float64) (image.Image, error) { + cp, err := faCodepoint(style, name) + if err != nil { + return nil, err + } + + if scale <= 0 { + scale = 0.55 + } + fontSize := float64(size) * scale + face, err := loadFAFace(style, fontSize) + if err != nil { + return nil, err + } + defer face.Close() + + rgba := image.NewRGBA(image.Rect(0, 0, size, size)) + + offX := (size - int(fontSize)) / 2 + if offX < 0 { + offX = size / 8 + } + baselineY := size * 7 / 10 + + d := font.Drawer{ + Dst: rgba, + Src: image.NewUniform(color.White), + Face: face, + Dot: fixed.P(offX, baselineY), + } + d.DrawString(string(cp)) + + return rgba, nil +} + +func isFAIconRef(path string) bool { + return strings.HasPrefix(path, "fa:") || strings.HasPrefix(path, "far:") || strings.HasPrefix(path, "fab:") +} + diff --git a/fontawesome_data.go b/fontawesome_data.go new file mode 100644 index 0000000..1c81776 --- /dev/null +++ b/fontawesome_data.go @@ -0,0 +1,71 @@ +package main + +import ( + "embed" + "unicode" + "unicode/utf8" +) + +//go:embed assets/Font_Awesome_7_BrandsRegular400.otf +//go:embed assets/Font_Awesome_7_FreeRegular400.otf +//go:embed assets/Font_Awesome_7_FreeSolid900.otf +var faFonts embed.FS + +type faStyle int + +const ( + faSolid faStyle = iota + faRegular + faBrands +) + +func (s faStyle) otfPath() string { + switch s { + case faSolid: + return "assets/Font_Awesome_7_FreeSolid900.otf" + case faRegular: + return "assets/Font_Awesome_7_FreeRegular400.otf" + case faBrands: + return "assets/Font_Awesome_7_BrandsRegular400.otf" + default: + return "assets/Font_Awesome_7_FreeSolid900.otf" + } +} + +var faCodepoints map[faStyle]map[string]rune + +func init() { + faCodepoints = make(map[faStyle]map[string]rune) + faCodepoints[faSolid] = buildFAMap(fa7Icons) + faCodepoints[faRegular] = buildFAMap(fa7Icons) + faCodepoints[faBrands] = buildFAMap(fa7BrandsIcons) +} + +func buildFAMap(src map[string]string) map[string]rune { + m := make(map[string]rune, len(src)) + for name, cp := range src { + r, _ := utf8.DecodeRuneInString(cp) + camel := camelToKebab(name) + m[name] = r + m[camel] = r + if lower := toLower(name); lower != name { + m[lower] = r + } + } + return m +} + +func camelToKebab(s string) string { + var out []byte + for i, r := range s { + if unicode.IsUpper(r) && i > 0 { + out = append(out, '-') + } + out = append(out, byte(unicode.ToLower(r))) + } + return string(out) +} + +func toLower(s string) string { + return string(unicode.ToLower(rune(s[0]))) + s[1:] +} diff --git a/fontawesome_icons.go b/fontawesome_icons.go new file mode 100644 index 0000000..98d5ea5 --- /dev/null +++ b/fontawesome_icons.go @@ -0,0 +1,1979 @@ +package main + +var fa7Icons = map[string]string{ + "0": "0", // U+0030 + "1": "1", // U+0031 + "2": "2", // U+0032 + "3": "3", // U+0033 + "4": "4", // U+0034 + "5": "5", // U+0035 + "6": "6", // U+0036 + "7": "7", // U+0037 + "8": "8", // U+0038 + "9": "9", // U+0039 + "A": "A", // U+0041 + "AddressBook": "\xef\x8a\xb9", // U+f2b9 + "AddressCard": "\xef\x8a\xbb", // U+f2bb + "AlarmClock": "\xef\x8d\x8e", // U+f34e + "AlignCenter": "\xef\x80\xb7", // U+f037 + "AlignJustify": "\xef\x80\xb9", // U+f039 + "AlignLeft": "\xef\x80\xb6", // U+f036 + "AlignRight": "\xef\x80\xb8", // U+f038 + "Anchor": "\xef\x84\xbd", // U+f13d + "AnchorCircleCheck": "\xee\x92\xaa", // U+e4aa + "AnchorCircleExclamation": "\xee\x92\xab", // U+e4ab + "AnchorCircleXmark": "\xee\x92\xac", // U+e4ac + "AnchorLock": "\xee\x92\xad", // U+e4ad + "AngleDown": "\xef\x84\x87", // U+f107 + "AngleLeft": "\xef\x84\x84", // U+f104 + "AngleRight": "\xef\x84\x85", // U+f105 + "AngleUp": "\xef\x84\x86", // U+f106 + "AnglesDown": "\xef\x84\x83", // U+f103 + "AnglesLeft": "\xef\x84\x80", // U+f100 + "AnglesRight": "\xef\x84\x81", // U+f101 + "AnglesUp": "\xef\x84\x82", // U+f102 + "Ankh": "\xef\x99\x84", // U+f644 + "AppleWhole": "\xef\x97\x91", // U+f5d1 + "Aquarius": "\xee\xa1\x85", // U+e845 + "Archway": "\xef\x95\x97", // U+f557 + "Aries": "\xee\xa1\x86", // U+e846 + "ArrowDown": "\xef\x81\xa3", // U+f063 + "ArrowDown19": "\xef\x85\xa2", // U+f162 + "ArrowDown91": "\xef\xa2\x86", // U+f886 + "ArrowDownAZ": "\xef\x85\x9d", // U+f15d + "ArrowDownLong": "\xef\x85\xb5", // U+f175 + "ArrowDownShortWide": "\xef\xa2\x84", // U+f884 + "ArrowDownUpAcrossLine": "\xee\x92\xaf", // U+e4af + "ArrowDownUpLock": "\xee\x92\xb0", // U+e4b0 + "ArrowDownWideShort": "\xef\x85\xa0", // U+f160 + "ArrowDownZA": "\xef\xa2\x81", // U+f881 + "ArrowLeft": "\xef\x81\xa0", // U+f060 + "ArrowLeftLong": "\xef\x85\xb7", // U+f177 + "ArrowPointer": "\xef\x89\x85", // U+f245 + "ArrowRight": "\xef\x81\xa1", // U+f061 + "ArrowRightArrowLeft": "\xef\x83\xac", // U+f0ec + "ArrowRightFromBracket": "\xef\x82\x8b", // U+f08b + "ArrowRightLong": "\xef\x85\xb8", // U+f178 + "ArrowRightToBracket": "\xef\x82\x90", // U+f090 + "ArrowRightToCity": "\xee\x92\xb3", // U+e4b3 + "ArrowRotateLeft": "\xef\x83\xa2", // U+f0e2 + "ArrowRotateRight": "\xef\x80\x9e", // U+f01e + "ArrowTrendDown": "\xee\x82\x97", // U+e097 + "ArrowTrendUp": "\xee\x82\x98", // U+e098 + "ArrowTurnDown": "\xef\x85\x89", // U+f149 + "ArrowTurnUp": "\xef\x85\x88", // U+f148 + "ArrowUp": "\xef\x81\xa2", // U+f062 + "ArrowUp19": "\xef\x85\xa3", // U+f163 + "ArrowUp91": "\xef\xa2\x87", // U+f887 + "ArrowUpAZ": "\xef\x85\x9e", // U+f15e + "ArrowUpFromBracket": "\xee\x82\x9a", // U+e09a + "ArrowUpFromGroundWater": "\xee\x92\xb5", // U+e4b5 + "ArrowUpFromWaterPump": "\xee\x92\xb6", // U+e4b6 + "ArrowUpLong": "\xef\x85\xb6", // U+f176 + "ArrowUpRightDots": "\xee\x92\xb7", // U+e4b7 + "ArrowUpRightFromSquare": "\xef\x82\x8e", // U+f08e + "ArrowUpShortWide": "\xef\xa2\x85", // U+f885 + "ArrowUpWideShort": "\xef\x85\xa1", // U+f161 + "ArrowUpZA": "\xef\xa2\x82", // U+f882 + "ArrowsDownToLine": "\xee\x92\xb8", // U+e4b8 + "ArrowsDownToPeople": "\xee\x92\xb9", // U+e4b9 + "ArrowsLeftRight": "\xef\x81\xbe", // U+f07e + "ArrowsLeftRightToLine": "\xee\x92\xba", // U+e4ba + "ArrowsRotate": "\xef\x80\xa1", // U+f021 + "ArrowsSpin": "\xee\x92\xbb", // U+e4bb + "ArrowsSplitUpAndLeft": "\xee\x92\xbc", // U+e4bc + "ArrowsToCircle": "\xee\x92\xbd", // U+e4bd + "ArrowsToDot": "\xee\x92\xbe", // U+e4be + "ArrowsToEye": "\xee\x92\xbf", // U+e4bf + "ArrowsTurnRight": "\xee\x93\x80", // U+e4c0 + "ArrowsTurnToDots": "\xee\x93\x81", // U+e4c1 + "ArrowsUpDown": "\xef\x81\xbd", // U+f07d + "ArrowsUpDownLeftRight": "\xef\x81\x87", // U+f047 + "ArrowsUpToLine": "\xee\x93\x82", // U+e4c2 + "Asterisk": "*", // U+002a + "At": "@", // U+0040 + "Atom": "\xef\x97\x92", // U+f5d2 + "AudioDescription": "\xef\x8a\x9e", // U+f29e + "AustralSign": "\xee\x82\xa9", // U+e0a9 + "Award": "\xef\x95\x99", // U+f559 + "B": "B", // U+0042 + "Baby": "\xef\x9d\xbc", // U+f77c + "BabyCarriage": "\xef\x9d\xbd", // U+f77d + "Backward": "\xef\x81\x8a", // U+f04a + "BackwardFast": "\xef\x81\x89", // U+f049 + "BackwardStep": "\xef\x81\x88", // U+f048 + "Bacon": "\xef\x9f\xa5", // U+f7e5 + "Bacteria": "\xee\x81\x99", // U+e059 + "Bacterium": "\xee\x81\x9a", // U+e05a + "BagShopping": "\xef\x8a\x90", // U+f290 + "Bahai": "\xef\x99\xa6", // U+f666 + "BahtSign": "\xee\x82\xac", // U+e0ac + "Ban": "\xef\x81\x9e", // U+f05e + "BanSmoking": "\xef\x95\x8d", // U+f54d + "Bandage": "\xef\x91\xa2", // U+f462 + "BangladeshiTakaSign": "\xee\x8b\xa6", // U+e2e6 + "Barcode": "\xef\x80\xaa", // U+f02a + "Bars": "\xef\x83\x89", // U+f0c9 + "BarsProgress": "\xef\xa0\xa8", // U+f828 + "BarsStaggered": "\xef\x95\x90", // U+f550 + "Baseball": "\xef\x90\xb3", // U+f433 + "BaseballBatBall": "\xef\x90\xb2", // U+f432 + "BasketShopping": "\xef\x8a\x91", // U+f291 + "Basketball": "\xef\x90\xb4", // U+f434 + "Bath": "\xef\x8b\x8d", // U+f2cd + "BatteryEmpty": "\xef\x89\x84", // U+f244 + "BatteryFull": "\xef\x89\x80", // U+f240 + "BatteryHalf": "\xef\x89\x82", // U+f242 + "BatteryQuarter": "\xef\x89\x83", // U+f243 + "BatteryThreeQuarters": "\xef\x89\x81", // U+f241 + "Bed": "\xef\x88\xb6", // U+f236 + "BedPulse": "\xef\x92\x87", // U+f487 + "BeerMugEmpty": "\xef\x83\xbc", // U+f0fc + "Bell": "\xef\x83\xb3", // U+f0f3 + "BellConcierge": "\xef\x95\xa2", // U+f562 + "BellSlash": "\xef\x87\xb6", // U+f1f6 + "BezierCurve": "\xef\x95\x9b", // U+f55b + "Bicycle": "\xef\x88\x86", // U+f206 + "Binoculars": "\xef\x87\xa5", // U+f1e5 + "Biohazard": "\xef\x9e\x80", // U+f780 + "BitcoinSign": "\xee\x82\xb4", // U+e0b4 + "Blender": "\xef\x94\x97", // U+f517 + "BlenderPhone": "\xef\x9a\xb6", // U+f6b6 + "Blog": "\xef\x9e\x81", // U+f781 + "Bold": "\xef\x80\xb2", // U+f032 + "Bolt": "\xef\x83\xa7", // U+f0e7 + "BoltLightning": "\xee\x82\xb7", // U+e0b7 + "Bomb": "\xef\x87\xa2", // U+f1e2 + "Bone": "\xef\x97\x97", // U+f5d7 + "Bong": "\xef\x95\x9c", // U+f55c + "Book": "\xef\x80\xad", // U+f02d + "BookAtlas": "\xef\x95\x98", // U+f558 + "BookBible": "\xef\x99\x87", // U+f647 + "BookBookmark": "\xee\x82\xbb", // U+e0bb + "BookJournalWhills": "\xef\x99\xaa", // U+f66a + "BookMedical": "\xef\x9f\xa6", // U+f7e6 + "BookOpen": "\xef\x94\x98", // U+f518 + "BookOpenReader": "\xef\x97\x9a", // U+f5da + "BookQuran": "\xef\x9a\x87", // U+f687 + "BookSkull": "\xef\x9a\xb7", // U+f6b7 + "BookTanakh": "\xef\xa0\xa7", // U+f827 + "Bookmark": "\xef\x80\xae", // U+f02e + "BorderAll": "\xef\xa1\x8c", // U+f84c + "BorderNone": "\xef\xa1\x90", // U+f850 + "BorderTopLeft": "\xef\xa1\x93", // U+f853 + "BoreHole": "\xee\x93\x83", // U+e4c3 + "BottleDroplet": "\xee\x93\x84", // U+e4c4 + "BottleWater": "\xee\x93\x85", // U+e4c5 + "BowlFood": "\xee\x93\x86", // U+e4c6 + "BowlRice": "\xee\x8b\xab", // U+e2eb + "BowlingBall": "\xef\x90\xb6", // U+f436 + "Box": "\xef\x91\xa6", // U+f466 + "BoxArchive": "\xef\x86\x87", // U+f187 + "BoxOpen": "\xef\x92\x9e", // U+f49e + "BoxTissue": "\xee\x81\x9b", // U+e05b + "BoxesPacking": "\xee\x93\x87", // U+e4c7 + "BoxesStacked": "\xef\x91\xa8", // U+f468 + "Braille": "\xef\x8a\xa1", // U+f2a1 + "Brain": "\xef\x97\x9c", // U+f5dc + "BrazilianRealSign": "\xee\x91\xac", // U+e46c + "BreadSlice": "\xef\x9f\xac", // U+f7ec + "Bridge": "\xee\x93\x88", // U+e4c8 + "BridgeCircleCheck": "\xee\x93\x89", // U+e4c9 + "BridgeCircleExclamation": "\xee\x93\x8a", // U+e4ca + "BridgeCircleXmark": "\xee\x93\x8b", // U+e4cb + "BridgeLock": "\xee\x93\x8c", // U+e4cc + "BridgeWater": "\xee\x93\x8e", // U+e4ce + "Briefcase": "\xef\x82\xb1", // U+f0b1 + "BriefcaseMedical": "\xef\x91\xa9", // U+f469 + "Broom": "\xef\x94\x9a", // U+f51a + "BroomBall": "\xef\x91\x98", // U+f458 + "Brush": "\xef\x95\x9d", // U+f55d + "Bucket": "\xee\x93\x8f", // U+e4cf + "Bug": "\xef\x86\x88", // U+f188 + "BugSlash": "\xee\x92\x90", // U+e490 + "Bugs": "\xee\x93\x90", // U+e4d0 + "Building": "\xef\x86\xad", // U+f1ad + "BuildingCircleArrowRight": "\xee\x93\x91", // U+e4d1 + "BuildingCircleCheck": "\xee\x93\x92", // U+e4d2 + "BuildingCircleExclamation": "\xee\x93\x93", // U+e4d3 + "BuildingCircleXmark": "\xee\x93\x94", // U+e4d4 + "BuildingColumns": "\xef\x86\x9c", // U+f19c + "BuildingFlag": "\xee\x93\x95", // U+e4d5 + "BuildingLock": "\xee\x93\x96", // U+e4d6 + "BuildingNgo": "\xee\x93\x97", // U+e4d7 + "BuildingShield": "\xee\x93\x98", // U+e4d8 + "BuildingUn": "\xee\x93\x99", // U+e4d9 + "BuildingUser": "\xee\x93\x9a", // U+e4da + "BuildingWheat": "\xee\x93\x9b", // U+e4db + "Bullhorn": "\xef\x82\xa1", // U+f0a1 + "Bullseye": "\xef\x85\x80", // U+f140 + "Burger": "\xef\xa0\x85", // U+f805 + "Burst": "\xee\x93\x9c", // U+e4dc + "Bus": "\xef\x88\x87", // U+f207 + "BusSide": "\xee\xa0\x9d", // U+e81d + "BusSimple": "\xef\x95\x9e", // U+f55e + "BusinessTime": "\xef\x99\x8a", // U+f64a + "C": "C", // U+0043 + "CableCar": "\xef\x9f\x9a", // U+f7da + "CakeCandles": "\xef\x87\xbd", // U+f1fd + "Calculator": "\xef\x87\xac", // U+f1ec + "Calendar": "\xef\x84\xb3", // U+f133 + "CalendarCheck": "\xef\x89\xb4", // U+f274 + "CalendarDay": "\xef\x9e\x83", // U+f783 + "CalendarDays": "\xef\x81\xb3", // U+f073 + "CalendarMinus": "\xef\x89\xb2", // U+f272 + "CalendarPlus": "\xef\x89\xb1", // U+f271 + "CalendarWeek": "\xef\x9e\x84", // U+f784 + "CalendarXmark": "\xef\x89\xb3", // U+f273 + "Camera": "\xef\x80\xb0", // U+f030 + "CameraRetro": "\xef\x82\x83", // U+f083 + "CameraRotate": "\xee\x83\x98", // U+e0d8 + "Campground": "\xef\x9a\xbb", // U+f6bb + "Cancer": "\xee\xa1\x87", // U+e847 + "CandyCane": "\xef\x9e\x86", // U+f786 + "Cannabis": "\xef\x95\x9f", // U+f55f + "Capricorn": "\xee\xa1\x88", // U+e848 + "Capsules": "\xef\x91\xab", // U+f46b + "Car": "\xef\x86\xb9", // U+f1b9 + "CarBattery": "\xef\x97\x9f", // U+f5df + "CarBurst": "\xef\x97\xa1", // U+f5e1 + "CarOn": "\xee\x93\x9d", // U+e4dd + "CarRear": "\xef\x97\x9e", // U+f5de + "CarSide": "\xef\x97\xa4", // U+f5e4 + "CarTunnel": "\xee\x93\x9e", // U+e4de + "Caravan": "\xef\xa3\xbf", // U+f8ff + "CaretDown": "\xef\x83\x97", // U+f0d7 + "CaretLeft": "\xef\x83\x99", // U+f0d9 + "CaretRight": "\xef\x83\x9a", // U+f0da + "CaretUp": "\xef\x83\x98", // U+f0d8 + "Carrot": "\xef\x9e\x87", // U+f787 + "CartArrowDown": "\xef\x88\x98", // U+f218 + "CartFlatbed": "\xef\x91\xb4", // U+f474 + "CartFlatbedSuitcase": "\xef\x96\x9d", // U+f59d + "CartPlus": "\xef\x88\x97", // U+f217 + "CartShopping": "\xef\x81\xba", // U+f07a + "CashRegister": "\xef\x9e\x88", // U+f788 + "Cat": "\xef\x9a\xbe", // U+f6be + "CediSign": "\xee\x83\x9f", // U+e0df + "CentSign": "\xee\x8f\xb5", // U+e3f5 + "Certificate": "\xef\x82\xa3", // U+f0a3 + "Chair": "\xef\x9b\x80", // U+f6c0 + "Chalkboard": "\xef\x94\x9b", // U+f51b + "ChalkboardUser": "\xef\x94\x9c", // U+f51c + "ChampagneGlasses": "\xef\x9e\x9f", // U+f79f + "ChargingStation": "\xef\x97\xa7", // U+f5e7 + "ChartArea": "\xef\x87\xbe", // U+f1fe + "ChartBar": "\xef\x82\x80", // U+f080 + "ChartColumn": "\xee\x83\xa3", // U+e0e3 + "ChartDiagram": "\xee\x9a\x95", // U+e695 + "ChartGantt": "\xee\x83\xa4", // U+e0e4 + "ChartLine": "\xef\x88\x81", // U+f201 + "ChartPie": "\xef\x88\x80", // U+f200 + "ChartSimple": "\xee\x91\xb3", // U+e473 + "Check": "\xef\x80\x8c", // U+f00c + "CheckDouble": "\xef\x95\xa0", // U+f560 + "CheckToSlot": "\xef\x9d\xb2", // U+f772 + "Cheese": "\xef\x9f\xaf", // U+f7ef + "Chess": "\xef\x90\xb9", // U+f439 + "ChessBishop": "\xef\x90\xba", // U+f43a + "ChessBoard": "\xef\x90\xbc", // U+f43c + "ChessKing": "\xef\x90\xbf", // U+f43f + "ChessKnight": "\xef\x91\x81", // U+f441 + "ChessPawn": "\xef\x91\x83", // U+f443 + "ChessQueen": "\xef\x91\x85", // U+f445 + "ChessRook": "\xef\x91\x87", // U+f447 + "ChevronDown": "\xef\x81\xb8", // U+f078 + "ChevronLeft": "\xef\x81\x93", // U+f053 + "ChevronRight": "\xef\x81\x94", // U+f054 + "ChevronUp": "\xef\x81\xb7", // U+f077 + "Child": "\xef\x86\xae", // U+f1ae + "ChildCombatant": "\xee\x93\xa0", // U+e4e0 + "ChildDress": "\xee\x96\x9c", // U+e59c + "ChildReaching": "\xee\x96\x9d", // U+e59d + "Children": "\xee\x93\xa1", // U+e4e1 + "Church": "\xef\x94\x9d", // U+f51d + "Circle": "\xef\x84\x91", // U+f111 + "CircleArrowDown": "\xef\x82\xab", // U+f0ab + "CircleArrowLeft": "\xef\x82\xa8", // U+f0a8 + "CircleArrowRight": "\xef\x82\xa9", // U+f0a9 + "CircleArrowUp": "\xef\x82\xaa", // U+f0aa + "CircleCheck": "\xef\x81\x98", // U+f058 + "CircleChevronDown": "\xef\x84\xba", // U+f13a + "CircleChevronLeft": "\xef\x84\xb7", // U+f137 + "CircleChevronRight": "\xef\x84\xb8", // U+f138 + "CircleChevronUp": "\xef\x84\xb9", // U+f139 + "CircleDollarToSlot": "\xef\x92\xb9", // U+f4b9 + "CircleDot": "\xef\x86\x92", // U+f192 + "CircleDown": "\xef\x8d\x98", // U+f358 + "CircleExclamation": "\xef\x81\xaa", // U+f06a + "CircleH": "\xef\x91\xbe", // U+f47e + "CircleHalfStroke": "\xef\x81\x82", // U+f042 + "CircleInfo": "\xef\x81\x9a", // U+f05a + "CircleLeft": "\xef\x8d\x99", // U+f359 + "CircleMinus": "\xef\x81\x96", // U+f056 + "CircleNodes": "\xee\x93\xa2", // U+e4e2 + "CircleNotch": "\xef\x87\x8e", // U+f1ce + "CirclePause": "\xef\x8a\x8b", // U+f28b + "CirclePlay": "\xef\x85\x84", // U+f144 + "CirclePlus": "\xef\x81\x95", // U+f055 + "CircleQuestion": "\xef\x81\x99", // U+f059 + "CircleRadiation": "\xef\x9e\xba", // U+f7ba + "CircleRight": "\xef\x8d\x9a", // U+f35a + "CircleStop": "\xef\x8a\x8d", // U+f28d + "CircleUp": "\xef\x8d\x9b", // U+f35b + "CircleUser": "\xef\x8a\xbd", // U+f2bd + "CircleXmark": "\xef\x81\x97", // U+f057 + "City": "\xef\x99\x8f", // U+f64f + "Clapperboard": "\xee\x84\xb1", // U+e131 + "Clipboard": "\xef\x8c\xa8", // U+f328 + "ClipboardCheck": "\xef\x91\xac", // U+f46c + "ClipboardList": "\xef\x91\xad", // U+f46d + "ClipboardQuestion": "\xee\x93\xa3", // U+e4e3 + "ClipboardUser": "\xef\x9f\xb3", // U+f7f3 + "Clock": "\xef\x80\x97", // U+f017 + "ClockRotateLeft": "\xef\x87\x9a", // U+f1da + "Clone": "\xef\x89\x8d", // U+f24d + "ClosedCaptioning": "\xef\x88\x8a", // U+f20a + "ClosedCaptioningSlash": "\xee\x84\xb5", // U+e135 + "Cloud": "\xef\x83\x82", // U+f0c2 + "CloudArrowDown": "\xef\x83\xad", // U+f0ed + "CloudArrowUp": "\xef\x83\xae", // U+f0ee + "CloudBolt": "\xef\x9d\xac", // U+f76c + "CloudMeatball": "\xef\x9c\xbb", // U+f73b + "CloudMoon": "\xef\x9b\x83", // U+f6c3 + "CloudMoonRain": "\xef\x9c\xbc", // U+f73c + "CloudRain": "\xef\x9c\xbd", // U+f73d + "CloudShowersHeavy": "\xef\x9d\x80", // U+f740 + "CloudShowersWater": "\xee\x93\xa4", // U+e4e4 + "CloudSun": "\xef\x9b\x84", // U+f6c4 + "CloudSunRain": "\xef\x9d\x83", // U+f743 + "Clover": "\xee\x84\xb9", // U+e139 + "Code": "\xef\x84\xa1", // U+f121 + "CodeBranch": "\xef\x84\xa6", // U+f126 + "CodeCommit": "\xef\x8e\x86", // U+f386 + "CodeCompare": "\xee\x84\xba", // U+e13a + "CodeFork": "\xee\x84\xbb", // U+e13b + "CodeMerge": "\xef\x8e\x87", // U+f387 + "CodePullRequest": "\xee\x84\xbc", // U+e13c + "Coins": "\xef\x94\x9e", // U+f51e + "ColonSign": "\xee\x85\x80", // U+e140 + "Comment": "\xef\x81\xb5", // U+f075 + "CommentDollar": "\xef\x99\x91", // U+f651 + "CommentDots": "\xef\x92\xad", // U+f4ad + "CommentMedical": "\xef\x9f\xb5", // U+f7f5 + "CommentNodes": "\xee\x9a\x96", // U+e696 + "CommentSlash": "\xef\x92\xb3", // U+f4b3 + "CommentSms": "\xef\x9f\x8d", // U+f7cd + "Comments": "\xef\x82\x86", // U+f086 + "CommentsDollar": "\xef\x99\x93", // U+f653 + "CompactDisc": "\xef\x94\x9f", // U+f51f + "Compass": "\xef\x85\x8e", // U+f14e + "CompassDrafting": "\xef\x95\xa8", // U+f568 + "Compress": "\xef\x81\xa6", // U+f066 + "Computer": "\xee\x93\xa5", // U+e4e5 + "ComputerMouse": "\xef\xa3\x8c", // U+f8cc + "Cookie": "\xef\x95\xa3", // U+f563 + "CookieBite": "\xef\x95\xa4", // U+f564 + "Copy": "\xef\x83\x85", // U+f0c5 + "Copyright": "\xef\x87\xb9", // U+f1f9 + "Couch": "\xef\x92\xb8", // U+f4b8 + "Cow": "\xef\x9b\x88", // U+f6c8 + "CreditCard": "\xef\x82\x9d", // U+f09d + "Crop": "\xef\x84\xa5", // U+f125 + "CropSimple": "\xef\x95\xa5", // U+f565 + "Cross": "\xef\x99\x94", // U+f654 + "Crosshairs": "\xef\x81\x9b", // U+f05b + "Crow": "\xef\x94\xa0", // U+f520 + "Crown": "\xef\x94\xa1", // U+f521 + "Crutch": "\xef\x9f\xb7", // U+f7f7 + "CruzeiroSign": "\xee\x85\x92", // U+e152 + "Cube": "\xef\x86\xb2", // U+f1b2 + "Cubes": "\xef\x86\xb3", // U+f1b3 + "CubesStacked": "\xee\x93\xa6", // U+e4e6 + "D": "D", // U+0044 + "Database": "\xef\x87\x80", // U+f1c0 + "DeleteLeft": "\xef\x95\x9a", // U+f55a + "Democrat": "\xef\x9d\x87", // U+f747 + "Desktop": "\xef\x8e\x90", // U+f390 + "Dharmachakra": "\xef\x99\x95", // U+f655 + "DiagramNext": "\xee\x91\xb6", // U+e476 + "DiagramPredecessor": "\xee\x91\xb7", // U+e477 + "DiagramProject": "\xef\x95\x82", // U+f542 + "DiagramSuccessor": "\xee\x91\xba", // U+e47a + "Diamond": "\xef\x88\x99", // U+f219 + "DiamondTurnRight": "\xef\x97\xab", // U+f5eb + "Dice": "\xef\x94\xa2", // U+f522 + "DiceD20": "\xef\x9b\x8f", // U+f6cf + "DiceD6": "\xef\x9b\x91", // U+f6d1 + "DiceFive": "\xef\x94\xa3", // U+f523 + "DiceFour": "\xef\x94\xa4", // U+f524 + "DiceOne": "\xef\x94\xa5", // U+f525 + "DiceSix": "\xef\x94\xa6", // U+f526 + "DiceThree": "\xef\x94\xa7", // U+f527 + "DiceTwo": "\xef\x94\xa8", // U+f528 + "Disease": "\xef\x9f\xba", // U+f7fa + "Display": "\xee\x85\xa3", // U+e163 + "Divide": "\xef\x94\xa9", // U+f529 + "Dna": "\xef\x91\xb1", // U+f471 + "Dog": "\xef\x9b\x93", // U+f6d3 + "DollarSign": "$", // U+0024 + "Dolly": "\xef\x91\xb2", // U+f472 + "DongSign": "\xee\x85\xa9", // U+e169 + "DoorClosed": "\xef\x94\xaa", // U+f52a + "DoorOpen": "\xef\x94\xab", // U+f52b + "Dove": "\xef\x92\xba", // U+f4ba + "DownLeftAndUpRightToCenter": "\xef\x90\xa2", // U+f422 + "DownLong": "\xef\x8c\x89", // U+f309 + "Download": "\xef\x80\x99", // U+f019 + "Dragon": "\xef\x9b\x95", // U+f6d5 + "DrawPolygon": "\xef\x97\xae", // U+f5ee + "Droplet": "\xef\x81\x83", // U+f043 + "DropletSlash": "\xef\x97\x87", // U+f5c7 + "Drum": "\xef\x95\xa9", // U+f569 + "DrumSteelpan": "\xef\x95\xaa", // U+f56a + "DrumstickBite": "\xef\x9b\x97", // U+f6d7 + "Dumbbell": "\xef\x91\x8b", // U+f44b + "Dumpster": "\xef\x9e\x93", // U+f793 + "DumpsterFire": "\xef\x9e\x94", // U+f794 + "Dungeon": "\xef\x9b\x99", // U+f6d9 + "E": "E", // U+0045 + "EarDeaf": "\xef\x8a\xa4", // U+f2a4 + "EarListen": "\xef\x8a\xa2", // U+f2a2 + "EarthAfrica": "\xef\x95\xbc", // U+f57c + "EarthAmericas": "\xef\x95\xbd", // U+f57d + "EarthAsia": "\xef\x95\xbe", // U+f57e + "EarthEurope": "\xef\x9e\xa2", // U+f7a2 + "EarthOceania": "\xee\x91\xbb", // U+e47b + "Egg": "\xef\x9f\xbb", // U+f7fb + "Eject": "\xef\x81\x92", // U+f052 + "Elevator": "\xee\x85\xad", // U+e16d + "Ellipsis": "\xef\x85\x81", // U+f141 + "EllipsisVertical": "\xef\x85\x82", // U+f142 + "Envelope": "\xef\x83\xa0", // U+f0e0 + "EnvelopeCircleCheck": "\xee\x93\xa8", // U+e4e8 + "EnvelopeOpen": "\xef\x8a\xb6", // U+f2b6 + "EnvelopeOpenText": "\xef\x99\x98", // U+f658 + "EnvelopesBulk": "\xef\x99\xb4", // U+f674 + "Equals": "=", // U+003d + "Eraser": "\xef\x84\xad", // U+f12d + "Ethernet": "\xef\x9e\x96", // U+f796 + "EuroSign": "\xef\x85\x93", // U+f153 + "Exclamation": "!", // U+0021 + "Expand": "\xef\x81\xa5", // U+f065 + "Explosion": "\xee\x93\xa9", // U+e4e9 + "Eye": "\xef\x81\xae", // U+f06e + "EyeDropper": "\xef\x87\xbb", // U+f1fb + "EyeLowVision": "\xef\x8a\xa8", // U+f2a8 + "EyeSlash": "\xef\x81\xb0", // U+f070 + "F": "F", // U+0046 + "FaceAngry": "\xef\x95\x96", // U+f556 + "FaceDizzy": "\xef\x95\xa7", // U+f567 + "FaceFlushed": "\xef\x95\xb9", // U+f579 + "FaceFrown": "\xef\x84\x99", // U+f119 + "FaceFrownOpen": "\xef\x95\xba", // U+f57a + "FaceGrimace": "\xef\x95\xbf", // U+f57f + "FaceGrin": "\xef\x96\x80", // U+f580 + "FaceGrinBeam": "\xef\x96\x82", // U+f582 + "FaceGrinBeamSweat": "\xef\x96\x83", // U+f583 + "FaceGrinHearts": "\xef\x96\x84", // U+f584 + "FaceGrinSquint": "\xef\x96\x85", // U+f585 + "FaceGrinSquintTears": "\xef\x96\x86", // U+f586 + "FaceGrinStars": "\xef\x96\x87", // U+f587 + "FaceGrinTears": "\xef\x96\x88", // U+f588 + "FaceGrinTongue": "\xef\x96\x89", // U+f589 + "FaceGrinTongueSquint": "\xef\x96\x8a", // U+f58a + "FaceGrinTongueWink": "\xef\x96\x8b", // U+f58b + "FaceGrinWide": "\xef\x96\x81", // U+f581 + "FaceGrinWink": "\xef\x96\x8c", // U+f58c + "FaceKiss": "\xef\x96\x96", // U+f596 + "FaceKissBeam": "\xef\x96\x97", // U+f597 + "FaceKissWinkHeart": "\xef\x96\x98", // U+f598 + "FaceLaugh": "\xef\x96\x99", // U+f599 + "FaceLaughBeam": "\xef\x96\x9a", // U+f59a + "FaceLaughSquint": "\xef\x96\x9b", // U+f59b + "FaceLaughWink": "\xef\x96\x9c", // U+f59c + "FaceMeh": "\xef\x84\x9a", // U+f11a + "FaceMehBlank": "\xef\x96\xa4", // U+f5a4 + "FaceRollingEyes": "\xef\x96\xa5", // U+f5a5 + "FaceSadCry": "\xef\x96\xb3", // U+f5b3 + "FaceSadTear": "\xef\x96\xb4", // U+f5b4 + "FaceSmile": "\xef\x84\x98", // U+f118 + "FaceSmileBeam": "\xef\x96\xb8", // U+f5b8 + "FaceSmileWink": "\xef\x93\x9a", // U+f4da + "FaceSurprise": "\xef\x97\x82", // U+f5c2 + "FaceTired": "\xef\x97\x88", // U+f5c8 + "Fan": "\xef\xa1\xa3", // U+f863 + "Faucet": "\xee\x80\x85", // U+e005 + "FaucetDrip": "\xee\x80\x86", // U+e006 + "Fax": "\xef\x86\xac", // U+f1ac + "Feather": "\xef\x94\xad", // U+f52d + "FeatherPointed": "\xef\x95\xab", // U+f56b + "Ferry": "\xee\x93\xaa", // U+e4ea + "File": "\xef\x85\x9b", // U+f15b + "FileArrowDown": "\xef\x95\xad", // U+f56d + "FileArrowUp": "\xef\x95\xb4", // U+f574 + "FileAudio": "\xef\x87\x87", // U+f1c7 + "FileCircleCheck": "\xee\x96\xa0", // U+e5a0 + "FileCircleExclamation": "\xee\x93\xab", // U+e4eb + "FileCircleMinus": "\xee\x93\xad", // U+e4ed + "FileCirclePlus": "\xee\x92\x94", // U+e494 + "FileCircleQuestion": "\xee\x93\xaf", // U+e4ef + "FileCircleXmark": "\xee\x96\xa1", // U+e5a1 + "FileCode": "\xef\x87\x89", // U+f1c9 + "FileContract": "\xef\x95\xac", // U+f56c + "FileCsv": "\xef\x9b\x9d", // U+f6dd + "FileExcel": "\xef\x87\x83", // U+f1c3 + "FileExport": "\xef\x95\xae", // U+f56e + "FileFragment": "\xee\x9a\x97", // U+e697 + "FileHalfDashed": "\xee\x9a\x98", // U+e698 + "FileImage": "\xef\x87\x85", // U+f1c5 + "FileImport": "\xef\x95\xaf", // U+f56f + "FileInvoice": "\xef\x95\xb0", // U+f570 + "FileInvoiceDollar": "\xef\x95\xb1", // U+f571 + "FileLines": "\xef\x85\x9c", // U+f15c + "FileMedical": "\xef\x91\xb7", // U+f477 + "FilePdf": "\xef\x87\x81", // U+f1c1 + "FilePen": "\xef\x8c\x9c", // U+f31c + "FilePowerpoint": "\xef\x87\x84", // U+f1c4 + "FilePrescription": "\xef\x95\xb2", // U+f572 + "FileShield": "\xee\x93\xb0", // U+e4f0 + "FileSignature": "\xef\x95\xb3", // U+f573 + "FileVideo": "\xef\x87\x88", // U+f1c8 + "FileWaveform": "\xef\x91\xb8", // U+f478 + "FileWord": "\xef\x87\x82", // U+f1c2 + "FileZipper": "\xef\x87\x86", // U+f1c6 + "Fill": "\xef\x95\xb5", // U+f575 + "FillDrip": "\xef\x95\xb6", // U+f576 + "Film": "\xef\x80\x88", // U+f008 + "Filter": "\xef\x82\xb0", // U+f0b0 + "FilterCircleDollar": "\xef\x99\xa2", // U+f662 + "FilterCircleXmark": "\xee\x85\xbb", // U+e17b + "Fingerprint": "\xef\x95\xb7", // U+f577 + "Fire": "\xef\x81\xad", // U+f06d + "FireBurner": "\xee\x93\xb1", // U+e4f1 + "FireExtinguisher": "\xef\x84\xb4", // U+f134 + "FireFlameCurved": "\xef\x9f\xa4", // U+f7e4 + "FireFlameSimple": "\xef\x91\xaa", // U+f46a + "Fish": "\xef\x95\xb8", // U+f578 + "FishFins": "\xee\x93\xb2", // U+e4f2 + "Flag": "\xef\x80\xa4", // U+f024 + "FlagCheckered": "\xef\x84\x9e", // U+f11e + "FlagUsa": "\xef\x9d\x8d", // U+f74d + "Flask": "\xef\x83\x83", // U+f0c3 + "FlaskVial": "\xee\x93\xb3", // U+e4f3 + "FloppyDisk": "\xef\x83\x87", // U+f0c7 + "FlorinSign": "\xee\x86\x84", // U+e184 + "Folder": "\xef\x81\xbb", // U+f07b + "FolderClosed": "\xee\x86\x85", // U+e185 + "FolderMinus": "\xef\x99\x9d", // U+f65d + "FolderOpen": "\xef\x81\xbc", // U+f07c + "FolderPlus": "\xef\x99\x9e", // U+f65e + "FolderTree": "\xef\xa0\x82", // U+f802 + "Font": "\xef\x80\xb1", // U+f031 + "FontAwesome": "\xef\x8a\xb4", // U+f2b4 + "Football": "\xef\x91\x8e", // U+f44e + "Forward": "\xef\x81\x8e", // U+f04e + "ForwardFast": "\xef\x81\x90", // U+f050 + "ForwardStep": "\xef\x81\x91", // U+f051 + "FrancSign": "\xee\x86\x8f", // U+e18f + "Frog": "\xef\x94\xae", // U+f52e + "Futbol": "\xef\x87\xa3", // U+f1e3 + "G": "G", // U+0047 + "Gamepad": "\xef\x84\x9b", // U+f11b + "GasPump": "\xef\x94\xaf", // U+f52f + "Gauge": "\xef\x98\xa4", // U+f624 + "GaugeHigh": "\xef\x98\xa5", // U+f625 + "GaugeSimple": "\xef\x98\xa9", // U+f629 + "GaugeSimpleHigh": "\xef\x98\xaa", // U+f62a + "Gavel": "\xef\x83\xa3", // U+f0e3 + "Gear": "\xef\x80\x93", // U+f013 + "Gears": "\xef\x82\x85", // U+f085 + "Gem": "\xef\x8e\xa5", // U+f3a5 + "Gemini": "\xee\xa1\x89", // U+e849 + "Genderless": "\xef\x88\xad", // U+f22d + "Ghost": "\xef\x9b\xa2", // U+f6e2 + "Gift": "\xef\x81\xab", // U+f06b + "Gifts": "\xef\x9e\x9c", // U+f79c + "GlassWater": "\xee\x93\xb4", // U+e4f4 + "GlassWaterDroplet": "\xee\x93\xb5", // U+e4f5 + "Glasses": "\xef\x94\xb0", // U+f530 + "Globe": "\xef\x82\xac", // U+f0ac + "GolfBallTee": "\xef\x91\x90", // U+f450 + "Gopuram": "\xef\x99\xa4", // U+f664 + "GraduationCap": "\xef\x86\x9d", // U+f19d + "GreaterThan": ">", // U+003e + "GreaterThanEqual": "\xef\x94\xb2", // U+f532 + "Grip": "\xef\x96\x8d", // U+f58d + "GripLines": "\xef\x9e\xa4", // U+f7a4 + "GripLinesVertical": "\xef\x9e\xa5", // U+f7a5 + "GripVertical": "\xef\x96\x8e", // U+f58e + "GroupArrowsRotate": "\xee\x93\xb6", // U+e4f6 + "GuaraniSign": "\xee\x86\x9a", // U+e19a + "Guitar": "\xef\x9e\xa6", // U+f7a6 + "Gun": "\xee\x86\x9b", // U+e19b + "H": "H", // U+0048 + "Hammer": "\xef\x9b\xa3", // U+f6e3 + "Hamsa": "\xef\x99\xa5", // U+f665 + "Hand": "\xef\x89\x96", // U+f256 + "HandBackFist": "\xef\x89\x95", // U+f255 + "HandDots": "\xef\x91\xa1", // U+f461 + "HandFist": "\xef\x9b\x9e", // U+f6de + "HandHolding": "\xef\x92\xbd", // U+f4bd + "HandHoldingDollar": "\xef\x93\x80", // U+f4c0 + "HandHoldingDroplet": "\xef\x93\x81", // U+f4c1 + "HandHoldingHand": "\xee\x93\xb7", // U+e4f7 + "HandHoldingHeart": "\xef\x92\xbe", // U+f4be + "HandHoldingMedical": "\xee\x81\x9c", // U+e05c + "HandLizard": "\xef\x89\x98", // U+f258 + "HandMiddleFinger": "\xef\xa0\x86", // U+f806 + "HandPeace": "\xef\x89\x9b", // U+f25b + "HandPointDown": "\xef\x82\xa7", // U+f0a7 + "HandPointLeft": "\xef\x82\xa5", // U+f0a5 + "HandPointRight": "\xef\x82\xa4", // U+f0a4 + "HandPointUp": "\xef\x82\xa6", // U+f0a6 + "HandPointer": "\xef\x89\x9a", // U+f25a + "HandScissors": "\xef\x89\x97", // U+f257 + "HandSparkles": "\xee\x81\x9d", // U+e05d + "HandSpock": "\xef\x89\x99", // U+f259 + "Handcuffs": "\xee\x93\xb8", // U+e4f8 + "Hands": "\xef\x8a\xa7", // U+f2a7 + "HandsAslInterpreting": "\xef\x8a\xa3", // U+f2a3 + "HandsBound": "\xee\x93\xb9", // U+e4f9 + "HandsBubbles": "\xee\x81\x9e", // U+e05e + "HandsClapping": "\xee\x86\xa8", // U+e1a8 + "HandsHolding": "\xef\x93\x82", // U+f4c2 + "HandsHoldingChild": "\xee\x93\xba", // U+e4fa + "HandsHoldingCircle": "\xee\x93\xbb", // U+e4fb + "HandsPraying": "\xef\x9a\x84", // U+f684 + "Handshake": "\xef\x8a\xb5", // U+f2b5 + "HandshakeAngle": "\xef\x93\x84", // U+f4c4 + "HandshakeSlash": "\xee\x81\xa0", // U+e060 + "Hanukiah": "\xef\x9b\xa6", // U+f6e6 + "HardDrive": "\xef\x82\xa0", // U+f0a0 + "Hashtag": "#", // U+0023 + "HatCowboy": "\xef\xa3\x80", // U+f8c0 + "HatCowboySide": "\xef\xa3\x81", // U+f8c1 + "HatWizard": "\xef\x9b\xa8", // U+f6e8 + "HeadSideCough": "\xee\x81\xa1", // U+e061 + "HeadSideCoughSlash": "\xee\x81\xa2", // U+e062 + "HeadSideMask": "\xee\x81\xa3", // U+e063 + "HeadSideVirus": "\xee\x81\xa4", // U+e064 + "Heading": "\xef\x87\x9c", // U+f1dc + "Headphones": "\xef\x80\xa5", // U+f025 + "Headset": "\xef\x96\x90", // U+f590 + "Heart": "\xef\x80\x84", // U+f004 + "HeartCircleBolt": "\xee\x93\xbc", // U+e4fc + "HeartCircleCheck": "\xee\x93\xbd", // U+e4fd + "HeartCircleExclamation": "\xee\x93\xbe", // U+e4fe + "HeartCircleMinus": "\xee\x93\xbf", // U+e4ff + "HeartCirclePlus": "\xee\x94\x80", // U+e500 + "HeartCircleXmark": "\xee\x94\x81", // U+e501 + "HeartCrack": "\xef\x9e\xa9", // U+f7a9 + "HeartPulse": "\xef\x88\x9e", // U+f21e + "Helicopter": "\xef\x94\xb3", // U+f533 + "HelicopterSymbol": "\xee\x94\x82", // U+e502 + "HelmetSafety": "\xef\xa0\x87", // U+f807 + "HelmetUn": "\xee\x94\x83", // U+e503 + "Hexagon": "\xef\x8c\x92", // U+f312 + "HexagonNodes": "\xee\x9a\x99", // U+e699 + "HexagonNodesBolt": "\xee\x9a\x9a", // U+e69a + "Highlighter": "\xef\x96\x91", // U+f591 + "HillAvalanche": "\xee\x94\x87", // U+e507 + "HillRockslide": "\xee\x94\x88", // U+e508 + "Hippo": "\xef\x9b\xad", // U+f6ed + "HockeyPuck": "\xef\x91\x93", // U+f453 + "HollyBerry": "\xef\x9e\xaa", // U+f7aa + "Horse": "\xef\x9b\xb0", // U+f6f0 + "HorseHead": "\xef\x9e\xab", // U+f7ab + "Hospital": "\xef\x83\xb8", // U+f0f8 + "HospitalUser": "\xef\xa0\x8d", // U+f80d + "HotTubPerson": "\xef\x96\x93", // U+f593 + "Hotdog": "\xef\xa0\x8f", // U+f80f + "Hotel": "\xef\x96\x94", // U+f594 + "Hourglass": "\xef\x89\x94", // U+f254 + "HourglassEnd": "\xef\x89\x93", // U+f253 + "HourglassHalf": "\xef\x89\x92", // U+f252 + "HourglassStart": "\xef\x89\x91", // U+f251 + "House": "\xef\x80\x95", // U+f015 + "HouseChimney": "\xee\x8e\xaf", // U+e3af + "HouseChimneyCrack": "\xef\x9b\xb1", // U+f6f1 + "HouseChimneyMedical": "\xef\x9f\xb2", // U+f7f2 + "HouseChimneyUser": "\xee\x81\xa5", // U+e065 + "HouseChimneyWindow": "\xee\x80\x8d", // U+e00d + "HouseCircleCheck": "\xee\x94\x89", // U+e509 + "HouseCircleExclamation": "\xee\x94\x8a", // U+e50a + "HouseCircleXmark": "\xee\x94\x8b", // U+e50b + "HouseCrack": "\xee\x8e\xb1", // U+e3b1 + "HouseFire": "\xee\x94\x8c", // U+e50c + "HouseFlag": "\xee\x94\x8d", // U+e50d + "HouseFloodWater": "\xee\x94\x8e", // U+e50e + "HouseFloodWaterCircleArrowRight": "\xee\x94\x8f", // U+e50f + "HouseLaptop": "\xee\x81\xa6", // U+e066 + "HouseLock": "\xee\x94\x90", // U+e510 + "HouseMedical": "\xee\x8e\xb2", // U+e3b2 + "HouseMedicalCircleCheck": "\xee\x94\x91", // U+e511 + "HouseMedicalCircleExclamation": "\xee\x94\x92", // U+e512 + "HouseMedicalCircleXmark": "\xee\x94\x93", // U+e513 + "HouseMedicalFlag": "\xee\x94\x94", // U+e514 + "HouseSignal": "\xee\x80\x92", // U+e012 + "HouseTsunami": "\xee\x94\x95", // U+e515 + "HouseUser": "\xee\x86\xb0", // U+e1b0 + "HryvniaSign": "\xef\x9b\xb2", // U+f6f2 + "Hurricane": "\xef\x9d\x91", // U+f751 + "I": "I", // U+0049 + "ICursor": "\xef\x89\x86", // U+f246 + "IceCream": "\xef\xa0\x90", // U+f810 + "Icicles": "\xef\x9e\xad", // U+f7ad + "Icons": "\xef\xa1\xad", // U+f86d + "IdBadge": "\xef\x8b\x81", // U+f2c1 + "IdCard": "\xef\x8b\x82", // U+f2c2 + "IdCardClip": "\xef\x91\xbf", // U+f47f + "Igloo": "\xef\x9e\xae", // U+f7ae + "Image": "\xef\x80\xbe", // U+f03e + "ImagePortrait": "\xef\x8f\xa0", // U+f3e0 + "Images": "\xef\x8c\x82", // U+f302 + "Inbox": "\xef\x80\x9c", // U+f01c + "Indent": "\xef\x80\xbc", // U+f03c + "IndianRupeeSign": "\xee\x86\xbc", // U+e1bc + "Industry": "\xef\x89\xb5", // U+f275 + "Infinity": "\xef\x94\xb4", // U+f534 + "Info": "\xef\x84\xa9", // U+f129 + "Italic": "\xef\x80\xb3", // U+f033 + "J": "J", // U+004a + "Jar": "\xee\x94\x96", // U+e516 + "JarWheat": "\xee\x94\x97", // U+e517 + "Jedi": "\xef\x99\xa9", // U+f669 + "JetFighter": "\xef\x83\xbb", // U+f0fb + "JetFighterUp": "\xee\x94\x98", // U+e518 + "Joint": "\xef\x96\x95", // U+f595 + "JugDetergent": "\xee\x94\x99", // U+e519 + "K": "K", // U+004b + "Kaaba": "\xef\x99\xab", // U+f66b + "Key": "\xef\x82\x84", // U+f084 + "Keyboard": "\xef\x84\x9c", // U+f11c + "Khanda": "\xef\x99\xad", // U+f66d + "KipSign": "\xee\x87\x84", // U+e1c4 + "KitMedical": "\xef\x91\xb9", // U+f479 + "KitchenSet": "\xee\x94\x9a", // U+e51a + "KiwiBird": "\xef\x94\xb5", // U+f535 + "L": "L", // U+004c + "LandMineOn": "\xee\x94\x9b", // U+e51b + "Landmark": "\xef\x99\xaf", // U+f66f + "LandmarkDome": "\xef\x9d\x92", // U+f752 + "LandmarkFlag": "\xee\x94\x9c", // U+e51c + "Language": "\xef\x86\xab", // U+f1ab + "Laptop": "\xef\x84\x89", // U+f109 + "LaptopCode": "\xef\x97\xbc", // U+f5fc + "LaptopFile": "\xee\x94\x9d", // U+e51d + "LaptopMedical": "\xef\xa0\x92", // U+f812 + "LariSign": "\xee\x87\x88", // U+e1c8 + "LayerGroup": "\xef\x97\xbd", // U+f5fd + "Leaf": "\xef\x81\xac", // U+f06c + "LeftLong": "\xef\x8c\x8a", // U+f30a + "LeftRight": "\xef\x8c\xb7", // U+f337 + "Lemon": "\xef\x82\x94", // U+f094 + "Leo": "\xee\xa1\x8a", // U+e84a + "LessThan": "<", // U+003c + "LessThanEqual": "\xef\x94\xb7", // U+f537 + "Libra": "\xee\xa1\x8b", // U+e84b + "LifeRing": "\xef\x87\x8d", // U+f1cd + "Lightbulb": "\xef\x83\xab", // U+f0eb + "LinesLeaning": "\xee\x94\x9e", // U+e51e + "Link": "\xef\x83\x81", // U+f0c1 + "LinkSlash": "\xef\x84\xa7", // U+f127 + "LiraSign": "\xef\x86\x95", // U+f195 + "List": "\xef\x80\xba", // U+f03a + "ListCheck": "\xef\x82\xae", // U+f0ae + "ListOl": "\xef\x83\x8b", // U+f0cb + "ListUl": "\xef\x83\x8a", // U+f0ca + "LitecoinSign": "\xee\x87\x93", // U+e1d3 + "LocationArrow": "\xef\x84\xa4", // U+f124 + "LocationCrosshairs": "\xef\x98\x81", // U+f601 + "LocationDot": "\xef\x8f\x85", // U+f3c5 + "LocationPin": "\xef\x81\x81", // U+f041 + "LocationPinLock": "\xee\x94\x9f", // U+e51f + "Lock": "\xef\x80\xa3", // U+f023 + "LockOpen": "\xef\x8f\x81", // U+f3c1 + "Locust": "\xee\x94\xa0", // U+e520 + "Lungs": "\xef\x98\x84", // U+f604 + "LungsVirus": "\xee\x81\xa7", // U+e067 + "M": "M", // U+004d + "Magnet": "\xef\x81\xb6", // U+f076 + "MagnifyingGlass": "\xef\x80\x82", // U+f002 + "MagnifyingGlassArrowRight": "\xee\x94\xa1", // U+e521 + "MagnifyingGlassChart": "\xee\x94\xa2", // U+e522 + "MagnifyingGlassDollar": "\xef\x9a\x88", // U+f688 + "MagnifyingGlassLocation": "\xef\x9a\x89", // U+f689 + "MagnifyingGlassMinus": "\xef\x80\x90", // U+f010 + "MagnifyingGlassPlus": "\xef\x80\x8e", // U+f00e + "ManatSign": "\xee\x87\x95", // U+e1d5 + "Map": "\xef\x89\xb9", // U+f279 + "MapLocation": "\xef\x96\x9f", // U+f59f + "MapLocationDot": "\xef\x96\xa0", // U+f5a0 + "MapPin": "\xef\x89\xb6", // U+f276 + "Marker": "\xef\x96\xa1", // U+f5a1 + "Mars": "\xef\x88\xa2", // U+f222 + "MarsAndVenus": "\xef\x88\xa4", // U+f224 + "MarsAndVenusBurst": "\xee\x94\xa3", // U+e523 + "MarsDouble": "\xef\x88\xa7", // U+f227 + "MarsStroke": "\xef\x88\xa9", // U+f229 + "MarsStrokeRight": "\xef\x88\xab", // U+f22b + "MarsStrokeUp": "\xef\x88\xaa", // U+f22a + "MartiniGlass": "\xef\x95\xbb", // U+f57b + "MartiniGlassCitrus": "\xef\x95\xa1", // U+f561 + "MartiniGlassEmpty": "\xef\x80\x80", // U+f000 + "Mask": "\xef\x9b\xba", // U+f6fa + "MaskFace": "\xee\x87\x97", // U+e1d7 + "MaskVentilator": "\xee\x94\xa4", // U+e524 + "MasksTheater": "\xef\x98\xb0", // U+f630 + "MattressPillow": "\xee\x94\xa5", // U+e525 + "Maximize": "\xef\x8c\x9e", // U+f31e + "Medal": "\xef\x96\xa2", // U+f5a2 + "Memory": "\xef\x94\xb8", // U+f538 + "Menorah": "\xef\x99\xb6", // U+f676 + "Mercury": "\xef\x88\xa3", // U+f223 + "Message": "\xef\x89\xba", // U+f27a + "Meteor": "\xef\x9d\x93", // U+f753 + "Microchip": "\xef\x8b\x9b", // U+f2db + "Microphone": "\xef\x84\xb0", // U+f130 + "MicrophoneLines": "\xef\x8f\x89", // U+f3c9 + "MicrophoneLinesSlash": "\xef\x94\xb9", // U+f539 + "MicrophoneSlash": "\xef\x84\xb1", // U+f131 + "Microscope": "\xef\x98\x90", // U+f610 + "MillSign": "\xee\x87\xad", // U+e1ed + "Minimize": "\xef\x9e\x8c", // U+f78c + "Minus": "\xef\x81\xa8", // U+f068 + "Mitten": "\xef\x9e\xb5", // U+f7b5 + "Mobile": "\xef\x8f\x8e", // U+f3ce + "MobileButton": "\xef\x84\x8b", // U+f10b + "MobileRetro": "\xee\x94\xa7", // U+e527 + "MobileScreen": "\xef\x8f\x8f", // U+f3cf + "MobileScreenButton": "\xef\x8f\x8d", // U+f3cd + "MobileVibrate": "\xee\xa0\x96", // U+e816 + "MoneyBill": "\xef\x83\x96", // U+f0d6 + "MoneyBill1": "\xef\x8f\x91", // U+f3d1 + "MoneyBill1Wave": "\xef\x94\xbb", // U+f53b + "MoneyBillTransfer": "\xee\x94\xa8", // U+e528 + "MoneyBillTrendUp": "\xee\x94\xa9", // U+e529 + "MoneyBillWave": "\xef\x94\xba", // U+f53a + "MoneyBillWheat": "\xee\x94\xaa", // U+e52a + "MoneyBills": "\xee\x87\xb3", // U+e1f3 + "MoneyCheck": "\xef\x94\xbc", // U+f53c + "MoneyCheckDollar": "\xef\x94\xbd", // U+f53d + "Monument": "\xef\x96\xa6", // U+f5a6 + "Moon": "\xef\x86\x86", // U+f186 + "MortarPestle": "\xef\x96\xa7", // U+f5a7 + "Mosque": "\xef\x99\xb8", // U+f678 + "Mosquito": "\xee\x94\xab", // U+e52b + "MosquitoNet": "\xee\x94\xac", // U+e52c + "Motorcycle": "\xef\x88\x9c", // U+f21c + "Mound": "\xee\x94\xad", // U+e52d + "Mountain": "\xef\x9b\xbc", // U+f6fc + "MountainCity": "\xee\x94\xae", // U+e52e + "MountainSun": "\xee\x94\xaf", // U+e52f + "MugHot": "\xef\x9e\xb6", // U+f7b6 + "MugSaucer": "\xef\x83\xb4", // U+f0f4 + "Music": "\xef\x80\x81", // U+f001 + "N": "N", // U+004e + "NairaSign": "\xee\x87\xb6", // U+e1f6 + "NetworkWired": "\xef\x9b\xbf", // U+f6ff + "Neuter": "\xef\x88\xac", // U+f22c + "Newspaper": "\xef\x87\xaa", // U+f1ea + "NonBinary": "\xee\xa0\x87", // U+e807 + "NotEqual": "\xef\x94\xbe", // U+f53e + "Notdef": "\xee\x87\xbe", // U+e1fe + "NoteSticky": "\xef\x89\x89", // U+f249 + "NotesMedical": "\xef\x92\x81", // U+f481 + "O": "O", // U+004f + "ObjectGroup": "\xef\x89\x87", // U+f247 + "ObjectUngroup": "\xef\x89\x88", // U+f248 + "Octagon": "\xef\x8c\x86", // U+f306 + "OilCan": "\xef\x98\x93", // U+f613 + "OilWell": "\xee\x94\xb2", // U+e532 + "Om": "\xef\x99\xb9", // U+f679 + "Otter": "\xef\x9c\x80", // U+f700 + "Outdent": "\xef\x80\xbb", // U+f03b + "P": "P", // U+0050 + "Pager": "\xef\xa0\x95", // U+f815 + "PaintRoller": "\xef\x96\xaa", // U+f5aa + "Paintbrush": "\xef\x87\xbc", // U+f1fc + "Palette": "\xef\x94\xbf", // U+f53f + "Pallet": "\xef\x92\x82", // U+f482 + "Panorama": "\xee\x88\x89", // U+e209 + "PaperPlane": "\xef\x87\x98", // U+f1d8 + "Paperclip": "\xef\x83\x86", // U+f0c6 + "ParachuteBox": "\xef\x93\x8d", // U+f4cd + "Paragraph": "\xef\x87\x9d", // U+f1dd + "Passport": "\xef\x96\xab", // U+f5ab + "Paste": "\xef\x83\xaa", // U+f0ea + "Pause": "\xef\x81\x8c", // U+f04c + "Paw": "\xef\x86\xb0", // U+f1b0 + "Peace": "\xef\x99\xbc", // U+f67c + "Pen": "\xef\x8c\x84", // U+f304 + "PenClip": "\xef\x8c\x85", // U+f305 + "PenFancy": "\xef\x96\xac", // U+f5ac + "PenNib": "\xef\x96\xad", // U+f5ad + "PenRuler": "\xef\x96\xae", // U+f5ae + "PenToSquare": "\xef\x81\x84", // U+f044 + "Pencil": "\xef\x8c\x83", // U+f303 + "Pentagon": "\xee\x9e\x90", // U+e790 + "PeopleArrows": "\xee\x81\xa8", // U+e068 + "PeopleCarryBox": "\xef\x93\x8e", // U+f4ce + "PeopleGroup": "\xee\x94\xb3", // U+e533 + "PeopleLine": "\xee\x94\xb4", // U+e534 + "PeoplePulling": "\xee\x94\xb5", // U+e535 + "PeopleRobbery": "\xee\x94\xb6", // U+e536 + "PeopleRoof": "\xee\x94\xb7", // U+e537 + "PepperHot": "\xef\xa0\x96", // U+f816 + "Percent": "%", // U+0025 + "Person": "\xef\x86\x83", // U+f183 + "PersonArrowDownToLine": "\xee\x94\xb8", // U+e538 + "PersonArrowUpFromLine": "\xee\x94\xb9", // U+e539 + "PersonBiking": "\xef\xa1\x8a", // U+f84a + "PersonBooth": "\xef\x9d\x96", // U+f756 + "PersonBreastfeeding": "\xee\x94\xba", // U+e53a + "PersonBurst": "\xee\x94\xbb", // U+e53b + "PersonCane": "\xee\x94\xbc", // U+e53c + "PersonChalkboard": "\xee\x94\xbd", // U+e53d + "PersonCircleCheck": "\xee\x94\xbe", // U+e53e + "PersonCircleExclamation": "\xee\x94\xbf", // U+e53f + "PersonCircleMinus": "\xee\x95\x80", // U+e540 + "PersonCirclePlus": "\xee\x95\x81", // U+e541 + "PersonCircleQuestion": "\xee\x95\x82", // U+e542 + "PersonCircleXmark": "\xee\x95\x83", // U+e543 + "PersonDigging": "\xef\xa1\x9e", // U+f85e + "PersonDotsFromLine": "\xef\x91\xb0", // U+f470 + "PersonDress": "\xef\x86\x82", // U+f182 + "PersonDressBurst": "\xee\x95\x84", // U+e544 + "PersonDrowning": "\xee\x95\x85", // U+e545 + "PersonFalling": "\xee\x95\x86", // U+e546 + "PersonFallingBurst": "\xee\x95\x87", // U+e547 + "PersonHalfDress": "\xee\x95\x88", // U+e548 + "PersonHarassing": "\xee\x95\x89", // U+e549 + "PersonHiking": "\xef\x9b\xac", // U+f6ec + "PersonMilitaryPointing": "\xee\x95\x8a", // U+e54a + "PersonMilitaryRifle": "\xee\x95\x8b", // U+e54b + "PersonMilitaryToPerson": "\xee\x95\x8c", // U+e54c + "PersonPraying": "\xef\x9a\x83", // U+f683 + "PersonPregnant": "\xee\x8c\x9e", // U+e31e + "PersonRays": "\xee\x95\x8d", // U+e54d + "PersonRifle": "\xee\x95\x8e", // U+e54e + "PersonRunning": "\xef\x9c\x8c", // U+f70c + "PersonShelter": "\xee\x95\x8f", // U+e54f + "PersonSkating": "\xef\x9f\x85", // U+f7c5 + "PersonSkiing": "\xef\x9f\x89", // U+f7c9 + "PersonSkiingNordic": "\xef\x9f\x8a", // U+f7ca + "PersonSnowboarding": "\xef\x9f\x8e", // U+f7ce + "PersonSwimming": "\xef\x97\x84", // U+f5c4 + "PersonThroughWindow": "\xee\x96\xa9", // U+e5a9 + "PersonWalking": "\xef\x95\x94", // U+f554 + "PersonWalkingArrowLoopLeft": "\xee\x95\x91", // U+e551 + "PersonWalkingArrowRight": "\xee\x95\x92", // U+e552 + "PersonWalkingDashedLineArrowRight": "\xee\x95\x93", // U+e553 + "PersonWalkingLuggage": "\xee\x95\x94", // U+e554 + "PersonWalkingWithCane": "\xef\x8a\x9d", // U+f29d + "PesetaSign": "\xee\x88\xa1", // U+e221 + "PesoSign": "\xee\x88\xa2", // U+e222 + "Phone": "\xef\x82\x95", // U+f095 + "PhoneFlip": "\xef\xa1\xb9", // U+f879 + "PhoneSlash": "\xef\x8f\x9d", // U+f3dd + "PhoneVolume": "\xef\x8a\xa0", // U+f2a0 + "PhotoFilm": "\xef\xa1\xbc", // U+f87c + "PictureInPicture": "\xee\xa0\x8b", // U+e80b + "PiggyBank": "\xef\x93\x93", // U+f4d3 + "Pills": "\xef\x92\x84", // U+f484 + "Pisces": "\xee\xa1\x8c", // U+e84c + "PizzaSlice": "\xef\xa0\x98", // U+f818 + "PlaceOfWorship": "\xef\x99\xbf", // U+f67f + "Plane": "\xef\x81\xb2", // U+f072 + "PlaneArrival": "\xef\x96\xaf", // U+f5af + "PlaneCircleCheck": "\xee\x95\x95", // U+e555 + "PlaneCircleExclamation": "\xee\x95\x96", // U+e556 + "PlaneCircleXmark": "\xee\x95\x97", // U+e557 + "PlaneDeparture": "\xef\x96\xb0", // U+f5b0 + "PlaneLock": "\xee\x95\x98", // U+e558 + "PlaneSlash": "\xee\x81\xa9", // U+e069 + "PlaneUp": "\xee\x88\xad", // U+e22d + "PlantWilt": "\xee\x96\xaa", // U+e5aa + "PlateWheat": "\xee\x95\x9a", // U+e55a + "Play": "\xef\x81\x8b", // U+f04b + "Plug": "\xef\x87\xa6", // U+f1e6 + "PlugCircleBolt": "\xee\x95\x9b", // U+e55b + "PlugCircleCheck": "\xee\x95\x9c", // U+e55c + "PlugCircleExclamation": "\xee\x95\x9d", // U+e55d + "PlugCircleMinus": "\xee\x95\x9e", // U+e55e + "PlugCirclePlus": "\xee\x95\x9f", // U+e55f + "PlugCircleXmark": "\xee\x95\xa0", // U+e560 + "Plus": "+", // U+002b + "PlusMinus": "\xee\x90\xbc", // U+e43c + "Podcast": "\xef\x8b\x8e", // U+f2ce + "Poo": "\xef\x8b\xbe", // U+f2fe + "PooStorm": "\xef\x9d\x9a", // U+f75a + "Poop": "\xef\x98\x99", // U+f619 + "PowerOff": "\xef\x80\x91", // U+f011 + "Prescription": "\xef\x96\xb1", // U+f5b1 + "PrescriptionBottle": "\xef\x92\x85", // U+f485 + "PrescriptionBottleMedical": "\xef\x92\x86", // U+f486 + "Print": "\xef\x80\xaf", // U+f02f + "PumpMedical": "\xee\x81\xaa", // U+e06a + "PumpSoap": "\xee\x81\xab", // U+e06b + "PuzzlePiece": "\xef\x84\xae", // U+f12e + "Q": "Q", // U+0051 + "Qrcode": "\xef\x80\xa9", // U+f029 + "Question": "?", // U+003f + "QuoteLeft": "\xef\x84\x8d", // U+f10d + "QuoteRight": "\xef\x84\x8e", // U+f10e + "R": "R", // U+0052 + "Radiation": "\xef\x9e\xb9", // U+f7b9 + "Radio": "\xef\xa3\x97", // U+f8d7 + "Rainbow": "\xef\x9d\x9b", // U+f75b + "RankingStar": "\xee\x95\xa1", // U+e561 + "Receipt": "\xef\x95\x83", // U+f543 + "RecordVinyl": "\xef\xa3\x99", // U+f8d9 + "RectangleAd": "\xef\x99\x81", // U+f641 + "RectangleList": "\xef\x80\xa2", // U+f022 + "RectangleXmark": "\xef\x90\x90", // U+f410 + "Recycle": "\xef\x86\xb8", // U+f1b8 + "Registered": "\xef\x89\x9d", // U+f25d + "Repeat": "\xef\x8d\xa3", // U+f363 + "Reply": "\xef\x8f\xa5", // U+f3e5 + "ReplyAll": "\xef\x84\xa2", // U+f122 + "Republican": "\xef\x9d\x9e", // U+f75e + "Restroom": "\xef\x9e\xbd", // U+f7bd + "Retweet": "\xef\x81\xb9", // U+f079 + "Ribbon": "\xef\x93\x96", // U+f4d6 + "RightFromBracket": "\xef\x8b\xb5", // U+f2f5 + "RightLeft": "\xef\x8d\xa2", // U+f362 + "RightLong": "\xef\x8c\x8b", // U+f30b + "RightToBracket": "\xef\x8b\xb6", // U+f2f6 + "Ring": "\xef\x9c\x8b", // U+f70b + "Road": "\xef\x80\x98", // U+f018 + "RoadBarrier": "\xee\x95\xa2", // U+e562 + "RoadBridge": "\xee\x95\xa3", // U+e563 + "RoadCircleCheck": "\xee\x95\xa4", // U+e564 + "RoadCircleExclamation": "\xee\x95\xa5", // U+e565 + "RoadCircleXmark": "\xee\x95\xa6", // U+e566 + "RoadLock": "\xee\x95\xa7", // U+e567 + "RoadSpikes": "\xee\x95\xa8", // U+e568 + "Robot": "\xef\x95\x84", // U+f544 + "Rocket": "\xef\x84\xb5", // U+f135 + "Rotate": "\xef\x8b\xb1", // U+f2f1 + "RotateLeft": "\xef\x8b\xaa", // U+f2ea + "RotateRight": "\xef\x8b\xb9", // U+f2f9 + "Route": "\xef\x93\x97", // U+f4d7 + "Rss": "\xef\x82\x9e", // U+f09e + "RubleSign": "\xef\x85\x98", // U+f158 + "Rug": "\xee\x95\xa9", // U+e569 + "Ruler": "\xef\x95\x85", // U+f545 + "RulerCombined": "\xef\x95\x86", // U+f546 + "RulerHorizontal": "\xef\x95\x87", // U+f547 + "RulerVertical": "\xef\x95\x88", // U+f548 + "RupeeSign": "\xef\x85\x96", // U+f156 + "RupiahSign": "\xee\x88\xbd", // U+e23d + "S": "S", // U+0053 + "SackDollar": "\xef\xa0\x9d", // U+f81d + "SackXmark": "\xee\x95\xaa", // U+e56a + "Sagittarius": "\xee\xa1\x8d", // U+e84d + "Sailboat": "\xee\x91\x85", // U+e445 + "Satellite": "\xef\x9e\xbf", // U+f7bf + "SatelliteDish": "\xef\x9f\x80", // U+f7c0 + "ScaleBalanced": "\xef\x89\x8e", // U+f24e + "ScaleUnbalanced": "\xef\x94\x95", // U+f515 + "ScaleUnbalancedFlip": "\xef\x94\x96", // U+f516 + "School": "\xef\x95\x89", // U+f549 + "SchoolCircleCheck": "\xee\x95\xab", // U+e56b + "SchoolCircleExclamation": "\xee\x95\xac", // U+e56c + "SchoolCircleXmark": "\xee\x95\xad", // U+e56d + "SchoolFlag": "\xee\x95\xae", // U+e56e + "SchoolLock": "\xee\x95\xaf", // U+e56f + "Scissors": "\xef\x83\x84", // U+f0c4 + "Scorpio": "\xee\xa1\x8e", // U+e84e + "Screwdriver": "\xef\x95\x8a", // U+f54a + "ScrewdriverWrench": "\xef\x9f\x99", // U+f7d9 + "Scroll": "\xef\x9c\x8e", // U+f70e + "ScrollTorah": "\xef\x9a\xa0", // U+f6a0 + "SdCard": "\xef\x9f\x82", // U+f7c2 + "Section": "\xee\x91\x87", // U+e447 + "Seedling": "\xef\x93\x98", // U+f4d8 + "Septagon": "\xee\xa0\xa0", // U+e820 + "Server": "\xef\x88\xb3", // U+f233 + "Shapes": "\xef\x98\x9f", // U+f61f + "Share": "\xef\x81\xa4", // U+f064 + "ShareFromSquare": "\xef\x85\x8d", // U+f14d + "ShareNodes": "\xef\x87\xa0", // U+f1e0 + "SheetPlastic": "\xee\x95\xb1", // U+e571 + "ShekelSign": "\xef\x88\x8b", // U+f20b + "Shield": "\xef\x84\xb2", // U+f132 + "ShieldCat": "\xee\x95\xb2", // U+e572 + "ShieldDog": "\xee\x95\xb3", // U+e573 + "ShieldHalved": "\xef\x8f\xad", // U+f3ed + "ShieldHeart": "\xee\x95\xb4", // U+e574 + "ShieldVirus": "\xee\x81\xac", // U+e06c + "Ship": "\xef\x88\x9a", // U+f21a + "Shirt": "\xef\x95\x93", // U+f553 + "ShoePrints": "\xef\x95\x8b", // U+f54b + "Shop": "\xef\x95\x8f", // U+f54f + "ShopLock": "\xee\x92\xa5", // U+e4a5 + "ShopSlash": "\xee\x81\xb0", // U+e070 + "Shower": "\xef\x8b\x8c", // U+f2cc + "Shrimp": "\xee\x91\x88", // U+e448 + "Shuffle": "\xef\x81\xb4", // U+f074 + "ShuttleSpace": "\xef\x86\x97", // U+f197 + "SignHanging": "\xef\x93\x99", // U+f4d9 + "Signal": "\xef\x80\x92", // U+f012 + "Signature": "\xef\x96\xb7", // U+f5b7 + "SignsPost": "\xef\x89\xb7", // U+f277 + "SimCard": "\xef\x9f\x84", // U+f7c4 + "SingleQuoteLeft": "\xee\xa0\x9b", // U+e81b + "SingleQuoteRight": "\xee\xa0\x9c", // U+e81c + "Sink": "\xee\x81\xad", // U+e06d + "Sitemap": "\xef\x83\xa8", // U+f0e8 + "Skull": "\xef\x95\x8c", // U+f54c + "SkullCrossbones": "\xef\x9c\x94", // U+f714 + "Slash": "\xef\x9c\x95", // U+f715 + "Sleigh": "\xef\x9f\x8c", // U+f7cc + "Sliders": "\xef\x87\x9e", // U+f1de + "Smog": "\xef\x9d\x9f", // U+f75f + "Smoking": "\xef\x92\x8d", // U+f48d + "Snowflake": "\xef\x8b\x9c", // U+f2dc + "Snowman": "\xef\x9f\x90", // U+f7d0 + "Snowplow": "\xef\x9f\x92", // U+f7d2 + "Soap": "\xee\x81\xae", // U+e06e + "Socks": "\xef\x9a\x96", // U+f696 + "SolarPanel": "\xef\x96\xba", // U+f5ba + "Sort": "\xef\x83\x9c", // U+f0dc + "SortDown": "\xef\x83\x9d", // U+f0dd + "SortUp": "\xef\x83\x9e", // U+f0de + "Spa": "\xef\x96\xbb", // U+f5bb + "SpaghettiMonsterFlying": "\xef\x99\xbb", // U+f67b + "SpellCheck": "\xef\xa2\x91", // U+f891 + "Spider": "\xef\x9c\x97", // U+f717 + "Spinner": "\xef\x84\x90", // U+f110 + "Spiral": "\xee\xa0\x8a", // U+e80a + "Splotch": "\xef\x96\xbc", // U+f5bc + "Spoon": "\xef\x8b\xa5", // U+f2e5 + "SprayCan": "\xef\x96\xbd", // U+f5bd + "SprayCanSparkles": "\xef\x97\x90", // U+f5d0 + "Square": "\xef\x83\x88", // U+f0c8 + "SquareArrowUpRight": "\xef\x85\x8c", // U+f14c + "SquareBinary": "\xee\x9a\x9b", // U+e69b + "SquareCaretDown": "\xef\x85\x90", // U+f150 + "SquareCaretLeft": "\xef\x86\x91", // U+f191 + "SquareCaretRight": "\xef\x85\x92", // U+f152 + "SquareCaretUp": "\xef\x85\x91", // U+f151 + "SquareCheck": "\xef\x85\x8a", // U+f14a + "SquareEnvelope": "\xef\x86\x99", // U+f199 + "SquareFull": "\xef\x91\x9c", // U+f45c + "SquareH": "\xef\x83\xbd", // U+f0fd + "SquareMinus": "\xef\x85\x86", // U+f146 + "SquareNfi": "\xee\x95\xb6", // U+e576 + "SquareParking": "\xef\x95\x80", // U+f540 + "SquarePen": "\xef\x85\x8b", // U+f14b + "SquarePersonConfined": "\xee\x95\xb7", // U+e577 + "SquarePhone": "\xef\x82\x98", // U+f098 + "SquarePhoneFlip": "\xef\xa1\xbb", // U+f87b + "SquarePlus": "\xef\x83\xbe", // U+f0fe + "SquarePollHorizontal": "\xef\x9a\x82", // U+f682 + "SquarePollVertical": "\xef\x9a\x81", // U+f681 + "SquareRootVariable": "\xef\x9a\x98", // U+f698 + "SquareRss": "\xef\x85\x83", // U+f143 + "SquareShareNodes": "\xef\x87\xa1", // U+f1e1 + "SquareUpRight": "\xef\x8d\xa0", // U+f360 + "SquareVirus": "\xee\x95\xb8", // U+e578 + "SquareXmark": "\xef\x8b\x93", // U+f2d3 + "StaffSnake": "\xee\x95\xb9", // U+e579 + "Stairs": "\xee\x8a\x89", // U+e289 + "Stamp": "\xef\x96\xbf", // U+f5bf + "Stapler": "\xee\x96\xaf", // U+e5af + "Star": "\xef\x80\x85", // U+f005 + "StarAndCrescent": "\xef\x9a\x99", // U+f699 + "StarHalf": "\xef\x82\x89", // U+f089 + "StarHalfStroke": "\xef\x97\x80", // U+f5c0 + "StarOfDavid": "\xef\x9a\x9a", // U+f69a + "StarOfLife": "\xef\x98\xa1", // U+f621 + "SterlingSign": "\xef\x85\x94", // U+f154 + "Stethoscope": "\xef\x83\xb1", // U+f0f1 + "Stop": "\xef\x81\x8d", // U+f04d + "Stopwatch": "\xef\x8b\xb2", // U+f2f2 + "Stopwatch20": "\xee\x81\xaf", // U+e06f + "Store": "\xef\x95\x8e", // U+f54e + "StoreSlash": "\xee\x81\xb1", // U+e071 + "StreetView": "\xef\x88\x9d", // U+f21d + "Strikethrough": "\xef\x83\x8c", // U+f0cc + "Stroopwafel": "\xef\x95\x91", // U+f551 + "Subscript": "\xef\x84\xac", // U+f12c + "Suitcase": "\xef\x83\xb2", // U+f0f2 + "SuitcaseMedical": "\xef\x83\xba", // U+f0fa + "SuitcaseRolling": "\xef\x97\x81", // U+f5c1 + "Sun": "\xef\x86\x85", // U+f185 + "SunPlantWilt": "\xee\x95\xba", // U+e57a + "Superscript": "\xef\x84\xab", // U+f12b + "Swatchbook": "\xef\x97\x83", // U+f5c3 + "Synagogue": "\xef\x9a\x9b", // U+f69b + "Syringe": "\xef\x92\x8e", // U+f48e + "T": "T", // U+0054 + "Table": "\xef\x83\x8e", // U+f0ce + "TableCells": "\xef\x80\x8a", // U+f00a + "TableCellsColumnLock": "\xee\x99\xb8", // U+e678 + "TableCellsLarge": "\xef\x80\x89", // U+f009 + "TableCellsRowLock": "\xee\x99\xba", // U+e67a + "TableCellsRowUnlock": "\xee\x9a\x91", // U+e691 + "TableColumns": "\xef\x83\x9b", // U+f0db + "TableList": "\xef\x80\x8b", // U+f00b + "TableTennisPaddleBall": "\xef\x91\x9d", // U+f45d + "Tablet": "\xef\x8f\xbb", // U+f3fb + "TabletButton": "\xef\x84\x8a", // U+f10a + "TabletScreenButton": "\xef\x8f\xba", // U+f3fa + "Tablets": "\xef\x92\x90", // U+f490 + "TachographDigital": "\xef\x95\xa6", // U+f566 + "Tag": "\xef\x80\xab", // U+f02b + "Tags": "\xef\x80\xac", // U+f02c + "Tape": "\xef\x93\x9b", // U+f4db + "Tarp": "\xee\x95\xbb", // U+e57b + "TarpDroplet": "\xee\x95\xbc", // U+e57c + "Taurus": "\xee\xa1\x8f", // U+e84f + "Taxi": "\xef\x86\xba", // U+f1ba + "Teeth": "\xef\x98\xae", // U+f62e + "TeethOpen": "\xef\x98\xaf", // U+f62f + "TemperatureArrowDown": "\xee\x80\xbf", // U+e03f + "TemperatureArrowUp": "\xee\x81\x80", // U+e040 + "TemperatureEmpty": "\xef\x8b\x8b", // U+f2cb + "TemperatureFull": "\xef\x8b\x87", // U+f2c7 + "TemperatureHalf": "\xef\x8b\x89", // U+f2c9 + "TemperatureHigh": "\xef\x9d\xa9", // U+f769 + "TemperatureLow": "\xef\x9d\xab", // U+f76b + "TemperatureQuarter": "\xef\x8b\x8a", // U+f2ca + "TemperatureThreeQuarters": "\xef\x8b\x88", // U+f2c8 + "TengeSign": "\xef\x9f\x97", // U+f7d7 + "Tent": "\xee\x95\xbd", // U+e57d + "TentArrowDownToLine": "\xee\x95\xbe", // U+e57e + "TentArrowLeftRight": "\xee\x95\xbf", // U+e57f + "TentArrowTurnLeft": "\xee\x96\x80", // U+e580 + "TentArrowsDown": "\xee\x96\x81", // U+e581 + "Tents": "\xee\x96\x82", // U+e582 + "Terminal": "\xef\x84\xa0", // U+f120 + "TextHeight": "\xef\x80\xb4", // U+f034 + "TextSlash": "\xef\xa1\xbd", // U+f87d + "TextWidth": "\xef\x80\xb5", // U+f035 + "Thermometer": "\xef\x92\x91", // U+f491 + "ThumbsDown": "\xef\x85\xa5", // U+f165 + "ThumbsUp": "\xef\x85\xa4", // U+f164 + "Thumbtack": "\xef\x82\x8d", // U+f08d + "ThumbtackSlash": "\xee\x9a\x8f", // U+e68f + "Ticket": "\xef\x85\x85", // U+f145 + "TicketSimple": "\xef\x8f\xbf", // U+f3ff + "Timeline": "\xee\x8a\x9c", // U+e29c + "ToggleOff": "\xef\x88\x84", // U+f204 + "ToggleOn": "\xef\x88\x85", // U+f205 + "Toilet": "\xef\x9f\x98", // U+f7d8 + "ToiletPaper": "\xef\x9c\x9e", // U+f71e + "ToiletPaperSlash": "\xee\x81\xb2", // U+e072 + "ToiletPortable": "\xee\x96\x83", // U+e583 + "ToiletsPortable": "\xee\x96\x84", // U+e584 + "Toolbox": "\xef\x95\x92", // U+f552 + "Tooth": "\xef\x97\x89", // U+f5c9 + "ToriiGate": "\xef\x9a\xa1", // U+f6a1 + "Tornado": "\xef\x9d\xaf", // U+f76f + "TowerBroadcast": "\xef\x94\x99", // U+f519 + "TowerCell": "\xee\x96\x85", // U+e585 + "TowerObservation": "\xee\x96\x86", // U+e586 + "Tractor": "\xef\x9c\xa2", // U+f722 + "Trademark": "\xef\x89\x9c", // U+f25c + "TrafficLight": "\xef\x98\xb7", // U+f637 + "Trailer": "\xee\x81\x81", // U+e041 + "Train": "\xef\x88\xb8", // U+f238 + "TrainSubway": "\xef\x88\xb9", // U+f239 + "TrainTram": "\xee\x96\xb4", // U+e5b4 + "Transgender": "\xef\x88\xa5", // U+f225 + "Trash": "\xef\x87\xb8", // U+f1f8 + "TrashArrowUp": "\xef\xa0\xa9", // U+f829 + "TrashCan": "\xef\x8b\xad", // U+f2ed + "TrashCanArrowUp": "\xef\xa0\xaa", // U+f82a + "Tree": "\xef\x86\xbb", // U+f1bb + "TreeCity": "\xee\x96\x87", // U+e587 + "TriangleExclamation": "\xef\x81\xb1", // U+f071 + "Trophy": "\xef\x82\x91", // U+f091 + "Trowel": "\xee\x96\x89", // U+e589 + "TrowelBricks": "\xee\x96\x8a", // U+e58a + "Truck": "\xef\x83\x91", // U+f0d1 + "TruckArrowRight": "\xee\x96\x8b", // U+e58b + "TruckDroplet": "\xee\x96\x8c", // U+e58c + "TruckFast": "\xef\x92\x8b", // U+f48b + "TruckField": "\xee\x96\x8d", // U+e58d + "TruckFieldUn": "\xee\x96\x8e", // U+e58e + "TruckFront": "\xee\x8a\xb7", // U+e2b7 + "TruckMedical": "\xef\x83\xb9", // U+f0f9 + "TruckMonster": "\xef\x98\xbb", // U+f63b + "TruckMoving": "\xef\x93\x9f", // U+f4df + "TruckPickup": "\xef\x98\xbc", // U+f63c + "TruckPlane": "\xee\x96\x8f", // U+e58f + "TruckRampBox": "\xef\x93\x9e", // U+f4de + "Tty": "\xef\x87\xa4", // U+f1e4 + "TurkishLiraSign": "\xee\x8a\xbb", // U+e2bb + "TurnDown": "\xef\x8e\xbe", // U+f3be + "TurnUp": "\xef\x8e\xbf", // U+f3bf + "Tv": "\xef\x89\xac", // U+f26c + "U": "U", // U+0055 + "Umbrella": "\xef\x83\xa9", // U+f0e9 + "UmbrellaBeach": "\xef\x97\x8a", // U+f5ca + "Underline": "\xef\x83\x8d", // U+f0cd + "UniversalAccess": "\xef\x8a\x9a", // U+f29a + "Unlock": "\xef\x82\x9c", // U+f09c + "UnlockKeyhole": "\xef\x84\xbe", // U+f13e + "UpDown": "\xef\x8c\xb8", // U+f338 + "UpDownLeftRight": "\xef\x82\xb2", // U+f0b2 + "UpLong": "\xef\x8c\x8c", // U+f30c + "UpRightAndDownLeftFromCenter": "\xef\x90\xa4", // U+f424 + "UpRightFromSquare": "\xef\x8d\x9d", // U+f35d + "Upload": "\xef\x82\x93", // U+f093 + "User": "\xef\x80\x87", // U+f007 + "UserAstronaut": "\xef\x93\xbb", // U+f4fb + "UserCheck": "\xef\x93\xbc", // U+f4fc + "UserClock": "\xef\x93\xbd", // U+f4fd + "UserDoctor": "\xef\x83\xb0", // U+f0f0 + "UserGear": "\xef\x93\xbe", // U+f4fe + "UserGraduate": "\xef\x94\x81", // U+f501 + "UserGroup": "\xef\x94\x80", // U+f500 + "UserInjured": "\xef\x9c\xa8", // U+f728 + "UserLock": "\xef\x94\x82", // U+f502 + "UserMinus": "\xef\x94\x83", // U+f503 + "UserNinja": "\xef\x94\x84", // U+f504 + "UserNurse": "\xef\xa0\xaf", // U+f82f + "UserPen": "\xef\x93\xbf", // U+f4ff + "UserPlus": "\xef\x88\xb4", // U+f234 + "UserSecret": "\xef\x88\x9b", // U+f21b + "UserShield": "\xef\x94\x85", // U+f505 + "UserSlash": "\xef\x94\x86", // U+f506 + "UserTag": "\xef\x94\x87", // U+f507 + "UserTie": "\xef\x94\x88", // U+f508 + "UserXmark": "\xef\x88\xb5", // U+f235 + "Users": "\xef\x83\x80", // U+f0c0 + "UsersBetweenLines": "\xee\x96\x91", // U+e591 + "UsersGear": "\xef\x94\x89", // U+f509 + "UsersLine": "\xee\x96\x92", // U+e592 + "UsersRays": "\xee\x96\x93", // U+e593 + "UsersRectangle": "\xee\x96\x94", // U+e594 + "UsersSlash": "\xee\x81\xb3", // U+e073 + "UsersViewfinder": "\xee\x96\x95", // U+e595 + "Utensils": "\xef\x8b\xa7", // U+f2e7 + "V": "V", // U+0056 + "VanShuttle": "\xef\x96\xb6", // U+f5b6 + "Vault": "\xee\x8b\x85", // U+e2c5 + "Venus": "\xef\x88\xa1", // U+f221 + "VenusDouble": "\xef\x88\xa6", // U+f226 + "VenusMars": "\xef\x88\xa8", // U+f228 + "Vest": "\xee\x82\x85", // U+e085 + "VestPatches": "\xee\x82\x86", // U+e086 + "Vial": "\xef\x92\x92", // U+f492 + "VialCircleCheck": "\xee\x96\x96", // U+e596 + "VialVirus": "\xee\x96\x97", // U+e597 + "Vials": "\xef\x92\x93", // U+f493 + "Video": "\xef\x80\xbd", // U+f03d + "VideoSlash": "\xef\x93\xa2", // U+f4e2 + "Vihara": "\xef\x9a\xa7", // U+f6a7 + "Virgo": "\xee\xa1\x90", // U+e850 + "Virus": "\xee\x81\xb4", // U+e074 + "VirusCovid": "\xee\x92\xa8", // U+e4a8 + "VirusCovidSlash": "\xee\x92\xa9", // U+e4a9 + "VirusSlash": "\xee\x81\xb5", // U+e075 + "Viruses": "\xee\x81\xb6", // U+e076 + "Voicemail": "\xef\xa2\x97", // U+f897 + "Volcano": "\xef\x9d\xb0", // U+f770 + "Volleyball": "\xef\x91\x9f", // U+f45f + "Volume": "\xef\x9a\xa8", // U+f6a8 + "VolumeHigh": "\xef\x80\xa8", // U+f028 + "VolumeLow": "\xef\x80\xa7", // U+f027 + "VolumeOff": "\xef\x80\xa6", // U+f026 + "VolumeXmark": "\xef\x9a\xa9", // U+f6a9 + "VrCardboard": "\xef\x9c\xa9", // U+f729 + "W": "W", // U+0057 + "WalkieTalkie": "\xef\xa3\xaf", // U+f8ef + "Wallet": "\xef\x95\x95", // U+f555 + "WandMagic": "\xef\x83\x90", // U+f0d0 + "WandMagicSparkles": "\xee\x8b\x8a", // U+e2ca + "WandSparkles": "\xef\x9c\xab", // U+f72b + "Warehouse": "\xef\x92\x94", // U+f494 + "Water": "\xef\x9d\xb3", // U+f773 + "WaterLadder": "\xef\x97\x85", // U+f5c5 + "WaveSquare": "\xef\xa0\xbe", // U+f83e + "WebAwesome": "\xee\x9a\x82", // U+e682 + "WeightHanging": "\xef\x97\x8d", // U+f5cd + "WeightScale": "\xef\x92\x96", // U+f496 + "WheatAwn": "\xee\x8b\x8d", // U+e2cd + "WheatAwnCircleExclamation": "\xee\x96\x98", // U+e598 + "Wheelchair": "\xef\x86\x93", // U+f193 + "WheelchairMove": "\xee\x8b\x8e", // U+e2ce + "WhiskeyGlass": "\xef\x9e\xa0", // U+f7a0 + "Wifi": "\xef\x87\xab", // U+f1eb + "Wind": "\xef\x9c\xae", // U+f72e + "WindowMaximize": "\xef\x8b\x90", // U+f2d0 + "WindowMinimize": "\xef\x8b\x91", // U+f2d1 + "WindowRestore": "\xef\x8b\x92", // U+f2d2 + "WineBottle": "\xef\x9c\xaf", // U+f72f + "WineGlass": "\xef\x93\xa3", // U+f4e3 + "WineGlassEmpty": "\xef\x97\x8e", // U+f5ce + "WonSign": "\xef\x85\x99", // U+f159 + "Worm": "\xee\x96\x99", // U+e599 + "Wrench": "\xef\x82\xad", // U+f0ad + "X": "X", // U+0058 + "XRay": "\xef\x92\x97", // U+f497 + "Xmark": "\xef\x80\x8d", // U+f00d + "XmarksLines": "\xee\x96\x9a", // U+e59a + "Y": "Y", // U+0059 + "YenSign": "\xef\x85\x97", // U+f157 + "YinYang": "\xef\x9a\xad", // U+f6ad + "Z": "Z", // U+005a + } + +var fa7BrandsIcons = map[string]string{ + "42Group": "\xee\x82\x80", // U+e080 + "500px": "\xef\x89\xae", // U+f26e + "AccessibleIcon": "\xef\x8d\xa8", // U+f368 + "Accusoft": "\xef\x8d\xa9", // U+f369 + "Adn": "\xef\x85\xb0", // U+f170 + "Adversal": "\xef\x8d\xaa", // U+f36a + "Affiliatetheme": "\xef\x8d\xab", // U+f36b + "Airbnb": "\xef\xa0\xb4", // U+f834 + "Algolia": "\xef\x8d\xac", // U+f36c + "Alipay": "\xef\x99\x82", // U+f642 + "Amazon": "\xef\x89\xb0", // U+f270 + "AmazonPay": "\xef\x90\xac", // U+f42c + "Amilia": "\xef\x8d\xad", // U+f36d + "Android": "\xef\x85\xbb", // U+f17b + "Angellist": "\xef\x88\x89", // U+f209 + "Angrycreative": "\xef\x8d\xae", // U+f36e + "Angular": "\xef\x90\xa0", // U+f420 + "AppStore": "\xef\x8d\xaf", // U+f36f + "AppStoreIos": "\xef\x8d\xb0", // U+f370 + "Apper": "\xef\x8d\xb1", // U+f371 + "Apple": "\xef\x85\xb9", // U+f179 + "ApplePay": "\xef\x90\x95", // U+f415 + "ArchLinux": "\xee\xa1\xa7", // U+e867 + "Artstation": "\xef\x9d\xba", // U+f77a + "Asymmetrik": "\xef\x8d\xb2", // U+f372 + "Atlassian": "\xef\x9d\xbb", // U+f77b + "Audible": "\xef\x8d\xb3", // U+f373 + "Autoprefixer": "\xef\x90\x9c", // U+f41c + "Avianex": "\xef\x8d\xb4", // U+f374 + "Aviato": "\xef\x90\xa1", // U+f421 + "Aws": "\xef\x8d\xb5", // U+f375 + "Bandcamp": "\xef\x8b\x95", // U+f2d5 + "BattleNet": "\xef\xa0\xb5", // U+f835 + "Behance": "\xef\x86\xb4", // U+f1b4 + "Bilibili": "\xee\x8f\x99", // U+e3d9 + "Bimobject": "\xef\x8d\xb8", // U+f378 + "Bitbucket": "\xef\x85\xb1", // U+f171 + "Bitcoin": "\xef\x8d\xb9", // U+f379 + "Bity": "\xef\x8d\xba", // U+f37a + "BlackTie": "\xef\x89\xbe", // U+f27e + "Blackberry": "\xef\x8d\xbb", // U+f37b + "Blogger": "\xef\x8d\xbc", // U+f37c + "BloggerB": "\xef\x8d\xbd", // U+f37d + "Bluesky": "\xee\x99\xb1", // U+e671 + "Bluetooth": "\xef\x8a\x93", // U+f293 + "BluetoothB": "\xef\x8a\x94", // U+f294 + "BoardGameGeek": "\xee\xa1\x95", // U+e855 + "Bootstrap": "\xef\xa0\xb6", // U+f836 + "Bots": "\xee\x8d\x80", // U+e340 + "Brave": "\xee\x98\xbc", // U+e63c + "BraveReverse": "\xee\x98\xbd", // U+e63d + "Btc": "\xef\x85\x9a", // U+f15a + "Buffer": "\xef\xa0\xb7", // U+f837 + "Buromobelexperte": "\xef\x8d\xbf", // U+f37f + "BuyNLarge": "\xef\xa2\xa6", // U+f8a6 + "Buysellads": "\xef\x88\x8d", // U+f20d + "CanadianMapleLeaf": "\xef\x9e\x85", // U+f785 + "CashApp": "\xee\x9f\x94", // U+e7d4 + "CcAmazonPay": "\xef\x90\xad", // U+f42d + "CcAmex": "\xef\x87\xb3", // U+f1f3 + "CcApplePay": "\xef\x90\x96", // U+f416 + "CcDinersClub": "\xef\x89\x8c", // U+f24c + "CcDiscover": "\xef\x87\xb2", // U+f1f2 + "CcJcb": "\xef\x89\x8b", // U+f24b + "CcMastercard": "\xef\x87\xb1", // U+f1f1 + "CcPaypal": "\xef\x87\xb4", // U+f1f4 + "CcStripe": "\xef\x87\xb5", // U+f1f5 + "CcVisa": "\xef\x87\xb0", // U+f1f0 + "Centercode": "\xef\x8e\x80", // U+f380 + "Centos": "\xef\x9e\x89", // U+f789 + "Chrome": "\xef\x89\xa8", // U+f268 + "Chromecast": "\xef\xa0\xb8", // U+f838 + "CircleZulip": "\xee\xa1\x91", // U+e851 + "Claude": "\xee\xa1\xa1", // U+e861 + "Cloudflare": "\xee\x81\xbd", // U+e07d + "Cloudscale": "\xef\x8e\x83", // U+f383 + "Cloudsmith": "\xef\x8e\x84", // U+f384 + "Cloudversify": "\xef\x8e\x85", // U+f385 + "Cmplid": "\xee\x8d\xa0", // U+e360 + "Codepen": "\xef\x87\x8b", // U+f1cb + "Codiepie": "\xef\x8a\x84", // U+f284 + "Confluence": "\xef\x9e\x8d", // U+f78d + "Connectdevelop": "\xef\x88\x8e", // U+f20e + "Contao": "\xef\x89\xad", // U+f26d + "CottonBureau": "\xef\xa2\x9e", // U+f89e + "Cpanel": "\xef\x8e\x88", // U+f388 + "CreativeCommons": "\xef\x89\x9e", // U+f25e + "CreativeCommonsBy": "\xef\x93\xa7", // U+f4e7 + "CreativeCommonsNc": "\xef\x93\xa8", // U+f4e8 + "CreativeCommonsNcEu": "\xef\x93\xa9", // U+f4e9 + "CreativeCommonsNcJp": "\xef\x93\xaa", // U+f4ea + "CreativeCommonsNd": "\xef\x93\xab", // U+f4eb + "CreativeCommonsPd": "\xef\x93\xac", // U+f4ec + "CreativeCommonsPdAlt": "\xef\x93\xad", // U+f4ed + "CreativeCommonsRemix": "\xef\x93\xae", // U+f4ee + "CreativeCommonsSa": "\xef\x93\xaf", // U+f4ef + "CreativeCommonsSampling": "\xef\x93\xb0", // U+f4f0 + "CreativeCommonsSamplingPlus": "\xef\x93\xb1", // U+f4f1 + "CreativeCommonsShare": "\xef\x93\xb2", // U+f4f2 + "CreativeCommonsZero": "\xef\x93\xb3", // U+f4f3 + "CriticalRole": "\xef\x9b\x89", // U+f6c9 + "Css": "\xee\x9a\xa2", // U+e6a2 + "Css3": "\xef\x84\xbc", // U+f13c + "Css3Alt": "\xef\x8e\x8b", // U+f38b + "Cuttlefish": "\xef\x8e\x8c", // U+f38c + "DAndD": "\xef\x8e\x8d", // U+f38d + "DAndDBeyond": "\xef\x9b\x8a", // U+f6ca + "Dailymotion": "\xee\x81\x92", // U+e052 + "DartLang": "\xee\x9a\x93", // U+e693 + "Dashcube": "\xef\x88\x90", // U+f210 + "Debian": "\xee\x98\x8b", // U+e60b + "Deezer": "\xee\x81\xb7", // U+e077 + "Delicious": "\xef\x86\xa5", // U+f1a5 + "Deploydog": "\xef\x8e\x8e", // U+f38e + "Deskpro": "\xef\x8e\x8f", // U+f38f + "Dev": "\xef\x9b\x8c", // U+f6cc + "Deviantart": "\xef\x86\xbd", // U+f1bd + "Dhl": "\xef\x9e\x90", // U+f790 + "Diaspora": "\xef\x9e\x91", // U+f791 + "Digg": "\xef\x86\xa6", // U+f1a6 + "DigitalOcean": "\xef\x8e\x91", // U+f391 + "Discord": "\xef\x8e\x92", // U+f392 + "Discourse": "\xef\x8e\x93", // U+f393 + "Disqus": "\xee\x9f\x95", // U+e7d5 + "Dochub": "\xef\x8e\x94", // U+f394 + "Docker": "\xef\x8e\x95", // U+f395 + "Draft2digital": "\xef\x8e\x96", // U+f396 + "Dribbble": "\xef\x85\xbd", // U+f17d + "Dropbox": "\xef\x85\xab", // U+f16b + "Drupal": "\xef\x86\xa9", // U+f1a9 + "Duolingo": "\xee\xa0\x92", // U+e812 + "Dyalog": "\xef\x8e\x99", // U+f399 + "Earlybirds": "\xef\x8e\x9a", // U+f39a + "Ebay": "\xef\x93\xb4", // U+f4f4 + "Edge": "\xef\x8a\x82", // U+f282 + "EdgeLegacy": "\xee\x81\xb8", // U+e078 + "Elementor": "\xef\x90\xb0", // U+f430 + "Eleventy": "\xee\x9f\x96", // U+e7d6 + "Ello": "\xef\x97\xb1", // U+f5f1 + "Ember": "\xef\x90\xa3", // U+f423 + "Empire": "\xef\x87\x91", // U+f1d1 + "Envira": "\xef\x8a\x99", // U+f299 + "Erlang": "\xef\x8e\x9d", // U+f39d + "Ethereum": "\xef\x90\xae", // U+f42e + "Etsy": "\xef\x8b\x97", // U+f2d7 + "Evernote": "\xef\xa0\xb9", // U+f839 + "Expeditedssl": "\xef\x88\xbe", // U+f23e + "Facebook": "\xef\x82\x9a", // U+f09a + "FacebookF": "\xef\x8e\x9e", // U+f39e + "FacebookMessenger": "\xef\x8e\x9f", // U+f39f + "FantasyFlightGames": "\xef\x9b\x9c", // U+f6dc + "Fedex": "\xef\x9e\x97", // U+f797 + "Fediverse": "\xee\xa1\xa5", // U+e865 + "Fedora": "\xef\x9e\x98", // U+f798 + "Figma": "\xef\x9e\x99", // U+f799 + "FilesPinwheel": "\xee\x9a\x9f", // U+e69f + "Firefox": "\xef\x89\xa9", // U+f269 + "FirefoxBrowser": "\xee\x80\x87", // U+e007 + "FirstOrder": "\xef\x8a\xb0", // U+f2b0 + "FirstOrderAlt": "\xef\x94\x8a", // U+f50a + "Firstdraft": "\xef\x8e\xa1", // U+f3a1 + "Flickr": "\xef\x85\xae", // U+f16e + "Flipboard": "\xef\x91\x8d", // U+f44d + "Flutter": "\xee\x9a\x94", // U+e694 + "Fly": "\xef\x90\x97", // U+f417 + "FontAwesome": "\xef\x8a\xb4", // U+f2b4 + "Fonticons": "\xef\x8a\x80", // U+f280 + "FonticonsFi": "\xef\x8e\xa2", // U+f3a2 + "Forgejo": "\xee\xa1\xa0", // U+e860 + "FortAwesome": "\xef\x8a\x86", // U+f286 + "FortAwesomeAlt": "\xef\x8e\xa3", // U+f3a3 + "Forumbee": "\xef\x88\x91", // U+f211 + "Foursquare": "\xef\x86\x80", // U+f180 + "FreeCodeCamp": "\xef\x8b\x85", // U+f2c5 + "Freebsd": "\xef\x8e\xa4", // U+f3a4 + "Fulcrum": "\xef\x94\x8b", // U+f50b + "GalacticRepublic": "\xef\x94\x8c", // U+f50c + "GalacticSenate": "\xef\x94\x8d", // U+f50d + "GetPocket": "\xef\x89\xa5", // U+f265 + "Gg": "\xef\x89\xa0", // U+f260 + "GgCircle": "\xef\x89\xa1", // U+f261 + "Git": "\xef\x87\x93", // U+f1d3 + "GitAlt": "\xef\xa1\x81", // U+f841 + "Gitee": "\xee\xa1\xa3", // U+e863 + "Github": "\xef\x82\x9b", // U+f09b + "GithubAlt": "\xef\x84\x93", // U+f113 + "Gitkraken": "\xef\x8e\xa6", // U+f3a6 + "Gitlab": "\xef\x8a\x96", // U+f296 + "Gitter": "\xef\x90\xa6", // U+f426 + "Glide": "\xef\x8a\xa5", // U+f2a5 + "GlideG": "\xef\x8a\xa6", // U+f2a6 + "Globaleaks": "\xee\xa1\x9d", // U+e85d + "Gofore": "\xef\x8e\xa7", // U+f3a7 + "Golang": "\xee\x90\x8f", // U+e40f + "Goodreads": "\xef\x8e\xa8", // U+f3a8 + "GoodreadsG": "\xef\x8e\xa9", // U+f3a9 + "Google": "\xef\x86\xa0", // U+f1a0 + "GoogleDrive": "\xef\x8e\xaa", // U+f3aa + "GooglePay": "\xee\x81\xb9", // U+e079 + "GooglePlay": "\xef\x8e\xab", // U+f3ab + "GooglePlus": "\xef\x8a\xb3", // U+f2b3 + "GooglePlusG": "\xef\x83\x95", // U+f0d5 + "GoogleScholar": "\xee\x98\xbb", // U+e63b + "GoogleWallet": "\xef\x87\xae", // U+f1ee + "Gratipay": "\xef\x86\x84", // U+f184 + "Grav": "\xef\x8b\x96", // U+f2d6 + "Gripfire": "\xef\x8e\xac", // U+f3ac + "Grunt": "\xef\x8e\xad", // U+f3ad + "Guilded": "\xee\x81\xbe", // U+e07e + "Gulp": "\xef\x8e\xae", // U+f3ae + "HackerNews": "\xef\x87\x94", // U+f1d4 + "Hackerrank": "\xef\x97\xb7", // U+f5f7 + "Hashnode": "\xee\x92\x99", // U+e499 + "Hips": "\xef\x91\x92", // U+f452 + "HireAHelper": "\xef\x8e\xb0", // U+f3b0 + "Hive": "\xee\x81\xbf", // U+e07f + "Hooli": "\xef\x90\xa7", // U+f427 + "Hornbill": "\xef\x96\x92", // U+f592 + "Hotjar": "\xef\x8e\xb1", // U+f3b1 + "Houzz": "\xef\x89\xbc", // U+f27c + "Html5": "\xef\x84\xbb", // U+f13b + "Hubspot": "\xef\x8e\xb2", // U+f3b2 + "HuggingFace": "\xee\xa1\xa9", // U+e869 + "Ideal": "\xee\x80\x93", // U+e013 + "Imdb": "\xef\x8b\x98", // U+f2d8 + "Instagram": "\xef\x85\xad", // U+f16d + "Instalod": "\xee\x82\x81", // U+e081 + "Intercom": "\xef\x9e\xaf", // U+f7af + "InternetExplorer": "\xef\x89\xab", // U+f26b + "Invision": "\xef\x9e\xb0", // U+f7b0 + "Ioxhost": "\xef\x88\x88", // U+f208 + "ItchIo": "\xef\xa0\xba", // U+f83a + "Itunes": "\xef\x8e\xb4", // U+f3b4 + "ItunesNote": "\xef\x8e\xb5", // U+f3b5 + "Java": "\xef\x93\xa4", // U+f4e4 + "JediOrder": "\xef\x94\x8e", // U+f50e + "Jenkins": "\xef\x8e\xb6", // U+f3b6 + "Jira": "\xef\x9e\xb1", // U+f7b1 + "Joget": "\xef\x8e\xb7", // U+f3b7 + "Joomla": "\xef\x86\xaa", // U+f1aa + "Js": "\xef\x8e\xb8", // U+f3b8 + "Jsfiddle": "\xef\x87\x8c", // U+f1cc + "Julia": "\xee\xa1\x92", // U+e852 + "Jxl": "\xee\x99\xbb", // U+e67b + "Kaggle": "\xef\x97\xba", // U+f5fa + "KakaoTalk": "\xee\x9f\x97", // U+e7d7 + "Keybase": "\xef\x93\xb5", // U+f4f5 + "Keycdn": "\xef\x8e\xba", // U+f3ba + "Kickstarter": "\xef\x8e\xbb", // U+f3bb + "KickstarterK": "\xef\x8e\xbc", // U+f3bc + "KoFi": "\xee\xa1\x96", // U+e856 + "Korvue": "\xef\x90\xaf", // U+f42f + "Kubernetes": "\xee\xa1\x97", // U+e857 + "Laravel": "\xef\x8e\xbd", // U+f3bd + "Lastfm": "\xef\x88\x82", // U+f202 + "Leanpub": "\xef\x88\x92", // U+f212 + "Leetcode": "\xee\xa1\xaa", // U+e86a + "Less": "\xef\x90\x9d", // U+f41d + "Letterboxd": "\xee\x98\xad", // U+e62d + "Line": "\xef\x8f\x80", // U+f3c0 + "Linkedin": "\xef\x82\x8c", // U+f08c + "LinkedinIn": "\xef\x83\xa1", // U+f0e1 + "Linktree": "\xee\x9f\x98", // U+e7d8 + "Linode": "\xef\x8a\xb8", // U+f2b8 + "Linux": "\xef\x85\xbc", // U+f17c + "Lumon": "\xee\x9f\xa2", // U+e7e2 + "LumonDrop": "\xee\x9f\xa3", // U+e7e3 + "Lyft": "\xef\x8f\x83", // U+f3c3 + "Magento": "\xef\x8f\x84", // U+f3c4 + "Mailchimp": "\xef\x96\x9e", // U+f59e + "Mandalorian": "\xef\x94\x8f", // U+f50f + "Markdown": "\xef\x98\x8f", // U+f60f + "Mastodon": "\xef\x93\xb6", // U+f4f6 + "Maxcdn": "\xef\x84\xb6", // U+f136 + "Mdb": "\xef\xa3\x8a", // U+f8ca + "Medapps": "\xef\x8f\x86", // U+f3c6 + "Medium": "\xef\x88\xba", // U+f23a + "Medrt": "\xef\x8f\x88", // U+f3c8 + "Meetup": "\xef\x8b\xa0", // U+f2e0 + "Megaport": "\xef\x96\xa3", // U+f5a3 + "Mendeley": "\xef\x9e\xb3", // U+f7b3 + "Meta": "\xee\x92\x9b", // U+e49b + "Microblog": "\xee\x80\x9a", // U+e01a + "Microsoft": "\xef\x8f\x8a", // U+f3ca + "Mintbit": "\xee\x98\xaf", // U+e62f + "Mix": "\xef\x8f\x8b", // U+f3cb + "Mixcloud": "\xef\x8a\x89", // U+f289 + "Mixer": "\xee\x81\x96", // U+e056 + "Mizuni": "\xef\x8f\x8c", // U+f3cc + "Modx": "\xef\x8a\x85", // U+f285 + "Monero": "\xef\x8f\x90", // U+f3d0 + "Napster": "\xef\x8f\x92", // U+f3d2 + "Neos": "\xef\x98\x92", // U+f612 + "NfcDirectional": "\xee\x94\xb0", // U+e530 + "NfcSymbol": "\xee\x94\xb1", // U+e531 + "Nimblr": "\xef\x96\xa8", // U+f5a8 + "Node": "\xef\x90\x99", // U+f419 + "NodeJs": "\xef\x8f\x93", // U+f3d3 + "Notion": "\xee\x9f\x99", // U+e7d9 + "Npm": "\xef\x8f\x94", // U+f3d4 + "Ns8": "\xef\x8f\x95", // U+f3d5 + "Nutritionix": "\xef\x8f\x96", // U+f3d6 + "Obsidian": "\xee\xa1\xb9", // U+e879 + "OctopusDeploy": "\xee\x82\x82", // U+e082 + "Odnoklassniki": "\xef\x89\xa3", // U+f263 + "Odysee": "\xee\x97\x86", // U+e5c6 + "OldRepublic": "\xef\x94\x90", // U+f510 + "Openai": "\xee\x9f\x8f", // U+e7cf + "Opencart": "\xef\x88\xbd", // U+f23d + "Openid": "\xef\x86\x9b", // U+f19b + "Openstreetmap": "\xee\xa1\xab", // U+e86b + "Opensuse": "\xee\x98\xab", // U+e62b + "Opera": "\xef\x89\xaa", // U+f26a + "OptinMonster": "\xef\x88\xbc", // U+f23c + "Orcid": "\xef\xa3\x92", // U+f8d2 + "Osi": "\xef\x90\x9a", // U+f41a + "Padlet": "\xee\x92\xa0", // U+e4a0 + "Page4": "\xef\x8f\x97", // U+f3d7 + "Pagelines": "\xef\x86\x8c", // U+f18c + "Palfed": "\xef\x8f\x98", // U+f3d8 + "Pandora": "\xee\x9f\x9a", // U+e7da + "Patreon": "\xef\x8f\x99", // U+f3d9 + "Paypal": "\xef\x87\xad", // U+f1ed + "Perbyte": "\xee\x82\x83", // U+e083 + "Periscope": "\xef\x8f\x9a", // U+f3da + "Phabricator": "\xef\x8f\x9b", // U+f3db + "PhoenixFramework": "\xef\x8f\x9c", // U+f3dc + "PhoenixSquadron": "\xef\x94\x91", // U+f511 + "Php": "\xef\x91\x97", // U+f457 + "PiedPiper": "\xef\x8a\xae", // U+f2ae + "PiedPiperAlt": "\xef\x86\xa8", // U+f1a8 + "PiedPiperHat": "\xef\x93\xa5", // U+f4e5 + "PiedPiperPp": "\xef\x86\xa7", // U+f1a7 + "Pinterest": "\xef\x83\x92", // U+f0d2 + "PinterestP": "\xef\x88\xb1", // U+f231 + "Pix": "\xee\x90\xba", // U+e43a + "Pixelfed": "\xee\x9f\x9b", // U+e7db + "Pixiv": "\xee\x99\x80", // U+e640 + "Playstation": "\xef\x8f\x9f", // U+f3df + "Postgresql": "\xee\xa1\x98", // U+e858 + "ProductHunt": "\xef\x8a\x88", // U+f288 + "Pushed": "\xef\x8f\xa1", // U+f3e1 + "Python": "\xef\x8f\xa2", // U+f3e2 + "Qq": "\xef\x87\x96", // U+f1d6 + "Quinscape": "\xef\x91\x99", // U+f459 + "Quora": "\xef\x8b\x84", // U+f2c4 + "RProject": "\xef\x93\xb7", // U+f4f7 + "RaspberryPi": "\xef\x9e\xbb", // U+f7bb + "Ravelry": "\xef\x8b\x99", // U+f2d9 + "React": "\xef\x90\x9b", // U+f41b + "Reacteurope": "\xef\x9d\x9d", // U+f75d + "Readme": "\xef\x93\x95", // U+f4d5 + "Rebel": "\xef\x87\x90", // U+f1d0 + "RedRiver": "\xef\x8f\xa3", // U+f3e3 + "Reddit": "\xef\x86\xa1", // U+f1a1 + "RedditAlien": "\xef\x8a\x81", // U+f281 + "Redhat": "\xef\x9e\xbc", // U+f7bc + "Renren": "\xef\x86\x8b", // U+f18b + "Replyd": "\xef\x8f\xa6", // U+f3e6 + "Researchgate": "\xef\x93\xb8", // U+f4f8 + "Resolving": "\xef\x8f\xa7", // U+f3e7 + "Rev": "\xef\x96\xb2", // U+f5b2 + "Rocketchat": "\xef\x8f\xa8", // U+f3e8 + "Rockrms": "\xef\x8f\xa9", // U+f3e9 + "Rust": "\xee\x81\xba", // U+e07a + "Safari": "\xef\x89\xa7", // U+f267 + "Salesforce": "\xef\xa0\xbb", // U+f83b + "Sass": "\xef\x90\x9e", // U+f41e + "Scaleway": "\xee\xa1\x99", // U+e859 + "Schlix": "\xef\x8f\xaa", // U+f3ea + "Screenpal": "\xee\x95\xb0", // U+e570 + "Scribd": "\xef\x8a\x8a", // U+f28a + "Searchengin": "\xef\x8f\xab", // U+f3eb + "Sellcast": "\xef\x8b\x9a", // U+f2da + "Sellsy": "\xef\x88\x93", // U+f213 + "Servicestack": "\xef\x8f\xac", // U+f3ec + "Shirtsinbulk": "\xef\x88\x94", // U+f214 + "Shoelace": "\xee\x98\x8c", // U+e60c + "Shopify": "\xee\x81\x97", // U+e057 + "Shopware": "\xef\x96\xb5", // U+f5b5 + "SignalMessenger": "\xee\x99\xa3", // U+e663 + "Simplybuilt": "\xef\x88\x95", // U+f215 + "Sistrix": "\xef\x8f\xae", // U+f3ee + "Sith": "\xef\x94\x92", // U+f512 + "Sitrox": "\xee\x91\x8a", // U+e44a + "Sketch": "\xef\x9f\x86", // U+f7c6 + "Skyatlas": "\xef\x88\x96", // U+f216 + "Skype": "\xef\x85\xbe", // U+f17e + "Slack": "\xef\x86\x98", // U+f198 + "Slideshare": "\xef\x87\xa7", // U+f1e7 + "Snapchat": "\xef\x8a\xab", // U+f2ab + "Solana": "\xee\xa1\x9e", // U+e85e + "Soundcloud": "\xef\x86\xbe", // U+f1be + "Sourcetree": "\xef\x9f\x93", // U+f7d3 + "SpaceAwesome": "\xee\x96\xac", // U+e5ac + "Speakap": "\xef\x8f\xb3", // U+f3f3 + "SpeakerDeck": "\xef\xa0\xbc", // U+f83c + "Spotify": "\xef\x86\xbc", // U+f1bc + "SquareBehance": "\xef\x86\xb5", // U+f1b5 + "SquareBluesky": "\xee\x9a\xa3", // U+e6a3 + "SquareDeskpro": "\xee\xa1\x84", // U+e844 + "SquareDribbble": "\xef\x8e\x97", // U+f397 + "SquareFacebook": "\xef\x82\x82", // U+f082 + "SquareFigma": "\xee\x9f\xa4", // U+e7e4 + "SquareFontAwesome": "\xee\x96\xad", // U+e5ad + "SquareFontAwesomeStroke": "\xef\x8d\x9c", // U+f35c + "SquareGit": "\xef\x87\x92", // U+f1d2 + "SquareGithub": "\xef\x82\x92", // U+f092 + "SquareGitlab": "\xee\x96\xae", // U+e5ae + "SquareGooglePlus": "\xef\x83\x94", // U+f0d4 + "SquareHackerNews": "\xef\x8e\xaf", // U+f3af + "SquareInstagram": "\xee\x81\x95", // U+e055 + "SquareJs": "\xef\x8e\xb9", // U+f3b9 + "SquareLastfm": "\xef\x88\x83", // U+f203 + "SquareLetterboxd": "\xee\x98\xae", // U+e62e + "SquareLinkedin": "\xee\x9f\x90", // U+e7d0 + "SquareOdnoklassniki": "\xef\x89\xa4", // U+f264 + "SquarePiedPiper": "\xee\x80\x9e", // U+e01e + "SquarePinterest": "\xef\x83\x93", // U+f0d3 + "SquareReddit": "\xef\x86\xa2", // U+f1a2 + "SquareSnapchat": "\xef\x8a\xad", // U+f2ad + "SquareSteam": "\xef\x86\xb7", // U+f1b7 + "SquareThreads": "\xee\x98\x99", // U+e619 + "SquareTumblr": "\xef\x85\xb4", // U+f174 + "SquareTwitter": "\xef\x82\x81", // U+f081 + "SquareUpwork": "\xee\x99\xbc", // U+e67c + "SquareViadeo": "\xef\x8a\xaa", // U+f2aa + "SquareVimeo": "\xef\x86\x94", // U+f194 + "SquareWebAwesome": "\xee\x9a\x83", // U+e683 + "SquareWebAwesomeStroke": "\xee\x9a\x84", // U+e684 + "SquareWhatsapp": "\xef\x90\x8c", // U+f40c + "SquareXTwitter": "\xee\x98\x9a", // U+e61a + "SquareXing": "\xef\x85\xa9", // U+f169 + "SquareYoutube": "\xef\x90\xb1", // U+f431 + "Squarespace": "\xef\x96\xbe", // U+f5be + "StackExchange": "\xef\x86\x8d", // U+f18d + "StackOverflow": "\xef\x85\xac", // U+f16c + "Stackpath": "\xef\xa1\x82", // U+f842 + "Staylinked": "\xef\x8f\xb5", // U+f3f5 + "Steam": "\xef\x86\xb6", // U+f1b6 + "SteamSymbol": "\xef\x8f\xb6", // U+f3f6 + "StickerMule": "\xef\x8f\xb7", // U+f3f7 + "Strava": "\xef\x90\xa8", // U+f428 + "Stripe": "\xef\x90\xa9", // U+f429 + "StripeS": "\xef\x90\xaa", // U+f42a + "Stubber": "\xee\x97\x87", // U+e5c7 + "Studiovinari": "\xef\x8f\xb8", // U+f3f8 + "Stumbleupon": "\xef\x86\xa4", // U+f1a4 + "StumbleuponCircle": "\xef\x86\xa3", // U+f1a3 + "Superpowers": "\xef\x8b\x9d", // U+f2dd + "Supple": "\xef\x8f\xb9", // U+f3f9 + "Supportnow": "\xee\xa0\xb3", // U+e833 + "Suse": "\xef\x9f\x96", // U+f7d6 + "Svelte": "\xee\xa1\xa8", // U+e868 + "Swift": "\xef\xa3\xa1", // U+f8e1 + "Symfony": "\xef\xa0\xbd", // U+f83d + "Symfonycasts": "\xee\xa2\xab", // U+e8ab + "TailwindCss": "\xee\xa1\xa6", // U+e866 + "Teamspeak": "\xef\x93\xb9", // U+f4f9 + "Telegram": "\xef\x8b\x86", // U+f2c6 + "TencentWeibo": "\xef\x87\x95", // U+f1d5 + "Tex": "\xee\x9f\xbf", // U+e7ff + "TheRedYeti": "\xef\x9a\x9d", // U+f69d + "Themeco": "\xef\x97\x86", // U+f5c6 + "Themeisle": "\xef\x8a\xb2", // U+f2b2 + "ThinkPeaks": "\xef\x9c\xb1", // U+f731 + "Threads": "\xee\x98\x98", // U+e618 + "Threema": "\xee\xa1\x9f", // U+e85f + "Tidal": "\xee\x9f\x9c", // U+e7dc + "Tiktok": "\xee\x81\xbb", // U+e07b + "TorBrowser": "\xee\xa0\xb8", // U+e838 + "TradeFederation": "\xef\x94\x93", // U+f513 + "Trello": "\xef\x86\x81", // U+f181 + "Tumblr": "\xef\x85\xb3", // U+f173 + "Twitch": "\xef\x87\xa8", // U+f1e8 + "Twitter": "\xef\x82\x99", // U+f099 + "Typescript": "\xee\xa1\x80", // U+e840 + "Typo3": "\xef\x90\xab", // U+f42b + "Uber": "\xef\x90\x82", // U+f402 + "Ubuntu": "\xef\x9f\x9f", // U+f7df + "Uikit": "\xef\x90\x83", // U+f403 + "Ultralytics": "\xee\xa1\xad", // U+e86d + "UltralyticsHub": "\xee\xa1\xae", // U+e86e + "UltralyticsYolo": "\xee\xa1\xaf", // U+e86f + "Umbraco": "\xef\xa3\xa8", // U+f8e8 + "Uncharted": "\xee\x82\x84", // U+e084 + "Uniregistry": "\xef\x90\x84", // U+f404 + "Unison": "\xee\xa1\x94", // U+e854 + "Unity": "\xee\x81\x89", // U+e049 + "UnrealEngine": "\xee\xa1\x9c", // U+e85c + "Unsplash": "\xee\x81\xbc", // U+e07c + "Untappd": "\xef\x90\x85", // U+f405 + "Ups": "\xef\x9f\xa0", // U+f7e0 + "Upwork": "\xee\x99\x81", // U+e641 + "Usb": "\xef\x8a\x87", // U+f287 + "Usps": "\xef\x9f\xa1", // U+f7e1 + "Ussunnah": "\xef\x90\x87", // U+f407 + "Vaadin": "\xef\x90\x88", // U+f408 + "Venmo": "\xee\xa1\x9a", // U+e85a + "VenmoV": "\xee\xa1\x9b", // U+e85b + "Viacoin": "\xef\x88\xb7", // U+f237 + "Viadeo": "\xef\x8a\xa9", // U+f2a9 + "Viber": "\xef\x90\x89", // U+f409 + "Vim": "\xee\xa2\x8a", // U+e88a + "Vimeo": "\xef\x90\x8a", // U+f40a + "VimeoV": "\xef\x89\xbd", // U+f27d + "Vine": "\xef\x87\x8a", // U+f1ca + "Vk": "\xef\x86\x89", // U+f189 + "Vnv": "\xef\x90\x8b", // U+f40b + "Vsco": "\xee\x9f\x9d", // U+e7dd + "Vuejs": "\xef\x90\x9f", // U+f41f + "W3c": "\xee\x9f\x9e", // U+e7de + "WatchmanMonitoring": "\xee\x82\x87", // U+e087 + "Waze": "\xef\xa0\xbf", // U+f83f + "WebAwesome": "\xee\x9a\x82", // U+e682 + "Webflow": "\xee\x99\x9c", // U+e65c + "Weebly": "\xef\x97\x8c", // U+f5cc + "Weibo": "\xef\x86\x8a", // U+f18a + "Weixin": "\xef\x87\x97", // U+f1d7 + "Whatsapp": "\xef\x88\xb2", // U+f232 + "Whmcs": "\xef\x90\x8d", // U+f40d + "WikipediaW": "\xef\x89\xa6", // U+f266 + "Windows": "\xef\x85\xba", // U+f17a + "Wirsindhandwerk": "\xee\x8b\x90", // U+e2d0 + "Wix": "\xef\x97\x8f", // U+f5cf + "WizardsOfTheCoast": "\xef\x9c\xb0", // U+f730 + "Wodu": "\xee\x82\x88", // U+e088 + "WolfPackBattalion": "\xef\x94\x94", // U+f514 + "Wordpress": "\xef\x86\x9a", // U+f19a + "WordpressSimple": "\xef\x90\x91", // U+f411 + "Wpbeginner": "\xef\x8a\x97", // U+f297 + "Wpexplorer": "\xef\x8b\x9e", // U+f2de + "Wpforms": "\xef\x8a\x98", // U+f298 + "Wpressr": "\xef\x8f\xa4", // U+f3e4 + "XTwitter": "\xee\x98\x9b", // U+e61b + "Xbox": "\xef\x90\x92", // U+f412 + "Xing": "\xef\x85\xa8", // U+f168 + "Xmpp": "\xee\xa1\xa4", // U+e864 + "YCombinator": "\xef\x88\xbb", // U+f23b + "Yahoo": "\xef\x86\x9e", // U+f19e + "Yammer": "\xef\xa1\x80", // U+f840 + "Yandex": "\xef\x90\x93", // U+f413 + "YandexInternational": "\xef\x90\x94", // U+f414 + "Yarn": "\xef\x9f\xa3", // U+f7e3 + "Yelp": "\xef\x87\xa9", // U+f1e9 + "Yoast": "\xef\x8a\xb1", // U+f2b1 + "Youtube": "\xef\x85\xa7", // U+f167 + "Zhihu": "\xef\x98\xbf", // U+f63f + "Zoom": "\xee\xa1\xbb", // U+e87b + "Zulip": "\xee\xa1\x93", // U+e853 + } diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..df2eb22 --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module streamdeck-lets-go + +go 1.26.4 + +require ( + github.com/bearsh/hid v1.6.0 + github.com/dh1tw/streamdeck v1.0.0 + github.com/disintegration/gift v1.2.1 + golang.org/x/image v0.42.0 +) + +require ( + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + golang.org/x/sys v0.36.0 // indirect + golang.org/x/text v0.38.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7b9c15c --- /dev/null +++ b/go.sum @@ -0,0 +1,22 @@ +github.com/bearsh/hid v1.6.0 h1:eOBSuF2pg+SCytKGuGjOzZx73xQ72gevJ5IlFvzgfGE= +github.com/bearsh/hid v1.6.0/go.mod h1:7JhM3r/tm4ALu4WWFqshda+Q6aIcnGRpUR08sx/dHdc= +github.com/dgottlieb/smarty-assertions v1.2.6 h1:YAXgSslRBbVtd54iTqM4yGT2k1a2qS6cffNQo0SDxDY= +github.com/dgottlieb/smarty-assertions v1.2.6/go.mod h1:x1wpV/RTxYWtN+vgrcRuCF4hjUmonK5NR59ZzQSym2k= +github.com/dh1tw/streamdeck v1.0.0 h1:YyK0g3BLuPQDXnNypwMBbDjbAUDdY073fYeTG5qPXH4= +github.com/dh1tw/streamdeck v1.0.0/go.mod h1:+EqLcYGV7m9jyRVSLTpQkl0BDmRTJEcOTSfcrf1FRzs= +github.com/disintegration/gift v1.2.1 h1:Y005a1X4Z7Uc+0gLpSAsKhWi4qLtsdEcMIbbdvdZ6pc= +github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +go.viam.com/test v1.2.4 h1:JYgZhsuGAQ8sL9jWkziAXN9VJJiKbjoi9BsO33TW3ug= +go.viam.com/test v1.2.4/go.mod h1:zI2xzosHdqXAJ/kFqcN+OIF78kQuTV2nIhGZ8EzvaJI= +golang.org/x/image v0.42.0 h1:1gSs6ehNWXLbkHBIPcWztk3D/6aIA/8hauiAYtlodVY= +golang.org/x/image v0.42.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= diff --git a/icons.go b/icons.go new file mode 100644 index 0000000..cb54fb2 --- /dev/null +++ b/icons.go @@ -0,0 +1,205 @@ +package main + +import ( + "bytes" + "fmt" + "image" + _ "image/png" + "os" + "os/exec" + "path/filepath" + "sort" + "strconv" + "strings" + "sync" +) + +func iconThemeDirs() []string { + dirs := []string{} + + if home := os.Getenv("HOME"); home != "" { + dirs = append(dirs, filepath.Join(home, ".local/share/icons")) + } + + xdgDirs := os.Getenv("XDG_DATA_DIRS") + if xdgDirs == "" { + xdgDirs = "/usr/local/share:/usr/share" + } + for _, d := range filepath.SplitList(xdgDirs) { + dirs = append(dirs, filepath.Join(d, "icons")) + } + + return uniquePaths(dirs) +} + +func uniquePaths(paths []string) []string { + seen := make(map[string]bool) + res := make([]string, 0, len(paths)) + for _, p := range paths { + if !seen[p] { + seen[p] = true + res = append(res, p) + } + } + return res +} + +func preferredThemes() []string { + theme := detectGtkTheme() + if theme != "" { + return []string{theme, "hicolor", "Adwaita", "Papirus", "Humanity", "breeze", "gnome"} + } + return []string{"hicolor", "Adwaita", "Papirus", "Humanity", "breeze", "gnome"} +} + +func detectGtkTheme() string { + data, err := os.ReadFile(filepath.Join(os.Getenv("HOME"), ".config/gtk-4.0/settings.ini")) + if err != nil { + data, err = os.ReadFile(filepath.Join(os.Getenv("HOME"), ".config/gtk-3.0/settings.ini")) + if err != nil { + return "" + } + } + for _, line := range strings.Split(string(data), "\n") { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "gtk-icon-theme-name=") { + return strings.TrimSpace(line[len("gtk-icon-theme-name="):]) + } + } + return "" +} + +func sizeDirs(target int) []string { + sizes := []int{} + + for _, base := range []int{16, 22, 24, 32, 48, 64, 72, 96, 128, 192, 256} { + sizes = append(sizes, base) + } + + sort.Slice(sizes, func(i, j int) bool { + di := abs(sizes[i] - target) + dj := abs(sizes[j] - target) + if di != dj { + return di < dj + } + return sizes[i] > sizes[j] + }) + + seen := make(map[int]bool) + res := make([]string, 0, len(sizes)) + for _, s := range sizes { + if seen[s] { + continue + } + seen[s] = true + res = append(res, fmt.Sprintf("%dx%d", s, s)) + } + res = append(res, "scalable") + return res +} + +func abs(x int) int { + if x < 0 { + return -x + } + return x +} + +func iconCategories() []string { + return []string{"actions", "apps", "categories", "devices", "emblems", "mimetypes", "places", "status"} +} + +func findSystemIcon(name string, targetSize int) (string, error) { + themes := preferredThemes() + dirs := iconThemeDirs() + sDirs := sizeDirs(targetSize) + cats := iconCategories() + + for _, base := range dirs { + for _, theme := range themes { + themeDir := filepath.Join(base, theme) + if _, err := os.Stat(themeDir); os.IsNotExist(err) { + continue + } + + for _, sd := range sDirs { + for _, cat := range cats { + for _, ext := range []string{"png", "xpm"} { + p := filepath.Join(themeDir, sd, cat, name+"."+ext) + if fi, err := os.Stat(p); err == nil && !fi.IsDir() { + return p, nil + } + } + } + } + + for _, sd := range sDirs { + for _, cat := range cats { + p := filepath.Join(themeDir, sd, cat, name+".svg") + if fi, err := os.Stat(p); err == nil && !fi.IsDir() { + return p, nil + } + } + } + } + } + + return "", fmt.Errorf("system icon %q not found", name) +} + +func svgToPNG(svgPath string, targetSize int) (image.Image, error) { + cmd := exec.Command("rsvg-convert", + "-w", strconv.Itoa(targetSize), + "-h", strconv.Itoa(targetSize), + "-f", "png", + svgPath, + ) + out, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("rsvg-convert: %w", err) + } + img, _, err := image.Decode(bytes.NewReader(out)) + if err != nil { + return nil, fmt.Errorf("decode converted svg: %w", err) + } + return img, nil +} + +var iconSizeCache sync.Map + +func loadSystemIcon(name string, targetSize int) (string, error) { + type cacheKey struct { + name string + size int + } + key := cacheKey{name, targetSize} + if cached, ok := iconSizeCache.Load(key); ok { + return cached.(string), nil + } + path, err := findSystemIcon(name, targetSize) + if err != nil { + return "", err + } + iconSizeCache.Store(key, path) + return path, nil +} + +func isSystemIconRef(path string) bool { + return strings.HasPrefix(path, "@") +} + +func systemIconName(path string) string { + return strings.TrimPrefix(path, "@") +} + +func parseSizeDir(dirName string) (int, bool) { + parts := strings.SplitN(dirName, "x", 2) + if len(parts) != 2 { + return 0, false + } + s, err := strconv.Atoi(parts[0]) + if err != nil { + return 0, false + } + return s, true +} diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..953b865 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,266 @@ +package config + +import ( + "encoding/json" + "fmt" + "log/slog" + "os" + "path/filepath" + "regexp" + "time" +) + +type Config struct { + Version int `json:"version"` + LogLevel string `json:"log_level"` + DefaultPage string `json:"default_page"` + Devices []DeviceConfig `json:"devices"` + Pages []PageConfig `json:"pages"` + AutoSwitch []SwitchRule `json:"auto_switch"` + Screensaver ScreensaverCfg `json:"screensaver"` +} + +type DeviceConfig struct { + Serial string `json:"serial"` + Brightness int `json:"brightness"` + Rotation int `json:"rotation,omitempty"` +} + +type PageConfig struct { + Name string `json:"name"` + Icon string `json:"icon,omitempty"` + Keys []KeyConfig `json:"keys"` + Background string `json:"background,omitempty"` + Screensaver *ScreensaverCfg `json:"screensaver,omitempty"` +} + +type KeyConfig struct { + Index int `json:"index"` + Icon string `json:"icon,omitempty"` + Background string `json:"background,omitempty"` + Label string `json:"label,omitempty"` + Font string `json:"font,omitempty"` + FontSize *float64 `json:"font_size,omitempty"` + IconScale *float64 `json:"icon_scale,omitempty"` + Action *Action `json:"action,omitempty"` + Display *DisplayCfg `json:"display,omitempty"` +} + +type Action struct { + Type string `json:"type"` + Command string `json:"command,omitempty"` + Builtin string `json:"builtin,omitempty"` + Script string `json:"script,omitempty"` + Page string `json:"page,omitempty"` + Background bool `json:"background,omitempty"` + Keys string `json:"keys,omitempty"` +} + +type DisplayCfg struct { + Command string `json:"command,omitempty"` + Script string `json:"script,omitempty"` + Interval string `json:"interval"` + MaxLen int `json:"max_len,omitempty"` + Timeout string `json:"timeout,omitempty"` +} + +type SwitchRule struct { + WMClass string `json:"wm_class"` + Title string `json:"title,omitempty"` + Page string `json:"page"` + Devices []string `json:"devices,omitempty"` + Stay bool `json:"stay,omitempty"` +} + +type ScreensaverCfg struct { + Enabled bool `json:"enabled"` + IdleSeconds int `json:"idle_seconds,omitempty"` + Image string `json:"image,omitempty"` + Brightness int `json:"brightness,omitempty"` +} + +func DefaultConfig() *Config { + return &Config{ + Version: 1, + LogLevel: "info", + DefaultPage: "default", + Pages: []PageConfig{ + { + Name: "default", + Keys: []KeyConfig{}, + }, + }, + } +} + +func ConfigPath(path string) string { + if path != "" { + return path + } + home, err := os.UserHomeDir() + if err != nil { + return "config.json" + } + return filepath.Join(home, ".config", "streamdeck-lets-go", "config.json") +} + +func LoadConfig(path string) (*Config, error) { + path = ConfigPath(path) + data, err := os.ReadFile(path) + if err != nil { + if os.IsNotExist(err) { + slog.Info("config not found, using defaults", "path", path) + return DefaultConfig(), nil + } + return nil, fmt.Errorf("reading config: %w", err) + } + + var cfg Config + if err := json.Unmarshal(data, &cfg); err != nil { + return nil, fmt.Errorf("parsing config: %w", err) + } + + if err := cfg.Validate(); err != nil { + return nil, fmt.Errorf("invalid config: %w", err) + } + + return &cfg, nil +} + +func (c *Config) Save(path string) error { + path = ConfigPath(path) + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + return fmt.Errorf("creating config dir: %w", err) + } + data, err := json.MarshalIndent(c, "", " ") + if err != nil { + return fmt.Errorf("marshaling config: %w", err) + } + if err := os.WriteFile(path, data, 0644); err != nil { + return fmt.Errorf("writing config: %w", err) + } + return nil +} + +func (c *Config) Validate() error { + if c.Version < 1 { + return fmt.Errorf("unsupported config version: %d", c.Version) + } + if c.DefaultPage == "" { + return fmt.Errorf("default_page is required") + } + pageNames := make(map[string]bool) + for _, p := range c.Pages { + if p.Name == "" { + return fmt.Errorf("page name is required") + } + if pageNames[p.Name] { + return fmt.Errorf("duplicate page name: %s", p.Name) + } + pageNames[p.Name] = true + + seenKeys := make(map[int]bool) + maxKey := 31 + for _, k := range p.Keys { + if k.Index < 0 { + return fmt.Errorf("page %s: key index must be >= 0", p.Name) + } + if k.Index > maxKey { + return fmt.Errorf("page %s: key index %d exceeds max %d", p.Name, k.Index, maxKey) + } + if seenKeys[k.Index] { + return fmt.Errorf("page %s: duplicate key index %d", p.Name, k.Index) + } + seenKeys[k.Index] = true + + if k.Action != nil { + switch k.Action.Type { + case "command": + if k.Action.Command == "" { + return fmt.Errorf("page %s key %d: command required for command action", p.Name, k.Index) + } + case "builtin": + case "script": + if k.Action.Script == "" { + return fmt.Errorf("page %s key %d: script path required for script action", p.Name, k.Index) + } + case "page": + if k.Action.Page == "" { + return fmt.Errorf("page %s key %d: page name required for page action", p.Name, k.Index) + } + case "keyboard": + if k.Action.Keys == "" { + return fmt.Errorf("page %s key %d: keys required for keyboard action", p.Name, k.Index) + } + case "": + return fmt.Errorf("page %s key %d: action type is required", p.Name, k.Index) + default: + return fmt.Errorf("page %s key %d: unknown action type: %s", p.Name, k.Index, k.Action.Type) + } + } + + if k.Display != nil { + if k.Display.Command == "" && k.Display.Script == "" { + return fmt.Errorf("page %s key %d: display requires command or script", p.Name, k.Index) + } + if k.Display.Command != "" && k.Display.Script != "" { + return fmt.Errorf("page %s key %d: display command and script are mutually exclusive", p.Name, k.Index) + } + if k.Display.Interval == "" { + return fmt.Errorf("page %s key %d: display interval is required", p.Name, k.Index) + } + interval, err := time.ParseDuration(k.Display.Interval) + if err != nil { + return fmt.Errorf("page %s key %d: invalid display interval %q: %w", p.Name, k.Index, k.Display.Interval, err) + } + if interval < time.Second { + return fmt.Errorf("page %s key %d: display interval must be at least 1s", p.Name, k.Index) + } + if interval > 24*time.Hour { + return fmt.Errorf("page %s key %d: display interval must not exceed 24h", p.Name, k.Index) + } + if k.Display.Timeout != "" { + if _, err := time.ParseDuration(k.Display.Timeout); err != nil { + return fmt.Errorf("page %s key %d: invalid display timeout %q: %w", p.Name, k.Index, k.Display.Timeout, err) + } + } + if k.Display.MaxLen < 0 { + return fmt.Errorf("page %s key %d: max_len must be >= 0", p.Name, k.Index) + } + if k.Display.MaxLen > 4096 { + return fmt.Errorf("page %s key %d: max_len must be <= 4096", p.Name, k.Index) + } + } + } + } + + for _, p := range c.Pages { + for _, k := range p.Keys { + if k.Action != nil && k.Action.Type == "page" { + if !pageNames[k.Action.Page] { + return fmt.Errorf("page %s key %d: references unknown page %q", p.Name, k.Index, k.Action.Page) + } + } + } + } + + for _, sr := range c.AutoSwitch { + if sr.WMClass == "" && sr.Title == "" { + return fmt.Errorf("auto_switch rule: wm_class or title is required") + } + if !pageNames[sr.Page] { + return fmt.Errorf("auto_switch rule: references unknown page %q", sr.Page) + } + if _, err := regexp.Compile(sr.WMClass); sr.WMClass != "" && err != nil { + return fmt.Errorf("auto_switch rule: invalid wm_class regex %q: %w", sr.WMClass, err) + } + if _, err := regexp.Compile(sr.Title); sr.Title != "" && err != nil { + return fmt.Errorf("auto_switch rule: invalid title regex %q: %w", sr.Title, err) + } + } + + if !pageNames[c.DefaultPage] { + return fmt.Errorf("default_page %q not found in pages", c.DefaultPage) + } + return nil +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..655900d --- /dev/null +++ b/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "context" + "flag" + "fmt" + "log/slog" + "os" + "os/signal" + "syscall" + + _ "image/gif" + _ "image/jpeg" + _ "image/png" + + "streamdeck-lets-go/internal/config" +) + +func main() { + slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelInfo}))) + + fs := flag.NewFlagSet("streamdeck-lets-go", flag.ExitOnError) + configPath := fs.String("config", "", "path to config.json (default: ~/.config/streamdeck-lets-go/config.json)") + httpAddr := fs.String("addr", ":9090", "web UI listen address") + noDeck := fs.Bool("no-deck", false, "run without Stream Deck hardware (config editing only)") + verbose := fs.Bool("v", false, "verbose output") + + if len(os.Args) < 2 { + fmt.Fprintf(os.Stderr, "Usage: streamdeck-lets-go [flags] [command]\n\n") + fmt.Fprintf(os.Stderr, "Commands:\n") + fmt.Fprintf(os.Stderr, " daemon run the Stream Deck daemon with web UI (default)\n") + fmt.Fprintf(os.Stderr, " serve run web UI only (no deck hardware)\n") + fmt.Fprintf(os.Stderr, " discover list connected Stream Decks\n") + fmt.Fprintf(os.Stderr, "\nFlags:\n") + fs.PrintDefaults() + os.Exit(0) + } + + cmd := os.Args[1] + args := os.Args[2:] + + switch cmd { + case "daemon": + fs.Parse(args) + case "serve": + fs.Parse(args) + *noDeck = true + case "discover": + discover() + return + default: + fs.Parse(os.Args[1:]) + } + + if *verbose { + slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelDebug}))) + } + + cfg, err := config.LoadConfig(*configPath) + if err != nil { + slog.Error("config", "error", err) + os.Exit(1) + } + + ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer cancel() + + httpEnabled := true + if err := Run(ctx, cfg, RunOptions{ + ConfigPath: *configPath, + HTTPAddr: *httpAddr, + HTTPEnabled: httpEnabled, + NoDeck: *noDeck, + }); err != nil { + slog.Error("run", "error", err) + os.Exit(1) + } +} + +func discover() { + devices, err := EnumerateDevices() + if err != nil { + slog.Error("discover", "error", err) + os.Exit(1) + } + if len(devices) == 0 { + fmt.Println("No Stream Deck devices found.") + return + } + fmt.Printf("Found %d Stream Deck(s):\n", len(devices)) + for _, d := range devices { + fmt.Printf(" Serial: %s Model: %s PID: 0x%04x\n", d.Serial, d.Model, d.PID) + } +} diff --git a/media.go b/media.go new file mode 100644 index 0000000..e7cb558 --- /dev/null +++ b/media.go @@ -0,0 +1,11 @@ +package main + +import ( + "log/slog" +) + +func init() { + slog.Info("media module loaded") +} + +// mediaAction is handled inline in action.go via playerctl/wpctl diff --git a/page.go b/page.go new file mode 100644 index 0000000..dd9997b --- /dev/null +++ b/page.go @@ -0,0 +1,781 @@ +package main + +import ( + "context" + "fmt" + "image" + "image/color" + "image/draw" + _ "image/gif" + _ "image/jpeg" + _ "image/png" + "log/slog" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "sync" + "time" + "unicode" + "unicode/utf8" + + "github.com/disintegration/gift" + "golang.org/x/image/font" + "golang.org/x/image/font/gofont/goregular" + "golang.org/x/image/font/opentype" + "golang.org/x/image/math/fixed" + + "streamdeck-lets-go/internal/config" +) + +type keyState struct { + cancel context.CancelFunc +} + +type PageManager struct { + mu sync.RWMutex + pages map[string]*config.PageConfig + active string + deck *Deck + keyStates map[int]*keyState + displayOutputs map[int]string + displayMu sync.RWMutex +} + +func NewPageManager(deck *Deck) *PageManager { + return &PageManager{ + pages: make(map[string]*config.PageConfig), + deck: deck, + keyStates: make(map[int]*keyState), + displayOutputs: make(map[int]string), + } +} + +func (pm *PageManager) LoadPages(pages []config.PageConfig) { + pm.mu.Lock() + defer pm.mu.Unlock() + pm.pages = make(map[string]*config.PageConfig, len(pages)) + for i := range pages { + pm.pages[pages[i].Name] = &pages[i] + } +} + +func (pm *PageManager) ActivatePage(name string) error { + pm.mu.Lock() + defer pm.mu.Unlock() + + page, ok := pm.pages[name] + if !ok { + return fmt.Errorf("page %q not found", name) + } + + slog.Info("activating page", "name", name) + pm.active = name + + pm.displayMu.Lock() + pm.displayOutputs = make(map[int]string) + pm.displayMu.Unlock() + + if err := pm.deck.ClearAll(); err != nil { + slog.Warn("clear all failed", "error", err) + } + + if page.Background != "" { + if img, err := loadImage(page.Background, 0, 0); err == nil { + if err := pm.deck.FillPanel(img); err != nil { + slog.Warn("fill panel failed", "error", err) + } + } else { + slog.Warn("load background image", "path", page.Background, "error", err) + } + } + + keyByIndex := make(map[int]config.KeyConfig, len(page.Keys)) + for _, k := range page.Keys { + keyByIndex[k.Index] = k + } + + for i := 0; i < pm.deck.NumKeys(); i++ { + k, ok := keyByIndex[i] + if !ok { + if page.Background == "" { + pm.deck.ClearKey(i) + } + continue + } + pm.renderKey(i, &k) + } + + return nil +} + +func (pm *PageManager) ActivePageName() string { + pm.mu.RLock() + defer pm.mu.RUnlock() + return pm.active +} + +func (pm *PageManager) ActivePage() *config.PageConfig { + pm.mu.RLock() + defer pm.mu.RUnlock() + return pm.pages[pm.active] +} + +func (pm *PageManager) GetDisplayOutputs() map[int]string { + pm.displayMu.RLock() + defer pm.displayMu.RUnlock() + result := make(map[int]string, len(pm.displayOutputs)) + for k, v := range pm.displayOutputs { + result[k] = v + } + return result +} + +func (pm *PageManager) GetPage(name string) *config.PageConfig { + pm.mu.RLock() + defer pm.mu.RUnlock() + return pm.pages[name] +} + +func (pm *PageManager) RenderKey(keyIndex int) { + pm.mu.RLock() + defer pm.mu.RUnlock() + page := pm.pages[pm.active] + if page == nil { + return + } + for _, k := range page.Keys { + if k.Index == keyIndex { + pm.renderKey(keyIndex, &k) + return + } + } +} + +func (pm *PageManager) ReRenderDisplayKey(keyIndex int, output string) { + pm.mu.RLock() + page := pm.pages[pm.active] + pm.mu.RUnlock() + if page == nil { + return + } + for _, k := range page.Keys { + if k.Index == keyIndex && k.Display != nil { + pm.renderKeyOutput(keyIndex, k.Display, output, nil) + return + } + } +} + +func (pm *PageManager) renderKey(idx int, k *config.KeyConfig) { + fontName := k.Font + if fontName == "" { + fontName = "medium" + } + fontSize := 18.0 + if k.FontSize != nil { + fontSize = *k.FontSize + } + + faScale := 0.55 + if k.IconScale != nil { + faScale = *k.IconScale + } + + if k.Icon != "" { + img, err := loadImage(k.Icon, pm.deck.KeySize(), faScale) + if err != nil { + slog.Warn("load icon", "path", k.Icon, "error", err) + pm.deck.FillColor(idx, 64, 64, 64) + if k.Label != "" { + pm.deck.WriteText(idx, k.Label, image.Black, fontName, fontSize) + } + return + } + + if k.Background != "" { + if bg, err := parseHexColor(k.Background); err == nil { + img = applyBackground(img, bg) + } else { + slog.Warn("invalid background color", "value", k.Background, "error", err) + } + } + + onImgFontSize := fontSize + if k.FontSize == nil { + onImgFontSize = 16 + } + onImgFontName := fontName + if k.Font == "" { + onImgFontName = "regular" + } + + if k.Label != "" { + if err := pm.deck.WriteTextOnImage(idx, img, k.Label, onImgFontName, onImgFontSize); err != nil { + slog.Warn("write text on image", "error", err) + pm.deck.FillImage(idx, img) + } + } else { + if err := pm.deck.FillImage(idx, img); err != nil { + slog.Warn("fill image", "error", err) + } + } + } else if k.Label != "" { + if k.Background != "" { + bg, err := parseHexColor(k.Background) + if err == nil { + ks := pm.deck.KeySize() + img := image.NewRGBA(image.Rect(0, 0, ks, ks)) + draw.Draw(img, img.Bounds(), &image.Uniform{bg}, image.Point{}, draw.Src) + if err := pm.deck.WriteTextOnImage(idx, img, k.Label, fontName, fontSize); err != nil { + slog.Warn("write text on image", "error", err) + pm.deck.FillImage(idx, img) + } + return + } + slog.Warn("invalid background color", "value", k.Background, "error", err) + } + if err := pm.deck.WriteText(idx, k.Label, image.Black, fontName, fontSize); err != nil { + slog.Warn("write text", "error", err) + } + } +} + +func (pm *PageManager) stopPeriodicKeys() { + pm.mu.Lock() + defer pm.mu.Unlock() + for _, ks := range pm.keyStates { + ks.cancel() + } + pm.keyStates = make(map[int]*keyState) +} + +func (pm *PageManager) startPeriodicKeys() { + pm.mu.Lock() + page := pm.pages[pm.active] + if page == nil { + pm.mu.Unlock() + return + } + + type displayKey struct { + index int + display *config.DisplayCfg + ctx context.Context + } + var keys []displayKey + for _, k := range page.Keys { + if k.Display != nil && k.Display.Interval != "" { + interval, err := time.ParseDuration(k.Display.Interval) + if err != nil || interval < time.Second { + continue + } + if _, exists := pm.keyStates[k.Index]; exists { + continue + } + ctx, cancel := context.WithCancel(context.Background()) + pm.keyStates[k.Index] = &keyState{cancel: cancel} + keys = append(keys, displayKey{index: k.Index, display: k.Display, ctx: ctx}) + } + } + pm.mu.Unlock() + + for _, dk := range keys { + go pm.runDisplayKey(dk.index, dk.display, dk.ctx) + } +} + +func (pm *PageManager) runDisplayKey(idx int, d *config.DisplayCfg, ctx context.Context) { + timeout := 30 * time.Second + if d.Timeout != "" { + if t, err := time.ParseDuration(d.Timeout); err == nil && t > 0 { + timeout = t + } + } + interval, _ := time.ParseDuration(d.Interval) + + output, execErr := execDisplayCapture(d, timeout) + pm.renderKeyOutput(idx, d, output, execErr) + + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + output, execErr := execDisplayCapture(d, timeout) + pm.renderKeyOutput(idx, d, output, execErr) + case <-ctx.Done(): + return + } + } +} + +func (pm *PageManager) renderKeyOutput(idx int, d *config.DisplayCfg, output string, execErr error) { + pm.mu.RLock() + page := pm.pages[pm.active] + pm.mu.RUnlock() + if page == nil { + return + } + + var kc *config.KeyConfig + for _, k := range page.Keys { + if k.Index == idx { + kCopy := k + kc = &kCopy + break + } + } + if kc == nil { + return + } + + if execErr != nil { + slog.Warn("display command failed", "key", idx, "error", execErr) + } + + text := sanitizeText(output) + if text == "" { + return + } + + pm.displayMu.Lock() + pm.displayOutputs[idx] = text + pm.displayMu.Unlock() + + maxLen := d.MaxLen + if maxLen <= 0 { + maxLen = 128 + } + if len(text) > maxLen { + text = text[:maxLen] + } + + faScale := 0.55 + if kc.IconScale != nil { + faScale = *kc.IconScale + } + + fontSize := 12.0 + if kc.FontSize != nil { + fontSize = *kc.FontSize + } + + if kc.Icon != "" { + img, err := loadImage(kc.Icon, pm.deck.KeySize(), faScale) + if err != nil { + slog.Warn("load icon for display", "path", kc.Icon, "error", err) + textImg := renderUnicodeText(text, fontSize, pm.deck.KeySize(), color.Black) + if err := pm.deck.FillImage(idx, textImg); err != nil { + slog.Warn("fill image", "error", err) + } + return + } + + if kc.Background != "" { + if bg, err := parseHexColor(kc.Background); err == nil { + img = applyBackground(img, bg) + } else { + slog.Warn("invalid background color", "value", kc.Background, "error", err) + } + } + + composite := renderUnicodeTextOnImage(img, text, fontSize, pm.deck.KeySize()) + if err := pm.deck.FillImage(idx, composite); err != nil { + slog.Warn("fill image", "error", err) + } + return + } + + if kc.Background != "" { + bg, err := parseHexColor(kc.Background) + if err == nil { + textImg := renderUnicodeText(text, fontSize, pm.deck.KeySize(), bg) + if err := pm.deck.FillImage(idx, textImg); err != nil { + slog.Warn("fill image", "error", err) + } + return + } + slog.Warn("invalid background color", "value", kc.Background, "error", err) + } + textImg := renderUnicodeText(text, fontSize, pm.deck.KeySize(), color.Black) + if err := pm.deck.FillImage(idx, textImg); err != nil { + slog.Warn("fill image", "error", err) + } +} + +var ( + unicodeFontOnce sync.Once + unicodeFontData []byte +) + +func loadUnicodeFontBytes() []byte { + unicodeFontOnce.Do(func() { + if data := fcRead(":charset=20BD"); data != nil { + unicodeFontData = data + return + } + if data := fcRead("mono"); data != nil { + unicodeFontData = data + return + } + if data := fcRead("sans"); data != nil { + unicodeFontData = data + return + } + unicodeFontData = goregular.TTF + }) + return unicodeFontData +} + +var ( + emojiFontOnce sync.Once + emojiFontData []byte +) + +func loadEmojiFontBytes() []byte { + emojiFontOnce.Do(func() { + if data := fcRead("emoji"); data != nil { + if _, err := opentype.Parse(data); err == nil { + emojiFontData = data + return + } + } + emojiFontData = loadUnicodeFontBytes() + }) + return emojiFontData +} + +func renderEmojiGlyph(r rune, size int, scale float64) image.Image { + if img, ok := renderCBDTGlyph(r, size, scale); ok { + return img + } + + fontSize := float64(size) * scale + data := loadEmojiFontBytes() + fnt, err := opentype.Parse(data) + if err != nil { + return renderUnicodeText(string(r), fontSize, size, color.Black) + } + face, err := opentype.NewFace(fnt, &opentype.FaceOptions{ + Size: fontSize, + DPI: 72, + Hinting: font.HintingFull, + }) + if err != nil { + return renderUnicodeText(string(r), fontSize, size, color.Black) + } + defer face.Close() + + rgba := image.NewRGBA(image.Rect(0, 0, size, size)) + + adv := font.MeasureString(face, string(r)).Ceil() + metrics := face.Metrics() + height := metrics.Height.Ceil() + + x := (size - adv) / 2 + if x < 1 { + x = 1 + } + y := (size + height) / 2 + if y < 1 { + y = 1 + } + + d := &font.Drawer{ + Dst: rgba, + Src: image.NewUniform(color.White), + Face: face, + Dot: fixed.P(x, y), + } + d.DrawString(string(r)) + return rgba +} + +func fcRead(pattern string) []byte { + cmd := exec.Command("fc-match", "-f", "%{file}", pattern) + out, err := cmd.Output() + if err != nil { + return nil + } + path := strings.TrimSpace(string(out)) + if path == "" { + return nil + } + data, err := os.ReadFile(path) + if err != nil { + return nil + } + return data +} + +func parseDisplayFace(size float64) (font.Face, error) { + f, err := opentype.Parse(loadUnicodeFontBytes()) + if err != nil { + return nil, err + } + return opentype.NewFace(f, &opentype.FaceOptions{ + Size: size, + DPI: 72, + Hinting: font.HintingFull, + }) +} + +func renderUnicodeText(text string, fontSize float64, keySize int, bg color.Color) *image.RGBA { + rgba := image.NewRGBA(image.Rect(0, 0, keySize, keySize)) + draw.Draw(rgba, rgba.Bounds(), &image.Uniform{bg}, image.Point{}, draw.Src) + + if text == "" { + return rgba + } + + face, err := parseDisplayFace(fontSize) + if err != nil { + return rgba + } + defer face.Close() + + textAdvance := font.MeasureString(face, text).Ceil() + metrics := face.Metrics() + height := metrics.Height.Ceil() + + x := (keySize - textAdvance) / 2 + if x < 1 { + x = 1 + } + y := (keySize + height) / 2 + if y < 1 { + y = 1 + } + + d := &font.Drawer{ + Dst: rgba, + Src: &image.Uniform{color.White}, + Face: face, + Dot: fixed.P(x, y), + } + d.DrawString(text) + + return rgba +} + +func renderUnicodeTextOnImage(baseImg image.Image, text string, fontSize float64, keySize int) *image.RGBA { + g := gift.New(gift.Resize(keySize, keySize, gift.LanczosResampling)) + rgba := image.NewRGBA(image.Rect(0, 0, keySize, keySize)) + g.Draw(rgba, baseImg) + + barHeight := 20 + if keySize < 72 { + barHeight = 16 + } + barRect := image.Rect(0, keySize-barHeight, keySize, keySize) + draw.Draw(rgba, barRect, &image.Uniform{color.RGBA{0, 0, 0, 180}}, image.Point{}, draw.Over) + + if text == "" { + return rgba + } + + face, err := parseDisplayFace(fontSize) + if err != nil { + return rgba + } + defer face.Close() + + textAdvance := font.MeasureString(face, text).Ceil() + metrics := face.Metrics() + ascent := metrics.Ascent.Ceil() + + x := (keySize - textAdvance) / 2 + if x < 1 { + x = 1 + } + y := keySize - barHeight/2 + ascent/2 + if y > keySize-2 { + y = keySize - 2 + } + + d := &font.Drawer{ + Dst: rgba, + Src: &image.Uniform{color.White}, + Face: face, + Dot: fixed.P(x, y), + } + d.DrawString(text) + + return rgba +} + +func sanitizeText(s string) string { + text := strings.TrimSpace(s) + if text == "" { + return text + } + var b strings.Builder + b.Grow(len(text)) + inEscape := false + for _, r := range text { + if inEscape { + if unicode.IsLetter(r) { + inEscape = false + } + continue + } + if r == 0x1b { + inEscape = true + continue + } + if unicode.IsPrint(r) || r == '\n' { + b.WriteRune(r) + } + } + return strings.TrimSpace(b.String()) +} + +func parseHexColor(s string) (color.RGBA, error) { + if len(s) == 0 || s[0] != '#' { + return color.RGBA{}, fmt.Errorf("invalid color format: %q", s) + } + raw := strings.TrimPrefix(s, "#") + if len(raw) != 3 && len(raw) != 6 && len(raw) != 8 { + return color.RGBA{}, fmt.Errorf("invalid color length: %q", s) + } + if len(raw) == 3 { + raw = string([]byte{raw[0], raw[0], raw[1], raw[1], raw[2], raw[2]}) + } + n, err := strconv.ParseUint(raw, 16, 64) + if err != nil { + return color.RGBA{}, fmt.Errorf("invalid hex color: %q: %w", s, err) + } + switch len(raw) { + case 6: + return color.RGBA{ + R: uint8(n >> 16), + G: uint8(n >> 8), + B: uint8(n), + A: 255, + }, nil + case 8: + return color.RGBA{ + R: uint8(n >> 24), + G: uint8(n >> 16), + B: uint8(n >> 8), + A: uint8(n), + }, nil + } + return color.RGBA{}, fmt.Errorf("unexpected hex length: %d", len(raw)) +} + +func applyBackground(img image.Image, bg color.RGBA) *image.RGBA { + b := img.Bounds() + rgba := image.NewRGBA(b) + draw.Draw(rgba, b, &image.Uniform{bg}, image.Point{}, draw.Src) + draw.Draw(rgba, b, img, image.Point{}, draw.Over) + return rgba +} + +var imageCache sync.Map + +func isEmojiRef(path string) bool { + return strings.HasPrefix(path, "emoji:") +} + +func parseEmojiRef(path string) (rune, error) { + raw := strings.TrimPrefix(path, "emoji:") + if raw == "" { + return 0, fmt.Errorf("empty emoji ref") + } + + if strings.HasPrefix(raw, ":") && strings.HasSuffix(raw, ":") && len(raw) > 2 { + name := strings.ToLower(raw[1 : len(raw)-1]) + if r, ok := emojiShortcodes[name]; ok { + return r, nil + } + return 0, fmt.Errorf("unknown emoji shortcode: %s", name) + } + + r, size := utf8.DecodeRuneInString(raw) + if r == utf8.RuneError || size == 0 { + return 0, fmt.Errorf("invalid emoji character") + } + return r, nil +} + +func loadImage(path string, targetSize int, faScale float64) (image.Image, error) { + if cached, ok := imageCache.Load(path); ok { + return cached.(image.Image), nil + } + + if isFAIconRef(path) { + style, name, err := parseFAIcon(path) + if err != nil { + return nil, err + } + img, err := renderFAGlyph(style, name, targetSize, faScale) + if err != nil { + return nil, err + } + imageCache.Store(path, img) + return img, nil + } + + if isEmojiRef(path) { + r, err := parseEmojiRef(path) + if err != nil { + return nil, err + } + img := renderEmojiGlyph(r, targetSize, faScale) + imageCache.Store(path, img) + return img, nil + } + + resolved := path + if isSystemIconRef(path) { + p, err := findSystemIcon(systemIconName(path), targetSize) + if err != nil { + return nil, err + } + resolved = p + } else if !strings.HasPrefix(path, "/") { + resolved = filepath.Join(configDir(), path) + } + + if strings.HasSuffix(resolved, ".svg") { + img, err := svgToPNG(resolved, targetSize) + if err != nil { + return nil, err + } + imageCache.Store(path, img) + return img, nil + } + + f, err := os.Open(resolved) + if err != nil { + return nil, fmt.Errorf("open: %w", err) + } + defer f.Close() + + img, _, err := image.Decode(f) + if err != nil { + return nil, fmt.Errorf("decode: %w", err) + } + + imageCache.Store(path, img) + return img, nil +} + +var cachedConfigDir string + +func configDir() string { + if cachedConfigDir != "" { + return cachedConfigDir + } + home, err := os.UserHomeDir() + if err != nil { + cachedConfigDir = "." + return cachedConfigDir + } + cachedConfigDir = filepath.Join(home, ".config", "streamdeck-lets-go") + return cachedConfigDir +} diff --git a/render.go b/render.go new file mode 100644 index 0000000..472f9a2 --- /dev/null +++ b/render.go @@ -0,0 +1,132 @@ +package main + +import ( + "image" + "image/color" + "image/draw" + + "github.com/disintegration/gift" + "golang.org/x/image/font" + "golang.org/x/image/font/basicfont" + "golang.org/x/image/math/fixed" + + "streamdeck-lets-go/internal/config" +) + +func RenderKeyToImage(k *config.KeyConfig, keySize int) image.Image { + if k == nil { + return blankImage(keySize, color.RGBA{0, 0, 0, 255}) + } + if k.Icon == "" && k.Label == "" { + if k.Background != "" { + if bg, err := parseHexColor(k.Background); err == nil { + return blankImage(keySize, bg) + } + } + return blankImage(keySize, color.RGBA{64, 64, 64, 255}) + } + + faScale := 0.55 + if k.IconScale != nil { + faScale = *k.IconScale + } + + if k.Icon != "" { + img, err := loadImage(k.Icon, keySize, faScale) + if err != nil { + img = blankImage(keySize, color.RGBA{64, 64, 64, 255}) + } + if k.Background != "" { + if bg, err := parseHexColor(k.Background); err == nil { + img = applyBackground(img, bg) + } + } + if k.Label != "" { + return composeImageWithLabel(img, k.Label, keySize) + } + g := gift.New(gift.Resize(keySize, keySize, gift.LanczosResampling)) + rgba := image.NewRGBA(image.Rect(0, 0, keySize, keySize)) + g.Draw(rgba, img) + return rgba + } + + if k.Background != "" { + if bg, err := parseHexColor(k.Background); err == nil { + if k.Label != "" { + fontSize := 12.0 + if k.FontSize != nil { + fontSize = *k.FontSize + } + return renderUnicodeText(k.Label, fontSize, keySize, bg) + } + return blankImage(keySize, bg) + } + } + return renderTextImage(k.Label, keySize) +} + +func blankImage(size int, c color.Color) image.Image { + img := image.NewRGBA(image.Rect(0, 0, size, size)) + draw.Draw(img, img.Bounds(), &image.Uniform{c}, image.Point{}, draw.Src) + return img +} + +func composeImageWithLabel(src image.Image, text string, keySize int) image.Image { + g := gift.New(gift.Resize(keySize, keySize, gift.LanczosResampling)) + rgba := image.NewRGBA(image.Rect(0, 0, keySize, keySize)) + g.Draw(rgba, src) + + barHeight := 20 + if keySize < 72 { + barHeight = 18 + } + barRect := image.Rect(0, keySize-barHeight, keySize, keySize) + draw.Draw(rgba, barRect, &image.Uniform{color.RGBA{0, 0, 0, 180}}, image.Point{}, draw.Over) + + if text != "" { + face := basicfont.Face7x13 + textW := font.MeasureString(face, text).Ceil() + posX := (keySize - textW) / 2 + if posX < 2 { + posX = 2 + } + posY := keySize - barHeight/2 + face.Metrics().Height.Ceil()/2 + if posY >= keySize { + posY = keySize - 2 + } + + d := &font.Drawer{ + Dst: rgba, + Src: image.NewUniform(color.White), + Face: face, + Dot: fixed.P(posX, posY), + } + d.DrawString(text) + } + + return rgba +} + +func renderTextImage(text string, keySize int) image.Image { + rgba := blankImage(keySize, color.RGBA{0, 0, 0, 255}).(*image.RGBA) + + if text != "" { + face := basicfont.Face7x13 + textW := font.MeasureString(face, text).Ceil() + posX := (keySize - textW) / 2 + if posX < 2 { + posX = 2 + } + posY := keySize/2 + face.Metrics().Height.Ceil()/2 + + d := &font.Drawer{ + Dst: rgba, + Src: image.NewUniform(color.White), + Face: face, + Dot: fixed.P(posX, posY), + } + d.DrawString(text) + } + + return rgba +} diff --git a/screensaver.go b/screensaver.go new file mode 100644 index 0000000..ff4a359 --- /dev/null +++ b/screensaver.go @@ -0,0 +1,92 @@ +package main + +import ( + "log/slog" + "time" + + "streamdeck-lets-go/internal/config" +) + +type Screensaver struct { + enabled bool + idleAfter time.Duration + lastInput time.Time + active bool + savedBrightness int +} + +func NewScreensaver(cfg *config.ScreensaverCfg) *Screensaver { + ss := &Screensaver{ + enabled: cfg.Enabled, + idleAfter: time.Duration(cfg.IdleSeconds) * time.Second, + lastInput: time.Now(), + } + if ss.idleAfter <= 0 { + ss.idleAfter = 30 * time.Second + } + return ss +} + +func (ss *Screensaver) NotifyInput() { + ss.lastInput = time.Now() + if ss.active { + ss.active = false + slog.Debug("screensaver deactivated") + } +} + +func (ss *Screensaver) Check() bool { + if !ss.enabled { + return false + } + if time.Since(ss.lastInput) > ss.idleAfter { + if !ss.active { + ss.active = true + slog.Debug("screensaver activated") + return true + } + return false + } + return false +} + +func (ss *Screensaver) Activate(deck *Deck, cfg *config.ScreensaverCfg) { + ss.savedBrightness = deck.Brightness() + + brightness := cfg.Brightness + if brightness <= 0 { + brightness = 10 + } + if err := deck.SetBrightness(brightness); err != nil { + slog.Warn("screensaver: set brightness", "error", err) + } + + if cfg.Image != "" { + img, err := loadImage(cfg.Image, 0, 0) + if err != nil { + slog.Warn("screensaver: load image", "path", cfg.Image, "error", err) + return + } + if err := deck.FillPanel(img); err != nil { + slog.Warn("screensaver: fill panel", "error", err) + } + } + + slog.Info("screensaver activated") +} + +func (ss *Screensaver) Deactivate(deck *Deck) { + brightness := ss.savedBrightness + if brightness <= 0 { + brightness = 75 + } + if err := deck.SetBrightness(brightness); err != nil { + slog.Warn("screensaver: restore brightness", "error", err) + } + ss.savedBrightness = 0 + slog.Info("screensaver deactivated") +} + +func (ss *Screensaver) IsActive() bool { + return ss.active +} diff --git a/static/app.js b/static/app.js new file mode 100644 index 0000000..c114d40 --- /dev/null +++ b/static/app.js @@ -0,0 +1,557 @@ +document.addEventListener('alpine:init', () => { + Alpine.data('deckApp', () => ({ + // ── State ── + config: null, + pages: [], + activePage: '', + view: 'grid', + showAdvanced: false, + showDisplay: false, + toast: null, + displayOutputs: {}, + isCapturingKey: false, + + // ── Edit state ── + editing: null, + editForm: {}, + + // ── Sub-views ── + subView: null, // 'backups', 'settings', 'switcher', null + + // ── Settings ── + settingsForm: {}, + autoSwitchRules: [], + + // ── Init ── + async init() { + await this.loadConfig() + setInterval(() => this.pollDisplayOutputs(), 3000) + }, + + async pollDisplayOutputs() { + if (this.view !== 'grid') return + try { + const res = await fetch(`/api/display-outputs`) + this.displayOutputs = await res.json() + } catch (_) {} + }, + + async loadConfig() { + try { + const res = await fetch('/api/config') + this.config = await res.json() + this.pages = this.config.pages + if (this.pages.length > 0) { + this.activePage = this.config.default_page || this.pages[0].name + } + this.syncSettings() + } catch (e) { + this.showToast('Failed to load config', 'error') + } + }, + + syncSettings() { + this.settingsForm = { + brightness: this.config.devices?.[0]?.brightness || 75, + screensaver_enabled: this.config.screensaver?.enabled || false, + screensaver_idle: this.config.screensaver?.idle_seconds || 30, + screensaver_brightness: this.config.screensaver?.brightness || 10, + } + this.autoSwitchRules = [...(this.config.auto_switch || [])] + }, + + // ── Page helpers ── + get currentPage() { + return this.pages.find(p => p.name === this.activePage) + }, + + get pageNames() { + return this.pages.map(p => p.name) + }, + + // ── Grid ── + get gridKeys() { + const page = this.currentPage + if (!page) return [] + const keys = [] + for (let i = 0; i < 15; i++) { + const kc = page.keys.find(k => k.index === i) + keys.push({ + index: i, + ...kc, + configured: !!kc, + hasDisplay: !!(kc?.display), + previewUrl: this.keyPreviewUrl(kc ? kc : {}), + }) + } + return keys + }, + + keyPreviewUrl(kc) { + const k = kc || {} + let url = '/api/render?key_size=72' + if (k.icon) url += `&icon=${encodeURIComponent(k.icon)}` + const label = this.displayOutputs[k.index] || k.label + if (label) url += `&label=${encodeURIComponent(label)}` + if (k.icon_scale != null) url += `&icon_scale=${k.icon_scale}` + if (k.font_size != null) url += `&font_size=${k.font_size}` + if (k.background) url += `&background=${encodeURIComponent(k.background)}` + return url + }, + + isFAIcon(icon) { + if (!icon) return false + return icon.startsWith('fa:') || icon.startsWith('far:') || icon.startsWith('fab:') + }, + + faClass(icon) { + if (!icon) return '' + if (icon.startsWith('fa:')) return 'fa-solid fa-' + icon.slice(3) + if (icon.startsWith('far:')) return 'fa-regular fa-' + icon.slice(4) + if (icon.startsWith('fab:')) return 'fa-brands fa-' + icon.slice(4) + return '' + }, + + get keyChips() { + if (!this.editForm.keys) return [] + const map = { ctrl: 'Ctrl', alt: 'Alt', shift: 'Shift', super: 'Super', meta: 'Super' } + return this.editForm.keys.split('+').map(k => map[k] || k.charAt(0).toUpperCase() + k.slice(1)) + }, + + toggleMod(mod) { + if (mod === 'ctrl') this.editForm.modCtrl = !this.editForm.modCtrl + else if (mod === 'alt') this.editForm.modAlt = !this.editForm.modAlt + else if (mod === 'shift') this.editForm.modShift = !this.editForm.modShift + else if (mod === 'super') this.editForm.modSuper = !this.editForm.modSuper + this.rebuildKeys() + }, + + rebuildKeys() { + const mods = [] + if (this.editForm.modCtrl) mods.push('ctrl') + if (this.editForm.modAlt) mods.push('alt') + if (this.editForm.modShift) mods.push('shift') + if (this.editForm.modSuper) mods.push('super') + if (this.editForm.mainKey) mods.push(this.editForm.mainKey) + this.editForm.keys = mods.join('+') + }, + + startKeyCapture() { + this.isCapturingKey = true + this.$nextTick(() => this.$refs.keyCapture?.focus()) + }, + + onCaptureKey(e) { + if (!this.isCapturingKey) return + e.preventDefault() + e.stopPropagation() + const map = { + 'Control': '', 'Alt': '', 'Shift': '', 'Meta': '', + ' ': 'space', 'Enter': 'return', 'Tab': 'tab', + 'Escape': 'escape', 'Delete': 'delete', 'Backspace': 'backspace', + 'ArrowUp': 'up', 'ArrowDown': 'down', 'ArrowLeft': 'left', 'ArrowRight': 'right', + } + let key = map[e.key] + if (key === undefined) { + key = e.key.length === 1 ? e.key.toLowerCase() : e.key + } + if (!key) return + this.editForm.mainKey = key.toLowerCase() + this.isCapturingKey = false + this.rebuildKeys() + }, + + displayKey(key) { + const map = { return: '\u21B5', escape: 'Esc', tab: 'Tab', space: '\u2423', + delete: 'Del', backspace: '\u232B', up: '\u2191', down: '\u2193', left: '\u2190', right: '\u2192' } + return map[key] || key.toUpperCase() + }, + + // ── Edit Key ── + editKey(idx) { + this.isCapturingKey = false + const page = this.currentPage + if (!page) return + const kc = page.keys.find(k => k.index === idx) + this.editing = idx + this.showAdvanced = false + this.showDisplay = !!(kc?.display) + + const action = kc?.action || {} + + const parts = (action.keys || '').toLowerCase().split('+') + const mainKey = parts.length > 0 ? parts.pop() : '' + + this.editForm = { + icon: kc?.icon || '', + label: kc?.label || '', + icon_scale: kc?.icon_scale ?? 0.55, + font_size: kc?.font_size ?? 16, + bg_color: kc?.background || '', + action_type: action.type || 'command', + command: action.command || '', + builtin: action.builtin || '', + script: action.script || '', + page: action.page || '', + keys: action.keys || '', + modCtrl: parts.includes('ctrl'), + modAlt: parts.includes('alt'), + modShift: parts.includes('shift'), + modSuper: parts.includes('super'), + mainKey: mainKey, + background: action.background ?? true, + display_mode: kc?.display ? (kc.display.command ? 'command' : 'script') : 'none', + display_command: kc?.display?.command || '', + display_script: kc?.display?.script || '', + display_interval: kc?.display?.interval || '30s', + display_max_len: kc?.display?.max_len || 128, + display_timeout: kc?.display?.timeout || '', + } + }, + + get editPreviewUrl() { + const f = this.editForm + let url = '/api/render?key_size=96' + if (f.icon) url += `&icon=${encodeURIComponent(f.icon)}` + if (f.label) url += `&label=${encodeURIComponent(f.label)}` + if (f.icon_scale != null) url += `&icon_scale=${f.icon_scale}` + if (f.font_size != null) url += `&font_size=${f.font_size}` + if (f.bg_color) url += `&background=${encodeURIComponent(f.bg_color)}` + return url + }, + + get editPreviewFaClass() { + return this.faClass(this.editForm.icon) + }, + + async saveKey() { + const page = this.currentPage + if (!page) return + + const dm = this.editForm.display_mode + const hasDisplay = dm !== 'none' + const actionType = this.editForm.action_type + + if (dm === 'command' && !this.editForm.display_command) { + this.showToast('Display command is required', 'error') + return + } + if (dm === 'script' && !this.editForm.display_script) { + this.showToast('Display script path is required', 'error') + return + } + + if (actionType && actionType !== 'none') { + if (actionType === 'command' && !this.editForm.command) { + if (!hasDisplay) { this.showToast('Command is required', 'error'); return } + } + if (actionType === 'script' && !this.editForm.script) { + if (!hasDisplay) { this.showToast('Script path is required', 'error'); return } + } + if (actionType === 'page' && !this.editForm.page) { + this.showToast('Target page is required', 'error') + return + } + if (actionType === 'keyboard' && !this.editForm.keys) { + if (!hasDisplay) { this.showToast('Key combination is required', 'error'); return } + } + } + + const kc = { + index: this.editing, + icon: this.editForm.icon, + label: this.editForm.label, + icon_scale: this.editForm.icon_scale, + font_size: this.editForm.font_size, + background: this.editForm.bg_color || '', + } + + if (actionType && actionType !== 'none') { + if (actionType === 'command' && this.editForm.command) { + kc.action = { type: 'command', command: this.editForm.command, background: this.editForm.background } + } else if (actionType === 'builtin') { + kc.action = { type: 'builtin', builtin: this.editForm.builtin } + } else if (actionType === 'script' && this.editForm.script) { + kc.action = { type: 'script', script: this.editForm.script } + } else if (actionType === 'page' && this.editForm.page) { + kc.action = { type: 'page', page: this.editForm.page } + } else if (actionType === 'keyboard' && this.editForm.keys) { + kc.action = { type: 'keyboard', keys: this.editForm.keys } + } else if (!hasDisplay) { + kc.action = null + } else { + kc.action = null + } + } else { + kc.action = null + } + + if (hasDisplay) { + kc.display = { + command: dm === 'command' ? this.editForm.display_command : '', + script: dm === 'script' ? this.editForm.display_script : '', + interval: this.editForm.display_interval || '30s', + max_len: this.editForm.display_max_len || 0, + } + if (this.editForm.display_timeout) { + kc.display.timeout = this.editForm.display_timeout + } + } else { + kc.display = null + } + + const existingIdx = page.keys.findIndex(k => k.index === this.editing) + if (existingIdx >= 0) { + page.keys[existingIdx] = kc + } else { + page.keys.push(kc) + } + + await this.saveConfig() + this.editing = null + }, + + async deleteKey() { + const page = this.currentPage + if (!page) return + page.keys = page.keys.filter(k => k.index !== this.editing) + await this.saveConfig() + this.editing = null + }, + + // ── Image picker ── + pickImage() { + this.$refs.fileInput.click() + }, + + async onImagePicked(e) { + const file = e.target.files[0] + if (!file) return + const formData = new FormData() + formData.append('file', file) + try { + const res = await fetch('/api/upload', { method: 'POST', body: formData }) + if (!res.ok) { this.showToast('Upload failed', 'error'); return } + const data = await res.json() + this.editForm.icon = data.path + } catch (err) { + this.showToast('Upload failed', 'error') + } + e.target.value = '' + }, + + // ── Page management ── + switchPage(name) { + this.activePage = name + this.displayOutputs = {} + }, + + async addPage() { + const name = prompt('New page name:') + if (!name || name.trim() === '') return + if (this.pages.find(p => p.name === name)) { + this.showToast('Page already exists', 'error') + return + } + this.pages.push({ name: name.trim(), keys: [] }) + this.activePage = name.trim() + this.config.pages = this.pages + if (!this.config.default_page) { + this.config.default_page = name.trim() + } + await this.saveConfig() + }, + + async deletePage() { + if (this.pages.length <= 1) { + this.showToast('Cannot delete the last page', 'error') + return + } + if (!confirm(`Delete page "${this.activePage}"?`)) return + const oldName = this.activePage + this.pages = this.pages.filter(p => p.name !== oldName) + this.activePage = this.pages[0].name + if (this.config.default_page === oldName) { + this.config.default_page = this.activePage + } + this.config.pages = this.pages + await this.saveConfig() + }, + + async renamePage() { + const oldName = this.activePage + const newName = prompt('Rename page:', oldName) + if (!newName || newName.trim() === '' || newName === oldName) return + if (this.pages.find(p => p.name === newName.trim())) { + this.showToast('Page already exists', 'error') + return + } + const page = this.pages.find(p => p.name === oldName) + if (page) page.name = newName.trim() + this.activePage = newName.trim() + if (this.config.default_page === oldName) { + this.config.default_page = newName.trim() + } + + // Update page references + for (const p of this.pages) { + for (const k of p.keys) { + if (k.action?.page === oldName) k.action.page = newName.trim() + } + } + for (const r of (this.config.auto_switch || [])) { + if (r.page === oldName) r.page = newName.trim() + } + + await this.saveConfig() + }, + + // ── Save / Reload ── + async saveConfig() { + this.config.pages = this.pages + try { + const res = await fetch('/api/config', { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(this.config), + }) + if (res.ok) { + this.showToast('Saved', 'success') + } else { + const text = await res.text() + this.showToast(`Save failed: ${text}`, 'error') + } + } catch (e) { + this.showToast('Save failed', 'error') + } + }, + + async reloadConfig() { + await this.loadConfig() + this.showToast('Reloaded', 'success') + }, + + // ── Settings ── + async saveSettings() { + if (!this.config.devices || this.config.devices.length === 0) { + this.config.devices = [{ serial: '', brightness: 75 }] + } + this.config.devices[0].brightness = parseInt(this.settingsForm.brightness) + this.config.screensaver = { + enabled: this.settingsForm.screensaver_enabled, + idle_seconds: parseInt(this.settingsForm.screensaver_idle) || 30, + brightness: parseInt(this.settingsForm.screensaver_brightness) || 10, + } + this.config.auto_switch = this.autoSwitchRules + await this.saveConfig() + }, + + addAutoSwitchRule() { + this.autoSwitchRules.push({ wm_class: '', title: '', page: '', stay: false, devices: [] }) + }, + + removeAutoSwitchRule(idx) { + this.autoSwitchRules.splice(idx, 1) + }, + + // ── Backup ── + backups: [], + + async loadBackups() { + try { + const res = await fetch('/api/backups') + this.backups = await res.json() + } catch (e) { + this.backups = [] + } + }, + + downloadConfig() { + window.open('/api/config/download', '_blank') + }, + + async downloadBackup(name) { + window.open(`/api/backups/${encodeURIComponent(name)}`, '_blank') + }, + + async restoreConfig() { + const input = document.createElement('input') + input.type = 'file' + input.accept = '.json' + input.onchange = async () => { + const file = input.files[0] + if (!file) return + try { + const formData = new FormData() + formData.append('file', file) + const res = await fetch('/api/config/restore', { + method: 'POST', + body: formData, + }) + if (res.ok) { + await this.loadConfig() + this.showToast('Config restored', 'success') + } else { + const text = await res.text() + this.showToast(`Restore failed: ${text}`, 'error') + } + } catch (e) { + this.showToast('Restore failed', 'error') + } + } + input.click() + }, + + async restoreBackup(filename) { + if (!confirm(`Restore "${filename}"?`)) return + try { + const res = await fetch(`/api/backups/${encodeURIComponent(filename)}`) + if (!res.ok) { + this.showToast('Failed to download backup', 'error') + return + } + const blob = await res.blob() + const formData = new FormData() + formData.append('file', blob, filename) + const putRes = await fetch('/api/config/restore', { + method: 'POST', + body: formData, + }) + if (putRes.ok) { + await this.loadConfig() + this.showToast('Backup restored', 'success') + } else { + const text = await putRes.text() + this.showToast(`Restore failed: ${text}`, 'error') + } + } catch (e) { + this.showToast('Restore failed', 'error') + } + }, + + // ── Toast ── + showToast(msg, type = 'success') { + this.toast = { msg, type } + setTimeout(() => { this.toast = null }, 2500) + }, + + // ── Formatting ── + formatSize(bytes) { + if (bytes < 1024) return bytes + ' B' + return (bytes / 1024).toFixed(1) + ' KB' + }, + + formatTime(iso) { + if (!iso) return '' + const d = new Date(iso) + return d.toLocaleString() + }, + + backupNameTime(name) { + // Extract date from config.YYYY-MM-DDTHH-MM-SS.json + const m = name.match(/config\.(.+)\.json/) + if (!m) return name + return m[1].replace('T', ' ') + }, + })) +}) diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..81efeb6 --- /dev/null +++ b/static/index.html @@ -0,0 +1,440 @@ + + + + + +StreamDeck + + + + + + +