scheme: dynamic light theme

Autodetect based on wallpaper
Also resize wallpaper so faster
And async magick blur so wallpaper doesnt block
This commit is contained in:
2 * r + 2 * t
2025-01-29 18:17:13 +11:00
parent 6f00e65727
commit 5118c8da96
7 changed files with 56 additions and 5 deletions
-1
View File
@@ -79,7 +79,6 @@ end
if test -d $CONFIG/gtk
log 'Generating GTK+ schemes'
gen-gtk $colours
$CONFIG/gtk/update-scheme.fish
end
# Reload programs if dynamic scheme
+8 -2
View File
@@ -7,13 +7,19 @@ function nl-echo
end
end
. (dirname (status filename))/../util.fish
set -l src (dirname (status filename))
. $src/../util.fish
set -l colour_names rosewater flamingo pink mauve red maroon peach yellow green teal sky sapphire blue lavender
set -l layer_names text subtext1 subtext0 overlay2 overlay1 overlay0 surface2 surface1 surface0 base mantle crust
test -f "$argv[1]" && set -l img "$argv[1]" || set -l img $CACHE/wallpaper/current
set -l colours_raw (okolors (realpath $img) -k 15 -w 0 -l 70,90,75,65,40,35,30,25,20,15,10,8,6)
set -l img ($src/resizeimg.py $img)
$src/islight.py $img && set -l light_vals 40,6,8,10,45,50,55,60,65,70,75,80,85,90 || set -l light_vals 70,90,75,65,40,35,30,25,20,15,10,8,6
set -l colours_raw (okolors (realpath $img) -k 15 -w 0 -l $light_vals)
set -l colours (string split ' ' $colours_raw[2])[2..]
set -l layers (nl-echo $colours_raw | cut -f 1 -d ' ')[3..]
+16
View File
@@ -0,0 +1,16 @@
#!/bin/python
import sys
from PIL import Image
from materialyoucolor.quantize import QuantizeCelebi
from materialyoucolor.score.score import Score
from materialyoucolor.hct import Hct
from resizeimg import resize
if __name__ == "__main__":
with Image.open(sys.argv[1]) as img:
img = resize(img)[0]
colours = QuantizeCelebi(list(img.getdata()), 128)
hct = Hct.from_int(Score.score(colours)[0])
sys.exit(0 if hct.tone > 60 else 1)
+29
View File
@@ -0,0 +1,29 @@
#!/bin/python
import sys
import math
from PIL import Image
def calc_size(w, h, b = 128):
ia = w * h
ba = b * b
s = math.sqrt(ba / ia) if ia > ba else 1
return max(1, round(w * s)), max(1, round(h * s))
def resize(img):
w, h = calc_size(img.width, img.height)
if w < img.width or h < img.height:
return img.resize((w, h), Image.Resampling.BICUBIC), True
return img, False
if __name__ == "__main__":
with Image.open(sys.argv[1]) as img:
img, resized = resize(img)
if resized:
img.save("/tmp/caelestia-resize.png")
print("/tmp/caelestia-resize.png")
else:
print(sys.argv[1])