refactor(fastfetch): merge the mac and kde configs into common

One Fastfetch package now serves both platforms. The logo is sent
inline through the kitty graphics protocol from a pre-encoded
albedo.kitty, which works in Ghostty and Kwi alike, so the separate
kitty-direct (mac) and Konsole (kde) variants are no longer needed.
This commit is contained in:
tri committed 2026-11-06 11:20:04 +07:00
1 parent 84e96f175c
commit fa77bc2514
15 files changed
+62 -183

No files matched your search

+2 -4
View File
@@ -9,14 +9,13 @@ From the repository root, install all KDE packages:
Or choose individual packages:
```sh
stow -d kde -t "$HOME" spectacle fastfetch
stow -d kde -t "$HOME" spectacle helium
```
| Package | Details |
| ---------------------------------- | -------------------------------------------------------- |
| [theme](theme/README.md) | Darwin Breeze KDE colors and generated app themes |
| [helium](helium/README.md) | Browser flags; colors come from GTK |
| [fastfetch](fastfetch/README.md) | Konsole configuration and a pre-scaled inline image logo |
| [spectacle](spectacle/README.md) | Screenshots to clipboard with a notification, no preview |
| [tray-icons](tray-icons/README.md) | Ngó Sen and qBittorrent tray icons |
@@ -33,5 +32,4 @@ The apply scripts require a running KDE Plasma 6 session. Ngó Sen icons need
an additional install step described in the tray-icons README.
Packages can be selected independently; Helium follows the Darwin Breeze
colors only when the theme is applied. Choose either `kde/fastfetch` or
`mac/fastfetch`; both own `~/.config/fastfetch/`.
colors only when the theme is applied.
@@ -1 +0,0 @@
_Ga=T,f=100,t=d,c=20,r=10,q=2,m=1;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\_Gm=1;2CzUiM53eKtBKKIrpLeyTzEjo54ifjUgpOfqaqxO8jgVGiX/zaZiv5kqvU+SQXJkYerUqQJ8bk6hBL52goHe22igSfbziCfL1U+A8b9pkDCguZ5MtWrGcHcPISB6wdTUCXr61qhS1Rz2toGIDGqAGlFZwkXD+4cTY/IXjiLOeTM831+7dm21Fl2BxbgZUkSoUB/8bzWV3tdEXvGvMd+K5SvE5Lg6hgi3xttErq7O+mFsWCNYmDoTAzUv4DbR7n+PHaXP107qKAyh0qXLw9HBCdUTYpDZpB6aZ9ZH3TopiAyPgJuzn9g34ukcj7jwTGGps69QKvHRVBgnHPbj+xw+fPhrIFQtyh7yeBUvBOH/salErz6t8qvyAL9UxBC348dPoHyFcrCx8JCYjybrP2Eq1v9sLN0RHZqB9MR2mjow7MvjRyk5obWUavXe39mCgN0E5sZuSEtNxoK543Ht4l48fXCeqJtu5/lVvHx6GfdvncTp45sxb/ZvaNemOXy9Auh+fIk5U4mdvxTxaV5UzM5erlEoUvRTsSdZ1v00RCg/chkuJW5cWBD9/9KQ73IZqV7liv7z+PETeHl7okpFY3lL5N93JitAqZvSCa4OoQQWD3g4xcLO0o9A4AVbKy/xaGflD3vrELKY676zFIfCqjGhjeDjGYgFc8YJsL14fAkP75zBnZzjuHXzGPWjot/JPYFHd8/i1VMC5YvruHFlP2ZMHY60Wsn0+x5wc4ghADanhdBKLA5jA3tYWVvi9u3bUI+HDELFKf+TAsBCnfA/aMhPnXeHnL2srHJl1Xfu0lmUPpOUeEXk/T3gsd4V7FubAOdPYtATdWun4MeBvTBn1hisXTUTmzfLine truncated
Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

@@ -1,80 +0,0 @@
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json",
"display": {
"key": {
"width": 10
},
"size": {
"binaryPrefix": "jedec"
},
"separator": ""
},
"logo": {
"type": "raw",
"source": "~/.config/fastfetch/albedo-konsole.kitty",
"width": 20,
"height": 10
},
"modules": [
"break",
{
"type": "os",
"key": "os",
"keyColor": "yellow",
"format": "{name}"
},
{
"type": "kernel",
"key": "ker",
"keyColor": "green"
},
{
"type": "packages",
"key": "pkgs",
"keyColor": "cyan"
},
{
"type": "shell",
"key": "sh",
"keyColor": "blue",
"format": "{pretty-name}"
},
{
"type": "wm",
"key": "wm",
"keyColor": "red",
"format": "{pretty-name}"
},
{
"type": "uptime",
"key": "up",
"keyColor": "green"
},
{
"type": "cpu",
"key": "cpu",
"keyColor": "red",
"format": "{name}"
},
{
"type": "memory",
"key": "ram",
"keyColor": "yellow",
"format": "{used} / {total}"
},
{
"type": "disk",
"key": "disk",
"keyColor": "cyan",
"folders": [
"/"
],
"format": "{size-used} / {size-total}"
},
"break",
{
"type": "custom",
"format": "\u001b[33m󰮯 \u001b[32m󰊠 \u001b[34m󰊠 \u001b[31m󰊠 \u001b[36m󰊠 \u001b[35m󰊠 \u001b[37m󰊠 \u001b[97m󰊠"
}
]
}
-3
View File
@@ -1,3 +0,0 @@
^/README.*
^/build\.py
__pycache__
-26
View File
@@ -1,26 +0,0 @@
# Fastfetch for Konsole
From the repository root:
```sh
stow -d kde -t "$HOME" fastfetch
```
The configuration, source PNG, and generated logo live in
`kde/fastfetch/.config/fastfetch/`. The generated logo is included, so a new
machine does not need to run the build script.
Choose either this package or `mac/fastfetch`; both own `~/.config/fastfetch/`.
Konsole needs inline image data instead of the original `kitty-direct` file
transfer. The committed `albedo-konsole.kitty` logo is pre-scaled to 20 × 10
cells to avoid grainy terminal scaling.
After changing `albedo.png`, the logo dimensions, or Konsole's font, update
the cell size in `build.py` and regenerate the logo from the repository root:
```sh
python3 kde/fastfetch/build.py
```
The build script requires `vipsthumbnail` from libvips.
-57
View File
@@ -1,57 +0,0 @@
#!/usr/bin/env python3
"""Encode albedo.png as kitty graphics escapes for fastfetch's "raw" logo.
fastfetch's "kitty-direct" logo sends the terminal a file path (t=f). Konsole
only accepts inline data (t=d) and answers t=f with ENOTSUPPORTED, which lands
on the prompt as typed input. These files carry the PNG inline instead, with
q=2 so the terminal never answers at all.
.config/fastfetch/albedo-konsole.kitty pre-scaled for Konsole
Konsole stretches the image to the c x r cell box with nearest-neighbour
scaling, at logical (not device) pixel size, so a 512px source turns grainy.
The Konsole copy is resized with Lanczos to exactly that box, which leaves
Konsole nothing to scale. Rerun after changing the image, the logo size or the
Konsole font.
"""
import base64
import subprocess
import tempfile
from pathlib import Path
PKG = Path(__file__).resolve().parent
DIR = PKG / ".config/fastfetch"
SOURCE = DIR / "albedo.png"
# Logo size in cells; keep in sync with "width" and "height" in config.jsonc.
COLS, ROWS = 20, 10
# Konsole's cell size in logical pixels for JetBrainsMono Nerd Font 10pt
# (QFontMetrics: average advance of Konsole's REPCHAR, and height()).
KONSOLE_CELL = 8, 17
def encode(png: bytes, dst: Path) -> None:
data = base64.b64encode(png)
chunks = [data[i : i + 4096] for i in range(0, len(data), 4096)]
out = bytearray()
for n, chunk in enumerate(chunks):
more = int(n < len(chunks) - 1)
if n == 0:
keys = b"a=T,f=100,t=d,c=%d,r=%d,q=2,m=%d" % (COLS, ROWS, more)
else:
keys = b"m=%d" % more
out += b"\x1b_G" + keys + b";" + chunk + b"\x1b\\"
dst.write_bytes(out)
def resize(width: int, height: int) -> bytes:
with tempfile.TemporaryDirectory() as tmp:
out = Path(tmp) / "out.png"
subprocess.run(
["vipsthumbnail", SOURCE, "--size", f"{width}x{height}!", "-o", out],
check=True,
)
return out.read_bytes()
encode(resize(COLS * KONSOLE_CELL[0], ROWS * KONSOLE_CELL[1]), DIR / "albedo-konsole.kitty")