215 lines
9.5 KiB
Plaintext
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" ? "☕" : ""}))
|