diff options
| -rw-r--r-- | Makefile | 8 | ||||
| -rwxr-xr-x | archsetup | 23 | ||||
| -rw-r--r-- | assets/easyeffects-eq-presets.org | 47 | ||||
| -rwxr-xr-x | assets/easyeffects-eq-presets.sh | 63 | ||||
| -rw-r--r-- | dotfiles/common/.Xresources | 4 | ||||
| -rw-r--r-- | dotfiles/common/.config/gtk-3.0/gtk.css | 2 | ||||
| -rw-r--r-- | dotfiles/hyprland/.config/easyeffects/output/dt770-pro-250-harman-eq.json | 199 | ||||
| -rw-r--r-- | dotfiles/hyprland/.config/easyeffects/output/pixel-buds-pro-2-harman-eq.json | 219 | ||||
| -rw-r--r-- | dotfiles/hyprland/.config/easyeffects/output/pxc-550-ii-harman-eq.json | 219 | ||||
| -rw-r--r-- | dotfiles/hyprland/.config/hypr/hyprland.conf | 18 | ||||
| -rw-r--r-- | dotfiles/hyprland/.config/waybar/config | 2 | ||||
| -rwxr-xr-x | dotfiles/hyprland/.local/bin/focus-restore | 9 | ||||
| -rwxr-xr-x | dotfiles/hyprland/.local/bin/start-hyprland | 11 | ||||
| -rwxr-xr-x | dotfiles/hyprland/.local/bin/toggle-scratchpad | 11 | ||||
| -rwxr-xr-x | dotfiles/hyprland/.local/bin/waybar-layout | 16 | ||||
| -rwxr-xr-x | scripts/testing/run-test.sh | 4 |
16 files changed, 836 insertions, 19 deletions
@@ -10,7 +10,7 @@ DE := $(filter dwm hyprland,$(MAKECMDGOALS)) # Extract DEST from command line for import (e.g., 'make import common' -> DEST=common) DEST := $(filter common dwm hyprland,$(MAKECMDGOALS)) -.PHONY: help stow restow reset unstow import common dwm hyprland +.PHONY: help stow restow reset unstow import test common dwm hyprland # Default target - show help help: @@ -29,6 +29,7 @@ help: @echo " reset Resolve conflicts, keep repo version - requires DE" @echo " unstow Remove all symlinks - requires DE" @echo " import Import new app configs into repo (fzf) - requires dest" + @echo " test Run full VM test suite and report results" @echo "" @echo "Examples:" @echo " make stow dwm # Fresh DWM install (common + dwm)" @@ -37,6 +38,7 @@ help: @echo " make reset hyprland # Resolve conflicts, keep repo version" @echo " make import common # Import configs to common/" @echo " make import hyprland # Import configs to hyprland/" + @echo " make test # Run full VM integration test" @echo "" # Prevent 'common', 'dwm' and 'hyprland' from being treated as file targets @@ -121,3 +123,7 @@ import: check-dest cd $(DOTFILES) && $(STOW) --restow $(DEST); \ echo ""; \ echo "Done. Don't forget to: git add -A && git commit" + +# Test - run full VM integration test suite +test: + @bash scripts/testing/run-test.sh @@ -833,6 +833,17 @@ user_customizations() { action="linking hyprland dotfiles" && display "task" "$action" (cd "$dotfiles_dir" && stow --target="/home/$username" --no-folding --adopt hyprland \ >> "$logfile" 2>&1 ) || error_warn "$action" "$?" + + # Remove battery module from waybar config on desktops (no battery) + if ! ls /sys/class/power_supply/BAT* &>/dev/null; then + action="removing waybar battery module (no battery detected)" && display "task" "$action" + waybar_config="/home/$username/.config/waybar/config" + # Remove "battery" from sysmonitor modules array and fix trailing comma + sed -i '/"battery"$/d' "$waybar_config" + sed -i 's/"custom\/disk",/"custom\/disk"/' "$waybar_config" + # Remove the battery config block + sed -i '/"battery": {/,/^ },$/d' "$waybar_config" + fi fi # Refresh font cache for any fonts in dotfiles @@ -870,6 +881,7 @@ user_customizations() { mkdir -p -m 751 "/home/$username/pictures/screenshots" mkdir -p -m 751 "/home/$username/videos" mkdir -p -m 751 "/home/$username/vms" + mkdir -p -m 751 "/home/$username/.local/var/log" chown -R "$username": "/home/$username" mkdir -p -m 751 /media/backup @@ -1077,6 +1089,10 @@ EOF systemctl enable avahi-daemon.service >> "$logfile" 2>&1 || error_warn "$action" "$?" fi + pacman_install wsdd + action="enabling wsdd for Windows network discovery" && display "task" "$action" + systemctl enable wsdd.service >> "$logfile" 2>&1 || error_warn "$action" "$?" + pacman_install geoclue # geolocation service for location-aware apps action="enabling geoclue geolocation service" && display "task" "$action" systemctl enable geoclue.service >> "$logfile" 2>&1 || error_warn "$action" "$?" @@ -1387,6 +1403,9 @@ hyprland() { pacman_install brightnessctl # brightness control pacman_install pamixer # audio control pacman_install foot # native Wayland terminal + pacman_install nautilus # file manager + pacman_install sushi # nautilus spacebar file preview + aur_install nautilus-open-any-terminal # right-click "open in terminal" with configurable terminal } ### Display Server (conditional) @@ -1522,7 +1541,7 @@ desktop_environment() { action="Audio System" && display "subtitle" "$action" for software in alsa-utils pipewire wireplumber pipewire-pulse \ - pipewire-docs pamixer pulsemixer ffmpeg rtkit; do + pipewire-docs pamixer pulsemixer easyeffects ffmpeg rtkit; do pacman_install "$software" done # disable the pc speaker beep @@ -1870,6 +1889,8 @@ supplemental_software() { aur_install snore-git # sleep with feedback pacman_install thunar # file manager pacman_install gvfs-smb # SMB network share browsing in Thunar + pacman_install wsdd # WS-Discovery daemon (Windows network discovery) + pacman_install gvfs-wsdd # WS-Discovery backend for gvfs (browse Windows shares) aur_install topgrade # upgrade everything utility aur_install ueberzug # allows for displaying images in terminals aur_install warpinator # secure file transfers diff --git a/assets/easyeffects-eq-presets.org b/assets/easyeffects-eq-presets.org new file mode 100644 index 0000000..37f6478 --- /dev/null +++ b/assets/easyeffects-eq-presets.org @@ -0,0 +1,47 @@ +#+TITLE: EasyEffects EQ Presets - Installation Guide +#+DATE: 2026-01-28 + +* Overview + +Three parametric EQ presets targeting the Harman frequency response curve, formatted for EasyEffects (PipeWire). + +| Preset File | Headphone | Source | Bands | Preamp | +|-----------------------------------+------------------------------+----------------------------+-------+---------| +| dt770-pro-250-harman-eq.json | Beyerdynamic DT 770 Pro 250 | oratory1990 (hand-tuned) | 9 | -4.7 dB | +| pxc-550-ii-harman-eq.json | Sennheiser PXC 550-II | AutoEQ / oratory1990 meas. | 10 | -3.0 dB | +| pixel-buds-pro-2-harman-eq.json | Google Pixel Buds Pro 2 | AutoEQ / DHRME meas. | 10 | -2.8 dB | + +* Prerequisites + +- PipeWire (replaces PulseAudio) +- pipewire-pulse +- EasyEffects (~sudo pacman -S easyeffects~) + +* Programmatic Install + +#+begin_src sh +./easyeffects-eq-presets.sh install +#+end_src + +Or manually: + +#+begin_src sh +mkdir -p ~/.config/easyeffects/output +cp *.json ~/.config/easyeffects/output/ +#+end_src + +* Manual Usage + +1. Open EasyEffects (search in app launcher or run ~easyeffects~) +2. Go to the *Output* tab (speaker icon, top left) +3. Click the *Presets* dropdown (top bar) +4. Select the preset matching your current headphone +5. Switch presets when you switch headphones + +* Notes + +- EasyEffects applies EQ system-wide to whatever PipeWire output is active, including Bluetooth +- Switch presets when switching between headphones — using the wrong preset will sound worse than no EQ +- The DT 770 preset is for the 250 Ohm version specifically (other impedance variants have different frequency responses) +- The PXC 550-II and Pixel Buds Pro 2 presets are AutoEQ-generated (algorithmically computed from measurements), not hand-tuned by oratory1990 +- To start EasyEffects minimized at login: ~easyeffects --gapplication-service~ diff --git a/assets/easyeffects-eq-presets.sh b/assets/easyeffects-eq-presets.sh new file mode 100755 index 0000000..40e9cd9 --- /dev/null +++ b/assets/easyeffects-eq-presets.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# Install EasyEffects parametric EQ presets (Harman target) +# +# Presets: +# dt770-pro-250-harman-eq.json - Beyerdynamic DT 770 Pro 250 Ohm (oratory1990) +# pxc-550-ii-harman-eq.json - Sennheiser PXC 550-II (AutoEQ/oratory1990) +# pixel-buds-pro-2-harman-eq.json - Google Pixel Buds Pro 2 (AutoEQ/DHRME) +# +# Prerequisites: easyeffects, pipewire, pipewire-pulse +# +# Usage: ./easyeffects-eq-presets.sh [install|uninstall] + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PRESET_DIR="${HOME}/.config/easyeffects/output" + +PRESETS=( + "dt770-pro-250-harman-eq.json" + "pxc-550-ii-harman-eq.json" + "pixel-buds-pro-2-harman-eq.json" +) + +install_presets() { + # Ensure easyeffects is installed + if ! command -v easyeffects &>/dev/null; then + echo "easyeffects not found. Installing..." + sudo pacman -S --needed --noconfirm easyeffects + fi + + mkdir -p "$PRESET_DIR" + + for preset in "${PRESETS[@]}"; do + if [[ -f "${SCRIPT_DIR}/${preset}" ]]; then + cp "${SCRIPT_DIR}/${preset}" "${PRESET_DIR}/${preset}" + echo "Installed: ${preset}" + else + echo "Warning: ${preset} not found in ${SCRIPT_DIR}" >&2 + fi + done + + echo "" + echo "Presets installed to ${PRESET_DIR}" + echo "Open EasyEffects and select a preset from the dropdown." +} + +uninstall_presets() { + for preset in "${PRESETS[@]}"; do + if [[ -f "${PRESET_DIR}/${preset}" ]]; then + rm "${PRESET_DIR}/${preset}" + echo "Removed: ${preset}" + fi + done +} + +case "${1:-install}" in + install) install_presets ;; + uninstall) uninstall_presets ;; + *) + echo "Usage: $0 [install|uninstall]" >&2 + exit 1 + ;; +esac diff --git a/dotfiles/common/.Xresources b/dotfiles/common/.Xresources index 96e4803..4b35809 100644 --- a/dotfiles/common/.Xresources +++ b/dotfiles/common/.Xresources @@ -10,8 +10,8 @@ Xft.hintstyle: hintfull Xft.hinting: 1 Xft.antialias: 1 Xft.rgba: rgb -Xcursor.size: 32 -Xcursor.theme: Vimix-white-cursors +Xcursor.size: 24 +Xcursor.theme: Bibata-Modern-Ice !! Emacs Emacs*toolBar: 0 diff --git a/dotfiles/common/.config/gtk-3.0/gtk.css b/dotfiles/common/.config/gtk-3.0/gtk.css index a1d4c13..cffaf78 100644 --- a/dotfiles/common/.config/gtk-3.0/gtk.css +++ b/dotfiles/common/.config/gtk-3.0/gtk.css @@ -1,6 +1,6 @@ .window-frame, .window-frame:backdrop { box-shadow: 0 0 0 black; /* removes shadow completely */ border-style: none; - margin: 1; /* this retains the ability to resize with the mouse, if 1px is too narrow, set some higher values */ + margin: 1px; /* this retains the ability to resize with the mouse, if 1px is too narrow, set some higher values */ border-radius: 0; } diff --git a/dotfiles/hyprland/.config/easyeffects/output/dt770-pro-250-harman-eq.json b/dotfiles/hyprland/.config/easyeffects/output/dt770-pro-250-harman-eq.json new file mode 100644 index 0000000..8774a0f --- /dev/null +++ b/dotfiles/hyprland/.config/easyeffects/output/dt770-pro-250-harman-eq.json @@ -0,0 +1,199 @@ +{ + "output": { + "blocklist": [], + "equalizer": { + "input-gain": -4.7, + "output-gain": 0.0, + "mode": "IIR", + "num-bands": 9, + "split-channels": false, + "left": { + "band0": { + "frequency": 45.0, + "gain": -4.7, + "q": 0.4, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band1": { + "frequency": 102.0, + "gain": 7.0, + "q": 5.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band2": { + "frequency": 134.0, + "gain": -3.8, + "q": 3.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band3": { + "frequency": 217.0, + "gain": 5.5, + "q": 2.3, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band4": { + "frequency": 2400.0, + "gain": -1.4, + "q": 4.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band5": { + "frequency": 3350.0, + "gain": 5.0, + "q": 3.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band6": { + "frequency": 5200.0, + "gain": 0.7, + "q": 3.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band7": { + "frequency": 6200.0, + "gain": -5.6, + "q": 4.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band8": { + "frequency": 10000.0, + "gain": -6.0, + "q": 0.7, + "type": "Hi-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + } + }, + "right": { + "band0": { + "frequency": 45.0, + "gain": -4.7, + "q": 0.4, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band1": { + "frequency": 102.0, + "gain": 7.0, + "q": 5.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band2": { + "frequency": 134.0, + "gain": -3.8, + "q": 3.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band3": { + "frequency": 217.0, + "gain": 5.5, + "q": 2.3, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band4": { + "frequency": 2400.0, + "gain": -1.4, + "q": 4.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band5": { + "frequency": 3350.0, + "gain": 5.0, + "q": 3.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band6": { + "frequency": 5200.0, + "gain": 0.7, + "q": 3.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band7": { + "frequency": 6200.0, + "gain": -5.6, + "q": 4.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band8": { + "frequency": 10000.0, + "gain": -6.0, + "q": 0.7, + "type": "Hi-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + } + } + }, + "plugins_order": [ + "equalizer" + ] + } +} diff --git a/dotfiles/hyprland/.config/easyeffects/output/pixel-buds-pro-2-harman-eq.json b/dotfiles/hyprland/.config/easyeffects/output/pixel-buds-pro-2-harman-eq.json new file mode 100644 index 0000000..056e216 --- /dev/null +++ b/dotfiles/hyprland/.config/easyeffects/output/pixel-buds-pro-2-harman-eq.json @@ -0,0 +1,219 @@ +{ + "output": { + "blocklist": [], + "equalizer": { + "input-gain": -2.8, + "output-gain": 0.0, + "mode": "IIR", + "num-bands": 10, + "split-channels": false, + "left": { + "band0": { + "frequency": 105.0, + "gain": 2.1, + "q": 0.7, + "type": "Lo-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band1": { + "frequency": 1384.0, + "gain": -4.3, + "q": 2.82, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band2": { + "frequency": 670.0, + "gain": 1.5, + "q": 1.78, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band3": { + "frequency": 41.0, + "gain": 0.8, + "q": 1.26, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band4": { + "frequency": 4720.0, + "gain": -3.1, + "q": 6.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band5": { + "frequency": 10000.0, + "gain": -0.6, + "q": 0.7, + "type": "Hi-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band6": { + "frequency": 3725.0, + "gain": 2.9, + "q": 6.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band7": { + "frequency": 2565.0, + "gain": 1.7, + "q": 4.21, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band8": { + "frequency": 153.0, + "gain": 0.7, + "q": 2.47, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band9": { + "frequency": 6024.0, + "gain": 0.7, + "q": 4.95, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + } + }, + "right": { + "band0": { + "frequency": 105.0, + "gain": 2.1, + "q": 0.7, + "type": "Lo-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band1": { + "frequency": 1384.0, + "gain": -4.3, + "q": 2.82, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band2": { + "frequency": 670.0, + "gain": 1.5, + "q": 1.78, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band3": { + "frequency": 41.0, + "gain": 0.8, + "q": 1.26, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band4": { + "frequency": 4720.0, + "gain": -3.1, + "q": 6.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band5": { + "frequency": 10000.0, + "gain": -0.6, + "q": 0.7, + "type": "Hi-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band6": { + "frequency": 3725.0, + "gain": 2.9, + "q": 6.0, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band7": { + "frequency": 2565.0, + "gain": 1.7, + "q": 4.21, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band8": { + "frequency": 153.0, + "gain": 0.7, + "q": 2.47, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band9": { + "frequency": 6024.0, + "gain": 0.7, + "q": 4.95, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + } + } + }, + "plugins_order": [ + "equalizer" + ] + } +} diff --git a/dotfiles/hyprland/.config/easyeffects/output/pxc-550-ii-harman-eq.json b/dotfiles/hyprland/.config/easyeffects/output/pxc-550-ii-harman-eq.json new file mode 100644 index 0000000..c400419 --- /dev/null +++ b/dotfiles/hyprland/.config/easyeffects/output/pxc-550-ii-harman-eq.json @@ -0,0 +1,219 @@ +{ + "output": { + "blocklist": [], + "equalizer": { + "input-gain": -3.0, + "output-gain": 0.0, + "mode": "IIR", + "num-bands": 10, + "split-channels": false, + "left": { + "band0": { + "frequency": 105.0, + "gain": 2.5, + "q": 0.7, + "type": "Lo-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band1": { + "frequency": 185.0, + "gain": -3.5, + "q": 1.35, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band2": { + "frequency": 2997.0, + "gain": 3.1, + "q": 1.24, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band3": { + "frequency": 4429.0, + "gain": 3.2, + "q": 5.98, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band4": { + "frequency": 5270.0, + "gain": -5.7, + "q": 4.03, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band5": { + "frequency": 10000.0, + "gain": -2.6, + "q": 0.7, + "type": "Hi-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band6": { + "frequency": 49.0, + "gain": -0.8, + "q": 1.84, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band7": { + "frequency": 359.0, + "gain": 0.8, + "q": 2.24, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band8": { + "frequency": 248.0, + "gain": -0.9, + "q": 4.62, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band9": { + "frequency": 735.0, + "gain": 0.4, + "q": 2.9, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + } + }, + "right": { + "band0": { + "frequency": 105.0, + "gain": 2.5, + "q": 0.7, + "type": "Lo-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band1": { + "frequency": 185.0, + "gain": -3.5, + "q": 1.35, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band2": { + "frequency": 2997.0, + "gain": 3.1, + "q": 1.24, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band3": { + "frequency": 4429.0, + "gain": 3.2, + "q": 5.98, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band4": { + "frequency": 5270.0, + "gain": -5.7, + "q": 4.03, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band5": { + "frequency": 10000.0, + "gain": -2.6, + "q": 0.7, + "type": "Hi-shelf", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band6": { + "frequency": 49.0, + "gain": -0.8, + "q": 1.84, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band7": { + "frequency": 359.0, + "gain": 0.8, + "q": 2.24, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band8": { + "frequency": 248.0, + "gain": -0.9, + "q": 4.62, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + }, + "band9": { + "frequency": 735.0, + "gain": 0.4, + "q": 2.9, + "type": "Bell", + "mode": "RLC (BT)", + "slope": "x1", + "mute": false, + "solo": false + } + } + }, + "plugins_order": [ + "equalizer" + ] + } +} diff --git a/dotfiles/hyprland/.config/hypr/hyprland.conf b/dotfiles/hyprland/.config/hypr/hyprland.conf index 585147e..2cc42e3 100644 --- a/dotfiles/hyprland/.config/hypr/hyprland.conf +++ b/dotfiles/hyprland/.config/hypr/hyprland.conf @@ -11,13 +11,14 @@ monitor=,preferred,auto,auto # Startup Applications # ============================================================================ exec-once = hyprpm reload && sleep 1 && hyprctl dismissnotify -1 -exec-once = waybar +exec-once = waybar > ~/.local/var/log/waybar-$(date +%Y-%m-%d-%H%M%S).log 2>&1 exec-once = swww-daemon && sleep 1 && swww img ~/pictures/wallpaper/trondheim-norway.jpg -exec-once = dunst -exec-once = hypridle +exec-once = dunst > ~/.local/var/log/dunst-$(date +%Y-%m-%d-%H%M%S).log 2>&1 +exec-once = hypridle > ~/.local/var/log/hypridle-$(date +%Y-%m-%d-%H%M%S).log 2>&1 exec-once = /usr/lib/geoclue-2.0/demos/agent -exec-once = gammastep +exec-once = gammastep > ~/.local/var/log/gammastep-$(date +%Y-%m-%d-%H%M%S).log 2>&1 exec-once = blueman-applet +exec-once = easyeffects --gapplication-service exec-once = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = mpd @@ -197,7 +198,7 @@ bind = $mod, D, layoutmsg, removemaster # Focus mode (xtra-dispatchers plugin) # O = "Only this window" / "bring back Others" / "close Others" bind = $mod, O, exec, hyprctl dispatch plugin:xtd:throwunfocused 10 -bind = $mod SHIFT, O, exec, hyprctl dispatch plugin:xtd:bringallfrom 10 +bind = $mod SHIFT, O, exec, focus-restore bind = $mod CTRL, O, exec, hyprctl dispatch plugin:xtd:closeunfocused # Gaps (from DWM) @@ -255,6 +256,7 @@ workspace = special:monitor, on-created-empty:foot --app-id foot-monitor gotop workspace = special:music, on-created-empty:foot --app-id foot-music ncmpcpp workspace = special:htop, on-created-empty:foot --app-id foot-htop htop workspace = special:network, on-created-empty:foot --app-id foot-network nmtui +workspace = special:effects, on-created-empty:easyeffects # Keybindings (single bind per scratchpad - just toggle visibility) bind = $mod SHIFT, RETURN, togglespecialworkspace, term @@ -262,6 +264,7 @@ bind = $mod, A, togglespecialworkspace, audio bind = $mod, M, togglespecialworkspace, monitor bind = $mod, SLASH, togglespecialworkspace, music bind = $mod SHIFT, H, togglespecialworkspace, htop +bind = $mod SHIFT, A, togglespecialworkspace, effects # Window rules (using app-id/class matching, Hyprland 0.53+ syntax) # Terminal scratchpad @@ -294,6 +297,11 @@ windowrule = match:class ^(foot-network)$, float on windowrule = match:class ^(foot-network)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-network)$, center on +# EasyEffects +windowrule = match:class ^(Easy Effects)$, float on +windowrule = match:class ^(Easy Effects)$, size (monitor_w*0.6) (monitor_h*0.6) +windowrule = match:class ^(Easy Effects)$, center on + # Calculator (not a scratchpad, just launches app) bind = $mod, X, exec, qalculate-gtk bind = $mod, C, exec, hyprpicker -a diff --git a/dotfiles/hyprland/.config/waybar/config b/dotfiles/hyprland/.config/waybar/config index fdff160..66e318b 100644 --- a/dotfiles/hyprland/.config/waybar/config +++ b/dotfiles/hyprland/.config/waybar/config @@ -1,7 +1,6 @@ { "layer": "top", "position": "top", - "height": 30, "spacing": 4, "margin-top": 6, "margin-left": 10, @@ -24,6 +23,7 @@ "group/sysmonitor": { "orientation": "horizontal", + "swap-icon-label": false, "modules": [ "cpu", "temperature", diff --git a/dotfiles/hyprland/.local/bin/focus-restore b/dotfiles/hyprland/.local/bin/focus-restore new file mode 100755 index 0000000..7f87390 --- /dev/null +++ b/dotfiles/hyprland/.local/bin/focus-restore @@ -0,0 +1,9 @@ +#!/bin/sh +# Restore unfocused windows from workspace 10 without disrupting master position. +# Records the focused window, brings all back, then swaps it back to master. + +FOCUSED=$(hyprctl activewindow -j | jq -r '.address') +hyprctl dispatch plugin:xtd:bringallfrom 10 +sleep 0.1 +hyprctl dispatch focuswindow "address:$FOCUSED" +hyprctl dispatch layoutmsg swapwithmaster master diff --git a/dotfiles/hyprland/.local/bin/start-hyprland b/dotfiles/hyprland/.local/bin/start-hyprland new file mode 100755 index 0000000..a5d191d --- /dev/null +++ b/dotfiles/hyprland/.local/bin/start-hyprland @@ -0,0 +1,11 @@ +#!/bin/sh +# Wrapper to launch Hyprland with persistent logging +# Shadows /usr/bin/start-hyprland when ~/.local/bin is in PATH + +LOG_DIR="$HOME/.local/var/log" +TIMESTAMP=$(date +%Y-%m-%d-%H%M%S) +LOG_FILE="$LOG_DIR/hyprland-$TIMESTAMP.log" + +mkdir -p "$LOG_DIR" + +exec /usr/bin/start-hyprland "$@" > "$LOG_FILE" 2>&1 diff --git a/dotfiles/hyprland/.local/bin/toggle-scratchpad b/dotfiles/hyprland/.local/bin/toggle-scratchpad index bb10ef7..b3da6b4 100755 --- a/dotfiles/hyprland/.local/bin/toggle-scratchpad +++ b/dotfiles/hyprland/.local/bin/toggle-scratchpad @@ -9,6 +9,17 @@ if [ -z "$NAME" ]; then exit 1 fi +# Auto-detect current Hyprland socket if env var is stale +if ! hyprctl version >/dev/null 2>&1; then + # Find the most recent Hyprland instance with a socket + for dir in /run/user/"$(id -u)"/hypr/*/; do + if [ -S "${dir}.socket.sock" ]; then + export HYPRLAND_INSTANCE_SIGNATURE="$(basename "$dir")" + break + fi + done +fi + STATEFILE="/tmp/scratchpad-$NAME-open" NOW=$(date +%s) diff --git a/dotfiles/hyprland/.local/bin/waybar-layout b/dotfiles/hyprland/.local/bin/waybar-layout index 6c45877..62470aa 100755 --- a/dotfiles/hyprland/.local/bin/waybar-layout +++ b/dotfiles/hyprland/.local/bin/waybar-layout @@ -3,17 +3,17 @@ # Shows current layout with nerd font icons # Layouts: master -> tab group (monocle) -> scrolling -> floating -# Get current layout -LAYOUT=$(hyprctl getoption general:layout -j | jq -r '.str') - -# Check if workspace has allfloat enabled -ALLFLOAT=$(hyprctl activeworkspace -j | jq -r '.hasfullscreenwindow') +# Check if hyprctl is reachable +if ! hyprctl version >/dev/null 2>&1; then + echo '{"text": "<span size='"'"'large'"'"'></span>", "tooltip": "Hyprland not connected"}' + exit 0 +fi -# Check if active window is floating -FLOATING=$(hyprctl activewindow -j 2>/dev/null | jq -r '.floating // false') +# Get current layout (redirect stderr to suppress connection errors) +LAYOUT=$(hyprctl getoption general:layout -j 2>/dev/null | jq -r '.str // "unknown"') # Check workspace rules for allfloat -WSRULES=$(hyprctl activeworkspace -j | jq -r '.rules // []') +WSRULES=$(hyprctl activeworkspace -j 2>/dev/null | jq -r '.rules // []') # Determine icon and tooltip if [ "$LAYOUT" = "master" ] && echo "$WSRULES" | grep -q "allfloat"; then diff --git a/scripts/testing/run-test.sh b/scripts/testing/run-test.sh index a600870..c65961d 100755 --- a/scripts/testing/run-test.sh +++ b/scripts/testing/run-test.sh @@ -319,6 +319,10 @@ EOFREPORT info "Test report saved: $REPORT_FILE" +# Display report to terminal +echo "" +cat "$REPORT_FILE" + # Cleanup or keep VM section "Cleanup" |
