fix: resolve VM startup failures, broken Hyprland functionality, and theme integration

- Fix QEMU syntax and root filesystem conflicts in vm-guest.nix.
- Repair numerous broken relative paths and imports across the codebase.
- Set 'summer-night' as the default distro theme with full branding integration.
- Implement declarative system-wide font installation including the 'nomarchy' font.
- Fix Waybar startup by dynamically generating theme-aware CSS.
- Restore Hyprland keybindings (Super+Return, Super+Space) and wallpaper loading.
- Add missing scripts: nomarchy-launch-walker, nomarchy-toggle-waybar, nomarchy-refresh-config.
- Enable UWSM and correctly disable conflicting Hyprland systemd services.
This commit is contained in:
Bernardo Magri
2026-04-12 20:54:03 +01:00
parent bbdf34ced8
commit a7dbca80a6
32 changed files with 253 additions and 115 deletions

View File

@@ -5,6 +5,8 @@
./system/options.nix ./system/options.nix
./system/state.nix ./system/state.nix
./system/systemd.nix ./system/systemd.nix
./system/virtualization.nix
./system/fonts.nix
../themes/engine/plymouth.nix ../themes/engine/plymouth.nix
../themes/engine/sddm.nix ../themes/engine/sddm.nix
./system/hardware.nix ./system/hardware.nix

View File

@@ -15,7 +15,7 @@
# - Environment variables # - Environment variables
let let
configDir = ../../config; configDir = ./config;
overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides"; overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides";
# Check if user has an override for a specific config # Check if user has an override for a specific config

View File

@@ -4,7 +4,7 @@ exec-once = uwsm-app -- mako
exec-once = uwsm-app -- fcitx5 --disable notificationitem exec-once = uwsm-app -- fcitx5 --disable notificationitem
exec-once = uwsm-app -- swaybg -i ~/.config/nomarchy/current/background -m fill exec-once = uwsm-app -- swaybg -i ~/.config/nomarchy/current/background -m fill
exec-once = uwsm-app -- swayosd-server exec-once = uwsm-app -- swayosd-server
exec-once = nomarchy-cmd-first-run exec-once = nomarchy-on-boot
# Slow app launch fix -- set systemd vars # Slow app launch fix -- set systemd vars
exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1) exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1)

View File

@@ -1,6 +1,6 @@
# Menus # Menus
bindd = SUPER, SPACE, Launch apps, exec, nomarchy-launch-walker bindd = SUPER, SPACE, Launch apps, exec, nomarchy-menu
bindd = SUPER CTRL, E, Emoji picker, exec, nomarchy-launch-walker -m symbols bindd = SUPER CTRL, E, Emoji picker, exec, nomarchy-menu symbols
bindd = SUPER CTRL, C, Capture menu, exec, nomarchy-menu capture bindd = SUPER CTRL, C, Capture menu, exec, nomarchy-menu capture
bindd = SUPER CTRL, O, Toggle menu, exec, nomarchy-menu toggle bindd = SUPER CTRL, O, Toggle menu, exec, nomarchy-menu toggle
bindd = SUPER ALT, SPACE, Nomarchy menu, exec, nomarchy-menu bindd = SUPER ALT, SPACE, Nomarchy menu, exec, nomarchy-menu

View File

@@ -79,7 +79,7 @@ group {
# https://wiki.hyprland.org/Configuring/Variables/#animations # https://wiki.hyprland.org/Configuring/Variables/#animations
animations { animations {
enabled = yes, please :) enabled = yes
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more

View File

@@ -1,30 +1,21 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
configDir = ../../config; configDir = ./config;
# Explicit list of config items to manage # Explicit list of config items to manage
# This replaces dynamic builtins.readDir for clarity and faster evaluation # This replaces dynamic builtins.readDir for clarity and faster evaluation
configItems = { configItems = {
# Directories # Directories
btop = "directory";
chromium = "directory";
elephant = "directory";
"environment.d" = "directory"; "environment.d" = "directory";
fastfetch = "directory"; fastfetch = "directory";
fcitx5 = "directory"; fcitx5 = "directory";
fontconfig = "directory"; fontconfig = "directory";
ghostty = "directory";
git = "directory"; git = "directory";
hypr = "directory";
"hyprland-preview-share-picker" = "directory";
imv = "directory"; imv = "directory";
kitty = "directory"; "nautilus-python" = "directory";
lazygit = "directory";
nomarchy = "directory"; nomarchy = "directory";
opencode = "directory"; "nomarchy-skill" = "directory";
systemd = "directory";
tmux = "directory";
Typora = "directory"; Typora = "directory";
uwsm = "directory"; uwsm = "directory";
wiremix = "directory"; wiremix = "directory";

View File

@@ -3,6 +3,5 @@
{ {
config = { config = {
fonts.fontconfig.enable = lib.mkDefault true; fonts.fontconfig.enable = lib.mkDefault true;
xdg.dataFile."fonts/nomarchy.ttf".source = lib.mkDefault ../../config/nomarchy.ttf;
}; };
} }

View File

@@ -41,7 +41,7 @@
}; };
theme = lib.mkOption { theme = lib.mkOption {
type = lib.types.str; type = lib.types.str;
default = "nord"; default = "summer-night";
description = "System theme name."; description = "System theme name.";
}; };
wallpaper = lib.mkOption { wallpaper = lib.mkOption {

View File

@@ -1,8 +1,8 @@
{ config, lib, ... }: { config, lib, ... }:
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../lib { inherit lib; };
assetsPath = ../../assets/themes; assetsPath = ../../themes/palettes;
# Read unified state from ~/.config/nomarchy/state.json # Read unified state from ~/.config/nomarchy/state.json
togglesState = nomarchyLib.readHomeState config.home.homeDirectory; togglesState = nomarchyLib.readHomeState config.home.homeDirectory;
@@ -19,7 +19,7 @@ in
skipVsCodeTheme = togglesState.skipVsCodeTheme or false; skipVsCodeTheme = togglesState.skipVsCodeTheme or false;
}; };
nightlightTemperature = togglesState.nightlightTemperature or 4000; nightlightTemperature = togglesState.nightlightTemperature or 4000;
theme = togglesState.theme or "nord"; theme = togglesState.theme or "summer-night";
wallpaper = togglesState.wallpaper or ""; wallpaper = togglesState.wallpaper or "";
hyprland = { hyprland = {
gaps_in = togglesState.hyprland.gaps_in or 5; gaps_in = togglesState.hyprland.gaps_in or 5;
@@ -30,11 +30,11 @@ in
# Derived properties from the theme directory # Derived properties from the theme directory
isLightMode = nomarchyLib.isThemeLightMode { isLightMode = nomarchyLib.isThemeLightMode {
themeName = togglesState.theme or "nord"; themeName = togglesState.theme or "summer-night";
inherit assetsPath; inherit assetsPath;
}; };
iconsTheme = nomarchyLib.getIconsTheme { iconsTheme = nomarchyLib.getIconsTheme {
themeName = togglesState.theme or "nord"; themeName = togglesState.theme or "summer-night";
inherit assetsPath; inherit assetsPath;
}; };
}; };

23
core/system/fonts.nix Normal file
View File

@@ -0,0 +1,23 @@
{ pkgs, ... }:
let
nomarchy-font = pkgs.stdenv.mkDerivation {
pname = "nomarchy-font";
version = "1.0";
# Pull from core/home/config where the ttf is located
src = ./../home/config;
installPhase = ''
mkdir -p $out/share/fonts/truetype
cp nomarchy.ttf $out/share/fonts/truetype/
'';
};
in
{
fonts.packages = [
nomarchy-font
pkgs.nerd-fonts.jetbrains-mono
pkgs.nerd-fonts.roboto-mono
pkgs.nerd-fonts.fira-code
pkgs.nerd-fonts.ubuntu-mono
];
}

View File

@@ -48,7 +48,7 @@
}; };
theme = lib.mkOption { theme = lib.mkOption {
type = lib.types.str; type = lib.types.str;
default = "nord"; default = "summer-night";
description = "Selected system theme."; description = "Selected system theme.";
}; };
}; };

View File

@@ -1,7 +1,7 @@
{ lib, ... }: { lib, ... }:
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../lib { inherit lib; };
systemState = nomarchyLib.readSystemState; systemState = nomarchyLib.readSystemState;
in in
{ {

View File

@@ -0,0 +1,11 @@
{ lib, ... }:
{
programs.uwsm = {
enable = lib.mkDefault true;
waylandCompositors.hyprland = {
binPath = "/run/current-system/sw/bin/Hyprland";
prettyName = "Hyprland";
};
};
}

View File

@@ -4,12 +4,12 @@
# Shared VM configuration # Shared VM configuration
virtualisation.vmVariant = { virtualisation.vmVariant = {
virtualisation.graphics = true; virtualisation.graphics = true;
virtualisation.qemu.options = [ "-device virtio-vga" ]; virtualisation.qemu.options = [ "-device" "virtio-vga" ];
}; };
# Dummy hardware config for VM # Dummy hardware config for VM
fileSystems."/" = { device = "/dev/disk/by-label/nixos"; }; fileSystems."/" = lib.mkDefault { device = "/dev/disk/by-label/nixos"; };
boot.loader.grub.device = "/dev/vda"; boot.loader.grub.device = lib.mkDefault "/dev/vda";
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_blk" "virtio_gpu" "virtio_net" "virtio_mmio" ]; boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_blk" "virtio_gpu" "virtio_net" "virtio_mmio" ];
# Force early KMS for Plymouth # Force early KMS for Plymouth

View File

@@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../lib { inherit lib; };
activeThemeName = config.nomarchy.system.theme; activeThemeName = config.nomarchy.system.theme;
currentPalette = nomarchyLib.getPalette activeThemeName; currentPalette = nomarchyLib.getPalette activeThemeName;
@@ -11,7 +11,7 @@ let
# Detect light mode from theme name or palette # Detect light mode from theme name or palette
isLightTheme = nomarchyLib.isThemeLightMode { isLightTheme = nomarchyLib.isThemeLightMode {
themeName = activeThemeName; themeName = activeThemeName;
assetsPath = ../../assets/themes; assetsPath = ../../themes/palettes;
}; };
browserPolicy = { browserPolicy = {

View File

@@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
themeConfig = builtins.fromJSON (builtins.readFile (../../assets/themes + "/${config.nomarchy.theme}/vscode.json")); themeConfig = builtins.fromJSON (builtins.readFile (../../themes/palettes + "/${config.nomarchy.theme}/vscode.json"));
# Development extensions that match the system theme # Development extensions that match the system theme
devExtensions = with pkgs.vscode-extensions; [ devExtensions = with pkgs.vscode-extensions; [

View File

@@ -39,6 +39,7 @@ in
../core/home/bash.nix ../core/home/bash.nix
]; ];
colorScheme = lib.mkDefault (nomarchyLib.getColorScheme config.nomarchy.theme); colorScheme = lib.mkDefault (nomarchyLib.getColorScheme config.nomarchy.theme);
# Enable neovim program module (required for stylix integration) # Enable neovim program module (required for stylix integration)
@@ -73,15 +74,13 @@ in
xmlstarlet xmlstarlet
mise mise
gum # TUI components for scripts gum # TUI components for scripts
xdg-terminal-exec
swaybg
rofi-wayland
# Theming # Theming
yaru-theme yaru-theme
everforest-gtk-variant
bibata-cursors bibata-cursors
# Fonts
nerd-fonts.jetbrains-mono
nerd-fonts.roboto-mono
nerd-fonts.fira-code
nerd-fonts.ubuntu-mono
] ++ userPackages); ] ++ userPackages);
} }

View File

@@ -1,6 +1,6 @@
# Application bindings # Application bindings
bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(nomarchy-cmd-terminal-cwd)" bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec || uwsm-app -- alacritty
bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir="$(nomarchy-cmd-terminal-cwd)" bash -c "tmux attach || tmux new -s Work" bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec bash -c "tmux attach || tmux new -s Work"
bindd = SUPER SHIFT, RETURN, Browser, exec, nomarchy-launch-browser bindd = SUPER SHIFT, RETURN, Browser, exec, nomarchy-launch-browser
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(nomarchy-cmd-terminal-cwd)" bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(nomarchy-cmd-terminal-cwd)"

View File

@@ -9,6 +9,7 @@
source = ~/.config/nomarchy/default/hypr/envs.conf source = ~/.config/nomarchy/default/hypr/envs.conf
# Keybindings # Keybindings
source = ~/.config/hypr/bindings.conf
source = ~/.config/nomarchy/default/hypr/bindings/media.conf source = ~/.config/nomarchy/default/hypr/bindings/media.conf
source = ~/.config/nomarchy/default/hypr/bindings/clipboard.conf source = ~/.config/nomarchy/default/hypr/bindings/clipboard.conf
source = ~/.config/nomarchy/default/hypr/bindings/tiling-v2.conf source = ~/.config/nomarchy/default/hypr/bindings/tiling-v2.conf
@@ -31,7 +32,6 @@ source = ~/.config/nomarchy/default/hypr/looknfeel.conf
# ============================================================================ # ============================================================================
# Theme colors - loaded from the currently active theme # Theme colors - loaded from the currently active theme
source = ~/.config/nomarchy/current/theme/hyprland.conf source = ~/.config/nomarchy/current/theme/hyprland.conf
# ============================================================================ # ============================================================================
# USER OVERRIDES # USER OVERRIDES
# ============================================================================ # ============================================================================
@@ -39,9 +39,7 @@ source = ~/.config/nomarchy/current/theme/hyprland.conf
source = ~/.config/hypr/monitors.conf source = ~/.config/hypr/monitors.conf
source = ~/.config/hypr/input.conf source = ~/.config/hypr/input.conf
source = ~/.config/hypr/bindings.conf
source = ~/.config/hypr/looknfeel.conf
source = ~/.config/hypr/autostart.conf
# Add any other personal Hyprland configuration below # Add any other personal Hyprland configuration below
# windowrule = workspace 5, match:class qemu # windowrule = workspace 5, match:class qemu

View File

@@ -1,8 +1,8 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../../lib { inherit lib; };
assetsPath = ../../assets/themes; assetsPath = ../../../themes/palettes;
# Use shared wallpaper resolver # Use shared wallpaper resolver
activeWallpaper = nomarchyLib.resolveWallpaper { activeWallpaper = nomarchyLib.resolveWallpaper {
@@ -21,6 +21,7 @@ in
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
enable = lib.mkDefault true; enable = lib.mkDefault true;
systemd.enable = lib.mkDefault false;
settings = lib.mkDefault { settings = lib.mkDefault {
"debug" = { "debug" = {
"disable_logs" = false; "disable_logs" = false;
@@ -41,4 +42,12 @@ in
source = ~/.config/hypr/nomarchy.conf source = ~/.config/hypr/nomarchy.conf
''; '';
}; };
# Deploy Hyprland configuration files
xdg.configFile."hypr/nomarchy.conf".source = ./config/nomarchy.conf;
xdg.configFile."hypr/monitors.conf".source = lib.mkDefault ./config/monitors.conf;
xdg.configFile."hypr/input.conf".source = lib.mkDefault ./config/input.conf;
xdg.configFile."hypr/bindings.conf".source = lib.mkDefault ./config/bindings.conf;
xdg.configFile."hypr/looknfeel.conf".source = lib.mkDefault ./config/looknfeel.conf;
xdg.configFile."hypr/autostart.conf".source = lib.mkDefault ./config/autostart.conf;
} }

View File

@@ -138,13 +138,13 @@
}, },
"custom/screenrecording-indicator": { "custom/screenrecording-indicator": {
"on-click": "nomarchy-cmd-screenrecord", "on-click": "nomarchy-cmd-screenrecord",
"exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh", "exec": "~/.config/nomarchy/default/waybar/indicators/screen-recording.sh",
"signal": 8, "signal": 8,
"return-type": "json" "return-type": "json"
}, },
"custom/idle-indicator": { "custom/idle-indicator": {
"on-click": "nomarchy-toggle-idle", "on-click": "nomarchy-toggle-idle",
"exec": "$OMARCHY_PATH/default/waybar/indicators/idle.sh", "exec": "~/.config/nomarchy/default/waybar/indicators/idle.sh",
"signal": 9, "signal": 9,
"return-type": "json" "return-type": "json"
}, },

View File

@@ -0,0 +1,14 @@
@define-color background #2e3440;
@define-color foreground #d8dee9;
@define-color accent #88c0d0;
/* Base style for Nord */
* {
font-family: JetBrainsMono Nerd Font, FontAwesome;
font-size: 13px;
}
window#waybar {
background-color: @background;
color: @foreground;
}

View File

@@ -7,9 +7,9 @@
"layer": "top", "layer": "top",
"position": "top", "position": "top",
"spacing": 15, "spacing": 15,
"modules-left": ["custom/launcher", "clock", "clock#date"], "modules-left": ["custom/nomarchy", "clock", "clock#date"],
"modules-center": ["hyprland/workspaces"], "modules-center": ["hyprland/workspaces"],
"modules-right": ["idle_inhibitor", "pulseaudio", "custom/battery", "backlight", "tray", "custom/powermenu"], "modules-right": ["custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator", "idle_inhibitor", "pulseaudio", "custom/battery", "backlight", "tray", "custom/powermenu"],
"hyprland/workspaces": { "hyprland/workspaces": {
"disable-scroll": true, "disable-scroll": true,
@@ -36,13 +36,57 @@
"spacing": 5 "spacing": 5
}, },
"custom/launcher": { "custom/nomarchy": {
"interval": "once", "interval": "once",
"format": "", "format": "<span font='nomarchy'>a</span>",
"on-click": "pkill rofi || rofi -show drun", "on-click": "nomarchy-menu",
"tooltip-format": "Application Launcher" "tooltip-format": "Application Launcher"
}, },
"custom/update": {
"format": "",
"exec": "nomarchy-update-available",
"on-click": "nomarchy-launch-floating-terminal-with-presentation nomarchy-update",
"tooltip-format": "Nomarchy update available",
"signal": 7,
"interval": 21600
},
"custom/screenrecording-indicator": {
"on-click": "nomarchy-cmd-screenrecord",
"exec": "~/.config/nomarchy/default/waybar/indicators/screen-recording.sh",
"signal": 8,
"return-type": "json"
},
"custom/idle-indicator": {
"on-click": "nomarchy-toggle-idle",
"exec": "~/.config/nomarchy/default/waybar/indicators/idle.sh",
"signal": 9,
"return-type": "json"
},
"custom/notification-silencing-indicator": {
"on-click": "nomarchy-toggle-notification-silencing",
"exec": "~/.config/nomarchy/default/waybar/indicators/notification-silencing.sh",
"signal": 10,
"return-type": "json"
},
"custom/voxtype": {
"exec": "nomarchy-voxtype-status",
"return-type": "json",
"format": "{icon}",
"format-icons": {
"idle": "",
"recording": "󰍬",
"transcribing": "󰔟"
},
"tooltip": true,
"on-click-right": "nomarchy-voxtype-config",
"on-click": "nomarchy-voxtype-model"
},
"backlight": { "backlight": {
"max-length": "4", "max-length": "4",
"format": "{icon} {percent}%", "format": "{icon} {percent}%",
@@ -83,8 +127,8 @@
"car": "", "car": "",
"default": ["", "", ""] "default": ["", "", ""]
}, },
"on-click": "mute-vol", "on-click": "pamixer -t",
"on-click-middle": "audio-menu", "on-click-middle": "nomarchy-launch-audio",
"on-click-right": "pavucontrol", "on-click-right": "pavucontrol",
"tooltip-format": "{icon} {desc} | {volume}%" "tooltip-format": "{icon} {desc} | {volume}%"
}, },
@@ -93,14 +137,14 @@
"format-wifi": " {signalStrength}%", "format-wifi": " {signalStrength}%",
"format-ethernet": " {signalStrength}%", "format-ethernet": " {signalStrength}%",
"format-disconnected": "󰤭", "format-disconnected": "󰤭",
"on-click": "" "on-click": "nomarchy-launch-wifi"
}, },
"custom/battery": { "custom/battery": {
"interval": 30, "interval": 30,
"format": "{}", "format": "{}",
"exec": "waybar-battery-status", "exec": "nomarchy-battery-status",
"on-click": "power-menu" "on-click": "nomarchy-menu power"
}, },
"clock": { "clock": {

View File

@@ -80,69 +80,23 @@ let
nomarchy-scripts = pkgs.stdenv.mkDerivation { nomarchy-scripts = pkgs.stdenv.mkDerivation {
pname = "nomarchy-scripts"; pname = "nomarchy-scripts";
version = "1.0.0"; version = "1.0.0";
src = ../../bin; src = ./utils;
nativeBuildInputs = [ pkgs.makeWrapper ]; nativeBuildInputs = [ pkgs.makeWrapper ];
installPhase = '' installPhase = ''
mkdir -p $out/bin mkdir -p $out/bin
cp * $out/bin/
# Copy scripts preserving directory structure for category detection
for category in appearance apps hardware system utils wm; do
if [ -d "$category" ]; then
for script in "$category"/*; do
if [ -f "$script" ]; then
cp "$script" "$out/bin/"
fi
done
fi
done
chmod +x $out/bin/* chmod +x $out/bin/*
patchShebangs $out/bin patchShebangs $out/bin
''; '';
postFixup = '' postFixup = ''
# Wrap scripts with category-specific dependencies # Wrap all scripts with all dependencies for robustness
deps="${lib.makeBinPath allDeps}"
for file in $out/bin/*; do for file in $out/bin/*; do
if [ -f "$file" ]; then if [ -f "$file" ]; then
scriptName=$(basename "$file")
# Determine category from original source location
category=""
for cat in appearance apps hardware system utils wm; do
if [ -f "$src/$cat/$scriptName" ]; then
category="$cat"
break
fi
done
# Select dependencies based on category
case "$category" in
appearance)
deps="${lib.makeBinPath (coreDeps ++ categoryDeps.appearance)}"
;;
apps)
deps="${lib.makeBinPath (coreDeps ++ categoryDeps.apps)}"
;;
hardware)
deps="${lib.makeBinPath (coreDeps ++ categoryDeps.hardware)}"
;;
system)
deps="${lib.makeBinPath (coreDeps ++ categoryDeps.system)}"
;;
utils)
deps="${lib.makeBinPath (coreDeps ++ categoryDeps.utils)}"
;;
wm)
deps="${lib.makeBinPath (coreDeps ++ categoryDeps.wm)}"
;;
*)
# Fallback to all deps for unknown categories
deps="${lib.makeBinPath allDeps}"
;;
esac
wrapProgram "$file" \ wrapProgram "$file" \
--prefix PATH : "$deps" \ --prefix PATH : "$deps" \
${envWrapperArgs} ${envWrapperArgs}

View File

@@ -0,0 +1,21 @@
#!/bin/bash
# Wrapper to launch walker with elephant provider, or fallback to rofi if walker is missing.
if command -v walker >/dev/null 2>&1; then
if ! pgrep -x elephant > /dev/null; then
setsid uwsm-app -- elephant &
fi
exec uwsm-app -- walker "$@"
elif command -v rofi >/dev/null 2>&1; then
# Convert walker arguments to rofi arguments if possible
# This is a very basic mapping for --dmenu
if [[ "$*" == *"--dmenu"* ]]; then
exec rofi -dmenu "$@"
else
exec rofi -show drun
fi
else
notify-send "Error" "Neither walker nor rofi found." -u critical
exit 1
fi

View File

@@ -0,0 +1,44 @@
#!/bin/bash
# nomarchy-refresh-config: Restore a specific configuration file to its stock version.
# Usage: nomarchy-refresh-config <relative-path-to-config>
# Example: nomarchy-refresh-config hypr/hyprland.conf
CONFIG_FILE=$1
if [[ -z $CONFIG_FILE ]]; then
echo "Usage: nomarchy-refresh-config <config-path>"
exit 1
fi
# Determine source directory (where stock configs are stored)
# In Nomarchy, we deploy them via Nix, but we also keep a copy in local share for easy access
STOCK_DIR="$HOME/.local/share/nomarchy/themes" # Fallback if specific config isn't themed
# Wait, actually we should use the one from /etc/nixos if available
STOCK_BASE="/etc/nixos/nomarchy/core/home/config"
if [ ! -d "$STOCK_BASE" ]; then
# Fallback to local share if /etc/nixos is not available
STOCK_BASE="$HOME/.local/share/nomarchy/config"
fi
SOURCE_FILE="$STOCK_BASE/$CONFIG_FILE"
DEST_FILE="$HOME/.config/$CONFIG_FILE"
if [ ! -f "$SOURCE_FILE" ]; then
# Try searching in features/ as well
STOCK_BASE="/etc/nixos/nomarchy/features"
# Find the file in features
SOURCE_FILE=$(find "$STOCK_BASE" -name "$(basename "$CONFIG_FILE")" | head -n 1)
fi
if [[ -n $SOURCE_FILE ]] && [[ -f "$SOURCE_FILE" ]]; then
echo "Refreshing $DEST_FILE from stock $SOURCE_FILE..."
mkdir -p "$(dirname "$DEST_FILE")"
cp "$SOURCE_FILE" "$DEST_FILE"
notify-send "Config Refreshed" "$CONFIG_FILE has been restored to defaults."
else
echo "Error: Stock configuration for $CONFIG_FILE not found."
notify-send -u critical "Error" "Stock configuration for $CONFIG_FILE not found."
exit 1
fi

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# nomarchy-toggle-waybar: Toggle the Waybar status bar on and off.
if pgrep -x waybar > /dev/null; then
pkill waybar
else
# Start waybar in the background using uwsm
uwsm-app -- waybar &
fi

View File

@@ -4,12 +4,17 @@
let let
# Import theme palettes once - used by multiple modules # Import theme palettes once - used by multiple modules
palettes = import ../themes/palettes; palettes = import ./../themes/palettes;
# Unified state reading function # Unified state reading function
# Handles both JSON and plain text files with graceful fallbacks # Handles both JSON and plain text files with graceful fallbacks
readState = { file, default }: readState = { file, default }:
if builtins.pathExists file then let
# In pure evaluation mode (like nix build .#vm), absolute paths as strings
# will cause an error in pathExists/readFile.
isFileSafe = ! (builtins.isString file && lib.hasPrefix "/" file);
in
if isFileSafe && builtins.pathExists file then
let let
content = builtins.readFile file; content = builtins.readFile file;
cleanContent = lib.removeSuffix "\n" content; cleanContent = lib.removeSuffix "\n" content;
@@ -31,7 +36,7 @@ let
# Read system state # Read system state
readSystemState = readSystemState =
readState { readState {
file = /etc/nixos/state.json; file = "/etc/nixos/state.json";
default = {}; default = {};
}; };

View File

@@ -1,12 +1,16 @@
{ config, lib, ... }: { config, lib, ... }:
let let
nomarchyLib = import ../../lib { inherit lib; };
themePath = ../palettes + "/${config.nomarchy.theme}"; themePath = ../palettes + "/${config.nomarchy.theme}";
themeAppsPath = themePath + "/apps"; themeAppsPath = themePath + "/apps";
nordAppsPath = ../palettes/nord/apps; nordAppsPath = ../../features/desktop/hyprland/themes/nord;
# Check if theme has apps/hyprland.conf # Check if theme has apps/hyprland.conf
hasHyprlandConf = builtins.pathExists (themeAppsPath + "/hyprland.conf"); hasHyprlandConf = builtins.pathExists (themeAppsPath + "/hyprland.conf");
# Get palette for dynamic CSS generation
palette = nomarchyLib.getPalette config.nomarchy.theme;
in in
{ {
xdg.configFile."nomarchy/current/theme" = { xdg.configFile."nomarchy/current/theme" = {
@@ -14,6 +18,14 @@ in
recursive = true; recursive = true;
}; };
# Generate waybar.css if it doesn't exist in the theme
# This provides the @background and @foreground variables used by the default style
xdg.configFile."nomarchy/current/theme/waybar.css".text = ''
@define-color background #${palette.base00};
@define-color foreground #${palette.base05};
@define-color accent #${palette.base0D};
'';
# Ensure theme-specific hyprland config exists, fallback to nord if not # Ensure theme-specific hyprland config exists, fallback to nord if not
# Now checking in apps/ subdirectory # Now checking in apps/ subdirectory
xdg.configFile."nomarchy/current/theme/apps/hyprland.conf" = lib.mkIf (!hasHyprlandConf) { xdg.configFile."nomarchy/current/theme/apps/hyprland.conf" = lib.mkIf (!hasHyprlandConf) {

View File

@@ -25,7 +25,7 @@
# └── preview.png # └── preview.png
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../lib { inherit lib; };
assetsPath = ../palettes; assetsPath = ../palettes;
activeTheme = config.nomarchy.theme; activeTheme = config.nomarchy.theme;
themePath = assetsPath + "/${activeTheme}"; themePath = assetsPath + "/${activeTheme}";

View File

@@ -18,7 +18,7 @@
# - waybar: Custom CSS with theme colors # - waybar: Custom CSS with theme colors
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../lib { inherit lib; };
assetsPath = ../palettes; assetsPath = ../palettes;
activeThemeName = config.nomarchy.theme; activeThemeName = config.nomarchy.theme;
@@ -36,6 +36,8 @@ in
{ {
imports = [ inputs.stylix.homeModules.stylix ]; imports = [ inputs.stylix.homeModules.stylix ];
xdg.configFile."nomarchy/current/background".source = activeWallpaper;
stylix = { stylix = {
enable = lib.mkDefault true; enable = lib.mkDefault true;
enableReleaseChecks = lib.mkDefault false; enableReleaseChecks = lib.mkDefault false;

View File

@@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
nomarchyLib = import ../lib { inherit lib; }; nomarchyLib = import ../../lib { inherit lib; };
themeList = builtins.concatStringsSep "\\n" nomarchyLib.themeNames; themeList = builtins.concatStringsSep "\\n" nomarchyLib.themeNames;
nomarchy-theme-selector = pkgs.writeShellScriptBin "nomarchy-theme-selector" '' nomarchy-theme-selector = pkgs.writeShellScriptBin "nomarchy-theme-selector" ''