diff --git a/.chezmoiignore.tmpl b/.chezmoiignore.tmpl index d9251ee..3fa0b83 100644 --- a/.chezmoiignore.tmpl +++ b/.chezmoiignore.tmpl @@ -36,3 +36,6 @@ AGENTS.md GEMINI.md + +.config/hypr/AGENTS.md +.config/waybar/AGENTS.md diff --git a/AGENTS.md b/AGENTS.md index 6f88b08..0927667 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,6 +9,42 @@ This is a chezmoi dotfiles source tree. Key paths: - Host-specific variants use `##hostname.` (e.g., `hyprpaper.conf##hostname.owlenlap01`). - `dot_config/waybar/waybar.wiki/` and `dot_config/hypr/hyprland.wiki/` are mirrored docs with `dot_git/` metadata; treat them as upstream mirrors unless intentionally updating. +## Chezmoi Config (chezmoi.toml) +- Source of truth: `~/.config/chezmoi/chezmoi.toml` (not tracked here). +- Tag keys are stable across machines; templates must access them via `.chezmoi.config.data.tags.`. +- `microphone` is only present when `pipewire` is true; guard access with the tag. +- `data.monitors` is an array and the number of entries varies by machine. +- Reference structure (current machine): + ``` + [data] + tags = { desktop = true, laptop = false, hyprland = true, waybar = true, pipewire = true, dev = true, entertainment = true, cs2 = true, bluetooth = false } + microphone = "alsa_input.usb-DCMT_Technology_USB_Condenser_Microphone_214b206000000178-00.mono-fallback" + + # --- Primary Monitor --- + [[data.monitors]] + name = "DP-1" + primary = true + width = 1920 + height = 1080 + refresh_rate = 60 + position = "0x0" + scale = 1.0 + workspaces = [1, 2, 3, 4, 5] + wallpaper = "/home/mpuchstein/Pictures/wallpaper/ki/1920x1080/rosepinesuccubus11.png" + + # --- Secondary Monitor --- + [[data.monitors]] + name = "DP-2" + width = 1920 + height = 1080 + refresh_rate = 144 + position = "1920x0" + scale = 1.0 + vrr = 1 + workspaces = [6, 7, 8, 9, 10] + wallpaper = "/home/mpuchstein/Pictures/wallpaper/ki/1920x1080/witch_autumn.png" + ``` + ## Build, Test, and Development Commands There is no build system; apply and verify changes with chezmoi: - `chezmoi diff` preview pending changes. diff --git a/dot_config/hypr/AGENTS.md b/dot_config/hypr/AGENTS.md new file mode 100644 index 0000000..9fcb241 --- /dev/null +++ b/dot_config/hypr/AGENTS.md @@ -0,0 +1,75 @@ +# Repository Guidelines + +## Project Structure & Module Organization +This directory is the Hyprland portion of a chezmoi dotfiles source tree. Key paths: +- `dot_config/` maps to `~/.config/` (e.g., `dot_config/hypr/`, `dot_config/nvim/`, `dot_config/waybar/`). +- `dot_local/` maps to `~/.local/` (scripts, data, and app state). +- `dot_profile.tmpl` renders to `~/.profile`. +- `.chezmoiscripts/` holds chezmoi hooks such as `run_onchange_*`. +- Host-specific variants use `##hostname.` (e.g., `hyprpaper.conf##hostname.owlenlap01`). +- `dot_config/hypr/hyprland.wiki/` is a mirrored docs subtree; treat it as upstream unless intentionally updating. + +Hyprland configuration lives here in `hyprland.conf`, with modular includes under `hyprland.d/` and related configs like `hypridle.conf`, `hyprlock.conf.tmpl`, and `hyprpaper.conf.tmpl`. + +## Chezmoi Config (chezmoi.toml) +- Source of truth: `~/.config/chezmoi/chezmoi.toml` (not tracked here). +- Tag keys are stable across machines; templates must access them via `.chezmoi.config.data.tags.`. +- `microphone` is only present when `pipewire` is true; guard access with the tag. +- `data.monitors` is an array and the number of entries varies by machine. +- Reference structure (current machine): + ``` + [data] + tags = { desktop = true, laptop = false, hyprland = true, waybar = true, pipewire = true, dev = true, entertainment = true, cs2 = true, bluetooth = false } + microphone = "alsa_input.usb-DCMT_Technology_USB_Condenser_Microphone_214b206000000178-00.mono-fallback" + + # --- Primary Monitor --- + [[data.monitors]] + name = "DP-1" + primary = true + width = 1920 + height = 1080 + refresh_rate = 60 + position = "0x0" + scale = 1.0 + workspaces = [1, 2, 3, 4, 5] + wallpaper = "/home/mpuchstein/Pictures/wallpaper/ki/1920x1080/rosepinesuccubus11.png" + + # --- Secondary Monitor --- + [[data.monitors]] + name = "DP-2" + width = 1920 + height = 1080 + refresh_rate = 144 + position = "1920x0" + scale = 1.0 + vrr = 1 + workspaces = [6, 7, 8, 9, 10] + wallpaper = "/home/mpuchstein/Pictures/wallpaper/ki/1920x1080/witch_autumn.png" + ``` + +## Build, Test, and Development Commands +There is no build system. Validate changes via chezmoi: +- `chezmoi diff` shows pending changes between source and target files. +- `chezmoi apply` renders templates and applies updates to `$HOME`. +- `chezmoi status` summarizes managed file state. + +After applying, reload Hyprland (e.g., `hyprctl reload`) or restart related tools to verify behavior. + +## Coding Style & Naming Conventions +- Match existing formatting; avoid reflowing unrelated blocks. +- Use chezmoi prefixes: `dot_` for dotfiles, `executable_` for executables, `symlink_` for symlinks, `private_` for restricted files, and `.tmpl` for Go templates. +- Keep templates minimal and use `##hostname.` for host-specific variants. + +## Testing Guidelines +No automated tests are defined. Validate by: +- Running `chezmoi diff` and `chezmoi apply`. +- Smoke-testing the affected tool (e.g., reload Hyprland, start Waybar). + +## Commit & Pull Request Guidelines +No established Git history. Use concise, imperative commit subjects with optional scope (e.g., `hypr: adjust keybinds`). For PRs, include: +- A clear summary of changes. +- Affected paths (e.g., `dot_config/hypr/hyprland.conf`). +- Screenshots for visible UI changes. + +## Agent-Specific Notes +When editing mirrored docs under `dot_config/hypr/hyprland.wiki/`, treat them as upstream mirrors unless explicitly asked to update. diff --git a/dot_config/hypr/hyprland.d/70-keybinds.conf b/dot_config/hypr/hyprland.d/70-keybinds.conf index 8e9fa7f..86a8ee7 100644 --- a/dot_config/hypr/hyprland.d/70-keybinds.conf +++ b/dot_config/hypr/hyprland.d/70-keybinds.conf @@ -9,7 +9,7 @@ $term_tmux = uwsm app -- kitty tmux $term_tmux_append = uwsm app -- kitty tmux a $filemanager = uwsm app -- nautilus $launcher = uwsm app -- sherlock -$powermenu = uwsm app -- sherlock -sm pm +$launcheralt = uwsm app -- owlry $clipman = uwsm app -- sherlock-clp | sherlock | cliphist decode | wl-copy $browser = uwsm app -- firefox $browserprv = uwsm app -- firefox --private-window @@ -40,7 +40,7 @@ bind = $mainMod CTRL, W, exec, $altbrowser bind = $mainMod Shift, E, exec, $editor bind = $mainMod CTRL, E, exec, $alteditor bind = $mainMod, X, exec, $launcher -bind = $mainMod, B, exec, $powermenu +bind = $mainMod SHIFT, X, exec, $launcheralt bind = $mainMod, C, exec, $clipman bind = $mainMod, Return, exec, $terminal_backup bind = $mainMod SHIFT, Return, exec, $term_tmux diff --git a/dot_config/jellyfin-mpv-shim/empty_input.conf b/dot_config/jellyfin-mpv-shim/empty_input.conf new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/jellyfin-mpv-shim/fonts/.keep b/dot_config/jellyfin-mpv-shim/fonts/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/jellyfin-mpv-shim/mpv.conf.tmpl b/dot_config/jellyfin-mpv-shim/mpv.conf.tmpl new file mode 100644 index 0000000..7558a11 --- /dev/null +++ b/dot_config/jellyfin-mpv-shim/mpv.conf.tmpl @@ -0,0 +1,24 @@ +# --- Video & Quality --- +{{- if .chezmoi.config.data.tags.desktop }} +profile=high-quality +vo=gpu-next +gpu-api=vulkan +hwdec=vaapi +{{- else }} +vo=gpu-next +hwdec=auto-safe +{{- end }} + +# --- Motion --- +video-sync=display-resample +interpolation=yes +tscale=oversample + +# --- Window --- +geometry=50%:50% + +# --- Screenshots --- +screenshot-format=png +screenshot-high-bit-depth=yes +screenshot-png-compression=7 +screenshot-directory=~/Pictures/Screenshots diff --git a/dot_config/jellyfin-mpv-shim/scripts/.keep b/dot_config/jellyfin-mpv-shim/scripts/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/mpv/mpv.conf b/dot_config/mpv/mpv.conf deleted file mode 100644 index f95a2bd..0000000 --- a/dot_config/mpv/mpv.conf +++ /dev/null @@ -1,150 +0,0 @@ -# -# Example mpv configuration file -# -# Warning: -# -# The commented example options usually do _not_ set the default values. Call -# mpv with --list-options to see the default values for most options. There is -# no builtin or example mpv.conf with all the defaults. -# -# -# Configuration files are read system-wide from /etc/mpv or /usr/local/etc/mpv, -# and per-user from ~/.config/mpv, where per-user settings override -# system-wide settings, all of which are overridden by the command line. -# -# Configuration file settings and the command line options use the same -# underlying mechanisms. Most options can be put into the configuration file -# by dropping the preceding '--'. See the man page for a complete list of -# options. -# -# Lines starting with '#' are comments and are ignored. -# -# See the CONFIGURATION FILES section in the man page -# for a detailed description of the syntax. -# -# Profiles should be placed at the bottom of the configuration file to ensure -# that settings wanted as defaults are not restricted to specific profiles. - -################## -# video settings # -################## - -# Start in fullscreen mode by default. -#fs=yes - -# force starting with centered window -#geometry=50%:50% - -# don't allow a new window to have a size larger than 90% of the screen size -#autofit-larger=90%x90% - -# Do not close the window on exit. -#keep-open=yes - -# Do not wait with showing the video window until it has loaded. (This will -# resize the window once video is loaded. Also always shows a window with -# audio.) -#force-window=immediate - -# Disable the On Screen Controller (OSC). -#osc=no - -# Keep the player window on top of all other windows. -#ontop=yes - -# Specify fast video rendering preset (for --vo= only) -# Recommended for mobile devices or older hardware with limited processing power -#profile=fast - -# Specify high quality video rendering preset (for --vo= only) -# Offers superior image fidelity and visual quality for an enhanced viewing -# experience on capable hardware -#profile=high-quality - -# Force video to lock on the display's refresh rate, and change video and audio -# speed to some degree to ensure synchronous playback - can cause problems -# with some drivers and desktop environments. -#video-sync=display-resample - -# Enable hardware decoding if available. Often, this does not work with all -# video outputs, but should work well with default settings on most systems. -# If performance or energy usage is an issue, forcing the vdpau or vaapi VOs -# may or may not help. -hwdec=auto - -################## -# audio settings # -################## - -# Specify default audio device. You can list devices with: --audio-device=help -# The option takes the device string (the stuff between the '...'). -#audio-device=alsa/default - -# Do not filter audio to keep pitch when changing playback speed. -#audio-pitch-correction=no - -# Output 5.1 audio natively, and upmix/downmix audio with a different format. -#audio-channels=5.1 -# Disable any automatic remix, _if_ the audio output accepts the audio format. -# of the currently played file. See caveats mentioned in the manpage. -# (The default is "auto-safe", see manpage.) -#audio-channels=auto - -################## -# other settings # -################## - -# Pretend to be a web browser. Might fix playback with some streaming sites, -# but also will break with shoutcast streams. -#user-agent="Mozilla/5.0" - -# cache settings -# -# Use a large seekable RAM cache even for local input. -#cache=yes -# -# Use extra large RAM cache (needs cache=yes to make it useful). -#demuxer-max-bytes=500M -#demuxer-max-back-bytes=100M -# -# Disable the behavior that the player will pause if the cache goes below a -# certain fill size. -#cache-pause=no -# -# Store cache payload on the hard disk instead of in RAM. (This may negatively -# impact performance unless used for slow input such as network.) -#cache-dir=~/.cache/ -#cache-on-disk=yes - -# Display English subtitles if available. -#slang=en - -# Play Finnish audio if available, fall back to English otherwise. -#alang=fi,en - -# Change subtitle encoding. For Arabic subtitles use 'cp1256'. -# If the file seems to be valid UTF-8, prefer UTF-8. -# (You can add '+' in front of the codepage to force it.) -#sub-codepage=cp1256 - -# You can also include other configuration files. -#include=/path/to/the/file/you/want/to/include - -############ -# Profiles # -############ - -# The options declared as part of profiles override global default settings, -# but only take effect when the profile is active. - -# The following profile can be enabled on the command line with: --profile=eye-cancer - -#[eye-cancer] -#sharpen=5 - -# uosc provides seeking & volume indicators (via flash-timeline and flash-volume commands) -# if you decide to use them, you don't need osd-bar -osd-bar=no - -# uosc will draw its own window controls and border if you disable window border -border=no diff --git a/dot_config/mpv/mpv.conf.tmpl b/dot_config/mpv/mpv.conf.tmpl new file mode 100644 index 0000000..bc7013c --- /dev/null +++ b/dot_config/mpv/mpv.conf.tmpl @@ -0,0 +1,40 @@ +# --- General --- +keep-open=yes +save-position-on-quit=yes +geometry=50%:50% + +# --- UI (uosc support) --- +osd-bar=no +border=no + +# --- Video --- +# Smooth motion handling +video-sync=display-resample +interpolation=yes +tscale=oversample + +# --- Hardware & Quality (Chezmoi) --- +{{- if .chezmoi.config.data.tags.desktop }} +profile=high-quality +vo=gpu-next +gpu-api=vulkan +hwdec=vaapi +{{- else }} +vo=gpu-next +hwdec=auto-safe +{{- end }} + +# --- Languages --- +# English, German, French, Japanese +alang=eng,en,deu,de,fra,fr,jpn,jp +slang=eng,en,deu,de,fra,fr + +# --- Subtitles --- +sub-auto=fuzzy +sub-font-size=48 + +# --- Screenshots --- +screenshot-format=png +screenshot-high-bit-depth=yes +screenshot-png-compression=7 +screenshot-directory=~/Pictures/Screenshots diff --git a/dot_config/owlry/config.toml b/dot_config/owlry/config.toml new file mode 100644 index 0000000..706f262 --- /dev/null +++ b/dot_config/owlry/config.toml @@ -0,0 +1,77 @@ +# Owlry Configuration +# Copy to ~/.config/owlry/config.toml + +[general] +show_icons = true +max_results = 10 +terminal_command = "kitty" # Auto-detected if not set + +# Launch wrapper for app execution (auto-detected if not set) +# Examples: +# "uwsm app --" # For uwsm sessions +# "hyprctl dispatch exec --" # For Hyprland +# "" # Direct execution +# launch_wrapper = "uwsm app --" + +[appearance] +width = 600 +height = 400 +font_size = 14 +border_radius = 12 + +# Theme: "owl" for built-in dark theme, or leave unset for GTK default +theme = "owl" + +# Individual color overrides (CSS color values) +# [appearance.colors] +# background = "#1a1b26" +# background_secondary = "#24283b" +# border = "#414868" +# text = "#c0caf5" +# text_secondary = "#565f89" +# accent = "#7aa2f7" +# accent_bright = "#89b4fa" +# badge_app = "#9ece6a" +# badge_calc = "#e0af68" +# badge_cmd = "#7aa2f7" +# badge_dmenu = "#bb9af7" +# badge_uuctl = "#f7768e" + +[providers] +applications = true +commands = true +uuctl = true + +# Calculator provider (type "= 5+3" or "calc 5+3") +calculator = true + +# Frecency: boost frequently/recently used items in search results +frecency = true +frecency_weight = 0.3 # 0.0 = disabled, 1.0 = strong boost + +# Web search provider (type "? query" or "web query") +websearch = true +# Options: google, duckduckgo, bing, startpage, searxng, brave, ecosia +# Or custom URL with {query} placeholder, e.g. "https://search.example.com/?q={query}" +search_engine = "duckduckgo" + +# System commands (shutdown, reboot, lock, suspend, hibernate, logout, BIOS) +system = true + +# SSH connections from ~/.ssh/config +ssh = true + +# Clipboard history (requires cliphist) +clipboard = true + +# Browser bookmarks (Chrome, Chromium, Brave, Edge, Vivaldi) +bookmarks = true + +# Emoji picker (copies to clipboard) +emoji = true + +# Custom scripts from ~/.config/owlry/scripts/ +scripts = true + +# File search (requires fd or locate, trigger with "/ pattern" or "find pattern") +files = true diff --git a/dot_config/owlry/scripts/.keep b/dot_config/owlry/scripts/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/waybar/AGENTS.md b/dot_config/waybar/AGENTS.md new file mode 100644 index 0000000..c289191 --- /dev/null +++ b/dot_config/waybar/AGENTS.md @@ -0,0 +1,70 @@ +# Repository Guidelines + +## Project Structure & Module Organization +This is a chezmoi dotfiles source tree scoped to Waybar. The current directory maps to `~/.config/waybar/` on apply. +- `dot_config/waybar/` contains Waybar config, style, and module files. +- `dot_config/waybar/waybar.wiki/` is a mirrored upstream doc set with `dot_git/` metadata; avoid editing unless intentionally updating the mirror. +- Host-specific variants use `##hostname.` suffixes (e.g., `config##hostname.laptop`). + +## Chezmoi Config (chezmoi.toml) +- Source of truth: `~/.config/chezmoi/chezmoi.toml` (not tracked here). +- Tag keys are stable across machines; templates must access them via `.chezmoi.config.data.tags.`. +- `microphone` is only present when `pipewire` is true; guard access with the tag. +- `data.monitors` is an array and the number of entries varies by machine. +- Reference structure (current machine): + ``` + [data] + tags = { desktop = true, laptop = false, hyprland = true, waybar = true, pipewire = true, dev = true, entertainment = true, cs2 = true, bluetooth = false } + microphone = "alsa_input.usb-DCMT_Technology_USB_Condenser_Microphone_214b206000000178-00.mono-fallback" + + # --- Primary Monitor --- + [[data.monitors]] + name = "DP-1" + primary = true + width = 1920 + height = 1080 + refresh_rate = 60 + position = "0x0" + scale = 1.0 + workspaces = [1, 2, 3, 4, 5] + wallpaper = "/home/mpuchstein/Pictures/wallpaper/ki/1920x1080/rosepinesuccubus11.png" + + # --- Secondary Monitor --- + [[data.monitors]] + name = "DP-2" + width = 1920 + height = 1080 + refresh_rate = 144 + position = "1920x0" + scale = 1.0 + vrr = 1 + workspaces = [6, 7, 8, 9, 10] + wallpaper = "/home/mpuchstein/Pictures/wallpaper/ki/1920x1080/witch_autumn.png" + ``` + +## Build, Test, and Development Commands +There is no build system. Use chezmoi to preview and apply changes: +- `chezmoi diff` preview pending changes. +- `chezmoi apply` render and apply files to `$HOME`. +- `chezmoi status` show managed file status. +After applying, restart Waybar to validate changes. + +## Coding Style & Naming Conventions +- Match existing file formatting; avoid reflowing unrelated sections. +- Prefer ASCII unless the file already uses Unicode. +- Use chezmoi naming conventions: `dot_` for dotfiles, `executable_` for executables, `private_` for restricted files, `.tmpl` for Go templates, `symlink_` for symlinks. +- Keep module names descriptive and aligned with Waybar’s config keys. + +## Testing Guidelines +No automated tests are defined. Validate by: +- Running `chezmoi diff` and `chezmoi apply`. +- Smoke-testing Waybar (reload or restart) to confirm layout and modules. + +## Commit & Pull Request Guidelines +The repository has no established Git history. Use short, imperative commit subjects and include a scope when helpful (e.g., `waybar: tweak clock format`). For pull requests, include: +- A concise summary of changes. +- Affected paths (e.g., `dot_config/waybar/config`). +- Screenshots for visual/UI changes. + +## Notes for Contributors +Avoid editing unrelated dotfiles unless requested. If you touch mirrored docs or host-specific files, call it out explicitly in your summary. diff --git a/dot_config/waybar/config.tmpl b/dot_config/waybar/config.tmpl index 9310933..f392be5 100644 --- a/dot_config/waybar/config.tmpl +++ b/dot_config/waybar/config.tmpl @@ -8,10 +8,10 @@ "layer": "top", "position": "left", "output": "{{ $primary_output }}", - "width": 95, - "spacing": 6, - "margin-top": 6, - "margin-bottom": 6, + "width": 90, + "spacing": 4, + "margin-top": 0, + "margin-bottom": 0, "modules-left": [ "clock", @@ -28,8 +28,7 @@ "memory", "disk#root", "network", - "temperature#cpu", - "temperature#gpu_hotspot" + "group/temps" ], "modules-right": [ @@ -37,17 +36,20 @@ "custom/hyprsunset", "gamemode", "privacy", - "wireplumber#source", - "wireplumber#sink", + "group/volume", "tray", + {{- if .chezmoi.config.data.tags.bluetooth }} "bluetooth", + {{- end }} + {{- if .chezmoi.config.data.tags.laptop }} "power-profiles-daemon", "battery" + {{- end }} ], "hyprland/window": { "format": "{title}", - "max-length": 28, + "max-length": 18, "icon": true, "icon-size": 18, "separate-outputs": false @@ -86,8 +88,8 @@ "network": { "interval": 3, - "format-wifi": " {essid}%", - "format-ethernet": " {ifname}", + "format-wifi": " {signalStrength}%", + "format-ethernet": "", "tooltip-format-wifi": "{signalStrength}\n {bandwidthUpBytes}\n {bandwidthDownBytes}", "tooltip-format-ethernet": " {bandwidthUpBytes}\n {bandwidthDownBytes}", "format-disconnected": "" @@ -197,23 +199,26 @@ "group/temps": { - "orientation": "horizontal", + "orientation": "vertical", "drawer": { "transition-duration": 300, "transition-left-to-right": true, "click-to-reveal": true }, "modules": [ - "custom/temps-wrap", // leader, always visible + "custom/temps-cycle", // leader, always visible "temperature#cpu", "temperature#gpu_hotspot", "temperature#nvme" ] }, - "custom/temps-wrap": { - "format": "", - "tooltip-format": "Temperatures" + "custom/temps-cycle": { + "exec": "$HOME/.config/waybar/scripts/temps-cycle.sh", + "return-type": "json", + "interval": 3, + "format": "{text}", + "tooltip": true }, "temperature#cpu": { @@ -221,8 +226,8 @@ "input-filename": "temp1_input", "interval": 5, "critical-threshold": 85, - "format": " CPU: {temperatureC}°C", - "format-critical": " CPU: {temperatureC}°C ", + "format": " {temperatureC}°C", + "format-critical": " {temperatureC}°C ", "tooltip-format": "CPU Tctl: {temperatureC}°C" }, @@ -241,8 +246,8 @@ "input-filename": "temp2_input", "interval": 5, "critical-threshold": 110, - "format": " GPU: {temperatureC}°C", - "format-critical": " GPU: {temperatureC}°C ", + "format": " {temperatureC}°C", + "format-critical": " {temperatureC}°C ", "tooltip-format": "GPU junction: {temperatureC}°C" }, @@ -297,5 +302,13 @@ "tooltip": true, "format": "{text}", "on-click": "kitty --hold alhp.utils -j" + }, + + "group/volume": { + "orientation": "vertical", + "modules": [ + "wireplumber#source", + "wireplumber#sink" + ] } -} \ No newline at end of file +} diff --git a/dot_config/waybar/scripts/executable_temps-cycle.sh b/dot_config/waybar/scripts/executable_temps-cycle.sh new file mode 100644 index 0000000..27aff45 --- /dev/null +++ b/dot_config/waybar/scripts/executable_temps-cycle.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +set -euo pipefail + +cycle_seconds=3 + +resolve_hwmon_file() { + local base="$1" file="$2" sub + if [[ -r "$base/$file" ]]; then + printf '%s' "$base/$file" + return 0 + fi + if [[ -d "$base" ]]; then + for sub in "$base"/hwmon*; do + if [[ -r "$sub/$file" ]]; then + printf '%s' "$sub/$file" + return 0 + fi + done + fi + return 1 +} + +resolve_hwmon_by_name() { + local target="$1" file="$2" h + [[ -n "$target" ]] || return 1 + for h in /sys/class/hwmon/hwmon*; do + [[ -r "$h/name" ]] || continue + if [[ "$(cat "$h/name")" == "$target" && -r "$h/$file" ]]; then + printf '%s' "$h/$file" + return 0 + fi + done + return 1 +} + +read_temp() { + local base="$1" file="$2" fallback="$3" raw path + if path=$(resolve_hwmon_file "$base" "$file"); then + : + elif path=$(resolve_hwmon_by_name "$fallback" "$file"); then + : + else + return 1 + fi + raw=$(<"$path") + if [[ "$raw" =~ ^[0-9]+$ ]]; then + printf '%s' "$((raw / 1000))" + return 0 + fi + return 1 +} + +cpu_path="/sys/devices/pci0000:00/0000:00:18.3/hwmon" +gpu_path="/sys/devices/pci0000:00/0000:00:01.1/0000:10:00.0/0000:11:00.0/0000:12:00.0/hwmon" +nvme_path="/sys/devices/pci0000:00/0000:00:02.2/0000:23:00.0/nvme/nvme0/hwmon" + +labels=() +icons=() +values=() + +if temp=$(read_temp "$cpu_path" "temp1_input" "k10temp"); then + labels+=("CPU") + icons+=("") + values+=("$temp") +fi + +if temp=$(read_temp "$gpu_path" "temp2_input" "amdgpu"); then + labels+=("GPU") + icons+=("") + values+=("$temp") +fi + +if temp=$(read_temp "$nvme_path" "temp1_input" "nvme"); then + labels+=("NVMe") + icons+=("") + values+=("$temp") +fi + +count=${#values[@]} +if (( count == 0 )); then + printf '{"text":" --","tooltip":"No temp sensors found"}\n' + exit 0 +fi + +idx=$(( ($(date +%s) / cycle_seconds) % count )) +text="${icons[idx]} ${values[idx]}°C" + +tooltip="" +for i in "${!values[@]}"; do + if [[ -n "$tooltip" ]]; then + tooltip+='\n' + fi + tooltip+="${labels[i]}: ${values[i]}°C" +done + +printf '{"text":"%s","tooltip":"%s"}\n' "$text" "$tooltip" diff --git a/dot_config/waybar/style.css b/dot_config/waybar/style.css index 391dab0..d22fce5 100644 --- a/dot_config/waybar/style.css +++ b/dot_config/waybar/style.css @@ -13,12 +13,28 @@ @define-color hl_low #21202e; @define-color hl_med #403d52; @define-color hl_high #524f67; +@define-color bar_alpha rgba(25, 23, 36, 0.65); +@define-color surface_alpha rgba(31, 29, 46, 0.82); +@define-color overlay_alpha rgba(38, 35, 58, 0.9); /* Bar */ window#waybar { - background: @base; + background: @bar_alpha; color: @text; - border-right: 1px solid @hl_low; + border: 0; +} + +/* Extra breathing room for the first/last pill in each section */ +#left > :first-child, +#center > :first-child, +#right > :first-child { + margin-top: 8px; +} + +#left > :last-child, +#center > :last-child, +#right > :last-child { + margin-bottom: 8px; } /* Typography */ @@ -37,7 +53,7 @@ window#waybar { } #workspaces button { - background: @surface; + background: @surface_alpha; color: @text; border: 1px solid @hl_low; border-radius: 6px; @@ -46,7 +62,7 @@ window#waybar { } #workspaces button:hover { - background: @overlay; + background: @overlay_alpha; } #workspaces button.active { @@ -74,18 +90,18 @@ window#waybar { #battery, #power-profiles-daemon, #bluetooth, -#group-temps, #tray, #temperature, #custom-swaync, +#custom-temps-cycle, #custom-hyprsunset, #custom-alhp { - background: @surface; + background: @surface_alpha; color: @text; border: 1px solid @hl_low; border-radius: 8px; padding: 3px 6px; - margin: 2px 4px; + margin: 2px 3px; } /* Universal hover effects - FIXED */ @@ -102,13 +118,13 @@ window#waybar { #battery:hover, #power-profiles-daemon:hover, #bluetooth:hover, -#group-temps:hover, #tray:hover, #temperature:hover, #custom-swaync:hover, +#custom-temps-cycle:hover, #custom-hyprsunset:hover, #custom-alhp:hover { - background: @overlay; + background: @overlay_alpha; } /* Window title */ @@ -138,18 +154,10 @@ window#waybar { border-left: 3px solid @pine; } -#temperature.gpu_edge { - border-left: 3px solid @iris; -} - #temperature.gpu_hotspot { border-left: 3px solid @rose; } -#temperature.gpu_mem { - border-left: 3px solid @foam; -} - #temperature.nvme { border-left: 3px solid @gold; } @@ -272,33 +280,25 @@ window#waybar { border-left: 3px solid @pine; } -/* Temps group: outer pill + compact rows */ -#group-temps { - border-left: 3px solid @rose; -} - -#group-temps > * { +/* Group wrappers (no extra padding to avoid width growth) */ +#group-temps, +#group-volume { background: transparent; border: 0; margin: 0; padding: 0; } -#custom-temps-wrap { - padding: 4px 6px; - border-radius: 6px; +#custom-temps-cycle { + border-left: 3px solid @rose; } #group-temps #temperature { - background: transparent; - color: @text; margin: 2px 0; - padding: 4px 6px; - border-radius: 6px; } #group-temps #temperature:hover { - background: @overlay; + background: @overlay_alpha; } /* Temperature modules within group - maintain specific colors */ @@ -314,10 +314,6 @@ window#waybar { border-left: 3px solid @rose; } -#group-temps #temperature.gpu2_edge { - border-left: 3px solid @foam; -} - #group-temps #temperature.nvme { border-left: 3px solid @gold; } @@ -340,6 +336,15 @@ window#waybar { border-left: 3px solid @love; } +#group-volume #wireplumber { + margin: 1px 0; + padding: 2px 4px; +} + +#group-volume #wireplumber:hover { + background: @overlay_alpha; +} + /* Tooltips */ tooltip, window#waybar tooltip { @@ -372,7 +377,7 @@ menuitem, menuitem:hover, .menuitem:hover { - background: @overlay; + background: @overlay_alpha; } menuitem:disabled,