182 lines
5.2 KiB
Markdown
182 lines
5.2 KiB
Markdown
# maccel NixOS Flake
|
|
|
|
If you're on NixOS, maccel provides a declarative flake module to seamlessly integrate and configure the mouse acceleration driver through your system configuration.
|
|
|
|
**Benefits of the NixOS module:**
|
|
|
|
- **Declarative configuration**: All parameters defined in your NixOS config
|
|
- **Direct kernel module parameters**: More efficient than reset scripts approach
|
|
- **No manual setup**: Kernel module, udev rules, and CLI tools installed automatically
|
|
- **Seamless updates**: Update maccel alongside your system like any other flake
|
|
- **Parameter discovery**: Optional CLI/TUI for real-time parameter tuning
|
|
|
|
## Quick Start
|
|
|
|
Add to your `flake.nix` inputs:
|
|
|
|
```nix
|
|
maccel.url = "github:Gnarus-G/maccel";
|
|
```
|
|
|
|
Create your `maccel.nix` module:
|
|
|
|
```nix
|
|
{inputs, ...}: {
|
|
imports = [
|
|
inputs.maccel.nixosModules.default
|
|
];
|
|
|
|
hardware.maccel = {
|
|
enable = true;
|
|
enableCli = true; # Optional
|
|
|
|
parameters = {
|
|
# Common (all modes)
|
|
sensMultiplier = 1.0;
|
|
yxRatio = 1.0;
|
|
inputDpi = 1000.0;
|
|
angleRotation = 0.0;
|
|
mode = "synchronous";
|
|
|
|
# Linear mode
|
|
acceleration = 0.3;
|
|
offset = 2.0;
|
|
outputCap = 2.0;
|
|
|
|
# Natural mode
|
|
decayRate = 0.1;
|
|
offset = 2.0;
|
|
limit = 1.5;
|
|
|
|
# Synchronous mode
|
|
gamma = 1.0;
|
|
smooth = 0.5;
|
|
motivity = 2.5;
|
|
syncSpeed = 10.0;
|
|
};
|
|
};
|
|
|
|
# To use maccel CLI/TUI without sudo
|
|
users.groups.maccel.members = ["your_username"];
|
|
}
|
|
```
|
|
|
|
## How it Works
|
|
|
|
### Parameter Management
|
|
|
|
- **NixOS config**: Parameters are set directly as kernel module parameters at boot for maximum efficiency
|
|
- **CLI/TUI**: When `enableCli = true`, you can use `maccel tui` or `maccel set` for real-time adjustments
|
|
- **Temporary changes**: CLI/TUI modifications are session-only and revert after reboot
|
|
|
|
### Recommended Workflow
|
|
|
|
1. **Enable CLI tools**: Set `enableCli = true` for parameter discovery
|
|
2. **Find optimal values**: Use `maccel tui` to experiment with parameters in real-time
|
|
3. **Apply permanently**: Copy your optimal values to `hardware.maccel.parameters` in your NixOS config
|
|
4. **Rebuild system**: Run `sudo nixos-rebuild switch --flake .` to make settings persistent
|
|
|
|
## Maintaining the NixOS Module
|
|
|
|
When new acceleration modes or parameters are added to maccel, the [NixOS module](module.nix) needs to be updated accordingly. This section provides a step-by-step guide for maintainers.
|
|
|
|
### 1. Adding New Modes
|
|
|
|
New modes are defined in [`driver/accel/mode.h`](driver/accel/mode.h). To add support:
|
|
|
|
**In [`module.nix`](module.nix):**
|
|
|
|
#### Step 1: Add to modeMap
|
|
|
|
```nix
|
|
# Update the modeMap with new modes
|
|
modeMap = {
|
|
linear = 0;
|
|
natural = 1;
|
|
synchronous = 2;
|
|
no_accel = 3;
|
|
new_mode = 4; # Add new mode here
|
|
};
|
|
```
|
|
|
|
#### Step 2: Add the mode option
|
|
|
|
```nix
|
|
# In options.hardware.maccel.parameters
|
|
mode = mkOption {
|
|
type = types.nullOr (types.enum ["linear" "natural" "synchronous" "no_accel" "new_mode"]);
|
|
default = null;
|
|
description = "Acceleration mode.";
|
|
};
|
|
```
|
|
|
|
### 2. Adding New Parameters
|
|
|
|
New parameters are defined in [`driver/params.h`](driver/params.h). To add support:
|
|
|
|
**In [`module.nix`](module.nix):**
|
|
|
|
#### Step 1: Add to parameterMap
|
|
|
|
```nix
|
|
# In parameterMap
|
|
parameterMap = {
|
|
# Existing parameters...
|
|
NEW_PARAM = cfg.parameters.newParam;
|
|
};
|
|
```
|
|
|
|
#### Step 2: Add NixOS option
|
|
|
|
```nix
|
|
# In options.hardware.maccel.parameters
|
|
newParam = mkOption {
|
|
type = types.nullOr types.float; # or appropriate type
|
|
default = null;
|
|
description = "Description of the new parameter.";
|
|
};
|
|
```
|
|
|
|
#### Step 3: Add validation (if needed)
|
|
|
|
```nix
|
|
# For parameters with constraints
|
|
newParam = mkOption {
|
|
type = types.nullOr (types.addCheck types.float (x: x > 0.0)
|
|
// {description = "positive float";});
|
|
default = null;
|
|
description = "Description of the new parameter. Must be positive.";
|
|
};
|
|
```
|
|
|
|
### 3. Using LLMs
|
|
|
|
This NixOS module was developed with significant LLM assistance. Here's a comprehensive prompt for maintaining it:
|
|
|
|
```
|
|
I need to update the NixOS module for maccel. Please analyze the maccel codebase and help me maintain the NixOS module:
|
|
|
|
CONTEXT:
|
|
- maccel is a Linux mouse acceleration driver with kernel module and CLI tools
|
|
- The NixOS module is in module.nix and provides declarative configuration
|
|
- Parameters are defined in driver/params.h and modes in driver/accel/mode.h
|
|
- Read README_NIXOS.md section "Maintaining the NixOS Module" for detailed patterns and examples
|
|
|
|
TASKS:
|
|
1. **Discover changes**: Analyze driver/params.h and driver/accel/ for new parameters, modes, or modifications
|
|
2. **Compare with current**: Check what's missing from existing modeMap and parameterMap in module.nix
|
|
3. **Add new modes**: Update modeMap with correct enum values and add to mode option enum
|
|
4. **Add new parameters**: Add to parameterMap and create NixOS options with proper type validation, descriptions, and constraints
|
|
5. **Explain changes**: Summarize what was added and why
|
|
|
|
Follow the exact patterns shown in README_NIXOS.md and existing patterns in module.nix. Provide complete code snippets for module.nix.
|
|
```
|
|
|
|
### 4. Testing The Module
|
|
|
|
After modifying [`module.nix`](module.nix):
|
|
|
|
1. **Format nix code**: `alejandra .`
|
|
2. **Check nix syntax**: `nix flake check`
|
|
3. **Test parameter loading**: Confirm parameters load correctly on boot when set via NixOS config
|