From 1689f677d093afc46ffd8601ff26da43c13c1743 Mon Sep 17 00:00:00 2001 From: Youwen Wu Date: Sat, 19 Apr 2025 20:59:57 -0700 Subject: [PATCH] feat: add laptop w/ notch configuration for waybar --- .../desktop-environment/waybar/default.nix | 751 +++++++++--------- hm/modules/linux/platform-tweaks/default.nix | 1 - 2 files changed, 387 insertions(+), 365 deletions(-) diff --git a/hm/modules/linux/desktop-environment/waybar/default.nix b/hm/modules/linux/desktop-environment/waybar/default.nix index 4e17c6f..426a209 100644 --- a/hm/modules/linux/desktop-environment/waybar/default.nix +++ b/hm/modules/linux/desktop-environment/waybar/default.nix @@ -2,6 +2,7 @@ pkgs, config, lib, + osConfig, ... }: let @@ -21,377 +22,399 @@ in }; config = lib.mkIf cfg.enable { home.packages = with pkgs; [ playerctl ]; - programs.waybar = { - enable = true; - settings.mainBar = { - position = "top"; - layer = "top"; - height = 35; - margin-top = 0; - margin-bottom = 0; - margin-left = 0; - margin-right = 0; - modules-left = [ - "custom/launcher" - "custom/playerctl#backward" - "custom/playerctl#play" - "custom/playerctl#foward" - "custom/playerlabel" - ]; - modules-center = [ - "cava#left" - "hyprland/workspaces" - "cava#right" - ]; - modules-right = [ - "tray" - "battery" - "pulseaudio" - "network" - "clock" - ]; - clock = { - format = " {:%a, %d %b, %I:%M %p}"; - tooltip = "true"; - tooltip-format = "{:%Y %B}\n{calendar}"; - format-alt = " {:%d/%m}"; - }; - "hyprland/workspaces" = { - active-only = false; - all-outputs = false; - disable-scroll = false; - on-scroll-up = "${pkgs.hyprnome}/bin/hyprnome --move"; - on-scroll-down = "${pkgs.hyprnome}/bin/hyprnome --move --previous"; - format = "{icon}"; - on-click = "activate"; - format-icons = { - active = ""; - default = ""; - urgent = ""; - special = "󰠱"; - }; - sort-by-number = true; - }; - "cava#left" = { - framerate = 60; - autosens = 1; - bars = 18; - lower_cutoff_freq = 50; - higher_cutoff_freq = 10000; - method = "pipewire"; - source = "auto"; - stereo = true; - reverse = false; - bar_delimiter = 0; - monstercat = false; - waves = false; - input_delay = 2; - format-icons = [ - "" - "" - "" - "" - "" - "" - "" - "" + programs.waybar = + let + isDesktop = osConfig.liminalOS.formFactor == "desktop"; + isLaptop = osConfig.liminalOS.formFactor == "laptop"; + in + { + enable = true; + settings.mainBar = { + position = "top"; + layer = "top"; + height = 35; + margin-top = 0; + margin-bottom = 0; + margin-left = 0; + margin-right = 0; + modules-left = + [ + "custom/launcher" + "custom/playerctl#backward" + "custom/playerctl#play" + "custom/playerctl#foward" + "custom/playerlabel" + ] + ++ (lib.optionals isLaptop [ + "cava#left" + "hyprland/workspaces" + ]); + modules-center = lib.mkIf isDesktop [ + "cava#left" + "hyprland/workspaces" + "cava#right" ]; - }; - "cava#right" = { - framerate = 60; - autosens = 1; - bars = 18; - lower_cutoff_freq = 50; - higher_cutoff_freq = 10000; - method = "pipewire"; - source = "auto"; - stereo = true; - reverse = false; - bar_delimiter = 0; - monstercat = false; - waves = false; - input_delay = 2; - format-icons = [ - "" - "" - "" - "" - "" - "" - "" - "" + modules-right = [ + "tray" + "battery" + "pulseaudio" + "network" + "clock" ]; - }; - "custom/playerctl#backward" = { - format = "󰙣 "; - on-click = "playerctl previous"; - on-scroll-up = "playerctl volume .05+"; - on-scroll-down = "playerctl volume .05-"; - }; - "custom/playerctl#play" = { - format = "{icon}"; - return-type = "json"; - exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; - on-click = "playerctl play-pause"; - on-scroll-up = "playerctl volume .05+"; - on-scroll-down = "playerctl volume .05-"; - format-icons = { - Playing = "󰏥 "; - Paused = ""; - Stopped = ""; + clock = { + format = " {:%a, %d %b, %I:%M %p}"; + tooltip = "true"; + tooltip-format = "{:%Y %B}\n{calendar}"; + format-alt = " {:%d/%m}"; }; - }; - "custom/playerctl#foward" = { - format = "󰙡 "; - on-click = "playerctl next"; - on-scroll-up = "playerctl volume .05+"; - on-scroll-down = "playerctl volume .05-"; - }; - "custom/playerlabel" = { - format = "󰎈 {} 󰎈"; - return-type = "json"; - max-length = 40; - exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; - on-click = ""; - }; - battery = { - states = { - good = 95; - warning = 30; - critical = 15; + "hyprland/workspaces" = { + active-only = false; + all-outputs = false; + disable-scroll = false; + on-scroll-down = "${pkgs.hyprnome}/bin/hyprnome --move"; + on-scroll-up = "${pkgs.hyprnome}/bin/hyprnome --move --previous"; + format = "{icon}"; + on-click = "activate"; + format-icons = { + active = ""; + default = ""; + urgent = ""; + special = "󰠱"; + }; + sort-by-number = true; }; - format = "{icon} {capacity}%"; - format-charging = " {capacity}%"; - format-plugged = " {capacity}% "; - format-alt = "{icon} {time}"; - format-icons = [ - "" - "" - "" - "" - "" - ]; - }; - - memory = { - format = "󰍛 {}%"; - format-alt = "󰍛 {used}/{total} GiB"; - interval = 5; - }; - cpu = { - format = "󰻠 {usage}%"; - format-alt = "󰻠 {avg_frequency} GHz"; - interval = 5; - }; - network = { - format-wifi = " {signalStrength}%"; - format-ethernet = "󰈀 100% "; - tooltip-format = "Connected to {essid} {ifname} via {gwaddr}"; - format-linked = "{ifname} (No IP)"; - format-disconnected = "󰖪 0% "; - }; - tray = { - icon-size = 20; - spacing = 8; - }; - pulseaudio = { - format = "{icon} {volume}%"; - format-muted = "󰝟"; - format-icons = { - default = [ - "󰕿" - "󰖀" - "󰕾" + "cava#left" = { + framerate = 60; + autosens = 1; + bars = 18; + lower_cutoff_freq = 50; + higher_cutoff_freq = 10000; + method = "pipewire"; + source = "auto"; + stereo = true; + reverse = false; + bar_delimiter = 0; + monstercat = false; + waves = false; + input_delay = 2; + format-icons = [ + "" + "" + "" + "" + "" + "" + "" + "" ]; }; - # on-scroll-up= "bash ~/.scripts/volume up"; - # on-scroll-down= "bash ~/.scripts/volume down"; - scroll-step = 5; - on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; - }; - "custom/launcher" = - let - toggle-colorscheme = pkgs.writeShellScriptBin "toggle-colorscheme.sh" '' - POLARITY_FILE="/etc/polarity" - - if [[ ! -f "$POLARITY_FILE" ]]; then - exit 0 - elif [[ ! -r "$POLARITY_FILE" ]]; then - echo "Error: Cannot read $POLARITY_FILE. Check permissions." >&2 - exit 1 - fi - - current_scheme=$(cat "$POLARITY_FILE") - if [[ $? -ne 0 ]]; then - echo "Error: Failed to read content from $POLARITY_FILE." >&2 - exit 1 - fi - - current_scheme=$(echo "$current_scheme" | xargs) - - target_service="" - case "$current_scheme" in - dawn) - target_service="colorscheme-dusk.service" - ;; - dusk) - target_service="colorscheme-dawn.service" - ;; - *) - echo "Error: Invalid content '$current_scheme' found in $POLARITY_FILE. Expected 'dawn' or 'dusk'." >&2 - exit 1 - ;; - esac - - echo "Current scheme: '$current_scheme'. Attempting to start '$target_service'..." - systemctl start "$target_service" - - if [[ $? -ne 0 ]]; then - echo "Error: Failed to execute 'systemctl start $target_service'. Check systemctl logs or permissions." >&2 - exit 1 - else - echo "Command 'systemctl start $target_service' executed successfully." - fi - - exit 0 - ''; - in - { - format = ""; - on-click = "pkill -9 rofi || rofi -show drun"; - on-click-right = "${toggle-colorscheme}/bin/toggle-colorscheme.sh"; - tooltip = "false"; + "cava#right" = { + framerate = 60; + autosens = 1; + bars = 18; + lower_cutoff_freq = 50; + higher_cutoff_freq = 10000; + method = "pipewire"; + source = "auto"; + stereo = true; + reverse = false; + bar_delimiter = 0; + monstercat = false; + waves = false; + input_delay = 2; + format-icons = [ + "" + "" + "" + "" + "" + "" + "" + "" + ]; }; + "custom/playerctl#backward" = { + format = "󰙣 "; + on-click = "playerctl previous"; + on-scroll-up = "playerctl volume .05+"; + on-scroll-down = "playerctl volume .05-"; + }; + "custom/playerctl#play" = { + format = "{icon}"; + return-type = "json"; + exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; + on-click = "playerctl play-pause"; + on-scroll-up = "playerctl volume .05+"; + on-scroll-down = "playerctl volume .05-"; + format-icons = { + Playing = "󰏥 "; + Paused = ""; + Stopped = ""; + }; + }; + "custom/playerctl#foward" = { + format = "󰙡 "; + on-click = "playerctl next"; + on-scroll-up = "playerctl volume .05+"; + on-scroll-down = "playerctl volume .05-"; + }; + "custom/playerlabel" = { + format = "󰎈 {} 󰎈"; + return-type = "json"; + max-length = 40; + exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; + on-click = ""; + }; + battery = { + states = { + good = 95; + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = " {capacity}%"; + format-plugged = " {capacity}% "; + format-alt = "{icon} {time}"; + format-icons = [ + "" + "" + "" + "" + "" + ]; + }; + + memory = { + format = "󰍛 {}%"; + format-alt = "󰍛 {used}/{total} GiB"; + interval = 5; + }; + cpu = { + format = "󰻠 {usage}%"; + format-alt = "󰻠 {avg_frequency} GHz"; + interval = 5; + }; + network = { + format-wifi = " {signalStrength}%"; + format-ethernet = "󰈀 100% "; + tooltip-format = "Connected to {essid} {ifname} via {gwaddr}"; + format-linked = "{ifname} (No IP)"; + format-disconnected = "󰖪 0% "; + }; + tray = { + icon-size = 20; + spacing = 8; + }; + pulseaudio = { + format = "{icon} {volume}%"; + format-muted = "󰝟"; + format-icons = { + default = [ + "󰕿" + "󰖀" + "󰕾" + ]; + }; + # on-scroll-up= "bash ~/.scripts/volume up"; + # on-scroll-down= "bash ~/.scripts/volume down"; + scroll-step = 5; + on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; + }; + "custom/launcher" = + let + toggle-colorscheme = pkgs.writeShellScriptBin "toggle-colorscheme.sh" '' + POLARITY_FILE="/etc/polarity" + + if [[ ! -f "$POLARITY_FILE" ]]; then + exit 0 + elif [[ ! -r "$POLARITY_FILE" ]]; then + echo "Error: Cannot read $POLARITY_FILE. Check permissions." >&2 + exit 1 + fi + + current_scheme=$(cat "$POLARITY_FILE") + if [[ $? -ne 0 ]]; then + echo "Error: Failed to read content from $POLARITY_FILE." >&2 + exit 1 + fi + + current_scheme=$(echo "$current_scheme" | xargs) + + target_service="" + case "$current_scheme" in + dawn) + target_service="colorscheme-dusk.service" + ;; + dusk) + target_service="colorscheme-dawn.service" + ;; + *) + echo "Error: Invalid content '$current_scheme' found in $POLARITY_FILE. Expected 'dawn' or 'dusk'." >&2 + exit 1 + ;; + esac + + echo "Current scheme: '$current_scheme'. Attempting to start '$target_service'..." + systemctl start "$target_service" + + if [[ $? -ne 0 ]]; then + echo "Error: Failed to execute 'systemctl start $target_service'. Check systemctl logs or permissions." >&2 + exit 1 + else + echo "Command 'systemctl start $target_service' executed successfully." + fi + + exit 0 + ''; + in + { + format = ""; + on-click = "pkill -9 rofi || rofi -show drun"; + on-click-right = "${toggle-colorscheme}/bin/toggle-colorscheme.sh"; + tooltip = "false"; + }; + }; + style = + '' + * { + border: none; + border-radius: 0px; + font-family: GeistMono Nerd Font; + font-size: 13px; + min-height: 0; + } + window#waybar { + background: #${palette.base01}; + } + + #cava.left, #cava.right { + background: #${palette.base00}; + margin: 4px; + padding: 6px 16px; + color: #${palette.base00}; + } + #cava.left { + border-radius: 24px 10px 24px 10px; + } + #cava.right { + border-radius: 10px 24px 10px 24px; + } + #workspaces { + background: #${palette.base00}; + color: #${palette.base00} + } + #workspaces button { + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: transparent; + background: #${palette.base01}; + transition: all 0.3s ease-in-out; + } + + #workspaces button.active { + background-color: #${palette.base0A}; + color: #${palette.base01}; + border-radius: 16px; + min-width: 50px; + background-size: 400% 400%; + transition: all 0.3s ease-in-out; + } + + #workspaces button:hover { + background-color: #${palette.base05}; + color: #${palette.base01}; + border-radius: 16px; + min-width: 50px; + background-size: 400% 400%; + } + + #tray, #pulseaudio, #network, #battery, + #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward{ + background: #${palette.base00}; + font-weight: bold; + margin: 4px 0px; + } + #tray, #pulseaudio, #network, #battery{ + color: #${palette.base05}; + border-radius: 10px 24px 10px 24px; + padding: 0 20px; + margin-left: 7px; + } + #clock { + color: #${palette.base05}; + background: #${palette.base00}; + border-radius: 0px 0px 0px 40px; + padding: 8px 10px 8px 25px; + margin-left: 7px; + font-weight: bold; + font-size: 14px; + } + #custom-launcher { + color: #${palette.base0A}; + background: #${palette.base00}; + border-radius: 0px 0px 40px 0px; + margin: 0px; + padding: 0px 35px 0px 15px; + font-size: 24px; + } + + #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward { + background: #${palette.base00}; + font-size: 20px; + } + #custom-playerctl.backward:hover, #custom-playerctl.play:hover, #custom-playerctl.foward:hover{ + color: #${palette.base05}; + } + #custom-playerctl.backward { + color: #${palette.base08}; + border-radius: 24px 0px 0px 10px; + padding-left: 16px; + margin-left: 7px; + } + #custom-playerctl.play { + color: #${palette.base0A}; + padding: 0 5px; + } + #custom-playerctl.foward { + color: #${palette.base08}; + border-radius: 0px 10px 24px 0px; + padding-right: 12px; + margin-right: 7px + } + #custom-playerlabel { + background: #${palette.base00}; + color: #${palette.base05}; + padding: 0 20px; + border-radius: 24px 10px 24px 10px; + margin: 4px 0; + font-weight: bold; + } + #window{ + background: #${palette.base00}; + padding-left: 15px; + padding-right: 15px; + border-radius: 16px; + margin-top: 4px; + margin-bottom: 4px; + font-weight: normal; + font-style: normal; + } + '' + + (lib.optionalString isLaptop '' + #workspaces { + margin: 4px; + padding: 6px 16px; + border-radius: 24px 10px 24px 10px; + } + '') + + (lib.optionalString isDesktop '' + #workspaces { + margin: 4px 5px; + padding: 6px 5px; + border-radius: 16px; + } + ''); }; - style = '' - * { - border: none; - border-radius: 0px; - font-family: GeistMono Nerd Font; - font-size: 13px; /* Reduced font size */ - min-height: 0; - } - window#waybar { - background: #${palette.base01}; - } - - #cava.left, #cava.right { - background: #${palette.base00}; - margin: 4px; /* Reduced margin */ - padding: 6px 16px; /* Reduced vertical padding */ - color: #${palette.base00}; - } - #cava.left { - border-radius: 24px 10px 24px 10px; - } - #cava.right { - border-radius: 10px 24px 10px 24px; - } - #workspaces { - background: #${palette.base00}; - margin: 4px 5px; /* Reduced vertical margin */ - padding: 6px 5px; /* Reduced vertical padding */ - border-radius: 16px; - color: #${palette.base00} - } - #workspaces button { - padding: 0px 5px; - margin: 0px 3px; - border-radius: 16px; - color: transparent; - background: #${palette.base01}; - transition: all 0.3s ease-in-out; - } - - #workspaces button.active { - background-color: #${palette.base0A}; - color: #${palette.base01}; - border-radius: 16px; - min-width: 50px; - background-size: 400% 400%; - transition: all 0.3s ease-in-out; - } - - #workspaces button:hover { - background-color: #${palette.base05}; - color: #${palette.base01}; - border-radius: 16px; - min-width: 50px; - background-size: 400% 400%; - } - - #tray, #pulseaudio, #network, #battery, - #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward{ - background: #${palette.base00}; - font-weight: bold; - margin: 4px 0px; /* Reduced vertical margin */ - } - #tray, #pulseaudio, #network, #battery{ - color: #${palette.base05}; - border-radius: 10px 24px 10px 24px; - padding: 0 20px; - margin-left: 7px; - } - #clock { - color: #${palette.base05}; - background: #${palette.base00}; - border-radius: 0px 0px 0px 40px; - padding: 8px 10px 8px 25px; /* Reduced vertical padding */ - margin-left: 7px; - font-weight: bold; - font-size: 14px; /* Reduced font size */ - } - #custom-launcher { - color: #${palette.base0A}; - background: #${palette.base00}; - border-radius: 0px 0px 40px 0px; - margin: 0px; - padding: 0px 35px 0px 15px; - font-size: 24px; /* Reduced font size */ - } - - #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward { - background: #${palette.base00}; - font-size: 20px; /* Reduced font size */ - } - #custom-playerctl.backward:hover, #custom-playerctl.play:hover, #custom-playerctl.foward:hover{ - color: #${palette.base05}; - } - #custom-playerctl.backward { - color: #${palette.base08}; - border-radius: 24px 0px 0px 10px; - padding-left: 16px; - margin-left: 7px; - } - #custom-playerctl.play { - color: #${palette.base0A}; - padding: 0 5px; - } - #custom-playerctl.foward { - color: #${palette.base08}; - border-radius: 0px 10px 24px 0px; - padding-right: 12px; - margin-right: 7px - } - #custom-playerlabel { - background: #${palette.base00}; - color: #${palette.base05}; - padding: 0 20px; - border-radius: 24px 10px 24px 10px; - margin: 4px 0; /* Reduced vertical margin */ - font-weight: bold; - } - #window{ - background: #${palette.base00}; - padding-left: 15px; - padding-right: 15px; - border-radius: 16px; - margin-top: 4px; /* Reduced margin */ - margin-bottom: 4px; /* Reduced margin */ - font-weight: normal; - font-style: normal; - } - ''; - }; }; } diff --git a/hm/modules/linux/platform-tweaks/default.nix b/hm/modules/linux/platform-tweaks/default.nix index f3ab7e4..93f4723 100644 --- a/hm/modules/linux/platform-tweaks/default.nix +++ b/hm/modules/linux/platform-tweaks/default.nix @@ -1,5 +1,4 @@ { - inputs, lib, config, osConfig,