1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-24 21:42:51 -05:00

Persist theme preference, dynamic auto theme with matugen

This commit is contained in:
bbedward
2025-07-11 11:41:41 -04:00
parent 6e64dfe499
commit 0b4464fe2c
8 changed files with 576 additions and 23 deletions

View File

@@ -0,0 +1,73 @@
# Dynamic Theme Setup
This setup adds wallpaper-aware "Auto" theme support to your Quickshell + Niri environment.
## Prerequisites
Install the required tools:
```bash
# Required for Material-You palette generation
cargo install matugen
# Required for JSON processing (usually pre-installed)
sudo pacman -S jq # Arch Linux
# or: sudo apt install jq # Ubuntu/Debian
# Background setters (choose one)
sudo pacman -S swaybg # Simple and reliable
# or: cargo install swww # Smoother transitions
```
## Setup
1. **Initial wallpaper setup:**
```bash
# Set your initial wallpaper
./scripts/set-wallpaper.sh /path/to/your/wallpaper.jpg
```
2. **Enable Niri color integration (optional):**
Add this line to your `~/.config/niri/config.kdl`:
```kdl
!include "generated_colors.kdl"
```
3. **Enable Auto theme:**
Open Control Center → Theme Picker → Click the gradient "Auto" button
## Usage
### Change wallpaper and auto-update theme:
```bash
./scripts/set-wallpaper.sh /new/wallpaper.jpg
```
### Manual theme switching:
- Use the Control Center theme picker
- Preferences persist across restarts
- Auto theme requires wallpaper symlink to exist
## How it works
1. **Color extraction:** `Colors.qml` uses Quickshell's ColorQuantizer to extract dominant colors from the wallpaper symlink
2. **Persistence:** `Prefs.qml` stores your theme choice using PersistentProperties
3. **Dynamic switching:** `Theme.qml` switches between static themes and wallpaper colors
4. **Auto-reload:** Quickshell's file watching automatically reloads when the wallpaper symlink changes
## Troubleshooting
### "Dynamic theme requires wallpaper setup!" error
Run the setup command:
```bash
./scripts/set-wallpaper.sh /path/to/your/wallpaper.jpg
```
### Colors don't update when changing wallpaper
- Make sure you're using the script, not manually changing files
- The symlink at `~/quickshell/current_wallpaper` must exist
### Niri colors don't change
- Ensure `!include "generated_colors.kdl"` is in your config.kdl
- Check that matugen and jq are installed
- Look for `~/.config/niri/generated_colors.kdl`

78
scripts/set-wallpaper.sh Executable file
View File

@@ -0,0 +1,78 @@
#!/usr/bin/env bash
set -euo pipefail
img=$1
QS_DIR="$HOME/quickshell"
mkdir -p "$QS_DIR"
LINK="$QS_DIR/current_wallpaper"
ln -sf -- "$img" "$LINK"
swaybg -m fill -i "$LINK" & disown
json="$(matugen image "$img" --json hex)"
get() { jq -r "$1" <<<"$json"; }
bg=$(get '.colors.dark.background')
fg=$(get '.colors.dark.on_background')
primary=$(get '.colors.dark.primary')
secondary=$(get '.colors.dark.secondary')
tertiary=$(get '.colors.dark.tertiary')
tertiary_ctr=$(get '.colors.dark.tertiary_container')
error=$(get '.colors.dark.error')
inverse=$(get '.colors.dark.inverse_primary')
bg_b=$(get '.colors.light.background')
fg_b=$(get '.colors.light.on_background')
primary_b=$(get '.colors.light.primary')
secondary_b=$(get '.colors.light.secondary')
tertiary_b=$(get '.colors.light.tertiary')
tertiary_ctr_b=$(get '.colors.light.tertiary_container')
error_b=$(get '.colors.light.error')
inverse_b=$(get '.colors.light.inverse_primary')
cat >"$QS_DIR/generated_niri_colors.kdl" <<EOF
// AUTO-GENERATED on $(date)
layout {
    border {
        active-color   "$primary"
        inactive-color "$secondary"
    }
    focus-ring {
        active-color   "$inverse"
    }
    background-color "$bg"
}
EOF
echo "→ Niri colours:   $QS_DIR/generated_niri_colors.kdl"
cat >"$QS_DIR/generated_ghostty_colors.conf" <<EOF
# AUTO-GENERATED on $(date)
background = $bg
foreground = $fg
cursor-color = $inverse
selection-background = $secondary
selection-foreground = #ffffff
palette = 0=$bg
palette = 1=$error
palette = 2=$tertiary
palette = 3=$secondary
palette = 4=$primary
palette = 5=$tertiary_ctr
palette = 6=$inverse
palette = 7=$fg
palette = 8=$bg_b
palette = 9=$error_b
palette = 10=$tertiary_b
palette = 11=$secondary_b
palette = 12=$primary_b
palette = 13=$tertiary_ctr_b
palette = 14=$inverse_b
palette = 15=$fg_b
EOF
echo "→ Ghostty theme:  $QS_DIR/generated_ghostty_colors.conf"
echo "   (use in ghostty:  theme = $QS_DIR/generated_ghostty_colors.conf )"
niri msg action do-screen-transition --delay-ms 100