Dotfiles/desktopenvs/hyprlua/eww/eww.yuck

215 lines
9.5 KiB
Plaintext

; =============================================================================
; eww.yuck — EWW bar configuration for hyprlua (laptop with battery variant)
; This file defines all widgets, polls, and listeners for the top status bar.
; EWW (Elkowar's Wacky Widgets) is a widget system for Wayland/X11 that uses
; a Lisp-like syntax (.yuck) for layout and SCSS for styling.
;
; Color palette (cyberqueer theme):
; Background: #1a1a1a (near-black)
; Accent 1: #E40046 (red — active/highlight)
; Accent 2: #5018dd (purple — inactive/secondary)
; Text: #D6ABAB (muted pink-grey)
; =============================================================================
; defwindow — declares the actual OS-level window that appears on screen.
; :monitor — which monitor index to render on (passed at launch time)
; :windowtype "dock" — tells the compositor this is a panel, so it reserves space
; :exclusive true — prevents other windows from overlapping the bar area
; :anchor "top center" — pins the bar to the top center of the monitor
; :geometry — sets position (x=0%, y=1% from top), width (99%), height (20px)
(defwindow bar [monitor]
:monitor monitor
:class "ewwbar"
:windowtype "dock"
:geometry (geometry :x "0%"
:y "1%"
:width "99%"
:height "20px"
:anchor "top center")
:exclusive true
; Render the bar widget, passing the monitor index through for workspace tracking
(bar :monitor_ monitor))
; defpoll — polls a shell command on an interval and stores the result.
; battery is polled every 2 seconds so the icon/percentage stays current.
; The script returns a formatted string like "󰁹 87%" for display.
(defpoll battery :interval "2s"
"~/Dotfiles/desktopenvs/hyprland/scripts/batteryperc")
; defwidget bar — root bar widget. Uses centerbox to split into three zones:
; left → winsworks (battery, workspaces, active window title)
; center → music (currently playing track)
; right → sidestuff (IP, volume, disk, caffeine, clock, systray)
(defwidget bar [monitor_]
(centerbox :orientation "h"
(winsworks :monitor monitor_)
(music)
(sidestuff)))
; winsworks — left section of the bar.
; Shows battery percentage, workspace buttons, and the active window title.
; :halign "start" — left-aligns the content within the centerbox left cell.
(defwidget winsworks [monitor]
(box :orientation "h" :space-evenly false :halign "start"
; Battery percentage badge — styled as a pill with class "music"
(box :class "music" {"${battery}"})
; Workspace dots — one button per active workspace on this monitor
(workspaceWidget :monitor monitor)
; Active window title — clicking opens the application drawer
(button :onclick "~/Dotfiles/desktopenvs/hyprland/scripts/drawer.sh" :class "music" {" ${activewindow}"})
)
)
; sidestuff — right section of the bar.
; :halign "end" — right-aligns all children within the centerbox right cell.
(defwidget sidestuff []
(box :class "sidestuff" :orientation "h" :space-evenly false :halign "end"
; IP address badge — refreshed every 5s, shows current LAN/VPN IP
(box :class "music" {"󰛳 ${IP}"})
; Volume slider — 󰓃 icon, drag to adjust, click to open pavucontrol mixer
; hyprctl eval is used to run Lua dispatch inline so the window gets the +mixer tag
(metric :label "󰓃"
:value volume
:onchange "pactl set-sink-volume @DEFAULT_SINK@ {}%"
:onclick "killall pavucontrol || hyprctl eval 'hl.dsp.exec_cmd(\"[tag +mixer] pavucontrol\")'")
; Disk usage gauge — tooltip shows per-disk breakdown from dysk
; EWW_DISK is a built-in magic variable providing filesystem stats
(box
:tooltip {disks}
(metric :label ""
:value {round((1 - (EWW_DISK["/"].free / EWW_DISK["/"].total)) * 100, 0)}
:onchange ""
:onclick ""))
; Caffeine toggle button — shows ☕ when active, sleeping icon when off
(caffeine)
; Clock widget with calendar tooltip
(clock)
; System tray — renders applets from running applications (nm-applet, blueman, etc.)
(systray :class "music" :orientation "h" :spacing 2 :space-evenly true)
))
; music — center section: shows currently playing track via playerctl.
; Clicking play/pauses the current media player (spotify/vlc priority).
; Displays a music note icon + track name, or "None" if nothing is playing.
(defwidget music []
(button :class "music"
:orientation "h"
:space-evenly false
:halign "center"
:onclick "~/Dotfiles/desktopenvs/hyprland/scripts/playpause.sh"
{music != "" ? " ${music}" : " None"}))
; metric — reusable slider+label widget used for volume and disk usage.
; Parameters:
; label — icon/text shown as a clickable button
; value — current value (0-100)
; onchange — command run when slider is dragged (use {} as placeholder for value)
; onclick — command run when the label button is clicked
(defwidget metric [label value onchange onclick]
(box :orientation "h"
:class "metric"
:space-evenly false
(button :class "label" :onclick onclick label)
(scale :min 0
:max 101
; Only make the slider interactive if an onchange command was provided
:active {onchange != ""}
:value value
:onchange onchange)))
; deflisten — subscribes to a long-running process that emits JSON on stdout.
; hyprland-workspaces is a helper binary that streams workspace state changes.
; The "_" argument means listen for all monitors; we filter by monitor in the widget.
(deflisten workspaces "hyprland-workspaces _")
; workspaceWidget — renders one button per workspace on the given monitor.
; :onscroll — scrolling the workspace area switches workspaces; sed converts
; "up"/"down" into "r+1"/"r-1" relative workspace references,
; then hyprctl eval runs the Lua dispatch inline.
; The special:magic scratchpad workspace gets a distinct icon (󱂬 without a number).
(defwidget workspaceWidget [monitor]
(eventbox :onscroll "hyprctl eval \"hl.dsp.focus({workspace='$(echo {} | sed 's/up/r+/;s/down/r-/')1'})\""
(box :class "workspaces"
:space-evenly false
:width 20
(for i in {workspaces[monitor].workspaces}
(button
:width 20
; Click a workspace button to focus it via Lua dispatch
:onclick "hyprctl eval 'hl.dsp.focus({workspace=${i.id}})'"
; i.class comes from hyprland-workspaces: "active", "occupied", or ""
:class "${i.class}"
{i.name == "special:magic" ? "󱂬" : "󱂬${i.name}"})))))
; workspace-old — legacy workspace listener using a shell script instead of
; the hyprland-workspaces binary. Kept for reference/fallback.
(deflisten workspace-old "~/Dotfiles/desktopenvs/hyprland/scripts/workspace")
(defwidget workspaces-old []
(literal :content workspace-old))
; music poll — queries playerctl for the current track every 0.5 seconds.
; Returns an empty string when nothing is playing so the widget shows "None".
(defpoll music :interval "0.5s"
"~/Dotfiles/desktopenvs/hyprland/scripts/playerget")
; activewindow poll — gets the focused window title/class every 0.5 seconds.
; Used in the left section of the bar as a window title breadcrumb.
(defpoll activewindow :interval "0.5s"
"~/Dotfiles/desktopenvs/hyprland/scripts/activewindow")
; IP poll — gets the current IP address every 5 seconds.
; Slow interval because IP changes are infrequent; avoids unnecessary shell forks.
(defpoll IP :interval "5s"
"~/Dotfiles/desktopenvs/hyprland/scripts/ip")
; volume poll — reads the default audio sink volume every 0.5 seconds.
; Fast interval so the slider reflects hardware key presses immediately.
(defpoll volume :interval "0.5s"
"~/Dotfiles/desktopenvs/hyprland/scripts/getvol")
; time poll — reads the system clock every second for the clock widget.
; Format: HH:MM:SS|DD.MM.YYYY — the pipe character is used as a visual separator.
(defpoll time :interval "1s"
"date '+%H:%M:%S|%d.%m.%Y'")
; clock widget — displays the current time and shows a calendar as a tooltip.
; The tooltip is populated by the `calender` poll (note: intentional spelling).
(defwidget clock []
(box :class "clock"
:tooltip {calender}
(label :text {"${time}"})
)
)
; calender poll — runs a script that generates a text calendar (via cal).
; Polled every 600 seconds (10 minutes) since the calendar only changes daily.
(defpoll calender :interval "600s"
"~/Dotfiles/desktopenvs/hyprland/scripts/calender-fix.sh")
; disks poll — runs dysk to get a human-readable table of physical disk usage.
; Shown as a tooltip on the disk gauge. Polled every 10 minutes.
(defpoll disks :interval "600s"
"~/Dotfiles/desktopenvs/hyprland/scripts/dysk-phydisks.sh")
; caffeine-active poll — checks whether the caffeine systemd-inhibit lock is active.
; Returns "true" or "false" string every 2 seconds. Used to toggle the icon.
(defpoll caffeine-active :interval "2s"
"~/Dotfiles/desktopenvs/hyprlua/scripts/caffeine-status.sh")
; caffeine widget — a button that toggles the caffeine idle-inhibit lock.
; ☕ = caffeine is ON (screen won't sleep), 󰅺 = caffeine is OFF (normal idle).
; Tooltip shows the current state for clarity.
(defwidget caffeine []
(button :class "music"
:onclick "~/Dotfiles/desktopenvs/hyprlua/scripts/caffeine.sh"
:tooltip {caffeine-active == "true" ? "Caffeine: ON" : "Caffeine: OFF"}
{caffeine-active == "true" ? "☕" : "󰅺"}))