diff --git a/CONFIGURATION_GUIDE.md b/CONFIGURATION_GUIDE.md new file mode 100644 index 0000000..d2ff2a8 --- /dev/null +++ b/CONFIGURATION_GUIDE.md @@ -0,0 +1,245 @@ +# 🎯 dots-hyprland Static Configuration Guide + +## 📍 Overview + +Since you're using **declarative mode**, configuration files are read-only in the Nix store. To customize static values, modify the source files in your flake and rebuild. + +## 🔧 Key Configuration Files + +### 1. 📱 Quickshell Main Config +**File**: `configs/quickshell/ii/modules/common/Config.qml` + +#### 🎨 Appearance Settings +```qml +property JsonObject appearance: JsonObject { + property bool extraBackgroundTint: true + property int fakeScreenRounding: 2 // 0: None | 1: Always | 2: When not fullscreen + property bool transparency: false + property JsonObject wallpaperTheming: JsonObject { + property bool enableAppsAndShell: true + property bool enableQtApps: true + property bool enableTerminal: true + } +} +``` + +#### 🖥️ Bar Configuration +```qml +property JsonObject bar: JsonObject { + property bool bottom: false // Instead of top + property int cornerStyle: 0 // 0: Hug | 1: Float | 2: Plain rectangle + property bool borderless: false + property string topLeftIcon: "spark" // Options: distro, spark + property bool showBackground: true + property bool verbose: true + + property JsonObject utilButtons: JsonObject { + property bool showScreenSnip: true + property bool showColorPicker: false + property bool showMicToggle: false + property bool showKeyboardToggle: true + property bool showDarkModeToggle: true + property bool showPerformanceProfileToggle: false + } + + property JsonObject workspaces: JsonObject { + property bool monochromeIcons: true + property int shown: 10 + property bool showAppIcons: true + property bool alwaysShowNumbers: false + property int showNumberDelay: 300 // milliseconds + } +} +``` + +#### 🔋 Battery Settings +```qml +property JsonObject battery: JsonObject { + property int low: 20 + property int critical: 5 + property bool automaticSuspend: true + property int suspend: 3 +} +``` + +#### 🚀 Applications +```qml +property JsonObject apps: JsonObject { + property string bluetooth: "kcmshell6 kcm_bluetooth" + property string network: "plasmawindowed org.kde.plasma.networkmanagement" + property string networkEthernet: "kcmshell6 kcm_networkmanagement" + property string taskManager: "plasma-systemmonitor --page-name Processes" + property string terminal: "kitty -1" // This is only for shell actions +} +``` + +#### ⏰ Time Format +```qml +property JsonObject time: JsonObject { + property string format: "hh:mm" + property string dateFormat: "ddd, dd/MM" +} +``` + +### 2. 🖼️ Hyprland Configuration +**File**: `configs/hypr/general.conf.template` + +#### 🎨 Visual Settings +```conf +general { + gaps_in = @GAPS_IN@ # Inner gaps (default: 4) + gaps_out = @GAPS_OUT@ # Outer gaps (default: 7) + gaps_workspaces = 50 # Workspace gaps + + border_size = @BORDER_SIZE@ # Border width (default: 2) + resize_on_border = true + + allow_tearing = @ALLOW_TEARING@ # For gaming +} + +decoration { + rounding = @ROUNDING@ # Corner rounding (default: 16) + + blur { + enabled = @BLUR_ENABLED@ # Background blur + xray = true + } +} +``` + +### 3. 🖥️ Terminal Configuration +**File**: `configs/applications/foot.ini.template` + +#### 📝 Terminal Settings +```ini +[main] +term=xterm-256color +login-shell=yes +app-id=foot +title=foot + +[scrollback] +lines=1000 # Scrollback buffer size +multiplier=3.0 + +[cursor] +style=beam # Options: block, beam, underline +blink=no +beam-thickness=1.5 + +[colors] +alpha=0.95 # Terminal transparency +``` + +### 4. 🎯 Fuzzel Launcher +**File**: `configs/matugen/templates/fuzzel/fuzzel_theme.ini` + +#### 🚀 Launcher Settings +```ini +[main] +terminal=foot +layer=overlay +width=40 +horizontal-pad=40 +vertical-pad=8 +inner-pad=5 +``` + +## 🔄 How to Apply Changes + +### Method 1: Edit and Rebuild +1. **Edit** the configuration files in `~/sources/celesrenata/end-4-flakes/configs/` +2. **Commit** your changes: `git add . && git commit -m "Update static config"` +3. **Rebuild**: `nix build .#homeConfigurations.declarative.activationPackage` +4. **Activate**: `./result/activate` + +### Method 2: Switch to Writable Mode +If you want to edit configs directly without rebuilding: + +```bash +# Build writable configuration +nix build .#homeConfigurations.writable.activationPackage +./result/activate + +# Run setup script +~/.local/bin/initialSetup.sh + +# Edit configs directly in ~/.config/ +``` + +## 🎨 Common Customizations + +### Change Terminal to Kitty +In `configs/quickshell/ii/modules/common/Config.qml`: +```qml +property string terminal: "kitty -1" +``` + +### Move Bar to Bottom +```qml +property bool bottom: true +``` + +### Disable Transparency +```qml +property bool transparency: false +``` + +### Change Time Format to 12-hour +```qml +property string format: "hh:mm AP" +``` + +### Increase Terminal Scrollback +In `configs/applications/foot.ini.template`: +```ini +[scrollback] +lines=10000 +``` + +### Change Workspace Count +```qml +property int shown: 5 // Show only 5 workspaces +``` + +## 🔍 Finding More Options + +- **Quickshell Config**: `configs/quickshell/ii/modules/common/Config.qml` (lines 1-300) +- **Hyprland Settings**: `configs/hypr/*.conf.template` files +- **Application Configs**: `configs/applications/` directory +- **Theming Templates**: `configs/matugen/templates/` directory + +## 💡 Pro Tips + +1. **Search for specific settings**: `grep -r "property.*terminal" configs/` +2. **Check template variables**: Look for `@VARIABLE@` patterns in `.template` files +3. **Test changes**: Use writable mode for quick testing, then apply to declarative mode +4. **Backup configs**: Git tracks all changes, so you can always revert + +## 🚀 Quick Start Examples + +### Minimal Gaming Setup +```qml +// In Config.qml +property bool transparency: false +property bool showBackground: false +property int shown: 3 // Only 3 workspaces +``` + +### Productivity Setup +```qml +// In Config.qml +property bool showScreenSnip: true +property bool showColorPicker: true +property string format: "HH:mm:ss" +property string dateFormat: "dddd, MMMM dd, yyyy" +``` + +### Minimalist Setup +```qml +// In Config.qml +property bool borderless: true +property bool showBackground: false +property bool monochromeIcons: true +property bool verbose: false +``` diff --git a/NIXOS_CONFIGURATION_GUIDE.md b/NIXOS_CONFIGURATION_GUIDE.md new file mode 100644 index 0000000..08b09ce --- /dev/null +++ b/NIXOS_CONFIGURATION_GUIDE.md @@ -0,0 +1,342 @@ +# 🎯 NixOS Configuration Guide for dots-hyprland + +## 📍 The NixOS Way + +In NixOS, you **don't edit configuration files directly**. Instead, you configure everything through **Nix expressions** that generate the configuration files. + +## 🔧 Current State vs Ideal State + +### ❌ Current State (Basic) +The current module only exposes basic options: +```nix +programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "essential"; + mode = "declarative"; +}; +``` + +### ✅ Ideal State (Rich Configuration) +What we're building - full NixOS-style configuration: +```nix +programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "essential"; + mode = "declarative"; + + # Quickshell configuration + quickshell = { + bar = { + bottom = false; + topLeftIcon = "spark"; + utilButtons = { + showColorPicker = true; + showScreenSnip = true; + showMicToggle = false; + }; + workspaces = { + shown = 10; + showAppIcons = true; + }; + }; + + battery = { + low = 20; + critical = 5; + }; + + apps = { + terminal = "foot"; + }; + + time = { + format = "hh:mm"; + dateFormat = "ddd, dd/MM"; + }; + }; + + # Hyprland configuration + hyprland = { + general = { + gapsIn = 4; + gapsOut = 7; + borderSize = 2; + }; + + decoration = { + rounding = 16; + blurEnabled = true; + }; + + monitors = [ + "eDP-1,1920x1080@60,0x0,1" + ]; + }; +}; +``` + +## 🚀 How to Configure (The NixOS Way) + +### Method 1: In Your Flake Configuration +Edit your flake.nix homeConfigurations: + +```nix +homeConfigurations.declarative = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + modules = [ + self.homeManagerModules.default + { + home.username = "celes"; + home.homeDirectory = "/home/celes"; + home.stateVersion = "24.05"; + + programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "essential"; + mode = "declarative"; + + # Your custom configuration here + quickshell.bar.utilButtons.showColorPicker = true; + quickshell.apps.terminal = "foot"; + hyprland.general.gapsIn = 6; + }; + } + ]; +}; +``` + +### Method 2: Separate Configuration File +Create `config/my-dots-config.nix`: + +```nix +{ config, lib, pkgs, ... }: + +{ + programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "essential"; + mode = "declarative"; + + quickshell = { + appearance = { + transparency = true; + fakeScreenRounding = 1; + }; + + bar = { + bottom = true; # Move bar to bottom + topLeftIcon = "distro"; + cornerStyle = 1; # Float style + + utilButtons = { + showColorPicker = true; + showScreenSnip = true; + showMicToggle = true; + showDarkModeToggle = true; + }; + + workspaces = { + shown = 5; # Only show 5 workspaces + monochromeIcons = false; + alwaysShowNumbers = true; + }; + }; + + battery = { + low = 25; + critical = 10; + automaticSuspend = false; + }; + + apps = { + terminal = "foot"; + taskManager = "htop"; + }; + + time = { + format = "HH:mm:ss"; # 24-hour with seconds + dateFormat = "dddd, MMMM dd, yyyy"; + }; + }; + + hyprland = { + general = { + gapsIn = 6; + gapsOut = 10; + borderSize = 3; + allowTearing = true; # For gaming + }; + + decoration = { + rounding = 12; + blurEnabled = false; # Disable for performance + }; + + gestures = { + workspaceSwipe = true; + }; + + monitors = [ + "eDP-1,1920x1080@60,0x0,1" + "HDMI-A-1,1920x1080@60,1920x0,1" + ]; + }; + }; +} +``` + +Then import it in your flake: +```nix +modules = [ + self.homeManagerModules.default + ./config/my-dots-config.nix + { + home.username = "celes"; + home.homeDirectory = "/home/celes"; + home.stateVersion = "24.05"; + } +]; +``` + +## 🔄 Development Workflow + +### 1. Add New Configuration Options +Edit `modules/components/quickshell-config.nix` to add new options: + +```nix +newFeature = mkOption { + type = types.bool; + default = false; + description = "Enable new feature"; +}; +``` + +### 2. Update Configuration Generation +Update the config generation to use the new option: + +```nix +property bool newFeature: ${boolToString cfg.newFeature} +``` + +### 3. Test and Apply +```bash +# Test the configuration +nix build .#homeConfigurations.declarative.activationPackage + +# Apply changes +./result/activate +``` + +## 🎨 Common Configuration Examples + +### Gaming Setup +```nix +programs.dots-hyprland = { + quickshell = { + appearance.transparency = false; + bar = { + showBackground = false; + workspaces.shown = 3; + }; + }; + + hyprland = { + general.allowTearing = true; + decoration.blurEnabled = false; + }; +}; +``` + +### Productivity Setup +```nix +programs.dots-hyprland = { + quickshell = { + bar = { + utilButtons = { + showScreenSnip = true; + showColorPicker = true; + }; + workspaces.shown = 10; + }; + + time = { + format = "HH:mm:ss"; + dateFormat = "dddd, MMMM dd, yyyy"; + }; + }; + + hyprland = { + general = { + gapsIn = 2; + gapsOut = 4; + }; + }; +}; +``` + +### Minimalist Setup +```nix +programs.dots-hyprland = { + quickshell = { + bar = { + borderless = true; + showBackground = false; + verbose = false; + workspaces = { + monochromeIcons = true; + showAppIcons = false; + }; + }; + }; + + hyprland = { + decoration.rounding = 0; + }; +}; +``` + +## 🔍 Available Options + +### Quickshell Options +- `appearance.*` - Visual appearance settings +- `bar.*` - Top bar configuration +- `battery.*` - Battery management +- `apps.*` - Application commands +- `time.*` - Time and date formatting + +### Hyprland Options +- `general.*` - Window gaps, borders, tearing +- `decoration.*` - Rounding, blur, shadows +- `gestures.*` - Touchpad gestures +- `monitors` - Monitor configuration + +## 💡 Benefits of This Approach + +1. **Type Safety**: Nix validates your configuration +2. **Documentation**: Built-in option descriptions +3. **Defaults**: Sensible defaults with easy overrides +4. **Reproducibility**: Same config = same result +5. **Rollbacks**: Easy to revert changes +6. **Modularity**: Mix and match configurations + +## 🚧 Current Status + +The rich configuration system is **partially implemented**. The basic structure is there, but we need to: + +1. ✅ Create option definitions (done above) +2. ⏳ Wire up the option values to config generation +3. ⏳ Test all options work correctly +4. ⏳ Add more granular options + +## 🎯 Next Steps + +1. **Test the new modules**: Add them to your flake and test +2. **Expand options**: Add more configuration options as needed +3. **Generate configs**: Wire up the options to actual config file generation +4. **Document**: Add examples and documentation + +This is the **proper NixOS way** - declarative, type-safe, and reproducible! 🎉 diff --git a/examples/gaming-config.nix b/examples/gaming-config.nix new file mode 100644 index 0000000..fc53100 --- /dev/null +++ b/examples/gaming-config.nix @@ -0,0 +1,75 @@ +# Gaming-optimized configuration for dots-hyprland +{ config, lib, pkgs, ... }: + +{ + programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "essential"; + mode = "declarative"; + + # 🎮 Gaming-optimized settings + quickshell = { + appearance = { + transparency = false; # Disable for performance + fakeScreenRounding = 0; # No rounding + }; + + bar = { + bottom = true; # Bottom bar for gaming + showBackground = false; # Minimal UI + verbose = false; # Less clutter + + utilButtons = { + showScreenSnip = false; + showColorPicker = false; + showMicToggle = true; # Useful for gaming + showKeyboardToggle = false; + showDarkModeToggle = false; + showPerformanceProfileToggle = true; # Gaming profiles + }; + + workspaces = { + shown = 3; # Only 3 workspaces for gaming + showAppIcons = false; # Minimal + alwaysShowNumbers = true; + }; + }; + + battery = { + low = 15; # Lower threshold for gaming + critical = 5; + automaticSuspend = false; # Never suspend while gaming + }; + + apps = { + terminal = "foot"; + taskManager = "htop"; # Lightweight task manager + }; + }; + + hyprland = { + general = { + gapsIn = 0; # No gaps for fullscreen gaming + gapsOut = 0; + borderSize = 1; # Minimal borders + allowTearing = true; # Enable for competitive gaming + }; + + decoration = { + rounding = 0; # No rounding for performance + blurEnabled = false; # Disable blur for performance + }; + + gestures = { + workspaceSwipe = false; # Disable gestures + }; + }; + + terminal = { + colors = { + alpha = 1.0; # No transparency for performance + }; + }; + }; +} diff --git a/examples/minimalist-config.nix b/examples/minimalist-config.nix new file mode 100644 index 0000000..0f80a59 --- /dev/null +++ b/examples/minimalist-config.nix @@ -0,0 +1,97 @@ +# Minimalist configuration for dots-hyprland +{ config, lib, pkgs, ... }: + +{ + programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "minimal"; + mode = "declarative"; + + # 🎯 Minimalist settings + quickshell = { + appearance = { + transparency = false; + fakeScreenRounding = 0; # No rounding + }; + + bar = { + bottom = false; + cornerStyle = 2; # Plain rectangle + borderless = true; # No grouping + showBackground = false; # No background + verbose = false; # Minimal info + + utilButtons = { + showScreenSnip = false; + showColorPicker = false; + showMicToggle = false; + showKeyboardToggle = false; + showDarkModeToggle = false; + showPerformanceProfileToggle = false; + }; + + workspaces = { + monochromeIcons = true; + shown = 5; # Only 5 workspaces + showAppIcons = false; # No app icons + alwaysShowNumbers = true; + }; + }; + + battery = { + low = 20; + critical = 5; + automaticSuspend = true; + suspend = 3; + }; + + apps = { + terminal = "foot"; + taskManager = "htop"; + }; + + time = { + format = "HH:mm"; # Simple 24-hour + dateFormat = "dd/MM"; # Minimal date + }; + }; + + hyprland = { + general = { + gapsIn = 2; # Minimal gaps + gapsOut = 4; + borderSize = 1; # Thin borders + allowTearing = false; + }; + + decoration = { + rounding = 0; # No rounding + blurEnabled = false; # No blur + }; + + gestures = { + workspaceSwipe = true; + }; + }; + + terminal = { + scrollback = { + lines = 500; # Smaller scrollback + }; + + cursor = { + style = "block"; # Simple block cursor + blink = false; + }; + + colors = { + alpha = 1.0; # No transparency + }; + + mouse = { + hideWhenTyping = true; # Clean interface + }; + }; + }; +} diff --git a/examples/productivity-config.nix b/examples/productivity-config.nix new file mode 100644 index 0000000..f42bfac --- /dev/null +++ b/examples/productivity-config.nix @@ -0,0 +1,93 @@ +# Productivity-focused configuration for dots-hyprland +{ config, lib, pkgs, ... }: + +{ + programs.dots-hyprland = { + enable = true; + source = ./configs; + packageSet = "essential"; + mode = "declarative"; + + # 💼 Productivity-optimized settings + quickshell = { + appearance = { + transparency = true; # Nice visual effects + fakeScreenRounding = 2; + }; + + bar = { + bottom = false; # Top bar for traditional feel + cornerStyle = 1; # Float style + showBackground = true; + verbose = true; # Show detailed info + + utilButtons = { + showScreenSnip = true; # Essential for productivity + showColorPicker = true; # Useful for design work + showMicToggle = true; # For meetings + showKeyboardToggle = true; + showDarkModeToggle = true; + showPerformanceProfileToggle = false; + }; + + workspaces = { + shown = 10; # Many workspaces for organization + showAppIcons = true; + alwaysShowNumbers = true; # Always show for quick navigation + showNumberDelay = 100; # Quick response + }; + }; + + battery = { + low = 25; # Higher threshold for work + critical = 10; + automaticSuspend = true; + suspend = 5; # Longer suspend delay + }; + + apps = { + terminal = "foot"; + taskManager = "plasma-systemmonitor --page-name Processes"; + }; + + time = { + format = "HH:mm:ss"; # 24-hour with seconds + dateFormat = "dddd, MMMM dd, yyyy"; # Full date + }; + }; + + hyprland = { + general = { + gapsIn = 6; # Comfortable gaps + gapsOut = 10; + borderSize = 2; + allowTearing = false; # Smooth visuals + }; + + decoration = { + rounding = 12; # Moderate rounding + blurEnabled = true; # Nice visual effects + }; + + gestures = { + workspaceSwipe = true; # Efficient navigation + }; + }; + + terminal = { + scrollback = { + lines = 10000; # Large scrollback for logs + multiplier = 3.0; + }; + + cursor = { + style = "beam"; + blink = true; # Visible cursor + }; + + colors = { + alpha = 0.90; # Slight transparency + }; + }; + }; +} diff --git a/flake.nix b/flake.nix index 58df3c1..7835f1f 100644 --- a/flake.nix +++ b/flake.nix @@ -64,6 +64,106 @@ source = ./configs; # Use local configs packageSet = "essential"; mode = "declarative"; + + # 🎨 Quickshell Configuration + quickshell = { + appearance = { + extraBackgroundTint = true; + fakeScreenRounding = 2; # When not fullscreen + transparency = false; + }; + + bar = { + bottom = false; # Top bar + cornerStyle = 0; # Hug style + topLeftIcon = "spark"; + showBackground = true; + verbose = true; + + utilButtons = { + showScreenSnip = true; + showColorPicker = true; # 🎯 Enable color picker! + showMicToggle = false; + showKeyboardToggle = true; + showDarkModeToggle = true; + showPerformanceProfileToggle = false; + }; + + workspaces = { + monochromeIcons = true; + shown = 10; + showAppIcons = true; + alwaysShowNumbers = false; + showNumberDelay = 300; + }; + }; + + battery = { + low = 20; + critical = 5; + automaticSuspend = true; + suspend = 3; + }; + + apps = { + terminal = "foot"; + bluetooth = "kcmshell6 kcm_bluetooth"; + network = "plasmawindowed org.kde.plasma.networkmanagement"; + taskManager = "plasma-systemmonitor --page-name Processes"; + }; + + time = { + format = "hh:mm"; + dateFormat = "ddd, dd/MM"; + }; + }; + + # 🖥️ Hyprland Configuration + hyprland = { + general = { + gapsIn = 4; + gapsOut = 7; + borderSize = 2; + allowTearing = false; + }; + + decoration = { + rounding = 16; + blurEnabled = true; + }; + + gestures = { + workspaceSwipe = true; + }; + + monitors = [ + # Add your monitor config here, e.g.: + # "eDP-1,1920x1080@60,0x0,1" + ]; + }; + + # 🖥️ Terminal Configuration + terminal = { + scrollback = { + lines = 1000; + multiplier = 3.0; + }; + + cursor = { + style = "beam"; + blink = false; + beamThickness = 1.5; + }; + + colors = { + alpha = 0.95; + }; + + mouse = { + hideWhenTyping = false; + alternateScrollMode = true; + }; + }; }; } ]; diff --git a/modules/components/hyprland-config.nix b/modules/components/hyprland-config.nix new file mode 100644 index 0000000..692dc6c --- /dev/null +++ b/modules/components/hyprland-config.nix @@ -0,0 +1,146 @@ +# Hyprland configuration options for dots-hyprland +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.programs.dots-hyprland.hyprland; +in +{ + options.programs.dots-hyprland.hyprland = { + # General settings + general = { + gapsIn = mkOption { + type = types.int; + default = 4; + description = "Inner gaps between windows"; + }; + + gapsOut = mkOption { + type = types.int; + default = 7; + description = "Outer gaps around windows"; + }; + + borderSize = mkOption { + type = types.int; + default = 2; + description = "Border width around windows"; + }; + + allowTearing = mkOption { + type = types.bool; + default = false; + description = "Allow screen tearing (useful for gaming)"; + }; + }; + + # Decoration settings + decoration = { + rounding = mkOption { + type = types.int; + default = 16; + description = "Corner rounding radius"; + }; + + blurEnabled = mkOption { + type = types.bool; + default = true; + description = "Enable background blur"; + }; + }; + + # Gesture settings + gestures = { + workspaceSwipe = mkOption { + type = types.bool; + default = true; + description = "Enable workspace swipe gestures"; + }; + }; + + # Monitor configuration + monitors = mkOption { + type = types.listOf types.str; + default = []; + description = "Monitor configuration strings"; + example = [ "eDP-1,1920x1080@60,0x0,1" ]; + }; + }; + + config = mkIf config.programs.dots-hyprland.enable { + # Generate Hyprland configuration files + xdg.configFile."hypr/general.conf".text = '' + # General Hyprland configuration for dots-hyprland (NixOS-managed) + + ${optionalString (cfg.monitors != []) '' + # Monitor configuration + ${concatMapStringsSep "\n" (monitor: "monitor=${monitor}") cfg.monitors} + ''} + + # Gestures + gestures { + workspace_swipe = ${boolToString cfg.gestures.workspaceSwipe} + workspace_swipe_distance = 700 + workspace_swipe_fingers = 3 + workspace_swipe_min_fingers = true + workspace_swipe_cancel_ratio = 0.2 + workspace_swipe_min_speed_to_force = 5 + workspace_swipe_direction_lock = true + workspace_swipe_direction_lock_threshold = 10 + workspace_swipe_create_new = true + } + + general { + # Gaps and border + gaps_in = ${toString cfg.general.gapsIn} + gaps_out = ${toString cfg.general.gapsOut} + gaps_workspaces = 50 + + border_size = ${toString cfg.general.borderSize} + col.active_border = rgba(cba6f7ff) + col.inactive_border = rgba(313244ff) + resize_on_border = true + + no_focus_fallback = true + + allow_tearing = ${boolToString cfg.general.allowTearing} + + snap { + enabled = true + } + } + + dwindle { + preserve_split = true + smart_split = false + smart_resizing = false + } + + decoration { + rounding = ${toString cfg.decoration.rounding} + + blur { + enabled = ${boolToString cfg.decoration.blurEnabled} + xray = true + special = false + new_optimizations = true + size = 14 + passes = 4 + brightness = 1 + noise = 0.01 + contrast = 1 + popups = true + popups_ignorealpha = 0.6 + } + + drop_shadow = true + shadow_ignore_window = true + shadow_offset = 0 2 + shadow_range = 20 + shadow_render_power = 3 + col.shadow = rgba(00000055) + } + ''; + }; +} diff --git a/modules/components/quickshell-config.nix b/modules/components/quickshell-config.nix new file mode 100644 index 0000000..925a996 --- /dev/null +++ b/modules/components/quickshell-config.nix @@ -0,0 +1,434 @@ +# Quickshell configuration options for dots-hyprland +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.programs.dots-hyprland.quickshell; +in +{ + options.programs.dots-hyprland.quickshell = { + # Appearance settings + appearance = { + extraBackgroundTint = mkOption { + type = types.bool; + default = true; + description = "Enable extra background tint"; + }; + + fakeScreenRounding = mkOption { + type = types.enum [ 0 1 2 ]; + default = 2; + description = "Screen rounding mode: 0=None, 1=Always, 2=When not fullscreen"; + }; + + transparency = mkOption { + type = types.bool; + default = false; + description = "Enable transparency effects"; + }; + }; + + # Bar configuration + bar = { + bottom = mkOption { + type = types.bool; + default = false; + description = "Place bar at bottom instead of top"; + }; + + cornerStyle = mkOption { + type = types.enum [ 0 1 2 ]; + default = 0; + description = "Bar corner style: 0=Hug, 1=Float, 2=Plain rectangle"; + }; + + borderless = mkOption { + type = types.bool; + default = false; + description = "Remove grouping of bar items"; + }; + + topLeftIcon = mkOption { + type = types.enum [ "distro" "spark" ]; + default = "spark"; + description = "Icon to show in top-left of bar"; + }; + + showBackground = mkOption { + type = types.bool; + default = true; + description = "Show bar background"; + }; + + verbose = mkOption { + type = types.bool; + default = true; + description = "Show detailed information in bar"; + }; + + utilButtons = { + showScreenSnip = mkOption { + type = types.bool; + default = true; + description = "Show screen snip button"; + }; + + showColorPicker = mkOption { + type = types.bool; + default = false; + description = "Show color picker button"; + }; + + showMicToggle = mkOption { + type = types.bool; + default = false; + description = "Show microphone toggle button"; + }; + + showKeyboardToggle = mkOption { + type = types.bool; + default = true; + description = "Show keyboard layout toggle"; + }; + + showDarkModeToggle = mkOption { + type = types.bool; + default = true; + description = "Show dark mode toggle"; + }; + + showPerformanceProfileToggle = mkOption { + type = types.bool; + default = false; + description = "Show performance profile toggle"; + }; + }; + + workspaces = { + monochromeIcons = mkOption { + type = types.bool; + default = true; + description = "Use monochrome workspace icons"; + }; + + shown = mkOption { + type = types.int; + default = 10; + description = "Number of workspaces to show"; + }; + + showAppIcons = mkOption { + type = types.bool; + default = true; + description = "Show application icons in workspaces"; + }; + + alwaysShowNumbers = mkOption { + type = types.bool; + default = false; + description = "Always show workspace numbers"; + }; + + showNumberDelay = mkOption { + type = types.int; + default = 300; + description = "Delay before showing workspace numbers (milliseconds)"; + }; + }; + }; + + # Battery settings + battery = { + low = mkOption { + type = types.int; + default = 20; + description = "Low battery threshold (%)"; + }; + + critical = mkOption { + type = types.int; + default = 5; + description = "Critical battery threshold (%)"; + }; + + automaticSuspend = mkOption { + type = types.bool; + default = true; + description = "Enable automatic suspend on critical battery"; + }; + + suspend = mkOption { + type = types.int; + default = 3; + description = "Minutes before suspend on critical battery"; + }; + }; + + # Application settings + apps = { + terminal = mkOption { + type = types.str; + default = "kitty -1"; + description = "Terminal command for shell actions"; + }; + + bluetooth = mkOption { + type = types.str; + default = "kcmshell6 kcm_bluetooth"; + description = "Bluetooth settings command"; + }; + + network = mkOption { + type = types.str; + default = "plasmawindowed org.kde.plasma.networkmanagement"; + description = "Network settings command"; + }; + + taskManager = mkOption { + type = types.str; + default = "plasma-systemmonitor --page-name Processes"; + description = "Task manager command"; + }; + }; + + # Time format + time = { + format = mkOption { + type = types.str; + default = "hh:mm"; + description = "Time format string"; + }; + + dateFormat = mkOption { + type = types.str; + default = "ddd, dd/MM"; + description = "Date format string"; + }; + }; + }; + + config = mkIf config.programs.dots-hyprland.enable { + # Generate the Config.qml file with NixOS-managed values + xdg.configFile."quickshell/ii/modules/common/Config.qml".text = '' + pragma Singleton + pragma ComponentBehavior: Bound + import QtQuick + import Quickshell + import Quickshell.Io + + Singleton { + id: root + property string filePath: Directories.shellConfigPath + property alias options: configOptionsJsonAdapter + property bool ready: true // Always ready for NixOS-generated config + + function setNestedValue(nestedKey, value) { + // NixOS-managed config - values are set at build time + console.log("NixOS-managed configuration - ignoring runtime changes"); + } + + JsonAdapter { + id: configOptionsJsonAdapter + + property JsonObject policies: JsonObject { + property int ai: 1 + property int weeb: 1 + } + + property JsonObject ai: JsonObject { + property string systemPrompt: "## Style\n- Use casual tone, don't be formal! Make sure you answer precisely without hallucination and prefer bullet points over walls of text. You can have a friendly greeting at the beginning of the conversation, but don't repeat the user's question\n\n## Context (ignore when irrelevant)\n- You are a helpful and inspiring sidebar assistant on a NixOS Linux system\n- Desktop environment: Hyprland + dots-hyprland\n- Current date & time: {DATETIME}\n- Focused app: {WINDOWCLASS}\n\n## Presentation\n- Use Markdown features in your response" + property string tool: "functions" + property list extraModels: [] + } + + property JsonObject appearance: JsonObject { + property bool extraBackgroundTint: ${boolToString cfg.appearance.extraBackgroundTint} + property int fakeScreenRounding: ${toString cfg.appearance.fakeScreenRounding} + property bool transparency: ${boolToString cfg.appearance.transparency} + property JsonObject wallpaperTheming: JsonObject { + property bool enableAppsAndShell: true + property bool enableQtApps: true + property bool enableTerminal: true + } + property JsonObject palette: JsonObject { + property string type: "auto" + } + } + + property JsonObject audio: JsonObject { + property JsonObject protection: JsonObject { + property bool enable: true + property real maxAllowedIncrease: 10 + property real maxAllowed: 90 + } + } + + property JsonObject apps: JsonObject { + property string bluetooth: "${cfg.apps.bluetooth}" + property string network: "${cfg.apps.network}" + property string networkEthernet: "kcmshell6 kcm_networkmanagement" + property string taskManager: "${cfg.apps.taskManager}" + property string terminal: "${cfg.apps.terminal}" + } + + property JsonObject background: JsonObject { + property bool fixedClockPosition: false + property real clockX: -500 + property real clockY: -500 + property string wallpaperPath: "" + property string thumbnailPath: "" + property JsonObject parallax: JsonObject { + property bool enableWorkspace: true + property real workspaceZoom: 1.07 + property bool enableSidebar: true + } + } + + property JsonObject bar: JsonObject { + property bool bottom: ${boolToString cfg.bar.bottom} + property int cornerStyle: ${toString cfg.bar.cornerStyle} + property bool borderless: ${boolToString cfg.bar.borderless} + property string topLeftIcon: "${cfg.bar.topLeftIcon}" + property bool showBackground: ${boolToString cfg.bar.showBackground} + property bool verbose: ${boolToString cfg.bar.verbose} + property JsonObject resources: JsonObject { + property bool alwaysShowSwap: true + property bool alwaysShowCpu: false + } + property list screenList: [] + property JsonObject utilButtons: JsonObject { + property bool showScreenSnip: ${boolToString cfg.bar.utilButtons.showScreenSnip} + property bool showColorPicker: ${boolToString cfg.bar.utilButtons.showColorPicker} + property bool showMicToggle: ${boolToString cfg.bar.utilButtons.showMicToggle} + property bool showKeyboardToggle: ${boolToString cfg.bar.utilButtons.showKeyboardToggle} + property bool showDarkModeToggle: ${boolToString cfg.bar.utilButtons.showDarkModeToggle} + property bool showPerformanceProfileToggle: ${boolToString cfg.bar.utilButtons.showPerformanceProfileToggle} + } + property JsonObject tray: JsonObject { + property bool monochromeIcons: true + } + property JsonObject workspaces: JsonObject { + property bool monochromeIcons: ${boolToString cfg.bar.workspaces.monochromeIcons} + property int shown: ${toString cfg.bar.workspaces.shown} + property bool showAppIcons: ${boolToString cfg.bar.workspaces.showAppIcons} + property bool alwaysShowNumbers: ${boolToString cfg.bar.workspaces.alwaysShowNumbers} + property int showNumberDelay: ${toString cfg.bar.workspaces.showNumberDelay} + } + property JsonObject weather: JsonObject { + property bool enable: false + property bool enableGPS: true + property string city: "" + property bool useUSCS: false + property int fetchInterval: 10 + } + } + + property JsonObject battery: JsonObject { + property int low: ${toString cfg.battery.low} + property int critical: ${toString cfg.battery.critical} + property bool automaticSuspend: ${boolToString cfg.battery.automaticSuspend} + property int suspend: ${toString cfg.battery.suspend} + } + + property JsonObject dock: JsonObject { + property bool enable: false + property bool monochromeIcons: true + property real height: 60 + property real hoverRegionHeight: 2 + property bool pinnedOnStartup: false + property bool hoverToReveal: true + property list pinnedApps: ["org.kde.dolphin", "kitty"] + property list ignoredAppRegexes: [] + } + + property JsonObject language: JsonObject { + property JsonObject translator: JsonObject { + property string engine: "auto" + property string targetLanguage: "auto" + property string sourceLanguage: "auto" + } + } + + property JsonObject light: JsonObject { + property JsonObject night: JsonObject { + property bool automatic: true + property string from: "19:00" + property string to: "06:30" + property int colorTemperature: 5000 + } + } + + property JsonObject networking: JsonObject { + property string userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" + } + + property JsonObject osd: JsonObject { + property int timeout: 1000 + } + + property JsonObject osk: JsonObject { + property string layout: "qwerty_full" + property bool pinnedOnStartup: false + } + + property JsonObject overview: JsonObject { + property bool enable: true + property real scale: 0.18 + property real rows: 2 + property real columns: 5 + } + + property JsonObject resources: JsonObject { + property int updateInterval: 3000 + } + + property JsonObject search: JsonObject { + property int nonAppResultDelay: 30 + property string engineBaseUrl: "https://www.google.com/search?q=" + property list excludedSites: ["quora.com"] + property bool sloppy: false + property JsonObject prefix: JsonObject { + property string action: "/" + property string clipboard: ";" + property string emojis: ":" + } + } + + property JsonObject sidebar: JsonObject { + property bool keepRightSidebarLoaded: true + property JsonObject translator: JsonObject { + property int delay: 300 + } + property JsonObject booru: JsonObject { + property bool allowNsfw: false + property string defaultProvider: "yandere" + property int limit: 20 + property JsonObject zerochan: JsonObject { + property string username: "[unset]" + } + } + } + + property JsonObject time: JsonObject { + property string format: "${cfg.time.format}" + property string dateFormat: "${cfg.time.dateFormat}" + } + + property JsonObject windows: JsonObject { + property bool showTitlebar: true + property bool centerTitle: true + } + + property JsonObject hacks: JsonObject { + property int arbitraryRaceConditionDelay: 20 + } + + property JsonObject screenshotTool: JsonObject { + property bool showContentRegions: true + } + } + } + ''; + }; +} diff --git a/modules/components/terminal-config.nix b/modules/components/terminal-config.nix new file mode 100644 index 0000000..577c30a --- /dev/null +++ b/modules/components/terminal-config.nix @@ -0,0 +1,189 @@ +# Terminal configuration options for dots-hyprland +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.programs.dots-hyprland.terminal; +in +{ + options.programs.dots-hyprland.terminal = { + # Terminal settings + scrollback = { + lines = mkOption { + type = types.int; + default = 1000; + description = "Number of scrollback lines"; + }; + + multiplier = mkOption { + type = types.float; + default = 3.0; + description = "Scrollback multiplier"; + }; + }; + + cursor = { + style = mkOption { + type = types.enum [ "block" "beam" "underline" ]; + default = "beam"; + description = "Cursor style"; + }; + + blink = mkOption { + type = types.bool; + default = false; + description = "Enable cursor blinking"; + }; + + beamThickness = mkOption { + type = types.float; + default = 1.5; + description = "Beam cursor thickness"; + }; + }; + + colors = { + alpha = mkOption { + type = types.float; + default = 0.95; + description = "Terminal transparency (0.0 - 1.0)"; + }; + }; + + mouse = { + hideWhenTyping = mkOption { + type = types.bool; + default = false; + description = "Hide mouse cursor when typing"; + }; + + alternateScrollMode = mkOption { + type = types.bool; + default = true; + description = "Enable alternate scroll mode"; + }; + }; + }; + + config = mkIf config.programs.dots-hyprland.enable { + # Generate foot configuration + xdg.configFile."foot/foot.ini".text = '' + [main] + term=xterm-256color + login-shell=yes + app-id=foot + title=foot + locked-title=no + + [bell] + urgent=no + notify=no + visual=no + command= + command-focused=no + + [scrollback] + lines=${toString cfg.scrollback.lines} + multiplier=${toString cfg.scrollback.multiplier} + indicator-position=relative + indicator-format="" + + [url] + launch=xdg-open ''${url} + label-letters=sadfjklewcmpgh + osc8-underline=url-mode + protocols=http, https, ftp, ftps, file, gemini, gopher + uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[] + + [cursor] + style=${cfg.cursor.style} + color=cdd6f4 + blink=${boolToString cfg.cursor.blink} + beam-thickness=${toString cfg.cursor.beamThickness} + underline-thickness= + + [mouse] + hide-when-typing=${boolToString cfg.mouse.hideWhenTyping} + alternate-scroll-mode=${boolToString cfg.mouse.alternateScrollMode} + + [colors] + alpha=${toString cfg.colors.alpha} + background=1e1e2e + foreground=cdd6f4 + + # Catppuccin Mocha color palette + regular0=45475a + regular1=f38ba8 + regular2=a6e3a1 + regular3=f9e2af + regular4=89b4fa + regular5=f5c2e7 + regular6=94e2d5 + regular7=bac2de + + bright0=585b70 + bright1=f38ba8 + bright2=a6e3a1 + bright3=f9e2af + bright4=89b4fa + bright5=f5c2e7 + bright6=94e2d5 + bright7=a6adc8 + + [key-bindings] + scrollback-up-page=Shift+Page_Up + scrollback-up-half-page=none + scrollback-up-line=none + scrollback-down-page=Shift+Page_Down + scrollback-down-half-page=none + scrollback-down-line=none + clipboard-copy=Control+Shift+c XF86Copy + clipboard-paste=Control+Shift+v XF86Paste + primary-paste=Shift+Insert + search-start=Control+Shift+r + font-increase=Control+plus Control+equal Control+KP_Add + font-decrease=Control+minus Control+KP_Subtract + font-reset=Control+0 Control+KP_0 + spawn-terminal=Control+Shift+n + minimize=none + maximize=none + fullscreen=none + pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none + pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none + pipe-selected=[xargs -r firefox] none + show-urls-launch=Control+Shift+u + show-urls-copy=none + show-urls-persistent=none + prompt-prev=Control+Shift+z + prompt-next=Control+Shift+x + unicode-input=Control+Shift+u + noop=none + + [search-bindings] + cancel=Control+g Control+c Escape + commit=Return + find-prev=Control+r + find-next=Control+s + cursor-left=Left Control+b + cursor-left-word=Control+Left Mod1+b + cursor-right=Right Control+f + cursor-right-word=Control+Right Mod1+f + cursor-home=Home Control+a + cursor-end=End Control+e + delete-prev=BackSpace + delete-prev-word=Mod1+BackSpace Control+BackSpace + delete-next=Delete + delete-next-word=Mod1+d Control+Delete + extend-to-word-boundary=Control+w + extend-to-next-whitespace=Control+Shift+w + clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste + primary-paste=Shift+Insert + unicode-input=none + + [url-bindings] + cancel=Control+g Control+c Control+d Escape + toggle-url-visible=t + ''; + }; +} diff --git a/modules/home-manager.nix b/modules/home-manager.nix index 359cf97..8475a17 100644 --- a/modules/home-manager.nix +++ b/modules/home-manager.nix @@ -13,6 +13,9 @@ in ./configuration.nix ./writable-mode.nix ./components/quickshell-service.nix + ./components/quickshell-config.nix + ./components/hyprland-config.nix + ./components/terminal-config.nix ./components/touchegg.nix ]; @@ -92,8 +95,10 @@ in # Enable configuration management based on mode programs.dots-hyprland.configuration = mkIf (cfg.mode == "declarative") { - enable = true; + enable = false; # Temporarily disabled for rich config testing source = cfg.source; + # Disable copying specific configs if we're managing them with rich config + copyMiscConfig = !(cfg ? quickshell || cfg ? terminal); }; # Enable writable mode