(defpoll time_str :interval "1m" :initial "" `date '+%r'`) (defpoll date_str :interval "1h" :initial "" `date '+%a %b %d'`) (defpoll tasks-data :interval "30m" :initial "{tasks: []}" `agenda-json`) (defpoll mail-data :interval "2m" :initial "{\"new\": 0, \"read\": 0}" `mail-count`) (defpoll active-network :interval "5m" :initial "{}" `nmcli conn show --active | head -n 2 | tail -n 1 | awk -F '[[:space:]][[:space:]]+' '{print "{ \\"name\\": \\""$1"\\", \\"type\\": \\""$3"\\"}"}'` ) (defpoll net-interface :interval "5m" :initial "" `nmcli conn show --active | head -n 2 | tail -n 1 | awk -F '[[:space:]][[:space:]]+' '{print $4}' | tr -d "[:blank:]"` ) (deflisten player-status "playerctl --follow status || false") (deflisten player-length "playerctl --follow metadata mpris:length || 0") (deflisten player-art "playerctl --follow metadata mpris:artUrl || 0") (deflisten artist `playerctl --follow metadata artist`) (defpoll player-position :interval "5s" :initial "0" :run-while {player-status == "Playing"} `playerctl position`) (deflisten track `playerctl --follow metadata title`) (defpoll volume :interval "5s" :initial "0" `amixer sget Master | awk -F"[][]" '/Left:/ { print $2 }' | tr -d '%'`) (defwidget time[] (box :class "time-container" :width 300 :height 30 (label :text date_str) (label :text time_str) )) (defwidget icon_stat[icon text ?visible] (box :class "icon-stat" :orientation "h" :space-evenly false :visible visible (label :width 30 :class "icon" :text icon) (label :class "text" :text text)) ) (defwidget stat_box[label text] (box :class "stat-box" :orientation "h" :spacing 0 :space-evenly false (box :width 4) (box :orientation "v" :spacing 0 :space-evenly false (box :height 4) (label :class "text" :text text) (label :class "label" :text label) (box :height 4)) (box :width 4) )) (defwidget section[] (box :class "section" :orientation "v" :space-evenly false (box :height 10) (children) (box :height 10) )) (defwidget pbar[text progress tooltip ?class ?visible] (box :class "pbar ${class}" :orientation "h" :visible visible :space-evenly false :tooltip tooltip (label :text text :width 40 :halign "center") (progress :value progress :valign "center" :width 240))) (defwidget tasks[] (box :class "task-container" :orientation "v" :halign "start" :spacing 5 :width 300 :space-evenly false (for task in {tasks-data.tasks} (box :class {task.state == "DONE" ? "task-item complete" : task.trigger == "Deadline:" ? "task-item deadline" : "task-item"} :orientation "h" :spacing 3 :halign "start" :space-evenly false :height 30 :valign "start" (box :width 10) (label :text {task.state != "" ? task.state == "TODO" ? " " : " " : " ${task.time}"} :class {task.state != "" ? "task-state" : "task-time"} :halign "start") (label :text {task.title} :wrap true :justify "left" :xalign 0))) )) (defwidget separator[] (box :orientation "v" :space-evenly false (box :height 10) (box :class "separator" :height 1) (box :height 9) )) (defwidget disk[mount] (pbar :text "" :progress {EWW_DISK[mount].used_perc} :visible {EWW_DISK[mount] != "null"} :tooltip "${mount}: ${round(EWW_DISK[mount].used_perc, 2)}%")) (defwindow side-panel :monitor 0 :geometry (geometry :x "10px" :y "0%" :width "300px" :height "99%" :anchor "center left") :stacking "fg" :windowtype "dock" :exclusive true :wm-ignore false (box :orientation "v" :halign "center" :valign "start" :spacing 4 :space-evenly false (section (time) (separator) (tasks)) (section (box :orientation "v" :spacing 2 :space-evenly: false (pbar :text "" :progress {EWW_RAM.used_mem_perc} :tooltip "${round(EWW_RAM.used_mem / 1024 / 1024 / 1024, 2)}GB used") (pbar :text "" :progress {EWW_CPU.avg} :tooltip "${round(EWW_CPU.avg, 2)}% average usage") (literal :visible {EWW_BATTERY != ""} :content {EWW_BATTERY != "" ? ' (pbar :text {EWW_BATTERY.BAT0?.status == "Discharging" ? "" : ""} :class {EWW_BATTERY.BAT0?.status == "Discharging" ? "bat-discharging" : "bat-charging"} :progress {EWW_BATTERY.BAT0?.capacity} :visible {EWW_BATTERY.BAT0 != ""} :tooltip "${EWW_BATTERY?.BAT0?.status}: ${round(EWW_BATTERY?.BAT0?.capacity, 2)}%") ' : ""}) (disk :mount "/") (disk :mount "/home/joe/Projects") (disk :mount "/mnt/glacier")) (separator) (box :orientation "h" :halign "center" :spacing 5 (icon_stat :icon "" :text "Ethernet" :visible {active-network.type == "ethernet"}) (icon_stat :icon " " :text "${active-network.name}" :visible {active-network.type == "wifi"}) (icon_stat :icon "" :text "${round(EWW_NET[net-interface].NET_DOWN / 1024 / 1024 / 2, 2)}mb") (icon_stat :icon "" :text "${round(EWW_NET[net-interface].NET_UP / 1024 / 1024 / 2, 2)}mb")) ) (section (box :orientation "h" :spacing 15 (box :width 15) (stat_box :label "New" :text {mail-data.new}) (stat_box :label "Read" :text {mail-data.read}) (box :width 15) )) (section (label :visible {player-status == ""} :text "No player active") (box :orientation "h" :space-evenly false :spacing 10 :visible {player-status != ""} (eventbox :onclick "playerctl play-pause" (label :width 50 :text {player-status == "Playing" ? "" : "" })) (box :class "music-art" :style 'background-image: url("${player-art}");' :width 60 :height 60) (box :orientation "v" (progress :value {player-position / (player-length / 1000000) * 100} :valign "center") (label :class "artist" :text artist :limit-width 15 :show-truncated true :halign "start") (label :text track :halign "start" :limit-width 20 :show-truncated true) ) ) (separator) (box :orientation "h" :space-evenly false :halign "center" :spacing 20 (label :text "" :width 20) (progress :width 200 :value {volume} :valign "center")) ) ))