diff options
| author | Caroline Larimore <caroline@larimo.re> | 2025-04-14 19:01:38 -0700 |
|---|---|---|
| committer | Caroline Larimore <caroline@larimo.re> | 2025-04-14 19:01:38 -0700 |
| commit | e8077fde966e051fc449fffcfa061c7f7edc47b0 (patch) | |
| tree | a0b1ce60f2718f90c64e924ed8df8d5d4f0d2289 /modules/home/desktop/components | |
| parent | e486d896215e7ef04438809952bc7317512d5765 (diff) | |
migration: finalize
Diffstat (limited to 'modules/home/desktop/components')
32 files changed, 1668 insertions, 0 deletions
diff --git a/modules/home/desktop/components/eww/assets/album_art_placeholder.png b/modules/home/desktop/components/eww/assets/album_art_placeholder.png Binary files differnew file mode 100644 index 0000000..2cdcbab --- /dev/null +++ b/modules/home/desktop/components/eww/assets/album_art_placeholder.png diff --git a/modules/home/desktop/components/eww/default.nix b/modules/home/desktop/components/eww/default.nix new file mode 100644 index 0000000..226ccc0 --- /dev/null +++ b/modules/home/desktop/components/eww/default.nix @@ -0,0 +1,105 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.eww; + desktop = config.${namespace}.desktop; +in { + options.${namespace}.desktop.components.eww = with types; { + enable = mkEnableOption "eww"; + }; + + config = mkIf cfg.enable { + home.packages = with pkgs; [ + eww + + (writeShellScriptBin "eww-toggle" '' + if ${pkgs.eww}/bin/eww active-windows | grep $1; then + ${pkgs.eww}/bin/eww close $1 + else + ${pkgs.eww}/bin/eww open $@ + fi + '') + + (writeShellScriptBin "get-album-art" '' + OUTFILE=".mpris-art" + + while read -r line; do + if [[ -n $line ]]; then + rm -f ~/$OUTFILE + + cmus_path=$(${pkgs.cmus}/bin/cmus-remote -Q | grep file | cut -c 6-) + if [[ -n $cmus_path ]]; then + if [[ -f $(dirname "$cmus_path")/cover.jpg ]]; then + cp "$(dirname "$cmus_path")/cover.jpg" ~/$OUTFILE + else + ${pkgs.ffmpeg}/bin/ffmpeg -y -v quiet -i "$cmus_path" -c:v copy -f mjpeg ~/$OUTFILE + fi + else + mpris=$(${pkgs.playerctl}/bin/playerctl --player=cmus,firefox,%any metadata mpris:artUrl) + + if [[ $mpris == data:image* ]]; then + echo $mpris | sed s/.*,//g | base64 --decode > ~/$OUTFILE + elif [[ -n $mpris ]]; then + curl -s -o ~/$OUTFILE $mpris + fi + fi + + if [[ -f ~/$OUTFILE ]]; then + : + else + cp ${./assets/album_art_placeholder.png} ~/$OUTFILE + fi + + echo ~/$OUTFILE + fi + done + '') + ]; + + xdg.configFile."eww/eww.yuck".source = eww/eww.yuck; + xdg.configFile."eww/eww.css".source = eww/eww.css; + + xdg.configFile."eww/panels".source = eww/panels; + xdg.configFile."eww/windows".source = eww/windows; + xdg.configFile."eww/widgets".source = eww/widgets; + + xdg.configFile."eww/colors.css".text = let c = desktop.theme.colors; in '' + @define-color accent #${c.accent}; + + @define-color black #${c.black}; + @define-color red #${c.red}; + @define-color green #${c.green}; + @define-color yellow #${c.yellow}; + @define-color blue #${c.blue}; + @define-color magenta #${c.magenta}; + @define-color cyan #${c.cyan}; + @define-color white #${c.white}; + + @define-color brightBlack #${c.brightBlack}; + @define-color brightRed #${c.brightRed}; + @define-color brightGreen #${c.brightGreen}; + @define-color brightYellow #${c.brightYellow}; + @define-color brightBlue #${c.brightBlue}; + @define-color brightMagenta #${c.brightMagenta}; + @define-color brightCyan #${c.brightCyan}; + @define-color brightWhite #${c.brightWhite}; + + @define-color bg #${c.bg}; + @define-color bg0 #${c.bg0}; + @define-color bg1 #${c.bg1}; + @define-color bg2 #${c.bg2}; + @define-color bg3 #${c.bg3}; + @define-color bg4 #${c.bg4}; + + @define-color fg #${c.fg}; + @define-color fg0 #${c.fg0}; + @define-color fg1 #${c.fg1}; + @define-color fg2 #${c.fg2}; + @define-color fg3 #${c.fg3}; + @define-color fg4 #${c.fg4}; + + @define-color orange #${c.orange}; + @define-color brightOrange #${c.brightOrange}; + ''; + }; +} diff --git a/modules/home/desktop/components/eww/eww/eww.css b/modules/home/desktop/components/eww/eww/eww.css new file mode 100644 index 0000000..a715970 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/eww.css @@ -0,0 +1,86 @@ +@import "colors.css"; +@import "panels/default.css"; +@import "widgets/default.css"; + +window { + color: @fg; + background-color: rgba(0, 0, 0, 0); + /*border: 2px solid @yellow;*/ + font-family: monospace, sans-serif; +} + +.panel { + color: @fg; + background-color: @bg; + opacity: 1; + border: 2px solid @bg1; + outline: 2px solid red; + outline-offset: -20px; + font-family: monospace, sans-serif; + padding: 8px; +} + +.unpadded { + padding: 0px; +} + +.padded { + padding: 8px; +} + +button { + color: @fg; + background: @bg; + + border: none; + border-radius: 0; + box-shadow: none; + text-shadow: none; + margin: 0; + padding: 0; +} + +button:hover { + background: @bg1; +} + +button:active { + background: @bg2; +} + +button.icon { + font-family: 'monospace'; + font-size: 24; +} + +.cutout { + background: @bg1; +} + +.faint { + font-weight: normal; + color: @fg4; +} + +graph { + color: @accent; + background: alpha(@accent, 0.2); +} + +scale trough { + background: @bg2; + min-height: 4px; + min-width: 4px; +} + +scale highlight { + background: @accent; +} + +scale slider { + box-shadow: none; + background: @accent; + margin: -6px; + min-height: 0; + min-width: 0; +} diff --git a/modules/home/desktop/components/eww/eww/eww.yuck b/modules/home/desktop/components/eww/eww/eww.yuck new file mode 100644 index 0000000..320a207 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/eww.yuck @@ -0,0 +1,3 @@ +(include "./panels/default.yuck") +(include "./widgets/default.yuck") +(include "./windows/default.yuck") diff --git a/modules/home/desktop/components/eww/eww/panels/bar.css b/modules/home/desktop/components/eww/eww/panels/bar.css new file mode 100644 index 0000000..a07c3b1 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/bar.css @@ -0,0 +1,39 @@ +.bar .shutdown { + color: @brightRed; +} + +.bar .restart { + color: @brightGreen; +} + +.bar .sleep { + color: @brightYellow; +} + +.bar .dismiss { + color: @red; +} + +.bar .ws { + font-family: 'Symbols Nerd Font Mono'; + font-size: 18; + + color: @bg2; +} + +.bar .ws.active { + color: @fg4; +} + +.bar .ws.visible { + color: @fg; +} + +.bar .ws.focused { + background: @bg1; + color: @fg0; +} + +.bar .ws.urgent { + background: @red; +} diff --git a/modules/home/desktop/components/eww/eww/panels/bar.yuck b/modules/home/desktop/components/eww/eww/panels/bar.yuck new file mode 100644 index 0000000..6dc4771 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/bar.yuck @@ -0,0 +1,102 @@ +(defwidget bar [] + (centerbox :class "bar" + :orientation "h" + + (box + :orientation "h" + :spacing 8 + :space-evenly false + + (tooltip :class "panel" + {EWW_TIME} + {formattime(EWW_TIME, "%T", "America/Los_Angeles")} + ) + + (tooltip :class "panel" + {formattime(EWW_TIME, "%F", "America/Los_Angeles")} + {formattime(EWW_TIME, "%A, %B %d, %Y", "America/Los_Angeles")} + ) + ) + + (box + :orientation "h" + :spacing 8 + :space-evenly false + + ;(label :class "panel" + ; :text "i have no idea what to put here :3" + ;) + + (box :class "unpadded panel" + (ws :num 0 :icon "" :name "Main") + (ws :num 1 :icon "" :name "Terminal") + (ws :num 2 :icon "" :name "Browser") + (ws :num 3 :icon "" :name "Chat") + (ws :num 4 :icon "" :name "Gaming") + (ws :num 5 :icon "" :name "5") + (ws :num 6 :icon "" :name "6") + (ws :num 7 :icon "" :name "7") + (ws :num 8 :icon "" :name "Meow") + (ws :num 9 :icon "" :name "Music") + (ws :num 10 :icon "" :name "Misc") + ) + ) + + (box + :orientation "h" + :spacing 8 + :space-evenly false + :halign "end" + + (box :class "unpadded panel" + :space-evenly false + (button :class "sleep icon" + :width 31 + "" + ) + + (button :class "restart icon" + :width 33 + "" + ) + + (button :class "shutdown icon" + :width 31 + "" + ) + ) + + (box :class "unpadded panel" + (button :class "dismiss icon" + :width 29 + :onclick `${EWW_CMD} close sys` + "" + ) + ) + ) + ) +) + +(defwidget ws [num icon name] + (tooltip {name} + (button :class {"ws" + + (ws-status[num].active ? " active" : "") + + (ws-status[num].visible ? " visible" : "") + + (ws-status[num].focused ? " focused" : "") + + (ws-status[num].urgent ? " urgent" : "") + } + :width { + num == 0 ? 31 : + num == 10 ? 31 : + 33 + } + + {icon} + ) + ) +) + +(defpoll ws-status + :interval "0.1s" + `i3-msg -t get_workspaces | jq -caM 'map({"ws-\\(.num)": {visible, focused, urgent, active: true}}) | add as $orig | [range(0;11)] | [.[] as $i | $orig."ws-\\($i)" // {visible: false, focused: false, urgent: false, active: false}]'` +) diff --git a/modules/home/desktop/components/eww/eww/panels/cpu.yuck b/modules/home/desktop/components/eww/eww/panels/cpu.yuck new file mode 100644 index 0000000..ef57fa6 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/cpu.yuck @@ -0,0 +1,45 @@ +(defwidget cpu [] + (box :class "panel" + :orientation "h" + :spacing 8 + :space-evenly false + + (tooltip :class "cutout" + {round(EWW_CPU.avg, 2) + "%"} + (graph + :value {EWW_CPU.avg} + :time-range "30s" + :width 76 + :height 76 + :hexpand true + ) + ) + + (box :orientation "v" + :spacing 8 + :space-evenly false + :hexpand true + + (label :halign "start" :markup {"<b>" + cpu-name + "</b>"}) + + (stat :key "Temperature" :value {round(EWW_TEMPS.K10TEMP_TCTL, 2) + "°C"}) + (stat :key "Frequency" :value {round(cpu-max-freq * cpu-freq/100, 0) + " MHz"}) + (stat :key "Usage" :value {round(EWW_CPU.avg, 2) + "%"}) + ) + ) +) + +(defpoll cpu-freq + :interval "2s" + `lscpu | sed -n '/CPU(s) scaling MHz/ s/.*:\\s*\\(.*\\)%/\\1/p'` +) + +(defpoll cpu-max-freq + :interval "9999s" + `lscpu | sed -n '/CPU max MHz/ s/.*:\\s*\\(.*\\)/\\1/p'` +) + +(defpoll cpu-name + :interval "9999s" + `lscpu | sed -n '/Model name/ s/.*:\\s*\\(.*\\)/\\1/p'` +) diff --git a/modules/home/desktop/components/eww/eww/panels/default.css b/modules/home/desktop/components/eww/eww/panels/default.css new file mode 100644 index 0000000..8cd39a3 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/default.css @@ -0,0 +1,4 @@ +@import "bar.css"; +@import "fs.css"; +@import "launcher.css"; +@import "music.css"; diff --git a/modules/home/desktop/components/eww/eww/panels/default.yuck b/modules/home/desktop/components/eww/eww/panels/default.yuck new file mode 100644 index 0000000..3c20c4b --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/default.yuck @@ -0,0 +1,7 @@ +(include "./panels/bar.yuck") +(include "./panels/cpu.yuck") +(include "./panels/fs.yuck") +(include "./panels/launcher.yuck") +(include "./panels/memory.yuck") +(include "./panels/music.yuck") +(include "./panels/volume.yuck") diff --git a/modules/home/desktop/components/eww/eww/panels/fs.css b/modules/home/desktop/components/eww/eww/panels/fs.css new file mode 100644 index 0000000..8ca2dd2 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/fs.css @@ -0,0 +1,13 @@ +.disks .meter.almost-full .progress { + color: @orange; + background: rgba(0, 0, 0, 0); +} + +.disks .meter.full .progress { + color: @red; + background: rgba(0, 0, 0, 0); +} + +.zfs .total { + font-weight: bold; +} diff --git a/modules/home/desktop/components/eww/eww/panels/fs.yuck b/modules/home/desktop/components/eww/eww/panels/fs.yuck new file mode 100644 index 0000000..54bbd46 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/fs.yuck @@ -0,0 +1,74 @@ +(defwidget disks [] + (box :class "panel disks" + :orientation "h" + :spacing 8 + :space-evenly false + :height {100+16} + + (disk :mount "total" + :zfs true + :name "zpool" + ) + + (disk :mount "/mnt/4tb" + :name "4tb" + ) + (disk :mount "/mnt/ssd" + :name "ssd" + ) + ) +) + +(defwidget zfs [] + (box :class "panel zfs" + :orientation "v" + :spacing 8 + :space-evenly false + :hexpand true + + (label :halign "start" :markup "<b>ZFS Volumes</b>") + + (zvol :mount "/nix") + (zvol :mount "/persist") + + (zvol :class "faint" + :mount "/home" + ) + + (zvol :class "faint" + :mount "/" + ) + + (zvol :class "total" + :mount "total" + :name "Total" + ) + ) +) + +(defwidget disk [mount ?name ?zfs] + (meter + :value { + (zfs == true ? zpool : disks)[mount].used / ((zfs == true ? zpool : disks)[mount].used + (zfs == true ? zpool : disks)[mount].free) * 100} + :label {name != "" ? name : mount} + + {round((zfs == true ? zpool : disks)[mount].used/1024/1024, 0) + " GiB"} + ) +) + +(defwidget zvol [mount ?name ?class] + (stat :class {class} + :key {name != "" ? name : mount} + :value {round(zpool[mount].used/1024/1024, 2) + " GiB"} + ) +) + +(defpoll disks + :interval "10s" + `df -x fuse -x tmpfs -x efivarfs -x devtmpfs -x zfs | tail -n +2 | awk '{ printf "%s free %d\\n%s used %d\\n", $6, $4, $6, $3 }' | xargs printf '{"%s": {"%s": %d}}\\n' | jq -scaM 'map(to_entries) | flatten | group_by(.key) | map({"\\(.[0].key)": map(.value | to_entries) | flatten | from_entries}) | add'` +) + +(defpoll zpool + :interval "10s" + `df -t zfs --total | tail -n +2 | awk '{ printf "%s free %d\\n%s used %d\\n", $6, $4, $6, $3 }' | xargs printf '{"%s": {"%s": %d}}\\n' | jq -scaM 'map(to_entries) | flatten | group_by(.key) | map({"\\(.[0].key)": map(.value | to_entries) | flatten | from_entries}) | add | .total = ."-" | del(."-") | .total.free = ."/zpool".free'` +) diff --git a/modules/home/desktop/components/eww/eww/panels/launcher.css b/modules/home/desktop/components/eww/eww/panels/launcher.css new file mode 100644 index 0000000..5055191 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/launcher.css @@ -0,0 +1,7 @@ +.launcher entry { + border-radius: 0; +} + +.launcher entry:focus { + box-shadow: 0 0 0 2px @accent inset; +} diff --git a/modules/home/desktop/components/eww/eww/panels/launcher.yuck b/modules/home/desktop/components/eww/eww/panels/launcher.yuck new file mode 100644 index 0000000..a568346 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/launcher.yuck @@ -0,0 +1,27 @@ +(defwidget launcher [] + (box :class "launcher panel" + :orientation "v" + :spacing 8 + :space-evenly false + :height {556 - ((128 + 16 + 4) + 8)} + :width 768 + + (input + :valign "start" + ) + + (scroll + :vscroll true + :hscroll false + :vexpand true + + (literal :content {lunch}) + ) + ) +) + +(defpoll lunch + :interval "60s" + ;`~/lunch.sh` + `~/code/lunch/zig-out/bin/lunch` +) diff --git a/modules/home/desktop/components/eww/eww/panels/memory.yuck b/modules/home/desktop/components/eww/eww/panels/memory.yuck new file mode 100644 index 0000000..4f6633a --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/memory.yuck @@ -0,0 +1,28 @@ +(defwidget memory [] + (box :class "panel" + :orientation "v" + :spacing 8 + :space-evenly false + + (box + (label :markup "<b>Memory</b>" + :halign "start" + ) + + (label :markup {round(EWW_RAM.used_mem/1024/1024/1024, 2) + " GiB / " + round(EWW_RAM.total_mem/1024/1024/1024, 2) + " GiB"} + :halign "end" + ) + ) + + (tooltip :class "cutout" + {round(EWW_RAM.used_mem_perc, 2) + "%"} + (graph + :hexpand true + :value {EWW_RAM.used_mem} + :max {EWW_RAM.total_mem} + :time-range "30s" + :height 100 + ) + ) + ) +) diff --git a/modules/home/desktop/components/eww/eww/panels/music.css b/modules/home/desktop/components/eww/eww/panels/music.css new file mode 100644 index 0000000..e5bbc60 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/music.css @@ -0,0 +1,38 @@ +.music { + padding: 8px; + opacity: 1.0; +} + +.music .right { + margin-top: 8px; +} + +.music .song-title { + font-size: 17px; + font-weight: bold; +} + +.music .song-album { + color: @fg2; +} + +.music .song-artist { + color: @fg2; +} + +.music scale trough { + background: @bg2; + min-height: 4px; +} + +.music scale highlight { + background: @accent; +} + +.music scale slider { + box-shadow: none; + background: @accent; + margin: -6px; + min-height: 0; + min-width: 0; +} diff --git a/modules/home/desktop/components/eww/eww/panels/music.yuck b/modules/home/desktop/components/eww/eww/panels/music.yuck new file mode 100644 index 0000000..feae96a --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/music.yuck @@ -0,0 +1,102 @@ + +(defwidget music [] + (box :class "panel music" + :orientation "h" + :spacing 8 + :space-evenly false + :height {128 + 16 + 4} + + (image + :path song-cover + :image-width 128 + :image-height 128 + ) + + (box :class "right" + :orientation "v" + :spacing 0 + :space-evenly true + :hexpand true + + (box :class "info" + :orientation "v" + :space-evenly false + :valign "center" + + (tooltip {song.title} + (label :class "song-title" + :text {song.title} + :halign "start" + :truncate true + ) + ) + (tooltip {song.album} + (label :class "song-album" + :text {song.album} + :halign "start" + :truncate true + ) + ) + (tooltip {song.artist} + (label :class "song-artist" + :text {song.artist} + :halign "start" + :truncate true + ) + ) + ) + + (box + :valign "end" + :space-evenly false + + (box :class "control" + :space-evenly false + + (button :class "icon" + :width 36 + :onclick `playerctl --player=cmus,firefox,%any previous` + + "" + ) + (button :class "icon" + :onclick `playerctl --player=cmus,firefox,%any play-pause` + :width 36 + + { song.status == "Playing" ? "" : "" } + ) + (button :class "icon" + :width 36 + :onclick `playerctl --player=cmus,firefox,%any next` + + "" + ) + ) + + (scale + :hexpand true + :value {song-position} + :max {song.length/1000/1000} + ;:onchange `/home/c/seek.sh {}` + ) + + {formattime(round(song-position, 0), "%M:%S") + " / " + formattime(round(song.length/1000/1000, 0), "%M:%S")} + + (box :width 16) + ) + ) + ) +) + +(deflisten song-cover + `playerctl --player=cmus,firefox,%any -F metadata title | get-album-art` +) + +(deflisten song + `playerctl --player=cmus,firefox,%any -F metadata --format='{"title": "{{title}}", "album": "{{album}}", "artist": "{{artist}}", "status": "{{status}}", "length": "{{mpris:length}}"}'` +) + +(defpoll song-position + :interval "0.2s" + `playerctl --player=cmus,firefox,%any position` +) diff --git a/modules/home/desktop/components/eww/eww/panels/volume.yuck b/modules/home/desktop/components/eww/eww/panels/volume.yuck new file mode 100644 index 0000000..0c342c3 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/panels/volume.yuck @@ -0,0 +1,40 @@ +(defwidget volume [] + (box :class "volume panel" + :orientation "v" + :space-evenly false + + (label :markup "<b>Volume</b>") + + (box + :orientation "h" + :vexpand true + + (box + :orientation "v" + :space-evenly false + :vexpand true + + (scale + :orientation "v" + :flipped true + :value {sink-volume} + :max 101 + :onchange `pactl set-sink-volume @DEFAULT_SINK@ {}%` + :vexpand true + ) + + {sink-volume + "%"} + ) + ) + ) +) + +(defpoll sink-volume + :interval "0.2s" + `pactl get-sink-volume @DEFAULT_SINK@ | head -n1 | awk '{print substr($5, 1, length($5)-1)}'` +) + +;(defpoll source-volume +; :interval "0.2s" +; `pactl get-source-volume @DEFAULT_SOURCE@ | head -n1 | awk '{print substr($5, 1, length($5)-1)}'` +;) diff --git a/modules/home/desktop/components/eww/eww/widgets/default.css b/modules/home/desktop/components/eww/eww/widgets/default.css new file mode 100644 index 0000000..e6d3764 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/widgets/default.css @@ -0,0 +1 @@ +@import "meter.css"; diff --git a/modules/home/desktop/components/eww/eww/widgets/default.yuck b/modules/home/desktop/components/eww/eww/widgets/default.yuck new file mode 100644 index 0000000..bedb80e --- /dev/null +++ b/modules/home/desktop/components/eww/eww/widgets/default.yuck @@ -0,0 +1,2 @@ +(include "./widgets/meter.yuck") +(include "./widgets/stat.yuck") diff --git a/modules/home/desktop/components/eww/eww/widgets/meter.css b/modules/home/desktop/components/eww/eww/widgets/meter.css new file mode 100644 index 0000000..df65382 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/widgets/meter.css @@ -0,0 +1,9 @@ +.meter .background { + color: @bg1; + background: rgba(0, 0, 0, 0); +} + +.meter .progress { + color: @accent; + background: rgba(0, 0, 0, 0); +} diff --git a/modules/home/desktop/components/eww/eww/widgets/meter.yuck b/modules/home/desktop/components/eww/eww/widgets/meter.yuck new file mode 100644 index 0000000..af2c3f3 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/widgets/meter.yuck @@ -0,0 +1,41 @@ +(defwidget meter [value label] + (overlay :class {"meter" + + (value >= 90 ? " almost-full" : "") + + (value >= 99 ? " full" : "") + + (value <= 10 ? " almost-empty" : "") + + (value <= 1 ? " empty" : "") + } + + :width 100 + + (circular-progress :class "background" + :value 80 + :start-at 35 + :thickness 10 + :width 100 + ) + + (circular-progress :class "progress" + :value {value*0.8} + :start-at 35 + :thickness 10 + :width 100 + ) + + (box + :orientation "v" + :valign "center" + :space-evenly false + :spacing 2 + + (children) + + {round(value, 2)+"%"} + ) + + (transform + :translate-y "44px" + (label :markup {"<b>"+label+"</b>"}) + ) + ) +) diff --git a/modules/home/desktop/components/eww/eww/widgets/stat.yuck b/modules/home/desktop/components/eww/eww/widgets/stat.yuck new file mode 100644 index 0000000..1ef76f2 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/widgets/stat.yuck @@ -0,0 +1,24 @@ +(defwidget stat [key value ?class] + (overlay + (box :class {class} + :orientation "h" + :spacing 45 + + (label + :text {key} + :halign "start" + :hexpand true + ) + + (label + :text {value} + :halign "end" + :hexpand true + ) + ) + + (label :class "faint" + :text "..." + ) + ) +) diff --git a/modules/home/desktop/components/eww/eww/windows/default.yuck b/modules/home/desktop/components/eww/eww/windows/default.yuck new file mode 100644 index 0000000..77e8cf3 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/windows/default.yuck @@ -0,0 +1,2 @@ +(include "./windows/sys.yuck") +(include "./windows/music.yuck") diff --git a/modules/home/desktop/components/eww/eww/windows/music.yuck b/modules/home/desktop/components/eww/eww/windows/music.yuck new file mode 100644 index 0000000..f83340b --- /dev/null +++ b/modules/home/desktop/components/eww/eww/windows/music.yuck @@ -0,0 +1,19 @@ +(defwindow music [pos gaps] + :monitor "<primary>" + :geometry (geometry + :x { + pos == "right" + ? gaps == "true" + ? "-8px" : "2px" + : "0px" + } + :y { gaps == "true" ? "-8px" : "2px" } + :width 512 + :anchor { pos == "right" ? "bottom right" : "bottom center" } + ) + :stacking "fg" + :windowtype "dock" + :wm-ignore true + + (music) +) diff --git a/modules/home/desktop/components/eww/eww/windows/net.yuck b/modules/home/desktop/components/eww/eww/windows/net.yuck new file mode 100644 index 0000000..8c5c299 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/windows/net.yuck @@ -0,0 +1,35 @@ +(box :class "panel" + :orientation "v" + :spacing 8 + :space-evenly true + :height {100+16} + :width {(100+8)*3+8} + + (graph + :value {net.rx} + :thickness 2 + :time-range "30s" + :min 0 + :max 100 + :dynamic true + :line-style "round" + ) + + {"Download: " + round(net.rx/1024/1024, 2) + " MiB/s (peak: " + round(net.rx_peak/1024/1024, 2) + " MiB/s)"} + + (graph + :value {net.tx} + :thickness 2 + :time-range "30s" + :min 0 + :max 100 + :dynamic true + :line-style "round" + ) + + {"Upload: " + round(net.tx/1024/1024, 2) + " MiB/s (peak: " + round(net.tx_peak/1024/1024, 2) + " MiB/s)"} +) + +(deflisten net + `/home/c/net.sh` +) diff --git a/modules/home/desktop/components/eww/eww/windows/sys.yuck b/modules/home/desktop/components/eww/eww/windows/sys.yuck new file mode 100644 index 0000000..fa6a719 --- /dev/null +++ b/modules/home/desktop/components/eww/eww/windows/sys.yuck @@ -0,0 +1,84 @@ +(defwindow sys + :monitor "<primary>" + ;:monitor "HDMI-A-0" + :geometry (geometry + :x "0px" + :y "0px" + :anchor "center" + ) + :stacking "fg" + :windowtype "dialog" + :wm-ignore false + + (box :class "main" + :orientation "v" + :spacing 8 + :space-evenly false + + (bar) + + (box + :orientation "h" + :spacing 8 + :space-evenly false + + (box + :orientation "v" + :spacing 8 + :space-evenly false + + (disks) + + (box + :orientation "h" + :spacing 8 + :space-evenly false + + (zfs) + + (box :class "unpadded panel" + (image + :path "/home/c/Pictures/suit ryo.png" + :image-width 134 + ) + ) + ) + + (centerbox :class "panel" + (image + :path "/home/c/Pictures/car.png" + :image-height 13 + ) + + "silly zone :3" + + (image + :path "/home/c/Pictures/car.png" + :image-height 13 + ) + ) + + (memory) + (cpu) + ) + + (box + :orientation "v" + :spacing 8 + :space-evenly false + + (launcher) + + (box + :orientation "h" + :spacing 8 + :space-evenly false + + (box :hexpand true (music)) + + (volume) + ) + ) + ) + ) +) diff --git a/modules/home/desktop/components/fcitx5/default.nix b/modules/home/desktop/components/fcitx5/default.nix new file mode 100644 index 0000000..0eb0a4c --- /dev/null +++ b/modules/home/desktop/components/fcitx5/default.nix @@ -0,0 +1,82 @@ +{ options, config, osConfig, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.fcitx5; + oscfg = osConfig.${namespace}.hardware.keyboard.jp; + desktop = config.${namespace}.desktop; + impermanence = config.${namespace}.impermanence; +in { + options.${namespace}.desktop.components.fcitx5 = with types; { + enable = mkEnableOption "fcitx5 theming"; + }; + + config = mkIf (cfg.enable && oscfg.enable) { + #TODO: investigate generating config files instead of persisting + home.persistence.${impermanence.location} = { + directories = [ + ".config/fcitx" + ".config/fcitx5" + ]; + }; + + xdg.dataFile."fcitx5/themes/nix-theme/theme.conf".source = let + c = desktop.theme.colors; + in (pkgs.formats.ini {}).generate "fcitx5-theme.conf" { + "Metadata" = { + Name = "nix-theme"; + Author = "CartConnoisseur"; + Description = "Theme generated by NixOS"; + Version = 1; + }; + + "InputPanel" = { + NormalColor = "#${c.fg}"; + HighlightColor = "#${c.fg}"; + HighlightBackgroundColor = "#00000000"; + HighlightCandidateColor = "#${c.bg}"; + + FullWidthHighlight = true; + PageButtonAlignment = "Last Candidate"; + }; + + "InputPanel/Background" = { + Color = "#${c.bg}"; + BorderColor = "#${c.fg1}"; + BorderWidth = 2; + }; + + # "InputPanel/Background/Margin" = { + # Left = 10; + # Right = 10; + # Top = 10; + # Bottom = 10; + # }; + + "InputPanel/Highlight" = { + Color = "#${c.fg}"; + BorderWidth = 0; + }; + + "InputPanel/Highlight/Margin" = { + Left = 2; + Right = 2; + Top = 2; + Bottom = 2; + }; + + "InputPanel/ContentMargin" = { + Left = 2; + Right = 2; + Top = 2; + Bottom = 2; + }; + + "InputPanel/TextMargin" = { + Left = 5; + Right = 5; + Top = 5; + Bottom = 5; + }; + }; + }; +} diff --git a/modules/home/desktop/components/gtk/default.nix b/modules/home/desktop/components/gtk/default.nix new file mode 100644 index 0000000..a20cc1f --- /dev/null +++ b/modules/home/desktop/components/gtk/default.nix @@ -0,0 +1,26 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.gtk; +in { + options.${namespace}.desktop.components.gtk = with types; { + enable = mkEnableOption "gtk"; + }; + + config = mkIf cfg.enable { + gtk = { + enable = true; + + #TODO: dynamic theming + theme = { + package = pkgs.gruvbox-gtk-theme; + name = "Gruvbox-Dark"; + }; + + font = { + name = "monospace"; + size = 8; + }; + }; + }; +} diff --git a/modules/home/desktop/components/i3/default.nix b/modules/home/desktop/components/i3/default.nix new file mode 100644 index 0000000..cf9ed91 --- /dev/null +++ b/modules/home/desktop/components/i3/default.nix @@ -0,0 +1,257 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.i3; + desktop = config.${namespace}.desktop; +in { + options.${namespace}.desktop.components.i3 = with types; { + enable = mkEnableOption "i3"; + }; + + config = mkIf cfg.enable { + #TODO: these probably shouldnt go here + home.packages = with pkgs; [ + kdePackages.breeze + ]; + + home.file.".Xresources".text = '' + Xcursor.size: 24 + Xcursor.theme: breeze_cursors + ''; + + xsession.windowManager.i3 = { + enable = true; + config = let + #NOTE: Alt (Mod1) and meta (Mod4) have been swapped by keyd. + mod = "Mod4"; + + ws0 = "0:Main"; + ws1 = "1:Terminal"; + ws2 = "2:Browser"; + ws3 = "3:Chat"; + ws4 = "4:Gaming"; + ws5 = "5"; + ws6 = "6"; + ws7 = "7"; + ws8 = "8:Meow"; + ws9 = "9:Music"; + ws10 = "10:Misc"; + ws11 = "11:Empty"; + + output = { + primary = "primary"; + left = "DVI-D-0"; + right = "DisplayPort-1 HDMI-A-0"; + }; + in { + modifier = "${mod}"; + + fonts = { + names = [ "monospace" ]; + size = 8.0; + }; + + colors = let c = desktop.theme.colors; in { + focused = { + border = "#${c.fg2}"; + background = "#${c.fg2}"; + text = "#${c.bg}"; + indicator = "#${c.fg2}"; + childBorder = "#${c.fg2}"; + }; + + focusedInactive = { + border = "#${c.bg1}"; + background = "#${c.bg1}"; + text = "#${c.fg}"; + indicator = "#${c.bg1}"; + childBorder = "#${c.bg1}"; + }; + + unfocused = { + border = "#${c.bg}"; + background = "#${c.bg}"; + text = "#${c.fg}"; + indicator = "#${c.bg}"; + childBorder = "#${c.bg}"; + }; + }; + + gaps.inner = 8; + + workspaceOutputAssign = [ + { workspace = "${ws0}"; output = output.primary; } + { workspace = "${ws1}"; output = output.primary; } + + { workspace = "${ws2}"; output = output.left; } + { workspace = "${ws3}"; output = output.left; } + + { workspace = "${ws4}"; output = output.primary; } + + { workspace = "${ws5}"; output = output.primary; } + { workspace = "${ws6}"; output = output.primary; } + { workspace = "${ws7}"; output = output.primary; } + + { workspace = "${ws8}"; output = output.primary; } + { workspace = "${ws9}"; output = output.right; } + { workspace = "${ws10}"; output = output.primary; } + + { workspace = "${ws11}"; output = output.primary; } + ]; + + assigns = { + "${ws2}" = [ { class = "firefox"; } ]; + "${ws3}" = [ { class = "discord"; } ]; + "${ws4}" = [ + { class = "steam"; } + { class = "prismlauncher"; } + ]; + + "${ws8}" = [ { class = "qbittorrent"; } ]; + "${ws9}" = [ { title = "cmus"; } ]; + }; + + startup = [ + { command = "polybar-msg cmd quit; polybar"; always = true; notification = false; } + { command = "systemctl --user restart picom"; always = true; notification = false; } + { command = "${pkgs.feh}/bin/feh --bg-fill ${desktop.background}"; always = true; notification = false; } + ] ++ optionals desktop.components.fcitx5.enable [ + { command = "fcitx5 -dr"; always = true; notification = false; } + ]; + + keybindings = { + "${mod}+Shift+c" = "reload"; + "${mod}+Shift+r" = "restart"; + "${mod}+Shift+e" = "exec \"i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'\""; + + "${mod}+q" = "kill"; + "${mod}+d" = "exec \"rofi -modi drun,run -show drun\""; + "${mod}+Return" = "exec ${pkgs.kitty}/bin/kitty"; + + "${mod}+Num_Lock" = "exec --no-startup-id polybar-msg cmd toggle"; + + # Screenshots + #TODO: screen and full should be swapped, but currently screen is fucky :'( + "Shift+Print" = "exec --no-startup-id ${pkgs.flameshot}/bin/flameshot screen -c"; + "Print" = "exec --no-startup-id ${pkgs.flameshot}/bin/flameshot full -c"; + "${mod}+Shift+s" = "exec --no-startup-id ${pkgs.flameshot}/bin/flameshot gui -c"; + "Mod1+Shift+s" = "exec --no-startup-id ${pkgs.flameshot}/bin/flameshot gui -c"; + "${mod}+Ctrl+Shift+s" = "exec --no-startup-id ${pkgs.flameshot}/bin/flameshot launcher -c"; + + # Media keys + "XF86AudioRaiseVolume" = "exec --no-startup-id ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +2%"; + "XF86AudioLowerVolume" = "exec --no-startup-id ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -2%"; + "XF86AudioMute" = "exec --no-startup-id ${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle"; + "XF86AudioMicMute" = "exec --no-startup-id ${pkgs.pulseaudio}/bin/pactl set-source-mute @DEFAULT_SOURCE@ toggle"; + + "XF86AudioPlay" = "exec --no-startup-id \"playerctl --player=cmus,firefox,%any play-pause\""; + "XF86AudioPause" = "exec --no-startup-id \"playerctl --player=cmus,firefox,%any play-pause\""; + "XF86AudioStop" = "exec --no-startup-id \"playerctl --player=cmus,firefox,%any stop\""; + "XF86AudioNext" = "exec --no-startup-id \"playerctl --player=cmus,firefox,%any next\""; + "XF86AudioPrev" = "exec --no-startup-id \"playerctl --player=cmus,firefox,%any previous\""; + + # Media controller widget + "${mod}+m" = "exec --no-startup-id eww-toggle music --arg pos=center --arg gaps=false"; + "${mod}+Ctrl+m" = "exec --no-startup-id eww-toggle music --arg pos=right --arg gaps=true"; + "${mod}+Shift+m" = "exec --no-startup-id eww-toggle music --arg pos=center --arg gaps=true"; + "${mod}+Shift+Ctrl+m" = "exec --no-startup-id eww-toggle music --arg pos=right --arg gaps=false"; + + # Workspaces + "${mod}+grave" = "workspace number ${ws0}"; + "${mod}+1" = "workspace number ${ws1}"; + "${mod}+2" = "workspace number ${ws2}"; + "${mod}+3" = "workspace number ${ws3}"; + "${mod}+4" = "workspace number ${ws4}"; + "${mod}+5" = "workspace number ${ws5}"; + "${mod}+6" = "workspace number ${ws6}"; + "${mod}+7" = "workspace number ${ws7}"; + "${mod}+8" = "workspace number ${ws8}"; + "${mod}+9" = "workspace number ${ws9}"; + "${mod}+0" = "workspace number ${ws10}"; + "${mod}+equal" = "workspace number ${ws11}"; + + # Move active workspace + "${mod}+comma" = "move workspace to output ${output.left}"; + "${mod}+period" = "move workspace to output ${output.primary}"; + "${mod}+slash" = "move workspace to output ${output.right}"; + + # Layout + "${mod}+z" = "layout stacking"; + "${mod}+x" = "layout tabbed"; + "${mod}+c" = "layout toggle split"; + + # Focus + "${mod}+h" = "focus left"; + "${mod}+j" = "focus down"; + "${mod}+k" = "focus up"; + "${mod}+l" = "focus right"; + + "${mod}+Left" = "focus left"; + "${mod}+Down" = "focus down"; + "${mod}+Up" = "focus up"; + "${mod}+Right" = "focus right"; + + "${mod}+space" = "focus mode_toggle"; + "${mod}+a" = "focus parent"; + + # Move focused container + "${mod}+Shift+h" = "move left"; + "${mod}+Shift+j" = "move down"; + "${mod}+Shift+k" = "move up"; + "${mod}+Shift+l" = "move right"; + + "${mod}+Shift+Left" = "move left"; + "${mod}+Shift+Down" = "move down"; + "${mod}+Shift+Up" = "move up"; + "${mod}+Shift+Right" = "move right"; + + # Misc container binds + "${mod}+Shift+space" = "floating toggle"; + "${mod}+f" = "fullscreen toggle"; + + "${mod}+w" = "split h"; + "${mod}+e" = "split v"; + + "${mod}+r" = "mode resize"; + + # Move focused container to workspace + "${mod}+Shift+grave" = "move container to workspace number ${ws0}"; + "${mod}+Shift+1" = "move container to workspace number ${ws1}"; + "${mod}+Shift+2" = "move container to workspace number ${ws2}"; + "${mod}+Shift+3" = "move container to workspace number ${ws3}"; + "${mod}+Shift+4" = "move container to workspace number ${ws4}"; + "${mod}+Shift+5" = "move container to workspace number ${ws5}"; + "${mod}+Shift+6" = "move container to workspace number ${ws6}"; + "${mod}+Shift+7" = "move container to workspace number ${ws7}"; + "${mod}+Shift+8" = "move container to workspace number ${ws8}"; + "${mod}+Shift+9" = "move container to workspace number ${ws9}"; + "${mod}+Shift+0" = "move container to workspace number ${ws10}"; + }; + + modes = { + resize = { + "h" = "resize shrink width 10 px or 10 ppt"; + "j" = "resize grow height 10 px or 10 ppt"; + "k" = "resize shrink height 10 px or 10 ppt"; + "l" = "resize grow width 10 px or 10 ppt"; + + "Left" = "resize shrink width 10 px or 10 ppt"; + "Down" = "resize grow height 10 px or 10 ppt"; + "Up" = "resize shrink height 10 px or 10 ppt"; + "Right" = "resize grow width 10 px or 10 ppt"; + + "Return" = "mode default"; + "Escape" = "mode default"; + "${mod}+r" = "mode default"; + }; + }; + + bars = []; + }; + + extraConfig = '' + default_border normal 0 + ''; + }; + }; +} diff --git a/modules/home/desktop/components/picom/default.nix b/modules/home/desktop/components/picom/default.nix new file mode 100644 index 0000000..698e06c --- /dev/null +++ b/modules/home/desktop/components/picom/default.nix @@ -0,0 +1,30 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.picom; +in { + options.${namespace}.desktop.components.picom = with types; { + enable = mkEnableOption "picom"; + }; + + config = mkIf cfg.enable { + services.picom = { + enable = true; + + backend = "glx"; + vSync = true; + + settings = { + blur = { + method = "gaussian"; + size = 10; + deviation = 2; + }; + + blur-background-exclude = [ + "window_type = 'dock'" + ]; + }; + }; + }; +} diff --git a/modules/home/desktop/components/polybar/default.nix b/modules/home/desktop/components/polybar/default.nix new file mode 100644 index 0000000..d7ee363 --- /dev/null +++ b/modules/home/desktop/components/polybar/default.nix @@ -0,0 +1,278 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.polybar; + desktop = config.${namespace}.desktop; +in { + options.${namespace}.desktop.components.polybar = with types; { + enable = mkEnableOption "polybar"; + }; + + config = mkIf cfg.enable { + services.polybar = { + enable = true; + script = ""; + + package = pkgs.polybar.override { + i3Support = true; + pulseSupport = true; + }; + + settings = let c = desktop.theme.colors; in { + "bar/main" = { + width = "100%"; + height = "24pt"; + radius = 0; + + background = "#${c.bg}"; + foreground = "#${c.fg}"; + + font = [ + "Symbols Nerd Font:size=16;2" + "monospace:size=11;2" + "Sauce Code Pro Nerd Font:size=11;2" + "Noto Sans CJK JP:size=11;1" + "sans-serif:size=11;1" + ]; + + border = { + top = "8px"; + left = "8px"; + right = "8px"; + + color = "#00000000"; + }; + + padding = { + left = 2; + right = 2; + }; + + cursor = { + click = "pointer"; + scroll = "ns-resize"; + }; + + enable-ipc = true; + + line.size = "3pt"; + + separator = { + text = "|"; + foreground = "#${c.bg3}"; + }; + + module.margin = 1; + modules = { + left = "stat music"; + center = "i3"; + right = "wlan eth filesystem keyboard xkeyboard pulseaudio date"; + }; + }; + + "module/keyboard" = { + type = "custom/script"; + + exec = "if [[ $(fcitx5-remote -n) == 'mozc' ]]; then printf 'jp'; else printf 'en'; fi"; + interval = 1; + + click.left = "${pkgs.fcitx5}/bin/fcitx5-remote -t"; + + format = { + prefix = { + text = " "; + foreground = "#${c.accent}"; + }; + }; + }; + + "module/music" = { + type = "custom/script"; + + exec = "playerctl --player=cmus,firefox,%any -F metadata --format='{{title}} - {{artist}}'"; + tail = true; + + format = { + prefix = { + text = " "; + foreground = "#${c.accent}"; + }; + }; + }; + + "module/stat" = { + type = "custom/script"; + + exec = "vmstat -n 2 | awk '{printf \"%.0f%% %.2f GiB\\\\n\", 100-$15, (31998756-($4+$5+$6))/1024/1024};fflush()'"; + tail = true; + + format = { + prefix = { + text = " "; + foreground = "#${c.accent}"; + }; + }; + }; + + "module/i3" = { + type = "internal/i3"; + + strip-wsnumbers = true; + index-sort = true; + + ws.icon = [ + "0:Main;" "1:Terminal;" "2:Browser;" "3:Chat;" "4:Gaming;" + "5;" "6;" "7;" + "8:Meow;" "9:Music;" "10:Misc;" + ]; + + label = { + focused = { + text = "%icon%"; + padding = 2; + + foreground = "#${c.fg0}"; + background = "#${c.bg1}"; + underline = "#${c.accent}"; + }; + + visible = { + text = "%icon%"; + padding = 2; + + underline = "#${c.fg4}"; + }; + + unfocused = { + text = "%icon%"; + padding = 2; + }; + + urgent = { + text = "%icon%"; + padding = 2; + + foreground = "#${c.bg}"; + background = "#${c.accent}"; + }; + }; + }; + + "module/xwindow" = { + type = "internal/xwindow"; + label = "%title:0:64:...%"; + }; + + + "module/pulseaudio" = { + type = "internal/pulseaudio"; + + format.volume = "<ramp-volume> <label-volume>"; + + label = { + volume = "%percentage%%"; + muted = { + text = " %percentage%%"; + foreground = "#${c.bg3}"; + }; + }; + + ramp.volume = { + text = [ "" "" "" ]; + foreground = "#${c.accent}"; + }; + }; + + "module/xkeyboard" = { + type = "internal/xkeyboard"; + blacklist = [ "num lock" ]; + + indicator.icon = [ "caps lock;;" ]; + + format = { + text = "<label-indicator>"; + }; + + label = { + indicator.on = "%icon%"; + }; + }; + + "module/cpu" = { + type = "internal/cpu"; + interval = 2; + + format.prefix = { + text = "CPU "; + foreground = "#${c.accent}"; + }; + + label = "%percentage%%"; + }; + + "module/memory" = { + type = "internal/memory"; + interval = 2; + + format.prefix = { + text = "MEM "; + foreground = "#${c.accent}"; + }; + + label = "%gb_used%"; + }; + + "module/filesystem" = { + type = "internal/fs"; + interval = 25; + + mount = [ "/nix" "/persist" ]; + + label = { + mounted = "%{F#${c.accent}}%{F-} %used%"; + unmounted = { + text = "%mountpoint%"; + foreground = "#${c.bg3}"; + }; + }; + }; + + "module/eth" = { + type = "internal/network"; + interface.type = "wired"; + interval = 2; + + format.connected = "<label-connected>"; + label.connected = "%{F#${c.accent}}%{F-} %downspeed% %upspeed%"; + }; + + "module/wlan" = { + type = "internal/network"; + interface.type = "wireless"; + interval = 2; + + format.connected = "<ramp-signal> <label-connected>"; + label.connected = " %downspeed% %upspeed%"; + + ramp-signal = { + text = [ "" "" "" "" "" ]; + foreground = "#${c.accent}"; + }; + }; + + "module/date" = { + type = "internal/date"; + interval = 1; + + date = "%H:%M"; + date-alt = "%Y-%m-%d %H:%M:%S"; + + format.prefix = { + text = " "; + foreground = "#${c.accent}"; + }; + }; + }; + }; + }; +} diff --git a/modules/home/desktop/components/rofi/default.nix b/modules/home/desktop/components/rofi/default.nix new file mode 100644 index 0000000..a1dbe33 --- /dev/null +++ b/modules/home/desktop/components/rofi/default.nix @@ -0,0 +1,58 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.desktop.components.rofi; + desktop = config.${namespace}.desktop; +in { + options.${namespace}.desktop.components.rofi = with types; { + enable = mkEnableOption "rofi"; + }; + + config = mkIf cfg.enable { + programs.rofi = { + enable = true; + + font = "monospace 12"; + + theme = let + inherit (config.lib.formats.rasi) mkLiteral; + c = desktop.theme.colors; + in { + "@import" = "default"; + + "*" = { + background = mkLiteral "#${c.bg}"; + foreground = mkLiteral "#${c.fg}"; + foreground-alt = mkLiteral "#${c.bg3}"; + + alternate-normal-background = mkLiteral "var(background)"; + + selected-normal-foreground = mkLiteral "var(background)"; + selected-normal-background = mkLiteral "#${c.accent}"; + + border-color = mkLiteral "var(background)"; + separatorcolor = mkLiteral "#${c.bg3}"; + }; + + inputbar = { + children = map mkLiteral [ "entry" "num-filtered-rows" "textbox-num-sep" "num-rows" ]; + }; + + element = { + children = map mkLiteral [ "element-icon" "element-text" ]; + }; + + entry.placeholder = ""; + + scrollbar.handle-color = mkLiteral "var(foreground-alt)"; + num-rows.text-color = mkLiteral "var(foreground-alt)"; + num-filtered-rows.text-color = mkLiteral "var(foreground-alt)"; + textbox-num-sep.text-color = mkLiteral "var(foreground-alt)"; + + message.border = mkLiteral "1px solid 0px 0px"; + listview.border = mkLiteral "1px solid 0px 0px"; + sidebar.border = mkLiteral "1px solid 0px 0px"; + }; + }; + }; +} |