refactor: implement component-based architecture for enhanced maintainability
- Reorganize directory structure into core/, features/, and themes/ - Colocate application Nix logic, configs, scripts, and theme overrides - Implement 'Inversion of Control' for theming: apps now pull theme-specific layouts - Update flake.nix and shared library paths to match the new structure - Document the new Feature-Centric architecture in README.md
This commit is contained in:
97
core/home/behavior.nix
Normal file
97
core/home/behavior.nix
Normal file
@@ -0,0 +1,97 @@
|
||||
{ config, lib, ... }:
|
||||
|
||||
# Behavior Configuration Module
|
||||
#
|
||||
# This module deploys non-visual configuration files (keybindings, input settings,
|
||||
# window rules, etc.) with lib.mkDefault, allowing downstream users to override.
|
||||
#
|
||||
# Visual/theme configs are handled separately by theme-loader.nix and stylix.nix.
|
||||
#
|
||||
# Behavior configs include:
|
||||
# - Keybindings (bindings, media keys, clipboard)
|
||||
# - Input settings (keyboard, mouse, touchpad)
|
||||
# - Window rules and layouts
|
||||
# - Autostart applications
|
||||
# - Environment variables
|
||||
|
||||
let
|
||||
configDir = ../../config;
|
||||
overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides";
|
||||
|
||||
# Check if user has an override for a specific config
|
||||
hasOverride = path: builtins.pathExists "${overridesDir}/${path}";
|
||||
|
||||
# Behavior config categories with their source paths
|
||||
behaviorConfigs = {
|
||||
# Hyprland behavior (non-visual)
|
||||
"nomarchy/default/hypr/bindings.conf" = "hypr/bindings.conf";
|
||||
"nomarchy/default/hypr/bindings/media.conf" = "hypr/bindings/media.conf";
|
||||
"nomarchy/default/hypr/bindings/clipboard.conf" = "hypr/bindings/clipboard.conf";
|
||||
"nomarchy/default/hypr/bindings/tiling-v2.conf" = "hypr/bindings/tiling-v2.conf";
|
||||
"nomarchy/default/hypr/bindings/utilities.conf" = "hypr/bindings/utilities.conf";
|
||||
"nomarchy/default/hypr/input.conf" = "hypr/input.conf";
|
||||
"nomarchy/default/hypr/windows.conf" = "hypr/windows.conf";
|
||||
"nomarchy/default/hypr/autostart.conf" = "hypr/autostart.conf";
|
||||
"nomarchy/default/hypr/envs.conf" = "hypr/envs.conf";
|
||||
"nomarchy/default/hypr/looknfeel.conf" = "hypr/looknfeel.conf";
|
||||
|
||||
# App-specific window rules (behavior, not visual)
|
||||
"nomarchy/default/hypr/apps.conf" = "hypr/apps.conf";
|
||||
"nomarchy/default/hypr/apps/qemu.conf" = "hypr/apps/qemu.conf";
|
||||
"nomarchy/default/hypr/apps/steam.conf" = "hypr/apps/steam.conf";
|
||||
"nomarchy/default/hypr/apps/terminals.conf" = "hypr/apps/terminals.conf";
|
||||
"nomarchy/default/hypr/apps/walker.conf" = "hypr/apps/walker.conf";
|
||||
"nomarchy/default/hypr/apps/browser.conf" = "hypr/apps/browser.conf";
|
||||
"nomarchy/default/hypr/apps/1password.conf" = "hypr/apps/1password.conf";
|
||||
"nomarchy/default/hypr/apps/bitwarden.conf" = "hypr/apps/bitwarden.conf";
|
||||
"nomarchy/default/hypr/apps/pip.conf" = "hypr/apps/pip.conf";
|
||||
"nomarchy/default/hypr/apps/system.conf" = "hypr/apps/system.conf";
|
||||
"nomarchy/default/hypr/apps/localsend.conf" = "hypr/apps/localsend.conf";
|
||||
"nomarchy/default/hypr/apps/telegram.conf" = "hypr/apps/telegram.conf";
|
||||
"nomarchy/default/hypr/apps/geforce.conf" = "hypr/apps/geforce.conf";
|
||||
"nomarchy/default/hypr/apps/moonlight.conf" = "hypr/apps/moonlight.conf";
|
||||
"nomarchy/default/hypr/apps/retroarch.conf" = "hypr/apps/retroarch.conf";
|
||||
"nomarchy/default/hypr/apps/webcam-overlay.conf" = "hypr/apps/webcam-overlay.conf";
|
||||
"nomarchy/default/hypr/apps/davinci-resolve.conf" = "hypr/apps/davinci-resolve.conf";
|
||||
"nomarchy/default/hypr/apps/hyprshot.conf" = "hypr/apps/hyprshot.conf";
|
||||
};
|
||||
|
||||
in
|
||||
{
|
||||
options.nomarchy.behavior = {
|
||||
hyprland = {
|
||||
bindings = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = "Whether to deploy default Hyprland keybindings.";
|
||||
};
|
||||
input = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = "Whether to deploy default input settings.";
|
||||
};
|
||||
windowRules = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = "Whether to deploy default window rules.";
|
||||
};
|
||||
autostart = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = "Whether to deploy default autostart configuration.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
# Note: The actual config deployment is handled by configs.nix
|
||||
# This module provides the options and documentation for behavior configs
|
||||
# The separation allows users to selectively disable behavior categories
|
||||
|
||||
# Ensure behavior config directories exist in overrides
|
||||
home.activation.createBehaviorOverrideDirs = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||
mkdir -p "${overridesDir}/hypr/bindings"
|
||||
mkdir -p "${overridesDir}/hypr/apps"
|
||||
'';
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user