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 = {