Initial eww config
This commit is contained in:
parent
3834b547c3
commit
08e0136240
3 changed files with 505 additions and 0 deletions
221
home-manager/modules/eww/config/eww.scss
Normal file
221
home-manager/modules/eww/config/eww.scss
Normal 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;
|
||||
}
|
233
home-manager/modules/eww/config/eww.yuck
Normal file
233
home-manager/modules/eww/config/eww.yuck
Normal 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))
|
51
home-manager/modules/eww/config/scripts/workspaces.nu
Executable file
51
home-manager/modules/eww/config/scripts/workspaces.nu
Executable 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)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue