diff --git a/config/battery.nix b/config/battery.nix index 79ffadb..bfb66c8 100644 --- a/config/battery.nix +++ b/config/battery.nix @@ -8,6 +8,11 @@ lib.mkIf (config.machine == "fire") { percentageCritical = 5; }; - # Power management tools - services.power-profiles-daemon.enable = true; + # Power and temperature management tools + services.thermald.enable = true; + services.tlp.enable = true; + services.tlp.settings = { + TLP_DEFAULT_MODE = "BAT"; + TLP_PERSISTENT_DEFAULT = 1; + }; } diff --git a/flake.lock b/flake.lock index 8fcd1f7..31a0b56 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1759853171, - "narHash": "sha256-uqbhyXtqMbYIiMqVqUhNdSuh9AEEkiasoK3mIPIVRhk=", + "lastModified": 1750304462, + "narHash": "sha256-Mj5t4yX05/rXnRqJkpoLZTWqgStB88Mr/fegTRqyiWc=", "owner": "nix-community", "repo": "home-manager", - "rev": "1a09eb84fa9e33748432a5253102d01251f72d6d", + "rev": "863842639722dd12ae9e37ca83bcb61a63b36f6c", "type": "github" }, "original": { @@ -40,11 +40,11 @@ "mobile-nixos": { "flake": false, "locked": { - "lastModified": 1759261417, - "narHash": "sha256-TjuoBb8+isL3KTdGgtYh90XPyeUMFbgNAOG9l23CB3A=", + "lastModified": 1749499850, + "narHash": "sha256-Fyy9ySTJ7jJ7z2h5+KHJU6OUhPJvy12OlVOichkwmZ0=", "owner": "mobile-nixos", "repo": "mobile-nixos", - "rev": "e6f6d527bf6abf94dd52fbba3143a720cef96431", + "rev": "26faf325d6efb169e2e4a2c435346b46c19d08bc", "type": "github" }, "original": { @@ -55,11 +55,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1759582739, - "narHash": "sha256-spZegilADH0q5OngM86u6NmXxduCNv5eX9vCiUPhOYc=", + "lastModified": 1750431636, + "narHash": "sha256-vnzzBDbCGvInmfn2ijC4HsIY/3W1CWbwS/YQoFgdgPg=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "3441b5242af7577230a78ffb03542add264179ab", + "rev": "1552a9f4513f3f0ceedcf90320e48d3d47165712", "type": "github" }, "original": { @@ -70,11 +70,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1759831965, - "narHash": "sha256-vgPm2xjOmKdZ0xKA6yLXPJpjOtQPHfaZDRtH+47XEBo=", + "lastModified": 1750365781, + "narHash": "sha256-XE/lFNhz5lsriMm/yjXkvSZz5DfvKJLUjsS6pP8EC50=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c9b6fb798541223bbb396d287d16f43520250518", + "rev": "08f22084e6085d19bcfb4be30d1ca76ecb96fe54", "type": "github" }, "original": { @@ -84,45 +84,6 @@ "type": "github" } }, - "quickshell": { - "inputs": { - "nixpkgs": [ - "quickshell-toki-night", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1759610621, - "narHash": "sha256-P3UPFd95mS/3aNgy40nCXAmyfR2bEEBd+tX6xfkYFb0=", - "rev": "c5c438f1cd1a76660a8658ef929a3d19e968e2ce", - "type": "tarball", - "url": "https://git.outfoxxed.me/api/v1/repos/quickshell/quickshell/archive/c5c438f1cd1a76660a8658ef929a3d19e968e2ce.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://git.outfoxxed.me/quickshell/quickshell/archive/master.tar.gz" - } - }, - "quickshell-toki-night": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ], - "quickshell": "quickshell", - "systems": "systems" - }, - "locked": { - "lastModified": 1759976594, - "narHash": "sha256-bTrBPRu8CM4YHRSDT6mI5SylEHshujSb2r++C6O/vug=", - "rev": "6e1fb585e30d3503dd120f19e64535005357ffc7", - "type": "tarball", - "url": "https://git.tokinanpa.dev/api/v1/repos/toki/quickshell-toki-night/archive/6e1fb585e30d3503dd120f19e64535005357ffc7.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://git.tokinanpa.dev/toki/quickshell-toki-night/archive/main.tar.gz" - } - }, "root": { "inputs": { "home-manager": "home-manager", @@ -130,7 +91,6 @@ "mobile-nixos": "mobile-nixos", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", - "quickshell-toki-night": "quickshell-toki-night", "sxmo": "sxmo", "tokyo-night-sddm-src": "tokyo-night-sddm-src" } @@ -151,21 +111,6 @@ "type": "github" } }, - "systems": { - "locked": { - "lastModified": 1680978846, - "narHash": "sha256-Gtqg8b/v49BFDpDetjclCYXm8mAnTrUzR0JnE2nv5aw=", - "owner": "nix-systems", - "repo": "x86_64-linux", - "rev": "2ecfcac5e15790ba6ce360ceccddb15ad16d08a8", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "x86_64-linux", - "type": "github" - } - }, "tokyo-night-sddm-src": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 7b4c9ac..8aa8cea 100644 --- a/flake.nix +++ b/flake.nix @@ -13,10 +13,6 @@ inputs = { home-manager.url = "github:nix-community/home-manager/master"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; - quickshell-toki-night.url = "https://git.tokinanpa.dev/toki/quickshell-toki-night/archive/main.tar.gz"; - quickshell-toki-night.inputs.nixpkgs.follows = "nixpkgs"; - quickshell-toki-night.inputs.systems.url = "github:nix-systems/x86_64-linux"; - tokyo-night-sddm-src.url = "github:rototrash/tokyo-night-sddm"; tokyo-night-sddm-src.flake = false; macos-hyprcursor-src.url = "github:driedpampas/macOS-hyprcursor"; diff --git a/home-manager/default.nix b/home-manager/default.nix index 0e96ed5..ebfd303 100644 --- a/home-manager/default.nix +++ b/home-manager/default.nix @@ -5,12 +5,5 @@ home.stateVersion = "21.11"; - imports = [ - ./shell - ./wayland - - ./email.nix - ./tools.nix - ./xdg.nix - ]; + imports = [ ./shell ./wayland ./xdg.nix ./tools.nix ./email.nix ]; } diff --git a/home-manager/wayland/default.nix b/home-manager/wayland/default.nix index 84727f9..84e8a9b 100644 --- a/home-manager/wayland/default.nix +++ b/home-manager/wayland/default.nix @@ -7,8 +7,8 @@ imports = [ ./hyprland.nix - ./idle.nix - ./quickshell.nix ./wltools.nix + ./waybar.nix + ./idle.nix ]; } diff --git a/home-manager/wayland/eww/eww.scss b/home-manager/wayland/eww/eww.scss new file mode 100644 index 0000000..0e63d34 --- /dev/null +++ b/home-manager/wayland/eww/eww.scss @@ -0,0 +1,268 @@ +$background: #1a1626; +$background-alt: #202330; +$background-scale: #414868; +$foreground: #c0caf5; +$foreground-alt: #8189af; +$foreground-light: #343b58; +$disabled: #565f89; +$accent: #f6a8cf; + +* { + all: unset; + font-family: "Quicksand Medium"; +} + +@mixin segment { + background-color: $background-alt; + border-radius: 20px; + margin: 0px 2px; +} + +.bar { + background-color: $background; + color: $foreground; + font-size: 13px; + + padding: 3px 0px; +} + + +tooltip { + background-color: rgba(22, 16, 30, 0.9); + border-radius: 5px; + font-size: 13px; +} + +.detail { + font-size: 10px; + color: $foreground-alt; +} + +.bar-sep { + margin: 0px 4px; + color: $background-alt; + font-size: 22px; +} + +.bar-window { + margin-left: 14px; + + .detail { + margin-top: 1px; + } + + :not(.detail) { + margin-top: -2px; + margin-left: 1px; + } +} + +.bar-time { + @include segment; + font-size: 15px; + padding: 0px 10px; + + .bar-date { + margin-top: 1px; + font-size: 11px; + color: #a9b1d6; + } +} + +.bar-music { + @include segment; + padding: 0px 2px; + + .progress { + .back { + color: $background-scale; + } + + .front { + color: $accent; + } + } + + .symbol.stopped { + font-size: 15px; + color: $foreground-alt; + margin-left: -2px; + } + + .symbol.paused { + font-size: 12px; + margin-left: 2px; + } + + .symbol.playing { + font-size: 15px; + margin-top: 1px; + } + + .bar-music-meta { + margin-left: 6px; + margin-right: 10px; + } + + .bar-artist { + margin-top: 1px; + margin-bottom: -2px; + } + + .bar-title { + margin-bottom: -3px; + } +} + + +.bar-workspaces { + @include segment; + padding: 3px; + + .workspace-button { + min-width: 23px; + border-radius: 100%; + color: #51587a; + + &.current + box { + border-radius: 100%; + background-color: $accent; + color: $foreground-light; + } + + &.occupied { + background-color: $background-scale; + color: $accent; + } + + &.occupied.previous-occupied { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + &.occupied.next-occupied { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } +} + +scale trough { + background-color: $background-scale; + border-radius: 5px; + min-height: 6px; + min-width: 60px; + margin: 0px 5px; + + highlight { + border-radius: 5px; + } +} + +.bar-scale { + margin: 0px 5px; + + .percent { + margin-top: -1px; + margin-left: 3px; + } +} + +@mixin scale-color($color) { + color: $color; + + scale highlight { + background-color: $color; + } +} + +.bar-volume { + @include scale-color(#7dcfff); + &.muted { @include scale-color(#f7768e); } + + .symbol { + margin-right: 6px; + font-size: 17; + } +} + +.bar-brightness { + @include scale-color(#e0af68); + + margin-right: 4px; + + .symbol { + margin-right: 7px; + font-size: 14px; + } +} + +.bar-internet { + margin-left: 5px; + margin-right: 9px; + font-size: 15px; + color: #bb9af7; + + &.disabled { + color: $disabled; + } +} + +.bar-bluetooth { + margin: 0px 3px; + font-size: 15px; + color: #7aa2f7; + + &.disabled { + color: $disabled; + } +} + + +.bar-circular { + margin: 0px 3px; + font-size: 15px; + + .back { + color: $background-scale; + } + + &.critical { + color: #f7768e; + } +} + +.bar-battery { + color: #8ece6a; +} + +.bar-ram { + color: #b4f9f8; + .symbol { + margin-right: 5px; + } +} + +.bar-storage { + color: #cfc9c2; + .symbol { + margin-right: 1px; + } +} + +.bar-power { + font-size: 18px; + margin-left: 4px; + margin-right: 10px; + color: #f7768e; +} + +.power { + font-size: 36px; + + button > box { + background-color: $background; + border-radius: 8px; + margin: 5px; + } +} diff --git a/home-manager/wayland/eww/eww.yuck b/home-manager/wayland/eww/eww.yuck new file mode 100644 index 0000000..35038fa --- /dev/null +++ b/home-manager/wayland/eww/eww.yuck @@ -0,0 +1,432 @@ + +;; Window Info + +(deflisten window :initial "{}" + "scripts/active-window") + +(defwidget bar_window [class-limit title-limit] + (box :class "bar-window" + :orientation "v" + :space-evenly false + (label :class "detail" + :halign "start" + :valign "end" + :limit-width class-limit + :text {window.class ?: "Desktop"}) + (label :halign "start" + :valign "end" + :limit-width title-limit + :text {window.title ?: "Workspace ${current_workspace}"}))) + +;; Workspaces + +(deflisten workspaces :initial "[]" + "scripts/get-workspaces") +(deflisten current_workspace :initial "1" + "scripts/get-active-workspace") + +(defwidget bar_workspace_button [workspace] + (eventbox :onclick "hyprctl dispatch workspace ${workspace.id}" + (overlay + (box :class "workspace-button ${workspace.id == current_workspace ? "current" : "" +} ${workspace.windows > 0 ? "occupied" : "" +} ${workspace.previous > 0 ? "previous-occupied" : "" +} ${workspace.next > 0 ? "next-occupied" : ""}" + {workspace.id}) + (box :visible {workspace.id == current_workspace} + {workspace.id})))) + +(defwidget bar_workspaces [] + (eventbox :onscroll "scripts/change-active-workspace {} ${current_workspace}" + (box :class "bar-workspaces" + :orientation "h" + :space-evenly true + (for workspace in workspaces + (bar_workspace_button :workspace workspace))))) + +;; Time + +(defwidget bar_time [width] + (box :class "bar-time segment" + :orientation "h" + :width width + :space-evenly false + :spacing 6 + (label :halign "start" + :yalign 0.5 + :text {formattime(EWW_TIME, "%H:%M:%S")}) + (label :class "bar-date" + :halign "end" + :hexpand true + :yalign 0.5 + :text {formattime(EWW_TIME, "%a %Y-%m-%d")}))) + +;; Playerctl + +(deflisten mpris :initial "{}" + "scripts/mpris-metadata") + +(defwidget bar_music [artist-limit title-limit] + (eventbox :onclick "playerctl play-pause" + (box :class "bar-music" + :orientation "h" + :space-evenly false + (box :class "progress" + (overlay + (circular-progress :class "back" + :value 100 + :width 25 + :thickness 2) + (circular-progress :class "front" + :value {(mpris.position ?: 0) == 0 || + (mpris.duration ?: 0) == 0 ? 0 : + mpris.position > mpris.duration ? 100 : + mpris.position / mpris.duration * 100} + :width 25 + :thickness 2 + :start-at 75 + :clockwise true) + (label :class "symbol ${(mpris.title ?: "") == "" || (mpris.status ?: "Stopped") == "Stopped" ? "stopped" : + mpris.status == "Playing" ? "playing" : "paused"}" + :text {(mpris.title ?: "") == "" || (mpris.status ?: "Stopped") == "Stopped" ? "" : + mpris.status == "Playing" ? "󰏤" : ""}))) + (revealer :transition "slideright" + :duration "800ms" + :reveal {(mpris.title ?: "") != "" && (mpris.status ?: "Stopped") != "Stopped"} + (box :orientation "v" + :class "bar-music-meta" + :space-evenly false + (label :class "bar-artist detail" + :halign "start" + :limit-width artist-limit + :text {mpris.artist ?: ""}) + (label :class "bar-title" + :halign "start" + :limit-width title-limit + :text {mpris.title ?: ""})))))) + + +;; Scales (Volume + Brightness) + +(defwidget bar_scale [?class reveal-name reveal value symbol onchange ?onclick] + (eventbox :onhover "${EWW_CMD} update ${reveal-name}=true" + :onhoverlost "${EWW_CMD} update ${reveal-name}=false" + (box :class "bar-scale ${class}" + :space-evenly false + (eventbox :onclick onclick + (label :class "symbol" + :text symbol)) + (revealer :transition "slideright" + :reveal reveal + :duration "400ms" + (scale :value value + :orientation "h" + :width "100%" + :min 0 + :max 101 + :onchange onchange)) + (eventbox :onclick onclick + (label :class "percent" + :width 29 + :xalign 0 + :text "${value}%"))))) + + +(defvar volume_reveal false) +(deflisten volume :initial "0" + "scripts/volume") + +(defwidget bar_volume [] + (bar_scale :class "bar-volume ${volume.muted ? "muted" : ""}" + :reveal-name "volume_reveal" + :reveal volume_reveal + :value {volume.value} + :symbol {volume.muted ? "󰝟" : + volume.value < 5 ? "󰖁" : + volume.value < 35 ? "󰕿" : + volume.value < 66 ? "󰖀" : "󰕾"} + :onchange "pamixer --set-volume {}" + :onclick "pamixer -t")) + + +(defvar brightness_reveal false) +(deflisten brightness :initial "0" + "scripts/brightness") + +(defwidget bar_brightness [] + (bar_scale :class "bar-brightness" + :reveal-name "brightness_reveal" + :reveal brightness_reveal + :value brightness + :symbol "󰃠" + :onchange "brightnessctl -e s {}%")) + + +;; Circular Indicators + +(defwidget bar_circular [?class ?critical ?tooltip value symbol] + (box :class "bar-circular ${class} ${(critical ?: false) ? "critical" : ""}" + :orientation "h" + :tooltip tooltip + (overlay + (circular-progress :class "back" + :value 100 + :width 25 + :thickness 2 + :start-at 75 + :clockwise true) + (circular-progress :class "front" + :value value + :width 25 + :thickness 2 + :start-at 75 + :clockwise true) + (label :class "symbol" + :text symbol)))) + +(defwidget bar_battery [] + (bar_circular :class "bar-battery" + :critical {EWW_BATTERY["BAT1"].capacity <= 15 + && EWW_BATTERY["BAT1"].status != "Charging"} + :tooltip "Battery: ${EWW_BATTERY["BAT1"].capacity}%${ + EWW_BATTERY["BAT1"].status == "Charging" ? " (Charging)" : ""}" + :value {EWW_BATTERY["BAT1"].capacity} + :symbol {EWW_BATTERY["BAT1"].status == "Charging" ? "󰂄" : "󰁹"})) + +(defwidget bar_ram [] + (bar_circular :class "bar-ram" + :critical {EWW_RAM.used_mem_perc >= 80} + :tooltip "RAM: ${round(EWW_RAM.used_mem / 1073741824, 2) +} / ${round(EWW_RAM.total_mem / 1073741824, 2)} GB (${round(EWW_RAM.used_mem_perc, 2)}%)" + :value {EWW_RAM.used_mem_perc} + :symbol "")) + +(defwidget bar_storage [] + (bar_circular :class "bar-storage" + :critical {EWW_DISK["/"].used_perc >= 95} + :tooltip "Storage: ${round(EWW_DISK["/"].used / 1073741824, 2) +} / ${round(EWW_DISK["/"].total / 1073741824, 0)} GB (${round(EWW_DISK["/"].used_perc, 2)}%)" + :value {EWW_DISK["/"].used_perc} + :symbol "󰆼")) + +;; Network + +(defpoll wifi :interval "5s" :initial "{}" + "scripts/network 802-11-wireless") +(defpoll ethernet :interval "5s" :initial "{}" + "scripts/network 802-3-ethernet") +(defpoll bluetooth :interval "5s" :initial "{}" + "scripts/network bluetooth") + +(defvar internet_reveal false) + +(defwidget bar_internet [] + (box :class "bar-internet ${wifi == "{}" && ethernet == "{}" ? "disabled" : ""}" + :space-evenly false + :tooltip {ethernet != "{}" ? "${ethernet.name} (${ethernet.device})" : + wifi != "{}" ? "${wifi.name} (${wifi.device})" : ""} + {wifi != "{}" ? "󰤨" : ethernet != "{}" ? "󰈀" : "󰤮"})) + +(defwidget bar_bluetooth [] + (box :class "bar-bluetooth ${bluetooth == "{}" ? "disabled" : ""}" + {bluetooth != "{}" ? "󰂯" : "󰂲"})) + +;; Power Menu + +(defpoll idleinhibit :interval "10s" :initial "0" + "pgrep -c -f wayland\"\"-idle-inhibitor || true") + +(defwidget bar_power [screen] + (eventbox :onclick "${EWW_CMD} active-windows | grep -q power_${screen} \ +&& ${EWW_CMD} close power_${screen} || ${EWW_CMD} open power --id power_${screen} --screen ${screen}" + (box :class "bar-power" + "⏻"))) + +(defwindow power [screen] + :geometry (geometry + :width "375px" + :height "150px" + :anchor "top right") + :namespace "eww-bar" + :stacking "fg" + :exclusive false + :focusable false + (eventbox :onhoverlost "${EWW_CMD} close power_${screen}" + (box :class "power" + :orientation "v" + (box :orientation "h" + (button :onclick "${EWW_CMD} close power_${screen}; systemctl suspend" + :tooltip "Sleep" + (box :style "color: #9aa5ce;" + "󰤄")) + (button :onclick "${EWW_CMD} close power_${screen}; hyprlock --immediate &" + :tooltip "Lock" + (box :style "color: #cfc9c2;" + "")) + (button :onclick "${EWW_CMD} close power_${screen}; hyprctl dispatch exit" + :tooltip "Log Out" + (box :style "color: #7dcfff; padding-left: 0.3ex;" + "")) + (button :onclick "${EWW_CMD} close power_${screen}; reboot" + :tooltip "Reboot" + (box :style "color: #e0af68;" + "")) + (button :onclick "${EWW_CMD} close power_${screen}; poweroff" + :tooltip "Shutdown" + (box :style "color: #f7768e; font-size: 1.35em; padding-bottom: 0.15ex;" + "⏼"))) + (box + :orientation "h" + (box) (box) (box) (box) + (button :onclick "scripts/toggle-idle-inhibit && ${EWW_CMD} poll idleinhibit" + :tooltip "Idle Inhibitor: ${idleinhibit > 0 ? "On" : "Off"}" + (box :style "padding-right: 0.5ex; ${idleinhibit > 0 ? + "color: #ff9e64" : + "color: #565f89; padding-top: 0.3ex;"}" + {idleinhibit > 0 ? "󰈈" : "󰛑"})))))) + + +;; Separator + +(defwidget bar_sep [] + (box :class "bar-sep" + :hexpand false + :vexpand false + "|")) + + +;; Bar Layout + +(defwidget fire_bar_left_edge [] + (box :orientation "h" + :space-evenly false + :halign "start" + :hexpand true + (bar_window :class-limit 60 + :title-limit 50))) + +(defwidget fire_bar_left_wing [] + (box :orientation "h" + :space-evenly false + :halign "end" + :hexpand true + (bar_time :width 175))) + +(defwidget fire_bar_center [] + (bar_workspaces)) + +(defwidget fire_bar_right_wing [] + (box :orientation "h" + :space-evenly false + :hexpand true + (bar_music :width 175 + :artist-limit 30 + :title-limit 25))) + +(defwidget fire_bar_right_edge [screen] + (box :orientation "h" + :space-evenly false + :halign "end" + :hexpand true + (bar_volume) + (bar_brightness) + (bar_sep) + (bar_bluetooth) + (bar_internet) + (bar_sep) + (bar_storage) + (bar_ram) + (bar_battery) + (bar_sep) + (bar_power :screen screen))) + +(defwidget fire_bar_layout [screen] + (centerbox :class "bar" + :orientation "h" + (box :orientation "h" + :space-evenly false + :hexpand true + (fire_bar_left_edge) + (fire_bar_left_wing)) + (fire_bar_center) + (box :orientation "h" + :space-evenly false + (fire_bar_right_wing) + (fire_bar_right_edge :screen screen)))) + + +(defwidget earth_bar_left_edge [] + (box :orientation "h" + :space-evenly false + :halign "start" + :hexpand true + (bar_window :class-limit 90 + :title-limit 80))) + +(defwidget earth_bar_left_wing [] + (box :orientation "h" + :space-evenly false + :halign "end" + :hexpand true + (bar_time :width 175))) + +(defwidget earth_bar_center [] + (bar_workspaces)) + +(defwidget earth_bar_right_wing [] + (box :orientation "h" + :space-evenly false + :hexpand true + (bar_music :width 175 + :artist-limit 30 + :title-limit 25))) + +(defwidget earth_bar_right_edge [screen] + (box :orientation "h" + :space-evenly false + :halign "end" + :hexpand true + (bar_volume) + (bar_sep) + (bar_bluetooth) + (bar_internet) + (bar_sep) + (bar_storage) + (bar_ram) + (bar_sep) + (bar_power :screen screen))) + +(defwidget earth_bar_layout [screen] + (centerbox :class "bar" + :orientation "h" + (box :orientation "h" + :space-evenly false + :hexpand true + (earth_bar_left_edge) + (earth_bar_left_wing)) + (earth_bar_center) + (box :orientation "h" + :space-evenly false + (earth_bar_right_wing) + (earth_bar_right_edge :screen screen)))) + + +(defwindow fire_bar [screen] + :geometry (geometry :width "100%" + :height "35px" + :anchor "top center") + :namespace "eww-bar" + :stacking "fg" + :exclusive true + :focusable false + (fire_bar_layout :screen screen)) + +(defwindow earth_bar [screen] + :geometry (geometry :width "100%" + :height "35px" + :anchor "top center") + :namespace "eww-bar" + :stacking "fg" + :exclusive true + :focusable false + (earth_bar_layout :screen screen)) diff --git a/home-manager/wayland/eww/scripts/active-window b/home-manager/wayland/eww/scripts/active-window new file mode 100755 index 0000000..8678080 --- /dev/null +++ b/home-manager/wayland/eww/scripts/active-window @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +hyprctl activewindow -j | jq -c . +socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | + stdbuf -o0 grep -ose '^activewindow>>' | while read -r line; do + hyprctl activewindow -j | jq -c . +done diff --git a/home-manager/wayland/eww/scripts/brightness b/home-manager/wayland/eww/scripts/brightness new file mode 100755 index 0000000..db5358b --- /dev/null +++ b/home-manager/wayland/eww/scripts/brightness @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +brightnessctl -me | cut -d, -f4 | tr -d '%' +device=$(brightnessctl -m | head -n 1 | cut -d, -f1) +while true; do + inotifywait /sys/class/backlight/"$device"/brightness &>/dev/null + brightnessctl -me | cut -d, -f4 | tr -d '%' +done diff --git a/home-manager/wayland/eww/scripts/change-active-workspace b/home-manager/wayland/eww/scripts/change-active-workspace new file mode 100755 index 0000000..106aea6 --- /dev/null +++ b/home-manager/wayland/eww/scripts/change-active-workspace @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +direction=$1 +current=$2 + +min=1 +max=10 + +function clamp { + if test $1 -lt $min; then + echo $min + elif test $1 -gt $max; then + echo $max + else + echo $1 + fi +} + +if test "$direction" = "down" +then + target=$(clamp $(($current+1))) + echo "jumping to $target" + hyprctl dispatch workspace $target +elif test "$direction" = "up" +then + target=$(clamp $(($current-1))) + echo "jumping to $target" + hyprctl dispatch workspace $target +fi diff --git a/home-manager/wayland/eww/scripts/get-active-workspace b/home-manager/wayland/eww/scripts/get-active-workspace new file mode 100755 index 0000000..65245a4 --- /dev/null +++ b/home-manager/wayland/eww/scripts/get-active-workspace @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +hyprctl monitors -j | jq '.[] | select(.focused) | .activeWorkspace.id' +socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | + stdbuf -o0 awk -F '>>|,' -e '/^workspace>>/ {print $2}' -e '/^focusedmon>>/ {print $3}' diff --git a/home-manager/wayland/eww/scripts/get-workspaces b/home-manager/wayland/eww/scripts/get-workspaces new file mode 100755 index 0000000..3d43617 --- /dev/null +++ b/home-manager/wayland/eww/scripts/get-workspaces @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +workspaces() { + hyprctl workspaces -j | jq -c 'map({key: .id | tostring, value: .windows}) | from_entries + | . as $windows | [range(1;11) | {id: tostring, windows: ($windows[tostring] // 0), + previous: ($windows[.-1|tostring] // 0), next: ($windows[.+1|tostring] // 0)}]' +} + +workspaces +socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do + workspaces +done diff --git a/home-manager/wayland/eww/scripts/mpris-metadata b/home-manager/wayland/eww/scripts/mpris-metadata new file mode 100755 index 0000000..c4593dc --- /dev/null +++ b/home-manager/wayland/eww/scripts/mpris-metadata @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +playerctl metadata --follow --format \ +'{"playerName": "{{ playerName }}",'\ +'"status": "{{ status }}",'\ +'"artist": "{{ artist }}",'\ +'"title": "{{ title }}",'\ +'"album": "{{ album }}",'\ +'"position": "{{ position }}",'\ +'"position_d": "{{ duration(position) }}",'\ +'"duration": "{{ mpris:length }}",'\ +'"duration_d": "{{ duration(mpris:length) }}"}' diff --git a/home-manager/wayland/eww/scripts/network b/home-manager/wayland/eww/scripts/network new file mode 100755 index 0000000..42715ff --- /dev/null +++ b/home-manager/wayland/eww/scripts/network @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +nmcli -t c show --active | awk -F ':' -e \ + '// { if ($3 == "'$1'") { + print "{\"name\":\""$1"\",\"device\":\""$4"\"}"; + found = 1; + exit; + }} + END { if (!found) print "{}" }' diff --git a/home-manager/wayland/eww/scripts/toggle-idle-inhibit b/home-manager/wayland/eww/scripts/toggle-idle-inhibit new file mode 100755 index 0000000..6981e75 --- /dev/null +++ b/home-manager/wayland/eww/scripts/toggle-idle-inhibit @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +if pkill -0 -f wayland-idle-inhibitor; then + pkill -f wayland-idle-inhibitor +else + wayland-idle-inhibitor & +fi diff --git a/home-manager/wayland/eww/scripts/volume b/home-manager/wayland/eww/scripts/volume new file mode 100755 index 0000000..783efa6 --- /dev/null +++ b/home-manager/wayland/eww/scripts/volume @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +volume() { + echo '{"value":'$(pamixer --get-volume)',"muted":"'$(pamixer --get-mute)'"}' +} + +volume +pw-mon -oa | stdbuf -o0 grep -os "changed:" | while read -r line; do + volume +done diff --git a/home-manager/wayland/hyprland.nix b/home-manager/wayland/hyprland.nix index 22df653..fe6d607 100644 --- a/home-manager/wayland/hyprland.nix +++ b/home-manager/wayland/hyprland.nix @@ -1,7 +1,6 @@ { config, pkgs, lib, ... }: let scripts = ./scripts; - shell = "quickshell"; in { wayland.windowManager.hyprland = { enable = true; @@ -10,9 +9,17 @@ in { plugins = [ pkgs.hyprlandPlugins.hy3 ]; - settings = { + settings = let + # Volume using pamixer + audio-disp = "${scripts}/multimedia Volume $(pamixer --get-mute) pamixer $(pamixer --get-volume)"; + audio = cmd: "pamixer ${cmd} && ${audio-disp}"; + # Brightness using brightnessctl + brightness-disp = ''${scripts}/multimedia Brightness "" brightnessctl $(brightnessctl -e -m | cut -d, -f4 | tr -d "%")''; + brightness = x: "brightnessctl -e set ${x} && ${brightness-disp}"; + in { "$mod" = "SUPER"; "$terminal" = "alacritty"; + "$menu" = "rofi -show drun"; env = [ "HYPRCURSOR_THEME,macos" @@ -33,8 +40,7 @@ in { }; windowrulev2 = [ - "bordercolor rgb(f7768e), fullscreen:1" - "noanim, initialClass:ueberzug(.*)" + "bordercolor rgb(f7768e),fullscreen:1" ]; cursor = { @@ -92,13 +98,9 @@ in { bind = [ "$mod, Return, exec, $terminal" - "$mod, D, global, ${shell}:launcher" - "$mod Shift, D, global, ${shell}:dashboard" + "$mod, D, exec, $menu" "$mod, M, exec, hyprlock --immediate" - # Exit - "$mod Shift, E, global, ${shell}:session" - # Emacs Everywhere # "$mod, Q, exec, $HOME/.config/emacs/bin/doom +everywhere" @@ -134,42 +136,43 @@ in { # Screenshot "$mod, P, exec, ${scripts}/screenshot-save" - - # Workspace manipulation - "$mod, N, global, ${shell}:newworkspace" - "$mod Shift, N, global, ${shell}:movetonewworkspace" ] ++ + # Workspace manipulation builtins.concatMap (n: let wsp = builtins.toString n; key = if n == 10 then "0" else wsp; in [ - "$mod, ${key}, global, ${shell}:workspace${wsp}" - "$mod Shift, ${key}, global, ${shell}:movetoworkspace${wsp}" + "$mod, ${key}, workspace, ${wsp}" + "$mod Shift, ${key}, hy3:movetoworkspace, ${wsp}" ]) (lib.range 1 10); bindn = [ ", mouse:272, hy3:focustab, mouse" - ", escape, global, ${shell}:escape" ]; bindl = [ # XF86 key bindings - ", XF86AudioMute, global, ${shell}:mute" - ", XF86AudioMicMute, global, ${shell}:muteMic" - ", XF86AudioPlay, global, ${shell}:mediaToggle" - ", XF86AudioNext, global, ${shell}:mediaNext" - ", XF86AudioPrev, global, ${shell}:mediaPrev" - ", XF86AudioStop, global, ${shell}:mediaStop" - ", XF86AudioRaiseVolume, global, ${shell}:volumeUp" - ", XF86AudioLowerVolume, global, ${shell}:volumeDown" - ", XF86MonBrightnessUp, global, ${shell}:brightnessUp" - ", XF86MonBrightnessDown, global, ${shell}:brightnessDown" + ", XF86AudioMute, exec, ${audio "--toggle-mute"}" + ", XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle" + ", XF86AudioPlay, exec, playerctl play-pause" + ", XF86AudioNext, exec, playerctl next" + ", XF86AudioPrev, exec, playerctl previous" # Screenshot ", Print, exec, ${scripts}/screenshot" "Shift, Print, exec, ${scripts}/screenshot-slurp" ]; + + bindle = [ + # XF86 key bindings + ", XF86AudioRaiseVolume, exec, ${audio "-i 2"}" + ", XF86AudioLowerVolume, exec, ${audio "-d 2"}" + "Shift, XF86AudioRaiseVolume, exec, ${audio "-i 2 --allow-boost"}" + "Shift, XF86AudioLowerVolume, exec, ${audio "-d 2 --allow-boost"}" + ", XF86MonBrightnessDown, exec, ${brightness "4%-"}" + ", XF86MonBrightnessUp, exec, ${brightness "4%+"}" + ]; }; }; } diff --git a/home-manager/wayland/quickshell.nix b/home-manager/wayland/quickshell.nix deleted file mode 100644 index 72b4a6d..0000000 --- a/home-manager/wayland/quickshell.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ pkgs, lib, quickshell-toki-night, ... }: -{ - systemd.user.services.quickshell = { - Install.WantedBy = [ "graphical-session.target" ]; - - Unit = { - Description = "Quickshell desktop UI manager"; - Documentation = "https://git.tokinanpa.dev/toki/quickshell-toki-night"; - After = [ "graphical-session-pre.target" ]; - PartOf = [ "graphical-session.target" ]; - }; - - Service = { - ExecStart = lib.getExe quickshell-toki-night.packages.${pkgs.system}.default; - Restart = "always"; - RestartSec = "10"; - }; - }; -} diff --git a/home-manager/wayland/rofi/config.rasi b/home-manager/wayland/rofi/config.rasi new file mode 100644 index 0000000..cda37be --- /dev/null +++ b/home-manager/wayland/rofi/config.rasi @@ -0,0 +1,160 @@ +configuration { + cycle: false; + modi: "drun"; + font: "JetBrainsMono Nerd Font 12"; + location: 0; + terminal: "alacritty"; + + show-icons: true; + hide-scrollbar: true; + disable-history: false; + click-to-exit: true; + + drun-display-format: "{icon} {name}"; + display-drun: ""; + + // Bindings + kb-remove-to-eol: ""; + kb-mode-complete: ""; + kb-remove-char-back: "BackSpace,Shift+BackSpace"; + kb-accept-entry: "Control+m,Return,KP_Enter"; + kb-element-next: "Tab,Control+j"; + kb-element-prev: "ISO_Left_Tab,Control+k"; +} + +@theme "tokyonight" + +window { + transparency: "real"; + background-color: @bg; + text-color: @fg; + border: 2px; + border-color: @blue; + border-radius: 30px; + width: 550px; + height: 65%; + anchor: center; + x-offset: 0; + y-offset: 0; +} + +prompt { + enabled: true; + padding: 8px; + background-color: @bg; + text-color: @red; +} + +textbox-prompt-colon { + expand: false; + str: ""; + border-radius: 100%; + background-color: @selected; + text-color: @fg; + padding: 8px 16px 8px 12px; +} + +entry { + background-color: @bg; + text-color: @fg; + placeholder-color: @placeholder; + expand: true; + horizontal-align: 0; + placeholder: "Search..."; + blink: true; + border: 0px 0px 2px 0px; + border-color: @blue; + border-radius: 10px; + padding: 8px; +} + +inputbar { + children: [ textbox-prompt-colon, prompt, entry ]; + background-color: @bg; + text-color: @fg; + expand: false; + border: 0px 0px 0px 0px; + border-radius: 0px; + border-color: @blue; + margin: 0px 0px 0px 0px; + padding: 0px; + position: center; +} + +case-indicator { + background-color: @bg; + text-color: @fg; + spacing: 0; +} + +listview { + background-color: @bg; + columns: 1; + lines: 10; + spacing: 4px; + cycle: false; + border: 0px; + dynamic: true; + layout: vertical; + scrollbar: false; +} + +mainbox { + background-color: @bg; + children: [ inputbar, listview ]; + spacing: 15px; + padding: 15px; +} + +element.normal.normal, +element.alternate.normal { + background-color: @bg; + text-color: @fg; + orientation: horizontal; + border-radius: 4px; + padding: 6px 6px 6px 6px; + border: 0px; +} + +element-icon { + background-color: inherit; + text-color: inherit; + horizontal-align: 0.5; + vertical-align: 0.5; + size: 24px; + border: 0px; +} + +element-text { + background-color: inherit; + text-color: inherit; + expand: true; + horizontal-align: 0; + vertical-align: 0.5; + margin: 2px 0px 2px 2px; +} + +element normal.urgent, +element alternate.urgent { + background-color: @UGT; + text-color: @FG; + border-radius: 9px; +} + +element selected { + background-color: @selected; + text-color: @blue; + border: 0px 0px 0px 0px; + border-radius: 10px; + border-color: @blue; +} + +element selected.urgent { + background-color: @red; + text-color: @fg2; +} + +element selected.active { + background-color: @selected; + color: @blue; +} diff --git a/home-manager/wayland/rofi/tokyonight.rasi b/home-manager/wayland/rofi/tokyonight.rasi new file mode 100644 index 0000000..eaf3471 --- /dev/null +++ b/home-manager/wayland/rofi/tokyonight.rasi @@ -0,0 +1,14 @@ +* { + bg: #1a1b26; + bg-light: #272834; + selected: #282e49; + blue: #7bc5e4; + fg: #abb2bf; + fg2: #e06c75; + grey: #565c64; + red: #ce7284; + green: #7dc5a0; + empty: #5b668e; + inactive: #4a5374; + placeholder: #474f6f; +} diff --git a/home-manager/wayland/scripts/multimedia b/home-manager/wayland/scripts/multimedia new file mode 100755 index 0000000..4a8c880 --- /dev/null +++ b/home-manager/wayland/scripts/multimedia @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +notify-send "$1" "$2" -c multimedia -a "$3" \ + $(busctl --user -j call org.freedesktop.Notifications /fr/emersion/Mako fr.emersion.Mako ListNotifications | + jq -r 'first(.data[][]|select(.category.data=="multimedia")|.id.data|["-r",.])[]') \ + -h "INT:value:$4" diff --git a/home-manager/wayland/scripts/screenshot b/home-manager/wayland/scripts/screenshot index 921b70e..2201f2a 100755 --- a/home-manager/wayland/scripts/screenshot +++ b/home-manager/wayland/scripts/screenshot @@ -1,4 +1,4 @@ #!/usr/bin/env bash grim - | wl-copy notify-send "Screenshot saved to clipboard" \ - -a grim -c screenshot -u low -e + -a grim -c screenshot -u low -t 3000 diff --git a/home-manager/wayland/scripts/screenshot-save b/home-manager/wayland/scripts/screenshot-save index f49678e..cf89ff0 100755 --- a/home-manager/wayland/scripts/screenshot-save +++ b/home-manager/wayland/scripts/screenshot-save @@ -3,8 +3,8 @@ if test $(wl-paste -l) = "image/png"; then name=$(date '+%Y-%m-%d_%H-%M-%S').png wl-paste -t "image/png" > ~/Pictures/"$name" notify-send "Image stored at $name" \ - -a grim -c screenshot -u low + -a grim -c screenshot -u low -t 3000 else notify-send "No image in clipboard" \ - -a grim -c screenshot -u low -t 2000 -e + -a grim -c screenshot -u low -t 3000 fi diff --git a/home-manager/wayland/scripts/screenshot-slurp b/home-manager/wayland/scripts/screenshot-slurp index 6421e5a..a1046ba 100755 --- a/home-manager/wayland/scripts/screenshot-slurp +++ b/home-manager/wayland/scripts/screenshot-slurp @@ -2,8 +2,8 @@ if region="$(slurp)"; then grim -g "$region" - | wl-copy notify-send "Screenshot saved to clipboard" \ - -a grim -c screenshot -u low -e + -a grim -c screenshot -u low -t 3000 else notify-send "Screenshot cancelled" \ - -a grim -c screenshot -u low -t 2000 -e + -a grim -c screenshot -u low -t 3000 fi diff --git a/home-manager/wayland/waybar.nix b/home-manager/wayland/waybar.nix new file mode 100644 index 0000000..d41d1ec --- /dev/null +++ b/home-manager/wayland/waybar.nix @@ -0,0 +1,292 @@ +{ config, pkgs, ... }: +{ + programs.waybar = { + enable = false; + + settings = + let spanfa = ""; + in [{ + layer = "top"; + height = 32; + margin = "8 8 0"; + + modules-left = [ "hyprland/workspaces" "custom/sep" "cpu" "memory" "temperature" ]; + + modules-center = [ "hyprland/window" ]; + + modules-right = + if config.machine == "fire" then + [ "battery" "pulseaudio" "backlight" "network" "clock" "idle_inhibitor" ] + else + [ "pulseaudio" "network" "clock" "idle_inhibitor" ]; + + + modules = { + "mpd" = { + format = "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ "; + format-disconnected = "Disconnected "; + format-stopped = "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped "; + unknown-tag = "N/A"; + interval = 2; + + consume-icons.on = " "; + random-icons.off = " "; + random-icons.on = " "; + repeat-icons.on = " "; + single-icons.on = "1 "; + state-icons.paused = ""; + state-icons.playing = ""; + + tooltip-format = "MPD (connected)"; + tooltip-format-disconnected = "MPD (disconnected)"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons.activated = ""; + format-icons.deactivated = ""; + }; + "tray" = { + # icon-size = 21; + spacing = 10; + }; + "clock" = { + format = " {:%H:%M}"; + tooltip-format = "{:%Y %B}\n{calendar}"; + format-alt = " {:%Y-%m-%d}"; + }; + "cpu" = { + format = " {usage}%"; + tooltip = false; + }; + "battery" = { + states.warning = 30; + states.low = 15; + states.critical = 5; + + format = "{icon} {capacity}%"; + format-icons = [ "󰂎" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰁿" "󰂁" "󰂂" "󰁹" ]; + format-charging = "󰂄 {capacity}%"; + format-time = "{H}h {M}m"; + }; + "memory" = { + format = "${spanfa} {}%"; + }; + "temperature" = { + # thermal-zone = 2; + # hwmon-path = "/sys/class/hwmon/hwmon2/temp1_input"; + critical-threshold = 80; + format = "${spanfa}{icon} {temperatureC}°C"; + format-icons = [ "" "" "" "" "" ]; + }; + "backlight" = { + # device = "acpi_video1"; + format = "{icon} {percent}%"; + format-icons = [ "󰃚" "󰃞" "󰃟" "󰃝" "󰃠" ]; + }; + "network" = { + # interface = "wlp2*"; # (Optional) To force the use of this interface + format = "{ifname}"; + format-wifi = "${spanfa} Online"; + format-ethernet = "${spanfa} "; + format-disconnected = ""; + tooltip-format-wifi = "{essid} - {signalStrength}%"; + tooltip-format-ethernet = "{signalStrength}%"; + tooltip-format-disconnected = ""; + }; + "pulseaudio" = { + scroll-step = 1; + smooth-scrolling-threshold = 2.0; + format = "${spanfa}{icon} {volume}%"; + format-bluetooth = " ${spanfa}{icon} {volume}%"; + format-bluetooth-muted = "${spanfa}  0%"; + format-muted = "${spanfa} {volume}%"; + + format-icons.headphone = ""; + format-icons.phone = ""; + format-icons.portable = ""; + format-icons.car = ""; + format-icons.default = [ "" "" "" ]; + + on-click = "pamixer -t"; + }; + "custom/media" = { + format = "{icon} {}"; + return-type = "json"; + max-length = 40; + + format-icons.spotify = ""; + format-icons.default = "🎜"; + + escape = true; + }; + "custom/sep".format = ""; + }; + }]; + + style = + '' + @define-color background #1a1b26; + @define-color foreground #a9b1d6; + @define-color red #ce7284; + @define-color green #7dc5a0; + @define-color yellow #caaa6a; + @define-color blue #7bc5e4; + @define-color magenta #ad8ee6; + @define-color altred #d5556f; + @define-color altgreen #b9f27c; + @define-color altyellow #ff9e64; + @define-color altblend #282e49; + @define-color empty #474f6f; + @define-color pink #c386c0; + @define-color violet #8682de; + + * { + border: none; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 13px; + } + + window#waybar { + background-color: @background; + border-radius: 8px; + color: @foreground; + padding: 3px 0px; + } + + #custom-sep { + color: @altblend; + font-size: 14px; + } + + #workspaces { + margin-left: 6px; + } + + #workspaces button { + padding: 0px 3px; + border-radius: 0px; + color: @blue; + } + + #workspaces button:hover { + box-shadow: inherit; + background: @background; + border: none; + padding: 0px 3px; + text-shadow: 0px 0px 2px shade(@blue, 1.1); + } + + #workspaces button.active { + color: shade(@pink, 1.1); + text-shadow: 0px 0px 2px shade(@pink, 1.2); + } + + #workspaces button.urgent { + background-color: @altred; + color: #ffffff; + } + + #clock, + #battery, + #cpu, + #memory, + #disk, + #temperature, + #network, + #custom-media, + #tray, + #mode, + #idle_inhibitor, + #mpd { + margin: 0px 8px; + } + + #idle_inhibitor { + padding: 0px 8px 0px 0px; + } + + + #cpu { + background-color: @altblend; + margin: 3px 0px 3px 2px; + padding-right: 5px; + padding-left: 8px; + border-radius: 18px 0px 0px 18px; + } + + #pulseaudio { + background-color: @altblend; + ${ + if config.machine == "fire" then + '' + margin: 3px 0px 3px 2px; + padding-right: 5px; + padding-left: 8px; + border-radius: 18px 0px 0px 18px; + '' + else + '' + margin: 3px 2px; + padding: 0px 8px; + border-radius: 18px; + '' + } + } + + #backlight, #memory { + background-color: @altblend; + margin: 3px 4px 3px 0px; + padding-left: 5px; + padding-right: 8px; + border-radius: 0px 18px 18px 0px; + } + + #network { + background-color: @altblend; + margin: 3px 4px; + padding: 0px 6px; + border-radius: 18px; + } + + + #window { + font-family: "NotoSans Nerd Font"; + font-size: 12px; + } + + #mode { + color: @magenta; + text-shadow: 0px 0px 2px shade(@magenta, 1.05); + } + + #cpu {color: @green;} + #memory {color: @yellow;} + #temperature {color: @blue;} + #clock {color: @blue;} + + #temperature {color: @blue;} + #temperature.critical {color: @altyellow;} + + @keyframes blink { to { color: @background; } } + + #battery {color: @green;} + #battery.warning:not(.charging) {color: @altyellow;} + #battery.low:not(.charging) {color: @altred;} + #battery.critical:not(.charging) { + color: #ff2525; + animation-name: blink; + animation-duration: 1s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; + } + + #backlight {color: @yellow;} + #network {color: @green;} + #pulseaudio {color: @pink;} + #pulseaudio.muted {color: @red;} + #idle_inhibitor.deactivated {color: @altred;} + #idle_inhibitor.activated {color: @altgreen;} + ''; + }; +} diff --git a/home-manager/wayland/wltools.nix b/home-manager/wayland/wltools.nix index d64b085..a764b3a 100644 --- a/home-manager/wayland/wltools.nix +++ b/home-manager/wayland/wltools.nix @@ -107,9 +107,110 @@ }; }; + # Rofi + + programs.rofi.enable = true; + programs.rofi.package = pkgs.rofi-wayland; + + xdg.configFile.rofi.source = ./rofi; + + # EWW + + programs.eww.enable = true; + programs.eww.configDir = ./eww; + + systemd.user.services.eww = + let eww = lib.getExe config.programs.eww.package; + in { + Install.WantedBy = [ "graphical-session.target" ]; + + Unit = { + Description = "GTK-based custom widgets"; + Documentation = "https://github.com/elkowar/eww"; + After = [ "graphical-session-pre.target" ]; + PartOf = [ "graphical-session.target" ]; + ConditionEnvironment = "WAYLAND_DISPLAY"; + }; + + Service = { + ExecStart = "${eww} daemon --no-daemonize"; + ExecStartPost = "${eww} open ${config.machine}_bar --screen 0"; + Restart = "always"; + RestartSec = "5"; + }; + }; + + # Mako + + services.mako.enable = true; + services.mako.settings = { + font = "JetBrainsMono Nerd Font 10"; + format = ''%a\n%s\n\n%b''; + layer = "overlay"; + backgroundColor = "#111320d0"; + width = 300; + margin = "5"; + padding = "5,10"; + borderSize = 2; + borderColor = "#7bc5e4"; + borderRadius = 5; + progressColor = "source #4e90ad"; + + extraConfig = + '' + [urgency=low] + format=%s\n%b + background-color=#111111c0 + border-color=#787c99 + progress-color=source #474f6f + border-size=1 + + [urgency=high] + background-color=#1e0909d0 + border-color=#ce7284 + progress-color=source #bc5469 + border-size=2 + default-timeout=0 + ignore-timeout=1 + + + [app-name=discord] + format=%s\n\n%b + border-color=#7da6ff + + [app-name=discordcanary] + format=%s\n\n%b + border-color=#7da6ff + + + [category=multimedia] + anchor=center + width=430 + font=JetBrainsMono Nerd Font 13 + format=%s + border-size=1 + default-timeout=2000 + + [category=multimedia app-name=pamixer body=false] + background-color=#111111c0 + border-color=#787c99 + progress-color=source #474f6f + + [category=multimedia app-name=pamixer body=true] + background-color=#111111c0 + border-color=#ce7284 + progress-color=source #bc5469 + + [category=multimedia app-name=brightnessctl] + background-color=#111111c0 + border-color=#ffea63 + progress-color=source #a08348 + ''; + }; + # WLuma - # systemd.user.services.wluma = lib.mkIf (config.machine == "fire") { + # systemd.user.services.wluma = lib.mkIf (config.machine== "fire") { # Install.WantedBy = [ "graphical-session.target" ]; # Unit = {