From 91873cc19798fa9e6ed7eb11d9e489bd959f8acc Mon Sep 17 00:00:00 2001 From: mjallen18 Date: Thu, 26 Jun 2025 12:10:55 -0500 Subject: [PATCH] hyprland again, waybar updates, bluetooth updates, wallpaper updates --- base/base-nogui/default.nix | 2 + hosts/desktop/configuration.nix | 2 +- .../hyprland/config/hypr/default.nix | 10 +- .../hyprland/config/waybar/default.nix | 30 +- .../config/waybar/scripts/waybar-wttr.py | 379 ----------------- .../config/waybar/scripts/weather.nix | 387 ++++++++++++++++++ .../hyprland/config/wlogout/default.nix | 99 +++++ .../hyprland/config/wlogout/layout | 36 -- .../hyprland/config/wlogout/style.css | 50 --- .../desktop-environments/hyprland/default.nix | 32 +- .../hyprland/environment.nix | 26 +- .../desktop-environments/hyprland/home.nix | 4 +- .../desktop-environments/hyprland/theme.nix | 12 +- 13 files changed, 568 insertions(+), 501 deletions(-) delete mode 100755 modules/desktop-environments/hyprland/config/waybar/scripts/waybar-wttr.py create mode 100644 modules/desktop-environments/hyprland/config/waybar/scripts/weather.nix create mode 100644 modules/desktop-environments/hyprland/config/wlogout/default.nix delete mode 100755 modules/desktop-environments/hyprland/config/wlogout/layout delete mode 100755 modules/desktop-environments/hyprland/config/wlogout/style.css diff --git a/base/base-nogui/default.nix b/base/base-nogui/default.nix index ba1fcaa..d2f2256 100644 --- a/base/base-nogui/default.nix +++ b/base/base-nogui/default.nix @@ -17,6 +17,8 @@ in # Bluetooth bluetooth.enable = lib.mkDefault true; + i2c.enable = true; + # Enable all firmware enableAllFirmware = lib.mkForce true; }; diff --git a/hosts/desktop/configuration.nix b/hosts/desktop/configuration.nix index ce14a4c..a971db1 100755 --- a/hosts/desktop/configuration.nix +++ b/hosts/desktop/configuration.nix @@ -135,7 +135,7 @@ in environment = { systemPackages = systemPackages; - etc."lact/config.yaml".text = lactConfig; + # etc."lact/config.yaml".text = lactConfig; variables = environmentVariables; }; diff --git a/modules/desktop-environments/hyprland/config/hypr/default.nix b/modules/desktop-environments/hyprland/config/hypr/default.nix index d4c1ca0..2252a10 100755 --- a/modules/desktop-environments/hyprland/config/hypr/default.nix +++ b/modules/desktop-environments/hyprland/config/hypr/default.nix @@ -33,7 +33,7 @@ in # https://wiki.hyprland.org/Configuring/Binds/#mouse-buttons bind = [ - "$mod, Return, exec, kitty" + "$mod, Return, exec, ${theme.defaultApps.terminal.pname}" "$mod, SPACE, exec, wofi --show drun" "$mod, Q, killactive, " "$mod, M, exec, wlogout --protocol layer-shell" @@ -91,7 +91,7 @@ in "$mod SHIFT, k, movewindow, u" "$mod SHIFT, j, movewindow, d" - "$mod, b, exec, firefox" + "$mod, b, exec, ${theme.defaultApps.browser.pname}" ]; bindm = [ @@ -198,6 +198,7 @@ in "float, title:(.*branchdialog.*)" "float, class:(.*pavucontrol.*)" "move onscreen cursor 0% 0%, class:(.*pavucontrol.*)" + "float, class:(.*[Oo]verskride.*)" "float, class:(.*FileRoller.*)" "float, class:(.*wlogout.*)" "idleinhibit stayfocused, title:(.*mpv.*)" @@ -214,6 +215,9 @@ in "float, class:(.*vesktop),title:(.*Discord Popout.*)" "pin, class:(.*vesktop),title:(.*Discord Popout.*)" + # Music + "workspace: name:discord, class:(Apple Music.*)" + # Steam "float, class:(.*[Ss]team), title:(.*[Ss]team.*)$" "workspace name:steam silent, class:(.*[Ss]team), title:(.*[Ss]team.*)$" @@ -276,11 +280,9 @@ in exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = xhost +SI:localuser:root - exec-once = bing-wallpaper exec-once = nwg-look -a exec-once = nwg-dock-hyprland -d exec-once = nm-applet - exec-once = blueberry-tray exec-once = [silent] firefox exec-once = [silent] vesktop exec-once = [silent] chromium --app="https://music.apple.com" diff --git a/modules/desktop-environments/hyprland/config/waybar/default.nix b/modules/desktop-environments/hyprland/config/waybar/default.nix index c16fe54..c3586a1 100755 --- a/modules/desktop-environments/hyprland/config/waybar/default.nix +++ b/modules/desktop-environments/hyprland/config/waybar/default.nix @@ -22,6 +22,9 @@ let ''; in { + imports = [ + ./scripts/weather.nix + ]; # https://github.com/Alexays/Waybar/wiki/Module:-Hyprland # https://www.nerdfonts.com/cheat-sheet @@ -53,6 +56,7 @@ in "keyboard-state#numlock" "pulseaudio" "pulseaudio#microphone" + "bluetooth" "clock" "custom/weather" ]; @@ -175,6 +179,22 @@ in }; }; + "bluetooth" = { + on-click = "overskride"; + tooltip = true; + format = "{format-off}"; + format-disabled = "󰂲"; + format-off = "󰂲"; + format-on = "󰂯"; + format-connected = "󰂱"; + tooltip-format = "{status}"; + tooltip-format-disabled = "{status}"; + tooltip-format-off = "{status}"; + tooltip-format-on = "{status}"; + tooltip-format-connected = "{status}"; + tooltip-format-enumerate-connected = { }; + }; + "pulseaudio#microphone" = { format = "{format_source}"; format-source = ""; @@ -286,11 +306,19 @@ in /* ------------- */ + #bluetooth { + color: ${theme.nord.frost.nord9}; + background-color: ${theme.nord.polarNight.nord0}; + ${defaultOpacity} + ${borderRight} + } + #pulseaudio.microphone { color: ${theme.nord.frost.nord8}; background-color: ${theme.nord.polarNight.nord0}; ${defaultOpacity} - ${borderRight} + ${defaultCenterOptions} + border-radius: 0; } #pulseaudio { diff --git a/modules/desktop-environments/hyprland/config/waybar/scripts/waybar-wttr.py b/modules/desktop-environments/hyprland/config/waybar/scripts/waybar-wttr.py deleted file mode 100755 index f1eaf83..0000000 --- a/modules/desktop-environments/hyprland/config/waybar/scripts/waybar-wttr.py +++ /dev/null @@ -1,379 +0,0 @@ -#!/usr/bin/env nix-shell -#! nix-shell -i python3 --pure -#! nix-shell -p python3 python3Packages.requests - -import json -from datetime import datetime - -import requests - -WWO_CODE = { - "113": "Sunny", - "116": "PartlyCloudy", - "119": "Cloudy", - "122": "VeryCloudy", - "143": "Fog", - "176": "LightShowers", - "179": "LightSleetShowers", - "182": "LightSleet", - "185": "LightSleet", - "200": "ThunderyShowers", - "227": "LightSnow", - "230": "HeavySnow", - "248": "Fog", - "260": "Fog", - "263": "LightShowers", - "266": "LightRain", - "281": "LightSleet", - "284": "LightSleet", - "293": "LightRain", - "296": "LightRain", - "299": "HeavyShowers", - "302": "HeavyRain", - "305": "HeavyShowers", - "308": "HeavyRain", - "311": "LightSleet", - "314": "LightSleet", - "317": "LightSleet", - "320": "LightSnow", - "323": "LightSnowShowers", - "326": "LightSnowShowers", - "329": "HeavySnow", - "332": "HeavySnow", - "335": "HeavySnowShowers", - "338": "HeavySnow", - "350": "LightSleet", - "353": "LightShowers", - "356": "HeavyShowers", - "359": "HeavyRain", - "362": "LightSleetShowers", - "365": "LightSleetShowers", - "368": "LightSnowShowers", - "371": "HeavySnowShowers", - "374": "LightSleetShowers", - "377": "LightSleet", - "386": "ThunderyShowers", - "389": "ThunderyHeavyRain", - "392": "ThunderySnowShowers", - "395": "HeavySnowShowers", -} - -WEATHER_SYMBOL_EMOJI = { - "Unknown": "✨", - "Cloudy": "☁️", - "Fog": "🌫", - "HeavyRain": "🌧", - "HeavyShowers": "🌧", - "HeavySnow": "❄️", - "HeavySnowShowers": "❄️", - "LightRain": "🌦", - "LightShowers": "🌦", - "LightSleet": "🌧", - "LightSleetShowers": "🌧", - "LightSnow": "🌨", - "LightSnowShowers": "🌨", - "PartlyCloudy": "⛅️", - "Sunny": "☀️", - "ThunderyHeavyRain": "🌩", - "ThunderyShowers": "⛈", - "ThunderySnowShowers": "⛈", - "VeryCloudy": "☁️", -} - -WEATHER_SYMBOL = { - "Unknown": "✨", - "Cloudy": "☁️", - "Fog": "🌫", - "HeavyRain": "🌧", - "HeavyShowers": "🌧", - "HeavySnow": "❄️", - "HeavySnowShowers": "❄️", - "LightRain": "🌦", - "LightShowers": "🌦", - "LightSleet": "🌧", - "LightSleetShowers": "🌧", - "LightSnow": "🌨", - "LightSnowShowers": "🌨", - "PartlyCloudy": "⛅️", - "Sunny": "☀️", - "ThunderyHeavyRain": "🌩", - "ThunderyShowers": "⛈", - "ThunderySnowShowers": "⛈", - "VeryCloudy": "☁️", -} - -WEATHER_CODES = {key: WEATHER_SYMBOL[value] for key, value in WWO_CODE.items()} - -WIND_DIRECTION = [ - "↓", "↙", "←", "↖", "↑", "↗", "→", "↘", -] - -MOON_PHASES = ( - "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘" -) - -WEATHER_SYMBOL_WI_DAY = { - "Unknown": "", - "Cloudy": "", - "Fog": "", - "HeavyRain": "", - "HeavyShowers": "", - "HeavySnow": "", - "HeavySnowShowers": "", - "LightRain": "", - "LightShowers": "", - "LightSleet": "", - "LightSleetShowers": "", - "LightSnow": "", - "LightSnowShowers": "", - "PartlyCloudy": "", - "Sunny": "", - "ThunderyHeavyRain": "", - "ThunderyShowers": "", - "ThunderySnowShowers": "", - "VeryCloudy": "", -} - -WEATHER_CODES_WI_DAY = {key: WEATHER_SYMBOL_WI_DAY[value] for key, value in WWO_CODE.items()} - -WEATHER_SYMBOL_WI_NIGHT = { - "Unknown": "", - "Cloudy": "", - "Fog": "", - "HeavyRain": "", - "HeavyShowers": "", - "HeavySnow": "", - "HeavySnowShowers": "", - "LightRain": "", - "LightShowers": "", - "LightSleet": "", - "LightSleetShowers": "", - "LightSnow": "", - "LightSnowShowers": "", - "PartlyCloudy": "", - "Sunny": "", - "ThunderyHeavyRain": "", - "ThunderyShowers": "", - "ThunderySnowShowers": "", - "VeryCloudy": "", -} - -WEATHER_CODES_WI_NIGHT = {key: WEATHER_SYMBOL_WI_NIGHT[value] for key, value in WWO_CODE.items()} - -WIND_DIRECTION_WI = [ - "", "", "", "", "", "", "", "", -] - -WIND_SCALE_WI = [ - "", "", "", "", "", "", "", "", "", "", "", "", "", -] - -MOON_PHASES_WI = ( - "", "", "", "", "", "", "", - "", "", "", "", "", "", "", - "", "", "", "", "", "", "", - "", "", "", "", "", "", "", -) - -WEATHER_SYMBOL_WEGO = { - "Unknown": [ - " .-. ", - " __) ", - " ( ", - " `-’ ", - " • "], - "Sunny": [ - "\033[38;5;226m \\ / \033[0m", - "\033[38;5;226m .-. \033[0m", - "\033[38;5;226m ― ( ) ― \033[0m", - "\033[38;5;226m `-’ \033[0m", - "\033[38;5;226m / \\ \033[0m"], - "PartlyCloudy": [ - "\033[38;5;226m \\ /\033[0m ", - "\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m \\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - " "], - "Cloudy": [ - " ", - "\033[38;5;250m .--. \033[0m", - "\033[38;5;250m .-( ). \033[0m", - "\033[38;5;250m (___.__)__) \033[0m", - " "], - "VeryCloudy": [ - " ", - "\033[38;5;240;1m .--. \033[0m", - "\033[38;5;240;1m .-( ). \033[0m", - "\033[38;5;240;1m (___.__)__) \033[0m", - " "], - "LightShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], - "HeavyShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", - "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", - "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"], - "LightSnowShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;255m * * * \033[0m", - "\033[38;5;255m * * * \033[0m"], - "HeavySnowShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", - "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", - "\033[38;5;255;1m * * * * \033[0m", - "\033[38;5;255;1m * * * * \033[0m"], - "LightSleetShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", - "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"], - "ThunderyShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;228;5m ⚡\033[38;5;111;25m‘ ‘\033[38;5;228;5m⚡\033[38;5;111;25m‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], - "ThunderyHeavyRain": [ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"], - "ThunderySnowShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m*\033[38;5;228;5m⚡\033[38;5;255;25m* \033[0m", - "\033[38;5;255m * * * \033[0m"], - "LightRain": [ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], - "HeavyRain": [ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"], - "LightSnow": [ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;255m * * * \033[0m", - "\033[38;5;255m * * * \033[0m"], - "HeavySnow": [ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;255;1m * * * * \033[0m", - "\033[38;5;255;1m * * * * \033[0m"], - "LightSleet": [ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", - "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"], - "Fog": [ - " ", - "\033[38;5;251m _ - _ - _ - \033[0m", - "\033[38;5;251m _ - _ - _ \033[0m", - "\033[38;5;251m _ - _ - _ - \033[0m", - " "], -} - -data = {} - - -weather = requests.get("https://wttr.in/?u&format=j1").json() -moon = requests.get("https://wttr.in/?format=%m").text - - -def format_time(time): - return datetime.strptime(format_24_time(time), "%H").strftime("%I %p") - -def format_24_time(time): - return time.replace("00", "").zfill(2) - - -def format_temp(temp): - return (hour["FeelsLikeF"] + "°").ljust(3) - - -def format_chances(hour): - chances = { - "chanceoffog": "Fog", - "chanceoffrost": "Frost", - "chanceofovercast": "Overcast", - "chanceofrain": "Rain", - "chanceofsnow": "Snow", - "chanceofsunshine": "Sunshine", - "chanceofthunder": "Thunder", - "chanceofwindy": "Wind", - } - - conditions = [] - for event in chances.keys(): - if int(hour[event]) > 0: - conditions.append(chances[event] + " " + hour[event] + "%") - return ", ".join(conditions) - - -tempint = int(weather["current_condition"][0]["FeelsLikeF"]) -extrachar = "" -if tempint > 0 and tempint < 10: - extrachar = "+" - - -data["text"] = ( - " " - + WEATHER_CODES[weather["current_condition"][0]["weatherCode"]] - + " " - + extrachar - + weather["current_condition"][0]["FeelsLikeF"] - + "°F" -) - -data["tooltip"] = ( - f"{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_F']}°\n" -) -data["tooltip"] += f"Feels like: {weather['current_condition'][0]['FeelsLikeF']}°\n" -data["tooltip"] += f"Wind: {weather['current_condition'][0]['windspeedMiles']}mph\n" -data["tooltip"] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n" -data["tooltip"] += f"Moon phase: {weather["weather"][0]['astronomy'][0]['moon_phase']} " + moon + "\n" -for i, day in enumerate(weather["weather"]): - data["tooltip"] += f"\n" - if i == 0: - data["tooltip"] += "Today, " - if i == 1: - data["tooltip"] += "Tomorrow, " - date = datetime.strptime(day['date'], "%Y-%m-%d").strftime("%a %b %d %Y") - data["tooltip"] += f"{date}\n" - data["tooltip"] += f" {day['maxtempF']}°F  {day['mintempF']}°F" - data[ - "tooltip" - ] += f" {day['astronomy'][0]['sunrise']}  {day['astronomy'][0]['sunset']}\n" - for hour in day["hourly"]: - if i == 0: - if int(format_24_time(hour["time"])) < datetime.now().hour - 2: - continue - if int(format_24_time(hour["time"])) > datetime.strptime(day['astronomy'][0]['sunset'], "%I:%M %p").hour or int(format_24_time(hour["time"])) < datetime.strptime(day['astronomy'][0]['sunrise'], "%I:%M %p").hour: - codes = WEATHER_CODES_WI_NIGHT - else: - codes = WEATHER_CODES_WI_DAY - data[ - "tooltip" - ] += f"{format_time(hour['time'])} {codes[hour['weatherCode']]} {format_temp(hour['FeelsLikeF'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n" - - -print(json.dumps(data)) diff --git a/modules/desktop-environments/hyprland/config/waybar/scripts/weather.nix b/modules/desktop-environments/hyprland/config/waybar/scripts/weather.nix new file mode 100644 index 0000000..6dccd84 --- /dev/null +++ b/modules/desktop-environments/hyprland/config/waybar/scripts/weather.nix @@ -0,0 +1,387 @@ +{ pkgs, ... }: +let + waybar-weather = pkgs.writeScriptBin "waybar-weather" '' + #!/usr/bin/env nix-shell + #! nix-shell -i python3 --pure + #! nix-shell -p python3 python3Packages.requests + + import json + from datetime import datetime + + import requests + + WWO_CODE = { + "113": "Sunny", + "116": "PartlyCloudy", + "119": "Cloudy", + "122": "VeryCloudy", + "143": "Fog", + "176": "LightShowers", + "179": "LightSleetShowers", + "182": "LightSleet", + "185": "LightSleet", + "200": "ThunderyShowers", + "227": "LightSnow", + "230": "HeavySnow", + "248": "Fog", + "260": "Fog", + "263": "LightShowers", + "266": "LightRain", + "281": "LightSleet", + "284": "LightSleet", + "293": "LightRain", + "296": "LightRain", + "299": "HeavyShowers", + "302": "HeavyRain", + "305": "HeavyShowers", + "308": "HeavyRain", + "311": "LightSleet", + "314": "LightSleet", + "317": "LightSleet", + "320": "LightSnow", + "323": "LightSnowShowers", + "326": "LightSnowShowers", + "329": "HeavySnow", + "332": "HeavySnow", + "335": "HeavySnowShowers", + "338": "HeavySnow", + "350": "LightSleet", + "353": "LightShowers", + "356": "HeavyShowers", + "359": "HeavyRain", + "362": "LightSleetShowers", + "365": "LightSleetShowers", + "368": "LightSnowShowers", + "371": "HeavySnowShowers", + "374": "LightSleetShowers", + "377": "LightSleet", + "386": "ThunderyShowers", + "389": "ThunderyHeavyRain", + "392": "ThunderySnowShowers", + "395": "HeavySnowShowers", + } + + WEATHER_SYMBOL_EMOJI = { + "Unknown": "✨", + "Cloudy": "☁️", + "Fog": "🌫", + "HeavyRain": "🌧", + "HeavyShowers": "🌧", + "HeavySnow": "❄️", + "HeavySnowShowers": "❄️", + "LightRain": "🌦", + "LightShowers": "🌦", + "LightSleet": "🌧", + "LightSleetShowers": "🌧", + "LightSnow": "🌨", + "LightSnowShowers": "🌨", + "PartlyCloudy": "⛅️", + "Sunny": "☀️", + "ThunderyHeavyRain": "🌩", + "ThunderyShowers": "⛈", + "ThunderySnowShowers": "⛈", + "VeryCloudy": "☁️", + } + + WEATHER_SYMBOL = { + "Unknown": "✨", + "Cloudy": "☁️", + "Fog": "🌫", + "HeavyRain": "🌧", + "HeavyShowers": "🌧", + "HeavySnow": "❄️", + "HeavySnowShowers": "❄️", + "LightRain": "🌦", + "LightShowers": "🌦", + "LightSleet": "🌧", + "LightSleetShowers": "🌧", + "LightSnow": "🌨", + "LightSnowShowers": "🌨", + "PartlyCloudy": "⛅️", + "Sunny": "☀️", + "ThunderyHeavyRain": "🌩", + "ThunderyShowers": "⛈", + "ThunderySnowShowers": "⛈", + "VeryCloudy": "☁️", + } + + WEATHER_CODES = {key: WEATHER_SYMBOL[value] for key, value in WWO_CODE.items()} + + WIND_DIRECTION = [ + "↓", "↙", "←", "↖", "↑", "↗", "→", "↘", + ] + + MOON_PHASES = ( + "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘" + ) + + WEATHER_SYMBOL_WI_DAY = { + "Unknown": "", + "Cloudy": "", + "Fog": "", + "HeavyRain": "", + "HeavyShowers": "", + "HeavySnow": "", + "HeavySnowShowers": "", + "LightRain": "", + "LightShowers": "", + "LightSleet": "", + "LightSleetShowers": "", + "LightSnow": "", + "LightSnowShowers": "", + "PartlyCloudy": "", + "Sunny": "", + "ThunderyHeavyRain": "", + "ThunderyShowers": "", + "ThunderySnowShowers": "", + "VeryCloudy": "", + } + + WEATHER_CODES_WI_DAY = {key: WEATHER_SYMBOL_WI_DAY[value] for key, value in WWO_CODE.items()} + + WEATHER_SYMBOL_WI_NIGHT = { + "Unknown": "", + "Cloudy": "", + "Fog": "", + "HeavyRain": "", + "HeavyShowers": "", + "HeavySnow": "", + "HeavySnowShowers": "", + "LightRain": "", + "LightShowers": "", + "LightSleet": "", + "LightSleetShowers": "", + "LightSnow": "", + "LightSnowShowers": "", + "PartlyCloudy": "", + "Sunny": "", + "ThunderyHeavyRain": "", + "ThunderyShowers": "", + "ThunderySnowShowers": "", + "VeryCloudy": "", + } + + WEATHER_CODES_WI_NIGHT = {key: WEATHER_SYMBOL_WI_NIGHT[value] for key, value in WWO_CODE.items()} + + WIND_DIRECTION_WI = [ + "", "", "", "", "", "", "", "", + ] + + WIND_SCALE_WI = [ + "", "", "", "", "", "", "", "", "", "", "", "", "", + ] + + MOON_PHASES_WI = ( + "", "", "", "", "", "", "", + "", "", "", "", "", "", "", + "", "", "", "", "", "", "", + "", "", "", "", "", "", "", + ) + + WEATHER_SYMBOL_WEGO = { + "Unknown": [ + " .-. ", + " __) ", + " ( ", + " `-’ ", + " • "], + "Sunny": [ + "\033[38;5;226m \\ / \033[0m", + "\033[38;5;226m .-. \033[0m", + "\033[38;5;226m ― ( ) ― \033[0m", + "\033[38;5;226m `-’ \033[0m", + "\033[38;5;226m / \\ \033[0m"], + "PartlyCloudy": [ + "\033[38;5;226m \\ /\033[0m ", + "\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m", + "\033[38;5;226m \\_\033[38;5;250m( ). \033[0m", + "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", + " "], + "Cloudy": [ + " ", + "\033[38;5;250m .--. \033[0m", + "\033[38;5;250m .-( ). \033[0m", + "\033[38;5;250m (___.__)__) \033[0m", + " "], + "VeryCloudy": [ + " ", + "\033[38;5;240;1m .--. \033[0m", + "\033[38;5;240;1m .-( ). \033[0m", + "\033[38;5;240;1m (___.__)__) \033[0m", + " "], + "LightShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", + "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", + "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", + "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], + "HeavyShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", + "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", + "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", + "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"], + "LightSnowShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", + "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", + "\033[38;5;255m * * * \033[0m", + "\033[38;5;255m * * * \033[0m"], + "HeavySnowShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", + "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", + "\033[38;5;255;1m * * * * \033[0m", + "\033[38;5;255;1m * * * * \033[0m"], + "LightSleetShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", + "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", + "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", + "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"], + "ThunderyShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", + "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", + "\033[38;5;228;5m ⚡\033[38;5;111;25m‘ ‘\033[38;5;228;5m⚡\033[38;5;111;25m‘ ‘ \033[0m", + "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], + "ThunderyHeavyRain": [ + "\033[38;5;240;1m .-. \033[0m", + "\033[38;5;240;1m ( ). \033[0m", + "\033[38;5;240;1m (___(__) \033[0m", + "\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m", + "\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"], + "ThunderySnowShowers": [ + "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", + "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", + "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", + "\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m*\033[38;5;228;5m⚡\033[38;5;255;25m* \033[0m", + "\033[38;5;255m * * * \033[0m"], + "LightRain": [ + "\033[38;5;250m .-. \033[0m", + "\033[38;5;250m ( ). \033[0m", + "\033[38;5;250m (___(__) \033[0m", + "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", + "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], + "HeavyRain": [ + "\033[38;5;240;1m .-. \033[0m", + "\033[38;5;240;1m ( ). \033[0m", + "\033[38;5;240;1m (___(__) \033[0m", + "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", + "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"], + "LightSnow": [ + "\033[38;5;250m .-. \033[0m", + "\033[38;5;250m ( ). \033[0m", + "\033[38;5;250m (___(__) \033[0m", + "\033[38;5;255m * * * \033[0m", + "\033[38;5;255m * * * \033[0m"], + "HeavySnow": [ + "\033[38;5;240;1m .-. \033[0m", + "\033[38;5;240;1m ( ). \033[0m", + "\033[38;5;240;1m (___(__) \033[0m", + "\033[38;5;255;1m * * * * \033[0m", + "\033[38;5;255;1m * * * * \033[0m"], + "LightSleet": [ + "\033[38;5;250m .-. \033[0m", + "\033[38;5;250m ( ). \033[0m", + "\033[38;5;250m (___(__) \033[0m", + "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", + "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"], + "Fog": [ + " ", + "\033[38;5;251m _ - _ - _ - \033[0m", + "\033[38;5;251m _ - _ - _ \033[0m", + "\033[38;5;251m _ - _ - _ - \033[0m", + " "], + } + + data = {} + + + weather = requests.get("https://wttr.in/?u&format=j1").json() + moon = requests.get("https://wttr.in/?format=%m").text + + + def format_time(time): + return datetime.strptime(format_24_time(time), "%H").strftime("%I %p") + + def format_24_time(time): + return time.replace("00", "").zfill(2) + + + def format_temp(temp): + return (hour["FeelsLikeF"] + "°").ljust(3) + + + def format_chances(hour): + chances = { + "chanceoffog": "Fog", + "chanceoffrost": "Frost", + "chanceofovercast": "Overcast", + "chanceofrain": "Rain", + "chanceofsnow": "Snow", + "chanceofsunshine": "Sunshine", + "chanceofthunder": "Thunder", + "chanceofwindy": "Wind", + } + + conditions = [] + for event in chances.keys(): + if int(hour[event]) > 0: + conditions.append(chances[event] + " " + hour[event] + "%") + return ", ".join(conditions) + + + tempint = int(weather["current_condition"][0]["FeelsLikeF"]) + extrachar = "" + if tempint > 0 and tempint < 10: + extrachar = "+" + + + data["text"] = ( + " " + + WEATHER_CODES[weather["current_condition"][0]["weatherCode"]] + + " " + + extrachar + + weather["current_condition"][0]["FeelsLikeF"] + + "°F" + ) + + data["tooltip"] = ( + f"{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_F']}°\n" + ) + data["tooltip"] += f"Feels like: {weather['current_condition'][0]['FeelsLikeF']}°\n" + data["tooltip"] += f"Wind: {weather['current_condition'][0]['windspeedMiles']}mph\n" + data["tooltip"] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n" + data["tooltip"] += f"Moon phase: {weather["weather"][0]['astronomy'][0]['moon_phase']} " + moon + "\n" + for i, day in enumerate(weather["weather"]): + data["tooltip"] += f"\n" + if i == 0: + data["tooltip"] += "Today, " + if i == 1: + data["tooltip"] += "Tomorrow, " + date = datetime.strptime(day['date'], "%Y-%m-%d").strftime("%a %b %d %Y") + data["tooltip"] += f"{date}\n" + data["tooltip"] += f" {day['maxtempF']}°F  {day['mintempF']}°F" + data[ + "tooltip" + ] += f" {day['astronomy'][0]['sunrise']}  {day['astronomy'][0]['sunset']}\n" + for hour in day["hourly"]: + if i == 0: + if int(format_24_time(hour["time"])) < datetime.now().hour - 2: + continue + if int(format_24_time(hour["time"])) > datetime.strptime(day['astronomy'][0]['sunset'], "%I:%M %p").hour or int(format_24_time(hour["time"])) < datetime.strptime(day['astronomy'][0]['sunrise'], "%I:%M %p").hour: + codes = WEATHER_CODES_WI_NIGHT + else: + codes = WEATHER_CODES_WI_DAY + data[ + "tooltip" + ] += f"{format_time(hour['time'])} {codes[hour['weatherCode']]} {format_temp(hour['FeelsLikeF'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n" + + + print(json.dumps(data)) + ''; +in +{ + home.packages = [ waybar-weather ]; +} diff --git a/modules/desktop-environments/hyprland/config/wlogout/default.nix b/modules/desktop-environments/hyprland/config/wlogout/default.nix new file mode 100644 index 0000000..6d4d3a2 --- /dev/null +++ b/modules/desktop-environments/hyprland/config/wlogout/default.nix @@ -0,0 +1,99 @@ +{ pkgs, ... }: +let + theme = import ../../theme.nix { inherit pkgs; }; +in +{ + programs.wlogout = { + enable = true; + layout = { + lock = { + label = "lock"; + action = "hyprlock --immediate"; + text = "Lock"; + keybind = "l"; + }; + hibernate = { + label = "hibernate"; + action = "systemctl hibernate"; + text = "Hibernate"; + keybind = "h"; + }; + logout = { + label = "logout"; + action = "sleep 1; hyprctl dispatch exit"; + text = "Logout"; + keybind = "e"; + }; + shutdown = { + label = "shutdown"; + action = "systemctl poweroff"; + text = "Shutdown"; + keybind = "s"; + }; + suspend = { + label = "suspend"; + action = "systemctl suspend"; + text = "Suspend"; + keybind = "u"; + }; + reboot = { + label = "reboot"; + action = "reboot"; + text = "Reboot"; + keybind = "r"; + }; + }; + style = '' + * { + background-image: none; + } + + window { + background-color: ${theme.nord.polarNight.nord0}f0 + } + + button { + margin: 8px; + color: ${theme.nord.frost.nord7}; + background-color: ${theme.nord.polarNight.nord1}; + border-style: solid; + border-width: 2px; + background-repeat: no-repeat; + background-position: center; + background-size: 25%; + } + + button:active, + button:focus, + button:hover { + color: ${theme.nord.frost.nord8}; + background-color: ${theme.nord.polarNight.nord2}; + outline-style: none; + } + + #lock { + background-image: image(url("icons/lock.png")); + } + + #logout { + background-image: image(url("icons/logout.png")); + } + + #suspend { + background-image: image(url("icons/suspend.png")); + } + + #hibernate { + background-image: image(url("icons/hibernate.png")); + } + + #shutdown { + background-image: image(url("icons/shutdown.png")); + } + + #reboot { + background-image: image(url("icons/reboot.png")); + } + ''; + }; +} \ No newline at end of file diff --git a/modules/desktop-environments/hyprland/config/wlogout/layout b/modules/desktop-environments/hyprland/config/wlogout/layout deleted file mode 100755 index 6e546a1..0000000 --- a/modules/desktop-environments/hyprland/config/wlogout/layout +++ /dev/null @@ -1,36 +0,0 @@ -{ - "label" : "lock", - "action" : "swaylock", - "text" : "Lock", - "keybind" : "l" -} -{ - "label" : "hibernate", - "action" : "systemctl hibernate", - "text" : "Hibernate", - "keybind" : "h" -} -{ - "label" : "logout", - "action" : "sleep 1; hyprctl dispatch exit", - "text" : "Logout", - "keybind" : "e" -} -{ - "label" : "shutdown", - "action" : "systemctl poweroff", - "text" : "Shutdown", - "keybind" : "s" -} -{ - "label" : "suspend", - "action" : "systemctl suspend", - "text" : "Suspend", - "keybind" : "u" -} -{ - "label" : "reboot", - "action" : "systemctl reboot", - "text" : "Reboot", - "keybind" : "r" -} diff --git a/modules/desktop-environments/hyprland/config/wlogout/style.css b/modules/desktop-environments/hyprland/config/wlogout/style.css deleted file mode 100755 index 5ba48fe..0000000 --- a/modules/desktop-environments/hyprland/config/wlogout/style.css +++ /dev/null @@ -1,50 +0,0 @@ -* { - background-image: none; -} - -window { - background-color: rgba(36, 39, 58, 0.9); -} - -button { - margin: 8px; - color: #cad3f5; - background-color: #363a4f; - border-style: solid; - border-width: 2px; - background-repeat: no-repeat; - background-position: center; - background-size: 25%; -} - -button:active, -button:focus, -button:hover { - color: #8bd5ca; - background-color: #24273a; - outline-style: none; -} - -#lock { - background-image: image(url("icons/lock.png")); -} - -#logout { - background-image: image(url("icons/logout.png")); -} - -#suspend { - background-image: image(url("icons/suspend.png")); -} - -#hibernate { - background-image: image(url("icons/hibernate.png")); -} - -#shutdown { - background-image: image(url("icons/shutdown.png")); -} - -#reboot { - background-image: image(url("icons/reboot.png")); -} diff --git a/modules/desktop-environments/hyprland/default.nix b/modules/desktop-environments/hyprland/default.nix index 714d16d..080bc53 100755 --- a/modules/desktop-environments/hyprland/default.nix +++ b/modules/desktop-environments/hyprland/default.nix @@ -1,7 +1,17 @@ { pkgs, lib, ... }: let -# sddmTheme = "catppuccin-mocha"; theme = import ./theme.nix { inherit pkgs; }; + + bing-wallpaper = pkgs.writeScriptBin "bing-wallpaper" '' + # Directory to store wallpapers + IMG_PATH="/tmp/wallpaper.jpg" + + # Download if not already downloaded + URL=$(curl -s "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" | \ + jq -r '.images[0].url') + FULL_URL="https://www.bing.com$URL" + curl -s -o "$IMG_PATH" "$FULL_URL" + ''; in { imports = [ @@ -15,7 +25,8 @@ in sddm = { enable = true; package = pkgs.kdePackages.sddm; - theme = theme.sddmTheme; + extraPackages = [ theme.sddm.package ]; + theme = theme.sddm.themeName; wayland.enable = true; }; # Disable gdm @@ -47,6 +58,22 @@ in }; systemd = { + services = { + preload-bing-wallpaper = { + wants = [ "network.target" ]; + after = [ "network.target" ]; + wantedBy = [ "graphical-session.target" ]; + path = [ + pkgs.bash + pkgs.jq + pkgs.curl + bing-wallpaper + ]; + script = '' + bing-wallpaper + ''; + }; + }; user.services.polkit-gnome-authentication-agent-1 = { description = "polkit-gnome-authentication-agent-1"; wantedBy = [ "graphical-session.target" ]; @@ -92,6 +119,7 @@ in xdgOpenUsePortal = false; extraPortals = [ pkgs.xdg-desktop-portal-hyprland + pkgs.xdg-desktop-portal-gnome pkgs.xdg-desktop-portal-gtk ]; }; diff --git a/modules/desktop-environments/hyprland/environment.nix b/modules/desktop-environments/hyprland/environment.nix index fc846af..98631cd 100755 --- a/modules/desktop-environments/hyprland/environment.nix +++ b/modules/desktop-environments/hyprland/environment.nix @@ -1,28 +1,6 @@ { pkgs, ... }: -let - - waybarWeatherScript = pkgs.writeScriptBin "waybar-weather" '' - /home/matt/.config/waybar/scripts/waybar-wttr.py - ''; - - waybarUpdatesScript = pkgs.writeScriptBin "waybar-updates" '' - /home/matt/.config/waybar/scripts/waybar-updates.py - ''; - - bing-wallpaper = pkgs.writeScriptBin "bing-wallpaper" '' - # Directory to store wallpapers - IMG_PATH="/tmp/wallpaper.jpg" - - # Download if not already downloaded - URL=$(curl -s "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" | \ - jq -r '.images[0].url') - FULL_URL="https://www.bing.com$URL" - curl -s -o "$IMG_PATH" "$FULL_URL" - ''; -in { environment.systemPackages = with pkgs; [ - bing-wallpaper ddcutil dunst egl-wayland @@ -42,6 +20,7 @@ in hyprcursor hyprland hyprshot + kdePackages.qtmultimedia libnotify mako meson @@ -51,6 +30,7 @@ in nwg-dock-hyprland nwg-drawer nwg-look + overskride pamixer pavucontrol playerctl @@ -60,8 +40,6 @@ in qt6.qtwayland rofi-wayland waybar - waybarUpdatesScript - waybarWeatherScript wayland-protocols wayland-utils waypaper diff --git a/modules/desktop-environments/hyprland/home.nix b/modules/desktop-environments/hyprland/home.nix index 9500310..77bffe3 100755 --- a/modules/desktop-environments/hyprland/home.nix +++ b/modules/desktop-environments/hyprland/home.nix @@ -1,7 +1,7 @@ { lib, pkgs, ... }: let theme = import ./theme.nix { inherit pkgs; }; - wallpaper = "/home/matt/.config/wallpapers/wall.png"; + wallpaper = "/tmp/wallpaper.jpg"; in { imports = [ @@ -93,8 +93,6 @@ in }; services = { - blueman-applet.enable = true; - hyprpaper = { enable = true; settings = { diff --git a/modules/desktop-environments/hyprland/theme.nix b/modules/desktop-environments/hyprland/theme.nix index c28444f..08b3e25 100644 --- a/modules/desktop-environments/hyprland/theme.nix +++ b/modules/desktop-environments/hyprland/theme.nix @@ -6,6 +6,13 @@ let themeColor = "dark"; # [ "standard" "light" "dark" ] iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ] iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ] + + # customized_sddm_astronaut = pkgs.sddm-astronaut.override { + # embeddedTheme = "hyprland_kath"; + # themeConfig = { + # Background = "path/to/background.jpg"; + # }; + # }; in { # Displays @@ -52,7 +59,10 @@ in fontSize = 12; # SDDM/Locking - sddmTheme = "sddm-astronaut"; + sddm = { + themeName = "sddm-astronaut-theme"; + package = pkgs.sddm-astronaut; + }; lockScreenTimer = 900; # 15 min screenOffTimer = 930; # 15.5 min suspendTimer = 3600; # 1hr