diff --git a/.config/hypr/hyprland.colors.conf b/.config/hypr/hyprland.colors.conf
new file mode 100644
index 0000000..c9ad99f
--- /dev/null
+++ b/.config/hypr/hyprland.colors.conf
@@ -0,0 +1,11 @@
+
+general {
+ col.active_border = rgba(F7DCDE39)
+ col.inactive_border = rgba(A58A8D30)
+}
+
+misc {
+ background_color = rgba(1D1011FF)
+}
+
+windowrulev2 = bordercolor rgba(FFB2BCAA) rgba(FFB2BC77),pinned:1
\ No newline at end of file
diff --git a/.config/hypr/hyprland.conf b/.config/hypr/hyprland.conf
index 9d3f54a..e8d5771 100644
--- a/.config/hypr/hyprland.conf
+++ b/.config/hypr/hyprland.conf
@@ -24,6 +24,7 @@ cursor {
source = ~/.config/hypr/monitors.conf
source = ~/.config/hypr/workspaces.conf
+source = ~/.config/hypr/hyprland.colors.conf
debug:disable_logs = false
@@ -67,7 +68,10 @@ exec-once=otd-daemon
exec-once=lorri daemon
#exec-once=wlsunset -S 6:00 -s 21:30
-exec-once=swaybg -m fill -i ~/.config/hypr/wallpapers/sunflowers.jpg
+# exec-once=swaybg -m fill -i ~/.config/hypr/wallpapers/sunflowers.jpg
+exec-once = swww-daemon --format xrgb --no-cache
+# "$(cat ~/.local/state/quickshell/user/generated/wallpaper/path.txt)"
+exec-once = sleep 0.5; swww img ~/.config/hypr/wallpapers/sunflowers.jpg --transition-step 100 --transition-fps 120 --transition-type grow --transition-angle 30 --transition-duration 1
# exec-once=waybar
exec-once=quickshell
exec-once=blueman-applet
@@ -80,6 +84,10 @@ exec-once=sleep 10;aw-qt& sleep 2; awatcher
exec-once = nm-applet --indicator # systray app for Network/Wifi
exec-once=kdeconnect-indicator
exec-once = hyprpm reload -n
+exec-once = wl-paste --type text --watch cliphist store
+exec-once = wl-paste --type image --watch cliphist store
+exec-once = fcitx5
+exec-once = easyeffects --gapplication-service
#$swaylock = swaylock --screenshots --clock --indicator --effect-blur 6x6 --fade-in 0.2 --ring-color 4e9dc2 --key-hl-color 71b0ce
$swaylock = hyprlock
@@ -156,8 +164,8 @@ general {
gaps_in = 5
gaps_out = 10
border_size = 1
- col.active_border = rgba(75DDDD50) rgba(09BC8A50) 45deg
- col.inactive_border = rgba(172A3AFF)
+ # col.active_border = rgba(75DDDD50) rgba(09BC8A50) 45deg
+ # col.inactive_border = rgba(172A3AFF)
layout = master
resize_on_border = true
@@ -251,6 +259,9 @@ windowrule=float,title:Open File
windowrule=float,title:branchdialog
windowrule=tile,title:*vivaldi*
+# can be more specific (:bar, :mediaControls, etc)
+layerrule = blur, quickshell
+
blurls=gtk-layer-shell
blurls=lockscreen
blurls = rofi
diff --git a/.config/hypr/hyprlock.conf b/.config/hypr/hyprlock.conf
index c8c7bf9..0e67515 100644
--- a/.config/hypr/hyprlock.conf
+++ b/.config/hypr/hyprlock.conf
@@ -1,6 +1,10 @@
-general {
-
-}
+$text_color = rgba(FFDAD6FF)
+$entry_background_color = rgba(41000311)
+$entry_border_color = rgba(896E6C55)
+$entry_color = rgba(FFDAD6FF)
+$font_family = Rubik Light
+$font_family_clock = Rubik Light
+$font_material_symbols = Material Symbols Rounded
background {
monitor =
@@ -16,35 +20,80 @@ background {
vibrancy = 0.1696
vibrancy_darkness = 0.0
}
-
input-field {
monitor =
- size = 200, 50
- outline_thickness = 3
- dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
- dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
- dots_center = false
- dots_rounding = -1 # -1 default circle, -2 follow input-field rounding
- outer_color = rgb(151515)
- inner_color = rgb(200, 200, 200)
- font_color = rgb(10, 10, 10)
+ size = 250, 50
+ outline_thickness = 2
+ dots_size = 0.1
+ dots_spacing = 0.3
+ outer_color = $entry_border_color
+ inner_color = $entry_background_color
+ font_color = $entry_color
fade_on_empty = true
- fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered.
- placeholder_text = Password # Text rendered in the input box when it's empty.
- hide_input = false
- rounding = -1 # -1 means complete rounding (circle/oval)
- check_color = rgb(204, 136, 34)
- fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color
- fail_text = $FAIL ($ATTEMPTS) # can be set to empty
- fail_timeout = 2000 # milliseconds before fail_text and fail_color disappears
- fail_transition = 300 # transition time in ms between normal outer_color and fail_color
- capslock_color = -1
- numlock_color = -1
- bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above)
- invert_numlock = false # change color if numlock is off
- swap_font_color = false # see below
- position = 0, -20
+ position = 0, 20
halign = center
valign = center
+}
+
+label { # Caps Lock Warning
+ monitor =
+ text = cmd[update:250] ${XDG_CONFIG_HOME:-$HOME/.config}/hypr/hyprlock/check-capslock.sh
+ color = $text_color
+ font_size = 13
+ font_family = $font_family
+ position = 0, -25
+ halign = center
+ valign = center
+}
+
+
+label { # Clock
+ monitor =
+ text = $TIME
+ color = $text_color
+ font_size = 65
+ font_family = $font_family_clock
+
+ position = 0, 300
+ halign = center
+ valign = center
+}
+label { # Date
+ monitor =
+ text = cmd[update:5000] date +"%A, %B %d"
+ color = $text_color
+ font_size = 17
+ font_family = $font_family
+
+ position = 0, 240
+ halign = center
+ valign = center
+}
+
+label { # User
+ monitor =
+ text = $USER
+ color = $text_color
+ outline_thickness = 2
+ dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8
+ dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
+ dots_center = true
+ font_size = 20
+ font_family = $font_family
+ position = 0, 50
+ halign = center
+ valign = bottom
+}
+
+label { # Status
+ monitor =
+ text = cmd[update:5000] ${XDG_CONFIG_HOME:-$HOME/.config}/hypr/hyprlock/status.sh
+ color = $text_color
+ font_size = 14
+ font_family = $font_family
+
+ position = 30, -30
+ halign = left
+ valign = top
}
\ No newline at end of file
diff --git a/.config/hypr/hyprlock/check-capslock.sh b/.config/hypr/hyprlock/check-capslock.sh
new file mode 100644
index 0000000..ca56178
--- /dev/null
+++ b/.config/hypr/hyprlock/check-capslock.sh
@@ -0,0 +1,9 @@
+#!/bin/env bash
+
+MAIN_KB_CAPS=$(hyprctl devices | grep -B 6 "main: yes" | grep "capsLock" | head -1 | awk '{print $2}')
+
+if [ "$MAIN_KB_CAPS" = "yes" ]; then
+ echo "Caps Lock active"
+else
+ echo ""
+fi
diff --git a/.config/hypr/hyprlock/status.sh b/.config/hypr/hyprlock/status.sh
new file mode 100644
index 0000000..dd80633
--- /dev/null
+++ b/.config/hypr/hyprlock/status.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+
+############ Variables ############
+enable_battery=false
+battery_charging=false
+
+####### Check availability ########
+for battery in /sys/class/power_supply/*BAT*; do
+ if [[ -f "$battery/uevent" ]]; then
+ enable_battery=true
+ if [[ $(cat /sys/class/power_supply/*/status | head -1) == "Charging" ]]; then
+ battery_charging=true
+ fi
+ break
+ fi
+done
+
+############# Output #############
+if [[ $enable_battery == true ]]; then
+ if [[ $battery_charging == true ]]; then
+ echo -n "(+) "
+ fi
+ echo -n "$(cat /sys/class/power_supply/*/capacity | head -1)"%
+ if [[ $battery_charging == false ]]; then
+ echo -n " remaining"
+ fi
+fi
+
+echo ''
\ No newline at end of file
diff --git a/.config/matugen/config.toml b/.config/matugen/config.toml
new file mode 100644
index 0000000..e920943
--- /dev/null
+++ b/.config/matugen/config.toml
@@ -0,0 +1,34 @@
+[config]
+version_check = false
+
+[templates.m3colors]
+input_path = '~/.config/matugen/templates/colors.json'
+output_path = '~/.local/state/quickshell/user/generated/colors.json'
+
+[templates.hyprland]
+input_path = '~/.config/matugen/templates/hyprland/hyprland.colors.conf'
+output_path = '~/.config/hypr/hyprland.colors.conf'
+
+[templates.hyprlock]
+input_path = '~/.config/matugen/templates/hyprland/hyprlock.conf'
+output_path = '~/.config/hypr/hyprlock.conf'
+
+[templates.fuzzel]
+input_path = '~/.config/matugen/templates/fuzzel/fuzzel_theme.ini'
+output_path = '~/.config/fuzzel/fuzzel_theme.ini'
+
+[templates.gtk3]
+input_path = '~/.config/matugen/templates/gtk/gtk-colors.css'
+output_path = '~/.config/gtk-3.0/gtk.css'
+
+[templates.gtk4]
+input_path = '~/.config/matugen/templates/gtk/gtk-colors.css'
+output_path = '~/.config/gtk-4.0/gtk.css'
+
+[templates.kde_colors]
+input_path = '~/.config/matugen/templates/kde/color.txt'
+output_path = '~/.local/state/quickshell/user/generated/color.txt'
+
+[templates.wallpaper]
+input_path = '~/.config/matugen/templates/wallpaper.txt'
+output_path = '~/.local/state/quickshell/user/generated/wallpaper/path.txt'
diff --git a/.config/matugen/scripts/least_busy_region.py b/.config/matugen/scripts/least_busy_region.py
new file mode 100755
index 0000000..a1f2f47
--- /dev/null
+++ b/.config/matugen/scripts/least_busy_region.py
@@ -0,0 +1,338 @@
+#!/usr/bin/env python3
+# Disclaimer: This script was ai-generated and went through minimal revision.
+
+import os
+os.environ["OPENCV_LOG_LEVEL"] = "SILENT"
+import cv2
+import numpy as np
+import argparse
+import json
+
+def center_crop(img, target_w, target_h):
+ h, w = img.shape[:2]
+ if w == target_w and h == target_h:
+ return img
+ x1 = max(0, (w - target_w) // 2)
+ y1 = max(0, (h - target_h) // 2)
+ x2 = x1 + target_w
+ y2 = y1 + target_h
+ return img[y1:y2, x1:x2]
+
+def find_least_busy_region(image_path, region_width=300, region_height=200, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", padding=50):
+ img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
+ if img is None:
+ raise FileNotFoundError(f"Image not found: {image_path}")
+ orig_h, orig_w = img.shape
+ scale = 1.0
+ if screen_width is not None and screen_height is not None:
+ scale_w = screen_width / orig_w
+ scale_h = screen_height / orig_h
+ if screen_mode == "fill":
+ scale = max(scale_w, scale_h)
+ else:
+ scale = min(scale_w, scale_h)
+ new_w = int(orig_w * scale)
+ new_h = int(orig_h * scale)
+ if verbose:
+ print(f"Scaling image from {orig_w}x{orig_h} to {new_w}x{new_h} (scale: {scale:.3f}, mode: {screen_mode})")
+ img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LANCZOS4)
+ img = center_crop(img, screen_width, screen_height)
+ if verbose:
+ print(f"Cropped image to {screen_width}x{screen_height}")
+ else:
+ if verbose:
+ print(f"Using original image size: {orig_w}x{orig_h}")
+ arr = img.astype(np.float64)
+ h, w = arr.shape
+ # Use OpenCV's integral for fast computation
+ integral = cv2.integral(arr, sdepth=cv2.CV_64F)[1:,1:]
+ integral_sq = cv2.integral(arr**2, sdepth=cv2.CV_64F)[1:,1:]
+ def region_sum(ii, x1, y1, x2, y2):
+ total = ii[y2, x2]
+ if x1 > 0:
+ total -= ii[y2, x1-1]
+ if y1 > 0:
+ total -= ii[y1-1, x2]
+ if x1 > 0 and y1 > 0:
+ total += ii[y1-1, x1-1]
+ return total
+ min_var = None
+ min_coords = (0, 0)
+ area = region_width * region_height
+ x_start = padding
+ y_start = padding
+ x_end = w - region_width - padding + 1
+ y_end = h - region_height - padding + 1
+ for y in range(y_start, max(y_end, y_start+1), stride):
+ for x in range(x_start, max(x_end, x_start+1), stride):
+ x1, y1 = x, y
+ x2, y2 = x + region_width - 1, y + region_height - 1
+ s = region_sum(integral, x1, y1, x2, y2)
+ s2 = region_sum(integral_sq, x1, y1, x2, y2)
+ mean = s / area
+ var = (s2 / area) - (mean ** 2)
+ if (min_var is None) or (var < min_var):
+ min_var = var
+ min_coords = (x, y)
+ return min_coords, min_var
+
+def find_largest_region(image_path, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", threshold=100.0, aspect_ratio=1.0, padding=50):
+ img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
+ if img is None:
+ raise FileNotFoundError(f"Image not found: {image_path}")
+ orig_h, orig_w = img.shape
+ scale = 1.0
+ if screen_width is not None and screen_height is not None:
+ scale_w = screen_width / orig_w
+ scale_h = screen_height / orig_h
+ if screen_mode == "fill":
+ scale = max(scale_w, scale_h)
+ else:
+ scale = min(scale_w, scale_h)
+ new_w = int(orig_w * scale)
+ new_h = int(orig_h * scale)
+ if verbose:
+ print(f"Scaling image from {orig_w}x{orig_h} to {new_w}x{new_h} (scale: {scale:.3f}, mode: {screen_mode})")
+ img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LANCZOS4)
+ img = center_crop(img, screen_width, screen_height)
+ if verbose:
+ print(f"Cropped image to {screen_width}x{screen_height}")
+ else:
+ if verbose:
+ print(f"Using original image size: {orig_w}x{orig_h}")
+ arr = img.astype(np.float64)
+ h, w = arr.shape
+ # Use OpenCV's integral for fast computation
+ integral = cv2.integral(arr, sdepth=cv2.CV_64F)[1:,1:]
+ integral_sq = cv2.integral(arr**2, sdepth=cv2.CV_64F)[1:,1:]
+ def region_sum(ii, x1, y1, x2, y2):
+ total = ii[y2, x2]
+ if x1 > 0:
+ total -= ii[y2, x1-1]
+ if y1 > 0:
+ total -= ii[y1-1, x2]
+ if x1 > 0 and y1 > 0:
+ total += ii[y1-1, x1-1]
+ return total
+ min_size = 10
+ max_size = min(h, int(w / aspect_ratio)) if aspect_ratio >= 1.0 else min(int(h * aspect_ratio), w)
+ best = None
+ best_size = min_size
+ while min_size <= max_size:
+ mid = (min_size + max_size) // 2
+ if aspect_ratio >= 1.0:
+ region_h = mid
+ region_w = int(mid * aspect_ratio)
+ else:
+ region_w = mid
+ region_h = int(mid / aspect_ratio)
+ if region_w > w or region_h > h:
+ max_size = mid - 1
+ continue
+ found = False
+ x_start = padding
+ y_start = padding
+ x_end = w - region_w - padding + 1
+ y_end = h - region_h - padding + 1
+ for y in range(y_start, max(y_end, y_start+1), stride):
+ for x in range(x_start, max(x_end, x_start+1), stride):
+ x1, y1 = x, y
+ x2, y2 = x + region_w - 1, y + region_h - 1
+ s = region_sum(integral, x1, y1, x2, y2)
+ s2 = region_sum(integral_sq, x1, y1, x2, y2)
+ area = region_w * region_h
+ mean = s / area
+ var = (s2 / area) - (mean ** 2)
+ if var <= threshold:
+ found = True
+ best = (x, y, region_w, region_h, var)
+ break
+ if found:
+ break
+ if found:
+ best_size = mid
+ min_size = mid + 1
+ else:
+ max_size = mid - 1
+ if best:
+ x, y, region_w, region_h, var = best
+ center_x = x + region_w // 2
+ center_y = y + region_h // 2
+ return (center_x, center_y), (region_w, region_h), var
+ else:
+ return None, (0, 0), None
+
+def draw_region(image_path, coords, region_width=300, region_height=200, output_path='output.png', screen_width=None, screen_height=None, screen_mode="fill"):
+ img = cv2.imread(image_path)
+ if img is None:
+ raise FileNotFoundError(f"Image not found: {image_path}")
+ orig_h, orig_w = img.shape[:2]
+ if screen_width is not None and screen_height is not None:
+ scale_w = screen_width / orig_w
+ scale_h = screen_height / orig_h
+ if screen_mode == "fill":
+ scale = max(scale_w, scale_h)
+ else:
+ scale = min(scale_w, scale_h)
+ new_w = int(orig_w * scale)
+ new_h = int(orig_h * scale)
+ img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LANCZOS4)
+ img = center_crop(img, screen_width, screen_height)
+ x, y = coords
+ cv2.rectangle(img, (x, y), (x+region_width-1, y+region_height-1), (0,0,255), 3)
+ cv2.imwrite(output_path, img)
+ print(f"Saved output image with rectangle at {output_path}")
+
+def draw_largest_region(image_path, center, size, output_path='output.png', screen_width=None, screen_height=None, screen_mode="fill"):
+ img = cv2.imread(image_path)
+ if img is None:
+ raise FileNotFoundError(f"Image not found: {image_path}")
+ orig_h, orig_w = img.shape[:2]
+ if screen_width is not None and screen_height is not None:
+ scale_w = screen_width / orig_w
+ scale_h = screen_height / orig_h
+ if screen_mode == "fill":
+ scale = max(scale_w, scale_h)
+ else:
+ scale = min(scale_w, scale_h)
+ new_w = int(orig_w * scale)
+ new_h = int(orig_h * scale)
+ img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LANCZOS4)
+ img = center_crop(img, screen_width, screen_height)
+ cx, cy = center
+ region_w, region_h = size
+ x1 = cx - region_w // 2
+ y1 = cy - region_h // 2
+ x2 = cx + region_w // 2 - 1
+ y2 = cy + region_h // 2 - 1
+ cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 3)
+ cv2.imwrite(output_path, img)
+ print(f"Saved output image with largest region at {output_path}")
+
+def get_dominant_color(image_path, x, y, w, h, screen_width=None, screen_height=None, screen_mode="fill"):
+ img = cv2.imread(image_path)
+ if img is None:
+ raise FileNotFoundError(f"Image not found: {image_path}")
+ orig_h, orig_w = img.shape[:2]
+ if screen_width is not None and screen_height is not None:
+ scale_w = screen_width / orig_w
+ scale_h = screen_height / orig_h
+ if screen_mode == "fill":
+ scale = max(scale_w, scale_h)
+ else:
+ scale = min(scale_w, scale_h)
+ new_w = int(orig_w * scale)
+ new_h = int(orig_h * scale)
+ img = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LANCZOS4)
+ img = center_crop(img, screen_width, screen_height)
+ # Ensure region is within bounds
+ x = max(0, x)
+ y = max(0, y)
+ w = max(1, min(w, img.shape[1] - x))
+ h = max(1, min(h, img.shape[0] - y))
+ region = img[y:y+h, x:x+w]
+ if region.size == 0 or region.shape[0] == 0 or region.shape[1] == 0:
+ return [0, 0, 0]
+ region = region.reshape((-1, 3))
+ # Filter out black pixels (optional, improves accuracy for some images)
+ non_black = region[np.any(region > 10, axis=1)]
+ if non_black.shape[0] == 0:
+ non_black = region
+ region = np.float32(non_black)
+ if region.shape[0] < 3:
+ return [int(x) for x in np.mean(region, axis=0)]
+ # K-means to find dominant color
+ criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
+ K = min(3, region.shape[0])
+ _, labels, centers = cv2.kmeans(region, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
+ counts = np.bincount(labels.flatten())
+ dominant = centers[np.argmax(counts)]
+ return [int(x) for x in dominant]
+
+def main():
+ parser = argparse.ArgumentParser(description="Find least busy region in an image and output a JSON. Made for determining a suitable position for a wallpaper widget.")
+ parser.add_argument("image_path", help="Path to the input image")
+ parser.add_argument("--width", type=int, default=300, help="Region width")
+ parser.add_argument("--height", type=int, default=200, help="Region height")
+ parser.add_argument("-v", "--visual-output", action="store_true", help="Output image with rectangle")
+ parser.add_argument("--screen-width", type=int, default=1920, help="Screen width for wallpaper scaling")
+ parser.add_argument("--screen-height", type=int, default=1080, help="Screen height for wallpaper scaling")
+ parser.add_argument("--stride", type=int, default=4, help="Step size for sliding window (higher is faster, less precise)")
+ parser.add_argument("--screen-mode", choices=["fill", "fit"], default="fill", help="Wallpaper scaling mode: 'fill' (default) or 'fit'")
+ parser.add_argument("--verbose", action="store_true", help="Print verbose output")
+ parser.add_argument("-l", "--largest-region", action="store_true", help="Find the largest region under the variance threshold and output its center")
+ parser.add_argument("-t", "--variance-threshold", type=float, default=1000.0, help="Variance threshold for largest region mode")
+ parser.add_argument("--aspect-ratio", type=float, default=1.78, help="Aspect ratio (width/height) for largest region mode")
+ parser.add_argument("--padding", type=int, default=50, help="Minimum distance from region to image edge (default: 50)")
+ args = parser.parse_args()
+
+ if args.largest_region:
+ center, size, var = find_largest_region(
+ args.image_path,
+ screen_width=args.screen_width,
+ screen_height=args.screen_height,
+ verbose=args.verbose,
+ stride=args.stride,
+ screen_mode=args.screen_mode,
+ threshold=args.variance_threshold,
+ aspect_ratio=args.aspect_ratio,
+ padding=args.padding
+ )
+ if center:
+ if args.visual_output:
+ draw_largest_region(args.image_path, center, size, screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode)
+ # Extract dominant color
+ cx, cy = center
+ region_w, region_h = size
+ x1 = cx - region_w // 2
+ y1 = cy - region_h // 2
+ dominant_color = get_dominant_color(
+ args.image_path, x1, y1, region_w, region_h,
+ screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode
+ )
+ dominant_color_hex = '#{:02x}{:02x}{:02x}'.format(*dominant_color)
+ print(json.dumps({
+ "center_x": center[0],
+ "center_y": center[1],
+ "width": size[0],
+ "height": size[1],
+ "variance": var,
+ "dominant_color": dominant_color_hex
+ }))
+ else:
+ print(json.dumps({"error": "No region found under the threshold."}))
+ return
+
+ coords, variance = find_least_busy_region(
+ args.image_path,
+ region_width=args.width,
+ region_height=args.height,
+ screen_width=args.screen_width,
+ screen_height=args.screen_height,
+ verbose=args.verbose,
+ stride=args.stride,
+ screen_mode=args.screen_mode,
+ padding=args.padding
+ )
+ if args.visual_output:
+ draw_region(args.image_path, coords, region_width=args.width, region_height=args.height, screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode)
+ # Output JSON with center point
+ center_x = coords[0] + args.width // 2
+ center_y = coords[1] + args.height // 2
+ dominant_color = get_dominant_color(
+ args.image_path, coords[0], coords[1], args.width, args.height,
+ screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode
+ )
+ dominant_color_hex = '#{:02x}{:02x}{:02x}'.format(*dominant_color)
+ print(json.dumps({
+ "center_x": center_x,
+ "center_y": center_y,
+ "width": args.width,
+ "height": args.height,
+ "variance": variance,
+ "dominant_color": dominant_color_hex
+ }))
+
+if __name__ == "__main__":
+ main()
+
diff --git a/.config/matugen/templates/ags/_material.scss b/.config/matugen/templates/ags/_material.scss
new file mode 100644
index 0000000..81acbfe
--- /dev/null
+++ b/.config/matugen/templates/ags/_material.scss
@@ -0,0 +1,70 @@
+$darkmode: False;
+$transparent: False;
+$background: {{colors.background.default.hex}};
+$onBackground: {{colors.on_background.default.hex}};
+$surface: {{colors.surface.default.hex}};
+$surfaceDim: {{colors.surface_dim.default.hex}};
+$surfaceBright: {{colors.surface_bright.default.hex}};
+$surfaceContainerLowest: {{colors.surface_container_lowest.default.hex}};
+$surfaceContainerLow: {{colors.surface_container_low.default.hex}};
+$surfaceContainer: {{colors.surface_container.default.hex}};
+$surfaceContainerHigh: {{colors.surface_container_high.default.hex}};
+$surfaceContainerHighest: {{colors.surface_container_highest.default.hex}};
+$onSurface: {{colors.on_surface.default.hex}};
+$surfaceVariant: {{colors.surface_variant.default.hex}};
+$onSurfaceVariant: {{colors.on_surface_variant.default.hex}};
+$inverseSurface: {{colors.inverse_surface.default.hex}};
+$inverseOnSurface: {{colors.inverse_on_surface.default.hex}};
+$outline: {{colors.outline.default.hex}};
+$outlineVariant: {{colors.outline_variant.default.hex}};
+$shadow: {{colors.shadow.default.hex}};
+$scrim: {{colors.scrim.default.hex}};
+$primary: {{colors.primary.default.hex}};
+$onPrimary: {{colors.on_primary.default.hex}};
+$primaryContainer: {{colors.primary_container.default.hex}};
+$onPrimaryContainer: {{colors.on_primary_container.default.hex}};
+$inversePrimary: {{colors.inverse_primary.default.hex}};
+$secondary: {{colors.secondary.default.hex}};
+$onSecondary: {{colors.on_secondary.default.hex}};
+$secondaryContainer: {{colors.secondary_container.default.hex}};
+$onSecondaryContainer: {{colors.on_secondary_container.default.hex}};
+$tertiary: {{colors.tertiary.default.hex}};
+$onTertiary: {{colors.on_tertiary.default.hex}};
+$tertiaryContainer: {{colors.tertiary_container.default.hex}};
+$onTertiaryContainer: {{colors.on_tertiary_container.default.hex}};
+$error: {{colors.error.default.hex}};
+$onError: {{colors.on_error.default.hex}};
+$errorContainer: {{colors.error_container.default.hex}};
+$onErrorContainer: {{colors.on_error_container.default.hex}};
+$primaryFixed: {{colors.primary_fixed.default.hex}};
+$primaryFixedDim: {{colors.primary_fixed_dim.default.hex}};
+$onPrimaryFixed: {{colors.on_primary_fixed.default.hex}};
+$onPrimaryFixedVariant: {{colors.on_primary_fixed_variant.default.hex}};
+$secondaryFixed: {{colors.secondary_fixed.default.hex}};
+$secondaryFixedDim: {{colors.secondary_fixed_dim.default.hex}};
+$onSecondaryFixed: {{colors.on_secondary_fixed.default.hex}};
+$onSecondaryFixedVariant: {{colors.on_secondary_fixed_variant.default.hex}};
+$tertiaryFixed: {{colors.tertiary_fixed.default.hex}};
+$tertiaryFixedDim: {{colors.tertiary_fixed_dim.default.hex}};
+$onTertiaryFixed: {{colors.on_tertiary_fixed.default.hex}};
+$onTertiaryFixedVariant: {{colors.on_tertiary_fixed_variant.default.hex}};
+$success: #B5CCBA;
+$onSuccess: #213528;
+$successContainer: #374B3E;
+$onSuccessContainer: #D1E9D6;
+$term0: #0D1C20;
+$term1: #8383FF;
+$term2: #63DFD4;
+$term3: #75FCDD;
+$term4: #76B4BD;
+$term5: #7AAEEA;
+$term6: #81D8D7;
+$term7: #CCDBD5;
+$term8: #B1BCB5;
+$term9: #BCB9FF;
+$term10: #F6FFFD;
+$term11: #FFFFFF;
+$term12: #BEE3E5;
+$term13: #C8DAFF;
+$term14: #E5FFFE;
+$term15: #ADEDF6;
diff --git a/.config/matugen/templates/ags/sourceviewtheme-light.xml b/.config/matugen/templates/ags/sourceviewtheme-light.xml
new file mode 100644
index 0000000..d501c31
--- /dev/null
+++ b/.config/matugen/templates/ags/sourceviewtheme-light.xml
@@ -0,0 +1,95 @@
+
+
+ end_4
+ <_description>Catppuccin port but very random
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.config/matugen/templates/ags/sourceviewtheme.xml b/.config/matugen/templates/ags/sourceviewtheme.xml
new file mode 100644
index 0000000..7198099
--- /dev/null
+++ b/.config/matugen/templates/ags/sourceviewtheme.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+ Leo Iannacone
+ <_description>Based on SublimeText Monokai Extended - Generated with tm2gtksw2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.config/matugen/templates/colors.json b/.config/matugen/templates/colors.json
new file mode 100644
index 0000000..25f80e8
--- /dev/null
+++ b/.config/matugen/templates/colors.json
@@ -0,0 +1,51 @@
+{
+ "background": "{{colors.background.default.hex}}",
+ "error": "{{colors.error.default.hex}}",
+ "error_container": "{{colors.error_container.default.hex}}",
+ "inverse_on_surface": "{{colors.inverse_on_surface.default.hex}}",
+ "inverse_primary": "{{colors.inverse_primary.default.hex}}",
+ "inverse_surface": "{{colors.inverse_surface.default.hex}}",
+ "on_background": "{{colors.on_background.default.hex}}",
+ "on_error": "{{colors.on_error.default.hex}}",
+ "on_error_container": "{{colors.on_error_container.default.hex}}",
+ "on_primary": "{{colors.on_primary.default.hex}}",
+ "on_primary_container": "{{colors.on_primary_container.default.hex}}",
+ "on_primary_fixed": "{{colors.on_primary_fixed.default.hex}}",
+ "on_primary_fixed_variant": "{{colors.on_primary_fixed_variant.default.hex}}",
+ "on_secondary": "{{colors.on_secondary.default.hex}}",
+ "on_secondary_container": "{{colors.on_secondary_container.default.hex}}",
+ "on_secondary_fixed": "{{colors.on_secondary_fixed.default.hex}}",
+ "on_secondary_fixed_variant": "{{colors.on_secondary_fixed_variant.default.hex}}",
+ "on_surface": "{{colors.on_surface.default.hex}}",
+ "on_surface_variant": "{{colors.on_surface_variant.default.hex}}",
+ "on_tertiary": "{{colors.on_tertiary.default.hex}}",
+ "on_tertiary_container": "{{colors.on_tertiary_container.default.hex}}",
+ "on_tertiary_fixed": "{{colors.on_tertiary_fixed.default.hex}}",
+ "on_tertiary_fixed_variant": "{{colors.on_tertiary_fixed_variant.default.hex}}",
+ "outline": "{{colors.outline.default.hex}}",
+ "outline_variant": "{{colors.outline_variant.default.hex}}",
+ "primary": "{{colors.primary.default.hex}}",
+ "primary_container": "{{colors.primary_container.default.hex}}",
+ "primary_fixed": "{{colors.primary_fixed.default.hex}}",
+ "primary_fixed_dim": "{{colors.primary_fixed_dim.default.hex}}",
+ "scrim": "{{colors.scrim.default.hex}}",
+ "secondary": "{{colors.secondary.default.hex}}",
+ "secondary_container": "{{colors.secondary_container.default.hex}}",
+ "secondary_fixed": "{{colors.secondary_fixed.default.hex}}",
+ "secondary_fixed_dim": "{{colors.secondary_fixed_dim.default.hex}}",
+ "shadow": "{{colors.shadow.default.hex}}",
+ "surface": "{{colors.surface.default.hex}}",
+ "surface_bright": "{{colors.surface_bright.default.hex}}",
+ "surface_container": "{{colors.surface_container.default.hex}}",
+ "surface_container_high": "{{colors.surface_container_high.default.hex}}",
+ "surface_container_highest": "{{colors.surface_container_highest.default.hex}}",
+ "surface_container_low": "{{colors.surface_container_low.default.hex}}",
+ "surface_container_lowest": "{{colors.surface_container_lowest.default.hex}}",
+ "surface_dim": "{{colors.surface_dim.default.hex}}",
+ "surface_tint": "{{colors.surface_tint.default.hex}}",
+ "surface_variant": "{{colors.surface_variant.default.hex}}",
+ "tertiary": "{{colors.tertiary.default.hex}}",
+ "tertiary_container": "{{colors.tertiary_container.default.hex}}",
+ "tertiary_fixed": "{{colors.tertiary_fixed.default.hex}}",
+ "tertiary_fixed_dim": "{{colors.tertiary_fixed_dim.default.hex}}"
+}
diff --git a/.config/matugen/templates/fuzzel/fuzzel_theme.ini b/.config/matugen/templates/fuzzel/fuzzel_theme.ini
new file mode 100644
index 0000000..ec7e1a6
--- /dev/null
+++ b/.config/matugen/templates/fuzzel/fuzzel_theme.ini
@@ -0,0 +1,8 @@
+[colors]
+background={{colors.background.default.hex_stripped}}ff
+text={{colors.on_background.default.hex_stripped}}ff
+selection={{colors.surface_variant.default.hex_stripped}}ff
+selection-text={{colors.on_surface_variant.default.hex_stripped}}ff
+border={{colors.surface_variant.default.hex_stripped}}dd
+match={{colors.primary.default.hex_stripped}}ff
+selection-match={{colors.primary.default.hex_stripped}}ff
diff --git a/.config/matugen/templates/gtk/gtk-colors.css b/.config/matugen/templates/gtk/gtk-colors.css
new file mode 100644
index 0000000..c0054f8
--- /dev/null
+++ b/.config/matugen/templates/gtk/gtk-colors.css
@@ -0,0 +1,22 @@
+/*
+* GTK Colors
+* Generated with Matugen
+*/
+
+@define-color accent_color {{colors.primary.default.hex}};
+@define-color accent_fg_color {{colors.on_primary.default.hex}};
+@define-color accent_bg_color {{colors.primary.default.hex}};
+@define-color window_bg_color {{colors.background.default.hex}};
+@define-color window_fg_color {{colors.on_background.default.hex}};
+@define-color headerbar_bg_color {{colors.surface_dim.default.hex}};
+@define-color headerbar_fg_color {{colors.on_surface.default.hex}};
+@define-color popover_bg_color {{colors.surface_dim.default.hex}};
+@define-color popover_fg_color {{colors.on_surface.default.hex}};
+@define-color view_bg_color {{colors.surface.default.hex}};
+@define-color view_fg_color {{colors.on_surface.default.hex}};
+@define-color card_bg_color {{colors.surface.default.hex}};
+@define-color card_fg_color {{colors.on_surface.default.hex}};
+@define-color sidebar_bg_color @window_bg_color;
+@define-color sidebar_fg_color @window_fg_color;
+@define-color sidebar_border_color @window_bg_color;
+@define-color sidebar_backdrop_color @window_bg_color;
diff --git a/.config/matugen/templates/hyprland/hyprland.colors.conf b/.config/matugen/templates/hyprland/hyprland.colors.conf
new file mode 100644
index 0000000..cc2be61
--- /dev/null
+++ b/.config/matugen/templates/hyprland/hyprland.colors.conf
@@ -0,0 +1,10 @@
+general {
+ col.active_border = rgba({{colors.on_surface.default.hex_stripped}}39)
+ col.inactive_border = rgba({{colors.outline.default.hex_stripped}}30)
+}
+
+misc {
+ background_color = rgba({{colors.surface.dark.hex_stripped}}FF)
+}
+
+windowrulev2 = bordercolor rgba({{colors.primary.default.hex_stripped}}AA) rgba({{colors.primary.default.hex_stripped}}77),pinned:1
diff --git a/.config/matugen/templates/hyprland/hyprlock.conf b/.config/matugen/templates/hyprland/hyprlock.conf
new file mode 100644
index 0000000..289764e
--- /dev/null
+++ b/.config/matugen/templates/hyprland/hyprlock.conf
@@ -0,0 +1,99 @@
+$text_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF)
+$entry_background_color = rgba({{colors.on_primary_fixed.default.hex_stripped}}11)
+$entry_border_color = rgba({{colors.outline.default.hex_stripped}}55)
+$entry_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF)
+$font_family = Rubik Light
+$font_family_clock = Rubik Light
+$font_material_symbols = Material Symbols Rounded
+
+background {
+ monitor =
+ path = screenshot
+ color = rgba(25, 20, 20, .2)
+
+ # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
+ blur_passes = 4 # 0 disables blurring
+ blur_size = 7
+ noise = 0.0117
+ contrast = 0.8916
+ brightness = 0.8172
+ vibrancy = 0.1696
+ vibrancy_darkness = 0.0
+}
+input-field {
+ monitor =
+ size = 250, 50
+ outline_thickness = 2
+ dots_size = 0.1
+ dots_spacing = 0.3
+ outer_color = $entry_border_color
+ inner_color = $entry_background_color
+ font_color = $entry_color
+ fade_on_empty = true
+
+ position = 0, 20
+ halign = center
+ valign = center
+}
+
+label { # Caps Lock Warning
+ monitor =
+ text = cmd[update:250] ${XDG_CONFIG_HOME:-$HOME/.config}/hypr/hyprlock/check-capslock.sh
+ color = $text_color
+ font_size = 13
+ font_family = $font_family
+ position = 0, -25
+ halign = center
+ valign = center
+}
+
+
+label { # Clock
+ monitor =
+ text = $TIME
+ color = $text_color
+ font_size = 65
+ font_family = $font_family_clock
+
+ position = 0, 300
+ halign = center
+ valign = center
+}
+label { # Date
+ monitor =
+ text = cmd[update:5000] date +"%A, %B %d"
+ color = $text_color
+ font_size = 17
+ font_family = $font_family
+
+ position = 0, 240
+ halign = center
+ valign = center
+}
+
+label { # User
+ monitor =
+ text = $USER
+ color = $text_color
+ outline_thickness = 2
+ dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8
+ dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
+ dots_center = true
+ font_size = 20
+ font_family = $font_family
+ position = 0, 50
+ halign = center
+ valign = bottom
+}
+
+label { # Status
+ monitor =
+ text = cmd[update:5000] ${XDG_CONFIG_HOME:-$HOME/.config}/hypr/hyprlock/status.sh
+ color = $text_color
+ font_size = 14
+ font_family = $font_family
+
+ position = 30, -30
+ halign = left
+ valign = top
+}
\ No newline at end of file
diff --git a/.config/matugen/templates/kde/color.txt b/.config/matugen/templates/kde/color.txt
new file mode 100644
index 0000000..3514290
--- /dev/null
+++ b/.config/matugen/templates/kde/color.txt
@@ -0,0 +1 @@
+{{colors.source_color.default.hex}}
\ No newline at end of file
diff --git a/.config/matugen/templates/kde/kde-material-you-colors-wrapper.sh b/.config/matugen/templates/kde/kde-material-you-colors-wrapper.sh
new file mode 100755
index 0000000..7d5f114
--- /dev/null
+++ b/.config/matugen/templates/kde/kde-material-you-colors-wrapper.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+
+XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
+
+color=$(tr -d '\n' < "$XDG_STATE_HOME/quickshell/user/generated/color.txt")
+
+current_mode=$(gsettings get org.gnome.desktop.interface color-scheme 2>/dev/null | tr -d "'")
+if [[ "$current_mode" == "prefer-dark" ]]; then
+ mode_flag="-d"
+else
+ mode_flag="-l"
+fi
+
+# Parse --scheme-variant flag
+scheme_variant_str=""
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --scheme-variant)
+ scheme_variant_str="$2"
+ shift 2
+ ;;
+ *)
+ shift
+ ;;
+ esac
+done
+
+# Map string variant to integer
+case "$scheme_variant_str" in
+ scheme-content) sv_num=0 ;;
+ scheme-expressive) sv_num=1 ;;
+ scheme-fidelity) sv_num=2 ;;
+ scheme-monochrome) sv_num=3 ;;
+ scheme-neutral) sv_num=4 ;;
+ scheme-tonal-spot) sv_num=5 ;;
+ scheme-vibrant) sv_num=6 ;;
+ scheme-rainbow) sv_num=7 ;;
+ scheme-fruit-salad) sv_num=8 ;;
+ "") sv_num=5 ;;
+ *)
+ echo "Unknown scheme variant: $scheme_variant_str" >&2
+ exit 1
+ ;;
+esac
+
+kde-material-you-colors "$mode_flag" --color "$color" -sv "$sv_num"
diff --git a/.config/matugen/templates/wallpaper.txt b/.config/matugen/templates/wallpaper.txt
new file mode 100644
index 0000000..33b0c5b
--- /dev/null
+++ b/.config/matugen/templates/wallpaper.txt
@@ -0,0 +1 @@
+{{image}}
diff --git a/.config/quickshell/modules/common/ConfigOptions.qml b/.config/quickshell/modules/common/ConfigOptions.qml
index 58331e3..ec9f8cd 100644
--- a/.config/quickshell/modules/common/ConfigOptions.qml
+++ b/.config/quickshell/modules/common/ConfigOptions.qml
@@ -10,12 +10,12 @@ Singleton {
}
property QtObject ai: QtObject {
- property string systemPrompt: qsTr("Use casual tone. No user knowledge is to be assumed except basic Linux literacy. Be brief and concise: When explaining concepts, use bullet points (prefer minus sign (-) over asterisk (*)) and highlight keywords in bold to pinpoint the main concepts instead of long paragraphs. You are also encouraged to split your response with h2 headers, each header title beginning with an emoji, like `## 🐧 Linux`. When making changes to the user's config, you must get the config to know what values there are before setting.")
+ property string systemPrompt: qsTr("Use casual tone. Be brief and concise: When explaining concepts, use bullet points (prefer minus sign (-) over asterisk (*)) and highlight keywords in bold to pinpoint the main concepts instead of long paragraphs. User uses NixOS and is knowledgable in rust and web development.")
}
property QtObject appearance: QtObject {
- property int fakeScreenRounding: 2 // 0: None | 1: Always | 2: When not fullscreen
- property bool transparency: false
+ property int fakeScreenRounding: 0 // 0: None | 1: Always | 2: When not fullscreen
+ property bool transparency: true
property QtObject palette: QtObject {
property string type: "auto" // Allowed: auto, scheme-content, scheme-expressive, scheme-fidelity, scheme-fruit-salad, scheme-monochrome, scheme-neutral, scheme-rainbow, scheme-tonal-spot
}
@@ -46,25 +46,25 @@ Singleton {
property QtObject bar: QtObject {
property bool bottom: false // Instead of top
property bool borderless: false // true for no grouping of items
- property string topLeftIcon: "spark" // Options: distro, spark
- property bool showBackground: true
+ property string topLeftIcon: "distro" // Options: distro, spark
+ property bool showBackground: false
property bool verbose: true
property QtObject resources: QtObject {
property bool alwaysShowSwap: true
- property bool alwaysShowCpu: false
+ property bool alwaysShowCpu: true
}
property list screenList: [] // List of names, like "eDP-1", find out with 'hyprctl monitors' command
property QtObject utilButtons: QtObject {
property bool showScreenSnip: true
- property bool showColorPicker: false
- property bool showMicToggle: false
- property bool showKeyboardToggle: true
+ property bool showColorPicker: true
+ property bool showMicToggle: true
+ property bool showKeyboardToggle: false
}
property QtObject tray: QtObject {
property bool monochromeIcons: true
}
property QtObject workspaces: QtObject {
- property int shown: 10
+ property int shown: 9
property bool showAppIcons: true
property bool alwaysShowNumbers: false
property int showNumberDelay: 300 // milliseconds
@@ -137,7 +137,7 @@ Singleton {
property int delay: 300 // Delay before sending request. Reduces (potential) rate limits and lag.
}
property QtObject booru: QtObject {
- property bool allowNsfw: false
+ property bool allowNsfw: true
property string defaultProvider: "yandere"
property int limit: 20
property QtObject zerochan: QtObject {
@@ -149,7 +149,7 @@ Singleton {
property QtObject time: QtObject {
// https://doc.qt.io/qt-6/qtime.html#toString
property string format: "hh:mm"
- property string dateFormat: "dddd, dd/MM"
+ property string dateFormat: "ddd, dd/MM"
}
property QtObject windows: QtObject {
diff --git a/.config/quickshell/modules/mediaControls/PlayerControl.qml b/.config/quickshell/modules/mediaControls/PlayerControl.qml
index cce0788..ad73bc9 100644
--- a/.config/quickshell/modules/mediaControls/PlayerControl.qml
+++ b/.config/quickshell/modules/mediaControls/PlayerControl.qml
@@ -64,13 +64,13 @@ Item { // Player instance
}
onArtUrlChanged: {
+ playerController.downloaded = false
if (playerController.artUrl.length == 0) {
playerController.artDominantColor = Appearance.m3colors.m3secondaryContainer
return;
}
// console.log("PlayerControl: Art URL changed to", playerController.artUrl)
// console.log("Download cmd:", coverArtDownloader.command.join(" "))
- playerController.downloaded = false
coverArtDownloader.running = true
}
diff --git a/.config/quickshell/modules/sidebarLeft/Anime.qml b/.config/quickshell/modules/sidebarLeft/Anime.qml
index 1300d54..a128b7c 100644
--- a/.config/quickshell/modules/sidebarLeft/Anime.qml
+++ b/.config/quickshell/modules/sidebarLeft/Anime.qml
@@ -199,7 +199,7 @@ Item {
Layout.alignment: Qt.AlignHCenter
iconSize: 60
color: Appearance.m3colors.m3outline
- text: "bookmark_heart"
+ text: "favorite"
}
StyledText {
id: widgetNameText
diff --git a/.config/quickshell/modules/sidebarLeft/SidebarLeftContent.qml b/.config/quickshell/modules/sidebarLeft/SidebarLeftContent.qml
index 8d67c2a..2616b78 100644
--- a/.config/quickshell/modules/sidebarLeft/SidebarLeftContent.qml
+++ b/.config/quickshell/modules/sidebarLeft/SidebarLeftContent.qml
@@ -20,7 +20,7 @@ Item {
property var tabButtonList: [
...(ConfigOptions.policies.ai !== 0 ? [{"icon": "neurology", "name": qsTr("Intelligence")}] : []),
{"icon": "translate", "name": qsTr("Translator")},
- ...(ConfigOptions.policies.weeb === 1 ? [{"icon": "bookmark_heart", "name": qsTr("Anime")}] : [])
+ ...(ConfigOptions.policies.weeb === 1 ? [{"icon": "favorite", "name": qsTr("Anime")}] : [])
]
property int selectedTab: 0
diff --git a/.config/quickshell/scripts/colors/colors_from_image.sh b/.config/quickshell/scripts/colors/colors_from_image.sh
new file mode 100755
index 0000000..5a4701f
--- /dev/null
+++ b/.config/quickshell/scripts/colors/colors_from_image.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
+XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
+XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
+CONFIG_DIR="$XDG_CONFIG_HOME/quickshell"
+CACHE_DIR="$XDG_CACHE_HOME/quickshell"
+STATE_DIR="$XDG_STATE_HOME/quickshell"
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+MATUGEN_DIR="$XDG_CONFIG_HOME/matugen"
+terminalscheme="$XDG_CONFIG_HOME/quickshell/scripts/terminal/scheme-base.json"
+IMAGE="$1"
+
+matugen image "$IMAGE"
+python3 "$SCRIPT_DIR/generate_colors_material.py" --path "$IMAGE" \
+ > "$STATE_DIR"/user/generated/material_colors.scss
\ No newline at end of file
diff --git a/.config/quickshell/scripts/colors/switchwall.sh b/.config/quickshell/scripts/colors/switchwall.sh
index 80adb16..6303e1c 100755
--- a/.config/quickshell/scripts/colors/switchwall.sh
+++ b/.config/quickshell/scripts/colors/switchwall.sh
@@ -45,17 +45,17 @@ post_process() {
local screen_height="$2"
local wallpaper_path="$3"
- handle_kde_material_you_colors &
+ # handle_kde_material_you_colors &
# Determine the largest region on the wallpaper that's sufficiently un-busy to put widgets in
- if [ ! -f "$MATUGEN_DIR/scripts/least_busy_region.py" ]; then
- echo "Error: least_busy_region.py script not found in $MATUGEN_DIR/scripts/"
- else
- "$MATUGEN_DIR/scripts/least_busy_region.py" \
- --screen-width "$screen_width" --screen-height "$screen_height" \
- --width 300 --height 200 \
- "$wallpaper_path" > "$STATE_DIR"/user/generated/wallpaper/least_busy_region.json
- fi
+ # if [ ! -f "$MATUGEN_DIR/scripts/least_busy_region.py" ]; then
+ # echo "Error: least_busy_region.py script not found in $MATUGEN_DIR/scripts/"
+ # else
+ # "$MATUGEN_DIR/scripts/least_busy_region.py" \
+ # --screen-width "$screen_width" --screen-height "$screen_height" \
+ # --width 300 --height 200 \
+ # "$wallpaper_path" > "$STATE_DIR"/user/generated/wallpaper/least_busy_region.json
+ # fi
}
check_and_prompt_upscale() {
@@ -162,7 +162,7 @@ switch() {
exit 0
fi
- check_and_prompt_upscale "$imgpath" &
+ # check_and_prompt_upscale "$imgpath" &
kill_existing_mpvpaper
if is_video "$imgpath"; then
@@ -242,11 +242,11 @@ switch() {
pre_process "$mode_flag"
matugen "${matugen_args[@]}"
- source "$(eval echo $ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate"
+ # source "$(eval echo $ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate"
python3 "$SCRIPT_DIR/generate_colors_material.py" "${generate_colors_material_args[@]}" \
> "$STATE_DIR"/user/generated/material_colors.scss
"$SCRIPT_DIR"/applycolor.sh
- deactivate
+ # deactivate
# Pass screen width, height, and wallpaper path to post_process
max_width_desired="$(hyprctl monitors -j | jq '([.[].width] | min)' | xargs)"
@@ -334,6 +334,8 @@ main() {
imgpath="$(kdialog --getopenfilename . --title 'Choose wallpaper')"
fi
+ type_flag="scheme-tonal-spot"
+
# If type_flag is 'auto', detect scheme type from image (after imgpath is set)
if [[ "$type_flag" == "auto" ]]; then
if [[ -n "$imgpath" && -f "$imgpath" ]]; then
diff --git a/.config/quickshell/services/SystemInfo.qml b/.config/quickshell/services/SystemInfo.qml
index cd3d9f3..1cb72cf 100644
--- a/.config/quickshell/services/SystemInfo.qml
+++ b/.config/quickshell/services/SystemInfo.qml
@@ -59,6 +59,7 @@ Singleton {
case "arch": distroIcon = "arch-symbolic"; break;
case "endeavouros": distroIcon = "endeavouros-symbolic"; break;
case "cachyos": distroIcon = "cachyos-symbolic"; break;
+ case "nix-snowflake":
case "nixos": distroIcon = "nixos-symbolic"; break;
case "fedora": distroIcon = "fedora-symbolic"; break;
case "linuxmint":
diff --git a/README.md b/README.md
index 3ef83dc..dc139bc 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@ My dotfiles and nix setup incl. scripts for hyprland and some other goodies.
Please do edit configuration of at least hyprland - default configuration is very specific to my setup (involves monitor scaling)
+Quickshell config based on (end-4's config)[https://github.com/end-4/dots-hyprland], you'll have a better time configuring them (gui settings for non-nix users).
+
## Screenshots

diff --git a/configuration.nix b/configuration.nix
index dee5f2b..98e05cb 100644
--- a/configuration.nix
+++ b/configuration.nix
@@ -82,7 +82,7 @@ in
LC_NUMERIC = "cs_CZ.UTF-8";
LC_PAPER = "cs_CZ.UTF-8";
LC_TELEPHONE = "cs_CZ.UTF-8";
- LC_TIME = "cs_CZ.UTF-8";
+ LC_TIME = "en_GB.UTF-8";
};
services.dnsmasq.enable = true;
services.displayManager.sddm.enable = true;
@@ -284,6 +284,26 @@ in
libsForQt5.kcoreaddons
libsForQt5.kirigami2
kdePackages.syntax-highlighting
+
+ (python313.withPackages(ps: with ps; [
+ build
+ pillow
+ cffi
+ libsass
+ material-color-utilities
+ materialyoucolor
+ numpy
+ packaging
+ pillow
+ psutil
+ pycparser
+ pyproject-hooks
+ pywayland
+ setproctitle
+ setuptools
+ setuptools-scm
+ wheel
+ ]))
];
environment.variables = let
diff --git a/home.nix b/home.nix
index 9a091c6..fc049be 100644
--- a/home.nix
+++ b/home.nix
@@ -26,6 +26,16 @@ in
hyprwayland-scanner
hyprcursor
material-symbols
+ cava
+ cliphist
+ matugen
+ swww
+ kdePackages.fcitx5-with-addons
+ easyeffects
+ mpvpaper
+ uv
+ hyprshot
+ libsecret
# cloud things
minikube
diff --git a/python/requirements.in b/python/requirements.in
new file mode 100644
index 0000000..0b4ac32
--- /dev/null
+++ b/python/requirements.in
@@ -0,0 +1,10 @@
+build
+pillow
+setuptools-scm
+wheel
+pywayland
+psutil
+materialyoucolor
+libsass
+material-color-utilities
+setproctitle
diff --git a/python/requirements.txt b/python/requirements.txt
new file mode 100644
index 0000000..c2f380c
--- /dev/null
+++ b/python/requirements.txt
@@ -0,0 +1,38 @@
+# This file was autogenerated by uv via the following command:
+# uv pip compile scriptdata/requirements.in -o scriptdata/requirements.txt
+build==1.2.2.post1
+ # via -r scriptdata/requirements.in
+cffi==1.17.1
+ # via pywayland
+libsass==0.23.0
+ # via -r scriptdata/requirements.in
+material-color-utilities==0.2.1
+ # via -r scriptdata/requirements.in
+materialyoucolor==2.0.10
+ # via -r scriptdata/requirements.in
+numpy==2.2.2
+ # via material-color-utilities
+packaging==24.2
+ # via
+ # build
+ # setuptools-scm
+pillow==11.1.0
+ # via
+ # -r scriptdata/requirements.in
+ # material-color-utilities
+psutil==6.1.1
+ # via -r scriptdata/requirements.in
+pycparser==2.22
+ # via cffi
+pyproject-hooks==1.2.0
+ # via build
+pywayland==0.4.18
+ # via -r scriptdata/requirements.in
+setproctitle==1.3.4
+ # via -r scriptdata/requirements.in
+setuptools==80.9.0
+ # via setuptools-scm
+setuptools-scm==8.1.0
+ # via -r scriptdata/requirements.in
+wheel==0.45.1
+ # via -r scriptdata/requirements.in