Files
dotfiles-hypr/eww/eww.yuck
T

180 lines
8.1 KiB
Plaintext

;; ==============
;; переменные
;; ==============
;; состояния раскрытия для каждого монитора
(defvar stats_reveal_0 false)
(defvar vol_reveal_0 false)
(defvar time_reveal_0 false)
(defvar stats_reveal_1 false)
(defvar vol_reveal_1 false)
(defvar time_reveal_1 false)
;; слушатели
(deflisten ws_data :initial "{}" "python3 $HOME/.config/eww/scripts/workspaces.py")
(deflisten volume :initial '{"volume": 0, "muted": false}' "python3 -u $HOME/.config/eww/scripts/volume.py")
(deflisten layout :initial "EN" "socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -oL awk -F'>>' '/activelayout/ {split(\$2, a, \",\"); print toupper(substr(a[2], 1, 2))}'")
(deflisten tray_count :initial "0" "python3 $HOME/.config/eww/scripts/tray_monitor.py")
(deflisten kb_leds :initial '{"caps":"0","num":"0"}' "python3 $HOME/.config/eww/scripts/kb_leds.py")
;; пуллы
(defpoll timestr :interval "1s" "date '+%H:%M'")
(defpoll datestr :interval "1m" "date '+%A, %B %d'")
(defpoll temp :interval "5s" :initial "0" "cat /sys/class/hwmon/$(grep -l 'coretemp' /sys/class/hwmon/hwmon*/name | cut -d/ -f5)/temp1_input | awk '{print int($1/1000)}'")
(defpoll gpu_temp :interval "30s" :initial "0" "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits")
(defpoll disk_free :interval "1m" "python3 $HOME/.config/eww/scripts/disk.py")
;; ==============
;; воркспейсы
;; ==============
;; слот под воркспейс
(defwidget workspace_slot [data id]
(revealer :reveal {data[id] != "null" && data[id].exists}
:transition "slideleft"
:duration "300ms"
(box :class "ws-pill ${data[id].urgent ? 'urgent' : data[id].focused ? 'focused' : data[id].active ? 'active' : ''}"
:space-evenly false
:valign "center"
(eventbox :onclick "hyprctl dispatch workspace ${id}"
(box :space-evenly false :valign "center"
(label :class "ws-id" :text "${id}")
(revealer :reveal {arraylength(data[id].icons) > 0}
:transition "slideright"
:duration "350ms"
(box :class "ws-icons-box" :space-evenly false :spacing 8
(for icon in {data[id].icons}
(label :class "ws-icon-item" :text "${icon}")))))))))
;; контейнер для 10 воркспейсов
(defwidget workspaces [ws_data]
(box :class "workspaces-rail" :space-evenly false
(for i in "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
(workspace_slot :data ws_data :id i))))
;; ===========
;; виджеты
;; ===========
;; трей
(defwidget tray_dynamic []
(revealer :reveal {tray_count > 0}
:transition "crossfade"
:duration "400ms"
(box :class "tray-capsule"
(systray :icon-size 16 :spacing 8 :prepend-new true))))
;; раскладка
(defwidget kb_widget []
(box :class "capsule kb-pill ${kb_leds.caps == '1' ? 'caps-on' : ''} ${kb_leds.num == '1' ? 'num-on' : ''}"
:space-evenly false
(label :text {layout ?: "EN"} :class "kb-label")))
;; звук
(defwidget volumewidget [reveal_state reveal_var]
(eventbox :cursor "pointer"
:onclick "eww update ${reveal_var}=${!reveal_state}"
:onrightclick "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
:onscroll "echo {} | sed -e 's/up/5%+/g' -e 's/down/5%-/g' | xargs wpctl set-volume -l 1.35 @DEFAULT_AUDIO_SINK@"
(box :class "capsule volume-pill ${reveal_state ? 'active' : ''} ${volume.muted || volume.volume == 0 || volume.volume == '0' ? 'muted' : ''}"
:space-evenly false
(label :class "icon"
:text {volume.muted || volume.volume == 0 || volume.volume == "0" ? "" : (volume.volume < 50 ? "" : "")})
(label :class "stat-label"
:text "${volume.volume}%" :width 38)
(revealer :reveal reveal_state
:transition "slideleft"
(box :class "slide-wrapper"
(scale :class "vol-bar" :min 0 :max 101 :value {volume.volume}
:onchange "wpctl set-volume @DEFAULT_AUDIO_SINK@ {}%"))))))
;; часы
(defwidget timewidget [reveal_state reveal_var]
(eventbox :cursor "pointer" :onclick "eww update ${reveal_var}=${!reveal_state}"
(box :class "capsule time-pill ${reveal_state ? 'active' : ''}"
:space-evenly false
(label :text timestr)
(revealer :reveal reveal_state :transition "slideleft"
(box :class "slide-wrapper" :space-evenly false
(label :class "icon" :text "󰃭")
(label :text datestr))))))
;; cтатистика
(defwidget statswidget [reveal_state reveal_var]
(eventbox :cursor "pointer" :onclick "eww update ${reveal_var}=${!reveal_state}"
(box :class "capsule stats-pill ${reveal_state ? 'active' : ''}
${(EWW_CPU.avg > 90 || EWW_RAM.used_mem_perc > 90 || (temp ?: 0) > 75 || (gpu_temp ?: 0) > 75) ? 'alert' : ''}"
:space-evenly false
(group :icon "" :value "${round(EWW_CPU.avg, 0)}%" :alert {EWW_CPU.avg > 90})
(group :icon "󰍛" :value "${round(EWW_RAM.used_mem_perc, 0)}%" :alert {EWW_RAM.used_mem_perc > 90})
(revealer :reveal reveal_state :transition "slideleft"
(box :space-evenly false :class "slide-wrapper"
(group :icon "󱛟" :value "${round(disk_free, 1)}GB" :alert {disk_free < 10})
(group :icon "" :value "${temp}°" :alert {(temp ?: 0) > 75})
(group :icon "󰢮" :value "${gpu_temp}°" :alert {(gpu_temp ?: 0) > 75}))))))
;; шаблон для иконки с текстом
(defwidget group [icon value alert]
(box :space-evenly false :class "stat-group"
(label :class "icon ${alert ? 'alert' : ''}" :text icon :width 24)
(label :class "stat-label ${alert ? 'alert' : ''}"
:text value
:width {icon == "󱛟" ? 65 : 40}
:halign "start")))
;; ===============
;; сборка бара
;; ===============
;; основной бар (с треем)
(defwidget main_bar [mon_key t_rev t_var s_rev s_var v_rev v_var]
(centerbox :class "bar-inner"
(box :halign "start" (workspaces :ws_data {ws_data[mon_key]}))
(box :halign "center" (timewidget :reveal_state t_rev :reveal_var t_var))
(box :halign "end" :space-evenly false
(tray_dynamic)
(kb_widget)
(statswidget :reveal_state s_rev :reveal_var s_var)
(volumewidget :reveal_state v_rev :reveal_var v_var))))
;; дополнительный бар
(defwidget side_bar [mon_key t_rev t_var s_rev s_var v_rev v_var]
(centerbox :class "bar-inner"
(box :halign "start" (workspaces :ws_data {ws_data[mon_key]}))
(box :halign "center" (timewidget :reveal_state t_rev :reveal_var t_var))
(box :halign "end" :space-evenly false
(tray_dynamic)
(kb_widget)
(statswidget :reveal_state s_rev :reveal_var s_var)
(volumewidget :reveal_state v_rev :reveal_var v_var))))
;; ========
;; окна
;; ========
;; окно бара для dvi
(defwindow bar_0 :monitor 0 :exclusive false :stacking "fg"
:geometry (geometry :width "100%" :anchor "top center")
(side_bar :mon_key "DVI_I_1"
:t_rev time_reveal_0 :t_var "time_reveal_0"
:s_rev stats_reveal_0 :s_var "stats_reveal_0"
:v_rev vol_reveal_0 :v_var "vol_reveal_0"))
;; окно бара для hdmi
(defwindow bar_1 :monitor 1 :exclusive false :stacking "fg"
:geometry (geometry :width "100%" :anchor "top center")
(main_bar :mon_key "HDMI_A_1"
:t_rev time_reveal_1 :t_var "time_reveal_1"
:s_rev stats_reveal_1 :s_var "stats_reveal_1"
:v_rev vol_reveal_1 :v_var "vol_reveal_1"))
;; обои
(defwindow wallpaper_0 :monitor 0 :stacking "bg" :focusable false
:geometry (geometry :width "100%" :height "100%")
(box :style "background-image: url('/home/pyrschtjag/Pictures/wallhaven-0wl9jp.jpg'); background-size: cover;"))
(defwindow wallpaper_1 :monitor 1 :stacking "bg" :focusable false
:geometry (geometry :width "100%" :height "100%")
(box :style "background-image: url('/home/pyrschtjag/Pictures/wallhaven-1jygr3.jpg'); background-size: cover;"))