diff options
30 files changed, 1242 insertions, 42 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 test common dwm hyprland +.PHONY: help deps stow restow reset unstow import test common dwm hyprland # Default target - show help help: @@ -24,6 +24,7 @@ help: @echo " hyprland Wayland/Hyprland specific" @echo "" @echo "Targets:" + @echo " deps Install dependencies for this project" @echo " stow Create symlinks (fresh install) - requires DE" @echo " restow Refresh symlinks (unlink + relink) - requires DE" @echo " reset Resolve conflicts, keep repo version - requires DE" @@ -41,6 +42,20 @@ help: @echo " make test # Run full VM integration test" @echo "" +# Install project dependencies +deps: + @echo "Installing project dependencies..." + @echo "" + @echo "=== Makefile targets (stow, import) ===" + sudo pacman -S --needed stow fzf + @echo "" + @echo "=== VM testing (make test) ===" + sudo pacman -S --needed qemu-full virt-manager virt-viewer libguestfs \ + bridge-utils dnsmasq archiso sshpass socat + @echo "" + @echo "Done. For VM testing, also ensure libvirtd is running:" + @echo " sudo systemctl enable --now libvirtd" + # Prevent 'common', 'dwm' and 'hyprland' from being treated as file targets common dwm hyprland: @: @@ -688,7 +688,7 @@ prerequisites() { for software in linux-firmware wireless-regdb base-devel ca-certificates \ chrony coreutils curl git go openssh python \ - stow tar vi zsh; do + stow tar vim zsh; do pacman_install "$software" done @@ -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" "$?" @@ -1251,6 +1267,7 @@ EOF # Btrfs: Install snapper for snapshot management display "task" "btrfs detected - installing snapper and grub-btrfs" pacman_install snapper + pacman_install snap-pac # auto-snapshot on pacman transactions pacman_install grub-btrfs # inotify-tools is an optional dep of grub-btrfs but required for grub-btrfsd daemon pacman_install inotify-tools @@ -1378,7 +1395,9 @@ hyprland() { pacman_install cpio # hyprpm (plugin manager) dependency pacman_install waybar # status bar pacman_install fuzzel # app launcher (native Wayland, pinentry support) - pacman_install swww # wallpaper + pacman_install swww # wallpaper daemon + aur_install waypaper # wallpaper GUI (swww frontend) + aur_install wlogout-git # logout menu pacman_install grim # screenshot pacman_install slurp # region select pacman_install satty # screenshot annotation @@ -1387,6 +1406,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 +1544,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 @@ -1557,12 +1579,12 @@ desktop_environment() { # Command Line Utilities action="Command Line Utilities" && display "subtitle" "$action" - for software in htop mc ncdu tmux fzf zip unzip atool wget detox \ - lsof usbutils moreutils; do + for software in htop btop mc ncdu tmux fzf zip unzip atool wget detox \ + lsof usbutils moreutils nvtop s-tui wavemon bandwhich; do pacman_install "$software" done - for software in task-spooler-cpu speedtest-go-bin gotop-bin rar; do + for software in task-spooler-cpu speedtest-go-bin rar; do aur_install "$software" done @@ -1608,7 +1630,7 @@ desktop_environment() { action="UI Theme" && display "subtitle" "$action" - for software in picom lxappearance gnome-themes-extra; do + for software in picom lxappearance gnome-themes-extra adwaita-qt5 adwaita-qt6; do pacman_install "$software" done @@ -1868,8 +1890,9 @@ supplemental_software() { aur_install insync # Google Drive sync client aur_install nsxiv # image viewer aur_install snore-git # sleep with feedback - pacman_install thunar # file manager - pacman_install gvfs-smb # SMB network share browsing in Thunar + pacman_install gvfs-smb # SMB network share browsing in Nautilus + 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/.bashrc.d/aliases.sh b/dotfiles/common/.bashrc.d/aliases.sh index 28c0f3f..9be16da 100644 --- a/dotfiles/common/.bashrc.d/aliases.sh +++ b/dotfiles/common/.bashrc.d/aliases.sh @@ -51,7 +51,6 @@ alias speedtest="speedtest-go" # ============================================================================= # Applications # ============================================================================= -alias vim="nvim" alias et="emacs -nw" alias weather="wego" alias crm="tickrs -s CRM" diff --git a/dotfiles/common/.config/btop/btop.conf b/dotfiles/common/.config/btop/btop.conf new file mode 100644 index 0000000..3c1318f --- /dev/null +++ b/dotfiles/common/.config/btop/btop.conf @@ -0,0 +1,272 @@ +#? Config file for btop v.1.4.6 + +#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. +#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" +color_theme = "Default" + +#* If the theme set background should be shown, set to False if you want terminal background transparency. +theme_background = true + +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor = true + +#* Set to true to force tty mode regardless if a real tty has been detected or not. +#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. +force_tty = false + +#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. +#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. +#* Use whitespace " " as separator between different presets. +#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" +presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" + +#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. +#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. +vim_keys = false + +#* Rounded corners on boxes, is ignored if TTY mode is ON. +rounded_corners = true + +#* Use terminal synchronized output sequences to reduce flickering on supported terminals. +terminal_sync = true + +#* Default symbols to use for graph creation, "braille", "block" or "tty". +#* "braille" offers the highest resolution but might not be included in all fonts. +#* "block" has half the resolution of braille but uses more common characters. +#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. +#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. +graph_symbol = "braille" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_cpu = "default" + +# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty". +graph_symbol_gpu = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_mem = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_net = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_proc = "default" + +#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. +shown_boxes = "cpu mem net proc" + +#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. +update_ms = 2000 + +#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", +#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. +proc_sorting = "cpu lazy" + +#* Reverse sorting order, True or False. +proc_reversed = false + +#* Show processes as a tree. +proc_tree = false + +#* Use the cpu graph colors in the process list. +proc_colors = true + +#* Use a darkening gradient in the process list. +proc_gradient = true + +#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. +proc_per_core = false + +#* Show process memory as bytes instead of percent. +proc_mem_bytes = true + +#* Show cpu graph for each process. +proc_cpu_graphs = true + +#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) +proc_info_smaps = false + +#* Show proc box on left side of screen instead of right. +proc_left = false + +#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). +proc_filter_kernel = false + +#* In tree-view, always accumulate child process resources in the parent process. +proc_aggregate = false + +#* Should cpu and memory usage display be preserved for dead processes when paused. +keep_dead_proc_usage = false + +#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_upper = "Auto" + +#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_lower = "Auto" + +#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off". +show_gpu_info = "Auto" + +#* Toggles if the lower CPU graph should be inverted. +cpu_invert_lower = true + +#* Set to True to completely disable the lower CPU graph. +cpu_single_graph = false + +#* Show cpu box at bottom of screen instead of top. +cpu_bottom = false + +#* Shows the system uptime in the CPU box. +show_uptime = true + +#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo. +show_cpu_watts = true + +#* Show cpu temperature. +check_temp = true + +#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. +cpu_sensor = "Auto" + +#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. +show_coretemp = true + +#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. +#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. +#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. +#* Example: "4:0 5:1 6:3" +cpu_core_map = "" + +#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". +temp_scale = "celsius" + +#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. +base_10_sizes = false + +#* Show CPU frequency. +show_cpu_freq = true + +#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average". +freq_mode = "first" + +#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. +#* Special formatting: /host = hostname | /user = username | /uptime = system uptime +clock_format = "%X" + +#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. +background_update = true + +#* Custom cpu model name, empty string to disable. +custom_cpu_name = "" + +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". +#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user" +disks_filter = "" + +#* Show graphs instead of meters for memory values. +mem_graphs = true + +#* Show mem box below net box instead of above. +mem_below_net = false + +#* Count ZFS ARC in cached and available memory. +zfs_arc_cached = true + +#* If swap memory should be shown in memory box. +show_swap = true + +#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. +swap_disk = true + +#* If mem box should be split to also show disks info. +show_disks = true + +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical = true + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab = true + +#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) +zfs_hide_datasets = false + +#* Set to true to show available disk space for privileged users. +disk_free_priv = false + +#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. +show_io_stat = true + +#* Toggles io mode for disks, showing big graphs for disk read/write speeds. +io_mode = false + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined = false + +#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". +#* Example: "/mnt/media:100 /:20 /boot:1". +io_graph_speeds = "" + +#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. +net_download = 100 + +net_upload = 100 + +#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. +net_auto = true + +#* Sync the auto scaling for download and upload to whichever currently has the highest scale. +net_sync = true + +#* Starts with the Network Interface specified here. +net_iface = "" + +#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes. +base_10_bitrate = "Auto" + +#* Show battery stats in top right if battery is present. +show_battery = true + +#* Which battery to use if multiple are present. "Auto" for auto detection. +selected_battery = "Auto" + +#* Show power stats of battery next to charge indicator. +show_battery_watts = true + +#* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". +#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. +log_level = "WARNING" + +#* Automatically save current settings to config file on exit. +save_config_on_exit = true + +#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. +nvml_measure_pcie_speeds = true + +#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. +rsmi_measure_pcie_speeds = true + +#* Horizontally mirror the GPU graph. +gpu_mirror_graph = true + +#* Set which GPU vendors to show. Available values are "nvidia amd intel" +shown_gpus = "nvidia amd intel" + +#* Custom gpu0 model name, empty string to disable. +custom_gpu_name0 = "" + +#* Custom gpu1 model name, empty string to disable. +custom_gpu_name1 = "" + +#* Custom gpu2 model name, empty string to disable. +custom_gpu_name2 = "" + +#* Custom gpu3 model name, empty string to disable. +custom_gpu_name3 = "" + +#* Custom gpu4 model name, empty string to disable. +custom_gpu_name4 = "" + +#* Custom gpu5 model name, empty string to disable. +custom_gpu_name5 = "" 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/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf b/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf deleted file mode 100644 index e8c5e8f..0000000 --- a/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Service] -Environment="DISPLAY=:0" -Environment="XAUTHORITY=/home/cjennings/.Xauthority"
\ No newline at end of file diff --git a/dotfiles/common/.config/wavemon/wavemonrc b/dotfiles/common/.config/wavemon/wavemonrc new file mode 100644 index 0000000..e39c80b --- /dev/null +++ b/dotfiles/common/.config/wavemon/wavemonrc @@ -0,0 +1,13 @@ +interface = wlp192s0 +cisco_mac = off +sort_order = chan/sig +sort_ascending = off +scan_filter_band = both +scan_hidden_essids = on +stat_updates = 100 +lhist_slot_size = 4 +meter_smoothness = 0 +info_updates = 10 +override_auto_scale = off +transparent_bg = on +startup_screen = info screen diff --git a/dotfiles/common/.zshrc.d/aliases.sh b/dotfiles/common/.zshrc.d/aliases.sh index 28c0f3f..9be16da 100644 --- a/dotfiles/common/.zshrc.d/aliases.sh +++ b/dotfiles/common/.zshrc.d/aliases.sh @@ -51,7 +51,6 @@ alias speedtest="speedtest-go" # ============================================================================= # Applications # ============================================================================= -alias vim="nvim" alias et="emacs -nw" alias weather="wego" alias crm="tickrs -s CRM" diff --git a/dotfiles/common/.Xresources b/dotfiles/dwm/.Xresources index 96e4803..4b35809 100644 --- a/dotfiles/common/.Xresources +++ b/dotfiles/dwm/.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/conky/conky.conf b/dotfiles/dwm/.config/conky/conky.conf index 09ee8ea..09ee8ea 100644 --- a/dotfiles/common/.config/conky/conky.conf +++ b/dotfiles/dwm/.config/conky/conky.conf diff --git a/dotfiles/common/.config/flameshot/flameshot.ini b/dotfiles/dwm/.config/flameshot/flameshot.ini index 8874b3b..8874b3b 100644 --- a/dotfiles/common/.config/flameshot/flameshot.ini +++ b/dotfiles/dwm/.config/flameshot/flameshot.ini diff --git a/dotfiles/common/.config/picom.conf b/dotfiles/dwm/.config/picom.conf index 0b65df7..0b65df7 100644 --- a/dotfiles/common/.config/picom.conf +++ b/dotfiles/dwm/.config/picom.conf diff --git a/dotfiles/common/.config/redshift.conf b/dotfiles/dwm/.config/redshift.conf index 92b61bf..92b61bf 100644 --- a/dotfiles/common/.config/redshift.conf +++ b/dotfiles/dwm/.config/redshift.conf diff --git a/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf b/dotfiles/dwm/.config/touchpad-indicator/touchpad-indicator.conf index 51a9907..51a9907 100644 --- a/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf +++ b/dotfiles/dwm/.config/touchpad-indicator/touchpad-indicator.conf diff --git a/dotfiles/common/.xinitrc b/dotfiles/dwm/.xinitrc index 991f507..991f507 100755 --- a/dotfiles/common/.xinitrc +++ b/dotfiles/dwm/.xinitrc diff --git a/dotfiles/hyprland/.config/easyeffectsrc b/dotfiles/hyprland/.config/easyeffectsrc new file mode 100644 index 0000000..a4cbf66 --- /dev/null +++ b/dotfiles/hyprland/.config/easyeffectsrc @@ -0,0 +1,2 @@ +[UiSettings] +ColorScheme=BreezeDark diff --git a/dotfiles/hyprland/.config/hypr/hyprland.conf b/dotfiles/hyprland/.config/hypr/hyprland.conf index 34e44b6..3eae5b6 100644 --- a/dotfiles/hyprland/.config/hypr/hyprland.conf +++ b/dotfiles/hyprland/.config/hypr/hyprland.conf @@ -10,21 +10,32 @@ monitor=,preferred,auto,auto # ============================================================================ # Startup Applications # ============================================================================ +# Portal and D-Bus setup FIRST (other apps depend on these) +exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once = systemctl --user start xdg-desktop-portal-hyprland xdg-desktop-portal + +# Core services exec-once = hyprpm reload && sleep 1 && hyprctl dismissnotify -1 -exec-once = waybar +exec-once = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh +exec-once = dunst > ~/.local/var/log/dunst-$(date +%Y-%m-%d-%H%M%S).log 2>&1 + +# Desktop appearance (after portal is ready) exec-once = swww-daemon && sleep 1 && swww img ~/pictures/wallpaper/trondheim-norway.jpg -exec-once = dunst -exec-once = hypridle +exec-once = waybar > ~/.local/var/log/waybar-$(date +%Y-%m-%d-%H%M%S).log 2>&1 +exec-once = set-theme "$(cat ~/.config/current-theme 2>/dev/null || echo hudson)" + +# Background services +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 = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh -exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once = easyeffects --gapplication-service exec-once = mpd + +# Apps that can start later exec-once = signal-desktop --start-in-tray --ozone-platform=wayland exec-once = protonmail-bridge --no-window exec-once = insync start -exec-once = set-theme "$(cat ~/.config/current-theme 2>/dev/null || echo hudson)" # ============================================================================ # Environment Variables @@ -106,6 +117,13 @@ misc { } # ============================================================================ +# Debug (temporary - disable when stable) +# ============================================================================ +debug { + disable_logs = false +} + +# ============================================================================ # XWayland # ============================================================================ xwayland { @@ -251,17 +269,17 @@ bind = $mod SHIFT, PERIOD, movewindow, mon:+1 # Workspace rules (auto-launch apps when workspace first accessed) workspace = special:term, on-created-empty:foot --app-id foot-term tmux workspace = special:audio, on-created-empty:foot --app-id foot-audio pulsemixer -workspace = special:monitor, on-created-empty:foot --app-id foot-monitor gotop +workspace = special:monitor, on-created-empty:foot --app-id foot-monitor monitor-dashboard 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 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 @@ -284,16 +302,16 @@ windowrule = match:class ^(foot-music)$, float on windowrule = match:class ^(foot-music)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-music)$, center on -# Htop -windowrule = match:class ^(foot-htop)$, float on -windowrule = match:class ^(foot-htop)$, size (monitor_w*0.6) (monitor_h*0.6) -windowrule = match:class ^(foot-htop)$, center on - # Network manager 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/.config/waypaper/config.ini b/dotfiles/hyprland/.config/waypaper/config.ini new file mode 100644 index 0000000..66652ed --- /dev/null +++ b/dotfiles/hyprland/.config/waypaper/config.ini @@ -0,0 +1,27 @@ +[Settings] +language = en +folder = ~/pictures/wallpaper +monitors = All +wallpaper = ~/pictures/wallpaper/trondheim-norway.jpg +show_path_in_tooltip = True +backend = swww +fill = fill +sort = name +color = #ffffff +subfolders = False +all_subfolders = False +show_hidden = False +show_gifs_only = False +zen_mode = False +post_command = +number_of_columns = 3 +swww_transition_type = simple +swww_transition_step = 63 +swww_transition_angle = 0 +swww_transition_duration = 2 +swww_transition_fps = 60 +mpvpaper_sound = False +mpvpaper_options = +use_xdg_state = False +stylesheet = /home/cjennings/.config/waypaper/style.css + diff --git a/dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf b/dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf new file mode 100644 index 0000000..9cc87a2 --- /dev/null +++ b/dotfiles/hyprland/.config/xdg-desktop-portal/portals.conf @@ -0,0 +1,3 @@ +[preferred] +default=hyprland;gtk +org.freedesktop.impl.portal.Settings=none diff --git a/dotfiles/hyprland/.local/bin/monitor-dashboard b/dotfiles/hyprland/.local/bin/monitor-dashboard new file mode 100755 index 0000000..9236d20 --- /dev/null +++ b/dotfiles/hyprland/.local/bin/monitor-dashboard @@ -0,0 +1,37 @@ +#!/bin/sh +# monitor-dashboard - tmux session with system monitoring tools +# Each tool gets its own window for full screen real estate + +SESSION="monitor" + +# Check if system has a battery +has_battery() { + [ -d /sys/class/power_supply/BAT0 ] || [ -d /sys/class/power_supply/BAT1 ] +} + +# Attach to existing session or create new one +if tmux has-session -t "$SESSION" 2>/dev/null; then + exec tmux attach-session -t "$SESSION" +fi + +# Create new session with btop in first window +tmux new-session -d -s "$SESSION" -n btop btop + +# Add windows for other monitoring tools (grouped logically) +# CPU/GPU +tmux new-window -t "$SESSION" -n s-tui s-tui +tmux new-window -t "$SESSION" -n nvtop nvtop +# Disk +tmux new-window -t "$SESSION" -n duf "watch --color -n 60 duf" +# Network +tmux new-window -t "$SESSION" -n bandwhich "sudo bandwhich" +tmux new-window -t "$SESSION" -n wavemon wavemon +# Power (laptop only) +if has_battery; then + tmux new-window -t "$SESSION" -n powertop "sudo powertop" +fi + +# Start on btop window +tmux select-window -t "$SESSION:btop" + +exec tmux attach-session -t "$SESSION" 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/dotfiles/hyprland/.local/share/easyeffects/output/dt770-pro-250-harman-eq.json b/dotfiles/hyprland/.local/share/easyeffects/output/dt770-pro-250-harman-eq.json new file mode 100644 index 0000000..8774a0f --- /dev/null +++ b/dotfiles/hyprland/.local/share/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/.local/share/easyeffects/output/pixel-buds-pro-2-harman-eq.json b/dotfiles/hyprland/.local/share/easyeffects/output/pixel-buds-pro-2-harman-eq.json new file mode 100644 index 0000000..056e216 --- /dev/null +++ b/dotfiles/hyprland/.local/share/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/.local/share/easyeffects/output/pxc-550-ii-harman-eq.json b/dotfiles/hyprland/.local/share/easyeffects/output/pxc-550-ii-harman-eq.json new file mode 100644 index 0000000..c400419 --- /dev/null +++ b/dotfiles/hyprland/.local/share/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/.profile.d/99-hyprland-autostart.sh b/dotfiles/hyprland/.profile.d/99-hyprland-autostart.sh new file mode 100644 index 0000000..9d80353 --- /dev/null +++ b/dotfiles/hyprland/.profile.d/99-hyprland-autostart.sh @@ -0,0 +1,26 @@ +# 99-hyprland-autostart.sh +# Auto-start Hyprland on TTY1 console login + +# Guard: only on TTY1, not SSH, no existing display +[ "$XDG_VTNR" = "1" ] || return 0 +[ -z "$SSH_TTY" ] || return 0 +[ -z "$WAYLAND_DISPLAY" ] || return 0 +[ -z "$DISPLAY" ] || return 0 +command -v Hyprland >/dev/null 2>&1 || return 0 + +# Skip if flag file exists (touch ~/.skip-hyprland to disable) +[ -f "$HOME/.skip-hyprland" ] && return 0 + +# Setup logging (same pattern as start-hyprland wrapper) +_hypr_log_dir="$HOME/.local/var/log" +mkdir -p "$_hypr_log_dir" +_hypr_log="$_hypr_log_dir/hyprland-$(date +%Y-%m-%d-%H%M%S).log" + +# Clear screen and start Hyprland (no exec = return to shell on exit) +clear +Hyprland >"$_hypr_log" 2>&1 + +# Hyprland exited - inform user +echo "Hyprland session ended. Type 'start-hyprland' to restart." + +unset _hypr_log_dir _hypr_log |
