Initial eww config

This commit is contained in:
Erwin Boskma 2023-07-04 20:24:29 +02:00
parent 3834b547c3
commit 08e0136240
Signed by: erwin
SSH key fingerprint: SHA256:9LmFDe1C6jSrEyqxxvX8NtJBmcbB105XoqyUZF092bg
3 changed files with 505 additions and 0 deletions

View file

@ -0,0 +1,221 @@
* {
all: unset;
}
// Color variables
$background: #1a1b26;
$foreground: #a9b1d6;
$urgent: #c9545d;
$black: #24283b;
$gray: #565f89;
$red: #f7768e;
$green: #73daca;
$yellow: #e0af68;
$blue: #7aa2f7;
$magenta: #bb9af7;
$cyan: #7dcfff;
$navy: #285577;
$white: $foreground;
// EWW BAR
.eww_bar {
background-color: $background;
padding: 0.3rem;
font-family: "Iosevka Nerd Font";
font-weight: bold;
color: $foreground;
}
// Workspaces
.workspaces {
font-family: "Iosevka Nerd Font";
padding: 0 1rem 0 0;
background-color: $background;
border-radius: 5px;
.ws {
margin: 0;
padding: 0 1rem;
border-top: 2px solid transparent;
&:hover {
background-color: $gray;
}
&.focused {
border-color: #4c7899;
background-color: $navy;
color: #ffffff;
}
&.urgent {
border-color: $urgent;
color: $urgent;
}
}
}
tooltip {
background-color: $background;
font-size: 1.2rem;
}
.ha-now-playing {
font-family: "Iosevka Nerd Font";
font-size: 1.2rem;
padding: 0;
.icon {
color: $magenta;
}
}
// Control Panel
.control {
padding: 0 0.5rem;
font-family: "Iosevka Nerd Font";
font-size: 1.2em;
border-radius: 5px;
}
.icon {
font-size: 2rem;
margin-right: 1rem;
&.small {
font-size: 1rem;
margin-right: 0.5rem;
}
}
.memory {
margin: 0 0.5rem;
.icon {
color: $blue;
}
}
.cpu {
margin: 0 0.5rem;
.icon {
color: $green;
}
}
.temperature {
margin: 0 0.5rem;
.icon {
color: $red;
}
}
.volume {
.icon {
color: $yellow;
}
}
scale {
trough {
// all: unset;
background-color: $black;
border-radius: 5px;
min-width: 80px;
min-height: 10px;
margin: 0 0.3rem 0 0.3rem;
highlight {
background-color: $yellow;
border-radius: 5px;
}
}
}
.bribar trough highlight {
background-color: $yellow;
border-radius: 5px;
}
.volbar trough highlight {
background-color: $green;
border-radius: 5px;
}
// Clock
.time {
font-family: "Iosevka Nerd Font";
font-size: 1.2rem;
border-radius: 5px;
padding: 0.7rem 0 0.5rem 0;
margin: 0 0.5rem;
.icon {
color: $red;
}
}
// Calendar
.cal-box {
background-color: $black;
font-family: "Iosevka Nerd Font";
font-size: 1rem;
.cal-inner-box {
padding: 1rem 1rem 0.2rem;
.cal {
&.highlight {
padding: 10rem;
}
padding: 0.8rem 0.25rem 0rem;
margin-left: 10px;
}
}
}
calendar:selected {
color: $blue;
}
calendar.header {
color: $blue;
}
calendar.button {
color: $magenta;
}
calendar.highlight {
color: $magenta;
}
calendar:indeterminate {
color: $background;
}
// Powermenu
.powermenu {
font-family: "Iosevka Nerd Font";
font-size: 1.5rem;
}
.button-reboot,
.button-hibernate,
.button-quit,
.button-shutdown {
// padding: 0.5rem 0.2rem 0.3rem 0.2rem;
padding: 0.3rem 0.7rem;
font-size: 2rem;
}
.button-shutdown {
// margin-bottom: 0.5rem;
color: $red;
}
.button-reboot {
color: $yellow;
}
.button-quit {
color: $green;
}
.button-hibernate {
color: $blue;
}

View file

@ -0,0 +1,233 @@
;; Variables
(defvar power false)
(defvar show-date false)
(defvar show-volume false)
(defvar volume-muted false)
(defvar ha-now-playing "/nix/store/n3364y7amwgjs94whqapvdvp9d7d3zrh-ha-now-playing-0.5.0/bin/ha-now-playing --host home.datarift.nl --token-file /run/secrets/ha_now_playing_token --entity media_player.sonos_woonkamer")
;; Polls
(defpoll volume-current
:initial 0
:interval "1s"
`pamedia get -b`)
;; Listen
(deflisten sonos-now-playing
:initial "{\"muted\":false,\"text\":\"\"}"
`/nix/store/n3364y7amwgjs94whqapvdvp9d7d3zrh-ha-now-playing-0.5.0/bin/ha-now-playing --host home.datarift.nl --token-file /run/secrets/ha_now_playing_token --entity media_player.sonos_woonkamer`)
(deflisten wm-info
:initial "{\"workspaces\":[],\"mode\":\"default\",\"title\":\"\"}"
`scripts/workspaces.nu`)
;; Widgets
(defwidget mode []
(box :space-evenly false
:spacing 2
:class "mode"
(label :class "icon"
:visible {wm-info.mode != "default"}
:text "󰁌")
(label :visible {wm-info.mode != "default"}
:text {wm-info.mode})))
(defwidget workspaces []
(box :space-evenly false
:spacing 5
:class "workspaces"
(box :space-evenly false
:spacing 0
(for ws in {wm-info.workspaces}
(button :onclick "swaymsg workspace ${ws.name}"
:class "ws${ws.visible ? ' visible' : ''}${ws.focused ? ' focused' : ''}${ws.urgent ? ' urgent' : ''}"
(box :space-evenly false
:spacing 2
(label :class "icon small"
:visible {!ws.focused && !ws.urgent}
:text "")
(label :class "icon small"
:visible {ws.focused}
:text "")
(label :class "icon small"
:visible {ws.urgent}
:text "")
(label :text "${ws.name}"))))
(mode))))
;; (defwidget workspaces []
;; (box :space-evenly false
;; :spacing 5
;; :class "workspaces"
;; (label :text {wm-info.title})))
(defwidget ha-now-playing []
(eventbox :onclick "${ha-now-playing} play-pause"
:onrightclick "${ha-now-playing} ${sonos-now-playing.muted ? 'unmute' : 'mute'}"
:onscroll "${ha-now-playing} volume-{}"
(box :class "ha-now-playing"
:space-evenly false
:spacing 2
(label :class "icon"
:text "󰐹")
(label :text {sonos-now-playing.text}))))
(defwidget date-time []
(eventbox :onclick "${EWW_CMD} update show-date=${!show-date}"
:cursor "pointer"
(box :class "time"
:space-evenly false
:spacing 2
(label :visible {!show-date}
:class "icon"
:text "󰅐")
(label :visible {!show-date}
:text "${formattime(EWW_TIME, '%H:%M:%S')}")
(label :visible show-date
:class "icon"
:text "󰃭")
(label :visible show-date
:text "${formattime(EWW_TIME, '%a, %d %b %Y')}"))))
(defwidget memory []
(box :class "memory"
:space-evenly false
:spacing 2
:tooltip "${round(EWW_RAM.used_mem / 1024 / 1024 / 1024, 2)}GiB / ${round(EWW_RAM.total_mem / 1024 / 1024 / 1024, 2)}GiB used"
(label :class "icon"
:text "󰍛")
(label :text "${round(EWW_RAM.used_mem_perc, 1)}%")))
(defwidget cpu []
(box :class "cpu"
:space-evenly false
:spacing 2
:tooltip {jq(EWW_CPU, "reduce .cores[] as $core (\"\"; . + $core.core + \": \" + ($core.usage | tostring) + \"%\\n\") | {tooltip:.}").tooltip}
(label :class "icon"
:text "󰻠")
(label :text "${round(EWW_CPU.avg, 2)}%")))
(defwidget temperature []
(box :class "temperature"
:space-evenly false
:spacing 2
(label :class "icon"
:text "󰔏")
(label :text "${round(EWW_TEMPS.ZENPOWER_TDIE, 1)}°C")))
(defwidget volume []
(eventbox :onhover "${EWW_CMD} update show-volume=true"
:onhoverlost "${EWW_CMD} update show-volume=false"
:onclick "pamedia mute"
:onmiddleclick "helvum"
:onrightclick "pavucontrol"
:tooltip "Volume: ${volume-current}%"
:cursor "pointer"
(box :space-evenly false
:spacing 5
:class "volume"
(revealer :transition "slideleft"
:reveal show-volume
:duration "550ms"
(scale :class "volume-bar"
:flipped true
:value volume-current
:orientation "h"
:min 0
:max 101
:round-digits 0
:tooltip "Volume: ${volume-current}%"
:onchange "pamedia set {}"))
(label :class "icon"
:visible {!volume-muted}
:text "󰕾")
(label :class "icon"
:visible volume-muted
:text "󰸈"))))
(defwidget control []
(box :class "control"
:space-evenly false
:spacing 2
(volume)
(cpu)
(temperature)
(memory)))
(defwidget power []
(eventbox :onhover "${EWW_CMD} update power=true"
:onhoverlost "${EWW_CMD} update power=false"
:cursor "pointer"
(box :space-evenly false
:class "powermenu"
(revealer :transition "slideleft"
:reveal power
:duration "550ms"
(box :orientation "h"
:space-evenly false
(button :class "button-reboot"
:tooltip "Reboot"
:onclick "systemctl reboot" "󰜉")
(button :class "button-quit"
:tooltip "Logout"
:onclick "i3-msg exit" "󰗼")
(button :class "button-hibernate"
:tooltip "Hibernate"
:onclick "systemctl hibernate" "󰤄")))
(button :class "button-shutdown"
:tooltip "Shutdown"
:onclick "systemctl shutdown" "󰐥"))))
(defwidget title []
(label :text {wm-info.title}))
(defwidget left []
(box :orientation "h"
:halign "start"
(workspaces)
(ha-now-playing)))
(defwidget right []
(box :orientation "h"
:space-evenly false
:halign "end"
(date-time)
(power)))
(defwidget end []
(box :orientation "h"
:halign "end"
:space-evenly false
(control)
(right)))
(defwidget bar []
(box :class "eww_bar"
:orientation "h"
:hexpand false
:vexpand false
(centerbox
(left)
(title)
(end))))
;; Bar windows
(defwindow bar-x11
:geometry (geometry :x "0"
:y "0"
:width "100%"
:height "47px"
:anchor "top center")
:stacking "fg"
:monitor 0
:reserve (struts :distance "47px"
:side "top")
:wm-ignore false
:hexpand false
:vexpand false
:exclusive true
(bar))

View file

@ -0,0 +1,51 @@
#!/usr/bin/env nu
module ipc {
def ipcCmd [] {
if (is-sway) {
"swaymsg"
} else if (is-i3) {
"i3-msg"
} else {
error make { msg: "This script only supports sway or i3" }
}
}
def is-sway [] {
("SWAYSOCK" in $env)
}
def is-i3 [] {
("I3SOCK" in $env)
}
export def ipc-cmd [--raw, ...parameters: string] {
let result = (run-external --redirect-stdout (ipcCmd) $parameters)
if $raw {
$result
} else {
$result | from json
}
}
}
use ipc ipc-cmd
def workspaces [] {
let workspaces = (ipc-cmd "-t" "get_workspaces" | select id name focused urgent visible)
let mode = (ipc-cmd "-t" "get_binding_state")
let focused_title = ((ipc-cmd --raw "-t" "get_tree") | jaq -r '.. | (.nodes? // empty)[] | select(.focused) | {name}' | from json)
{ workspaces: $workspaces, mode: $mode.name, title: $focused_title.name }
}
def main [] {
print (workspaces | to json -r)
loop {
ipc-cmd --raw '-t' 'subscribe' '["workspace","window","mode"]' out+err> /dev/null
try {
print (workspaces | to json -r)
}
}
}