228 lines
5.8 KiB
Markdown
228 lines
5.8 KiB
Markdown
# Home Manager Module for Hyprmonitors
|
|
|
|
This directory contains a Home Manager module for installing and configuring hyprmonitors, a Rust web server that provides an HTTP API for controlling Hyprland desktop monitors.
|
|
|
|
## What is Hyprmonitors?
|
|
|
|
Hyprmonitors is a lightweight web server that exposes a RESTful API to control your Hyprland monitors using `hyprctl dispatch dpms` commands. It allows you to:
|
|
|
|
- Turn all monitors on/off via HTTP requests
|
|
- Control individual monitors by name
|
|
- Get current monitor status
|
|
- Integrate monitor control into web applications or scripts
|
|
|
|
## Installation
|
|
|
|
### Method 1: Direct Import
|
|
|
|
Add the module to your Home Manager configuration:
|
|
|
|
```nix
|
|
{
|
|
imports = [
|
|
/path/to/hyprmonitors/home-manager-module.nix
|
|
];
|
|
|
|
# Enable Hyprland (required)
|
|
wayland.windowManager.hyprland.enable = true;
|
|
|
|
# Enable hyprmonitors service
|
|
services.hyprmonitors.enable = true;
|
|
}
|
|
```
|
|
|
|
### Method 2: As a Flake Input
|
|
|
|
Add hyprmonitors as a flake input in your `flake.nix`:
|
|
|
|
```nix
|
|
{
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
home-manager.url = "github:nix-community/home-manager";
|
|
hyprmonitors.url = "path:/path/to/hyprmonitors";
|
|
};
|
|
|
|
outputs = { nixpkgs, home-manager, hyprmonitors, ... }: {
|
|
homeConfigurations.youruser = home-manager.lib.homeManagerConfiguration {
|
|
modules = [
|
|
hyprmonitors.homeManagerModules.default
|
|
{
|
|
wayland.windowManager.hyprland.enable = true;
|
|
services.hyprmonitors.enable = true;
|
|
}
|
|
];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
The module provides several configuration options:
|
|
|
|
```nix
|
|
services.hyprmonitors = {
|
|
enable = true; # Enable the service
|
|
|
|
host = "127.0.0.1"; # Host to bind to (default: 127.0.0.1)
|
|
port = 3000; # Port to bind to (default: 3000)
|
|
|
|
logLevel = "info"; # Log level: error, warn, info, debug, trace
|
|
|
|
package = pkgs.hyprmonitors; # Override the package (optional)
|
|
|
|
environmentVariables = { # Additional environment variables
|
|
HYPRLAND_INSTANCE_SIGNATURE = "your-signature";
|
|
};
|
|
|
|
settings = { # Future configuration options
|
|
timeout_seconds = 30;
|
|
};
|
|
};
|
|
```
|
|
|
|
## Usage
|
|
|
|
Once installed and configured, the module provides several convenient tools:
|
|
|
|
### Shell Aliases
|
|
|
|
The module automatically adds these shell aliases:
|
|
|
|
- `hyprmonitors-start` - Start the service
|
|
- `hyprmonitors-stop` - Stop the service
|
|
- `hyprmonitors-restart` - Restart the service
|
|
- `hyprmonitors-status` - Check service status
|
|
- `hyprmonitors-logs` - View service logs
|
|
- `hyprmonitors-test` - Test if the API is responding
|
|
|
|
### API Helper Script
|
|
|
|
The `hyprmonitors-curl` script provides easy access to the API:
|
|
|
|
```bash
|
|
# Check if the service is running
|
|
hyprmonitors-curl health
|
|
|
|
# Get status of all monitors
|
|
hyprmonitors-curl status
|
|
|
|
# Turn all monitors on/off
|
|
hyprmonitors-curl on
|
|
hyprmonitors-curl off
|
|
|
|
# Control specific monitors
|
|
hyprmonitors-curl on DP-1
|
|
hyprmonitors-curl off HDMI-A-1
|
|
```
|
|
|
|
### Manual API Access
|
|
|
|
You can also use curl directly:
|
|
|
|
```bash
|
|
# Health check
|
|
curl http://localhost:3000/health
|
|
|
|
# Monitor status
|
|
curl http://localhost:3000/monitors/status
|
|
|
|
# Turn all monitors on/off
|
|
curl -X POST http://localhost:3000/monitors/on
|
|
curl -X POST http://localhost:3000/monitors/off
|
|
|
|
# Control specific monitors
|
|
curl -X POST http://localhost:3000/monitors/DP-1/on
|
|
curl -X POST http://localhost:3000/monitors/HDMI-A-1/off
|
|
```
|
|
|
|
## Service Management
|
|
|
|
The service is automatically managed by systemd:
|
|
|
|
```bash
|
|
# Check service status
|
|
systemctl --user status hyprmonitors.service
|
|
|
|
# View logs
|
|
journalctl --user -u hyprmonitors.service -f
|
|
|
|
# Manual start/stop (if needed)
|
|
systemctl --user start hyprmonitors.service
|
|
systemctl --user stop hyprmonitors.service
|
|
```
|
|
|
|
## Integration with Hyprland
|
|
|
|
You can integrate hyprmonitors with Hyprland keybinds:
|
|
|
|
```nix
|
|
wayland.windowManager.hyprland.settings = {
|
|
bind = [
|
|
# Turn all monitors off/on
|
|
"SUPER SHIFT, M, exec, hyprmonitors-curl off"
|
|
"SUPER CTRL, M, exec, hyprmonitors-curl on"
|
|
|
|
# Control specific monitors
|
|
"SUPER SHIFT, 1, exec, hyprmonitors-curl off DP-1"
|
|
"SUPER SHIFT, 2, exec, hyprmonitors-curl off HDMI-A-1"
|
|
"SUPER CTRL, 1, exec, hyprmonitors-curl on DP-1"
|
|
"SUPER CTRL, 2, exec, hyprmonitors-curl on HDMI-A-1"
|
|
];
|
|
};
|
|
```
|
|
|
|
## Desktop Entry
|
|
|
|
The module creates a desktop entry "Hyprmonitors Control" that opens the health endpoint in your browser for quick access to verify the service is running.
|
|
|
|
## Finding Monitor Names
|
|
|
|
To find your monitor names for use with the API:
|
|
|
|
```bash
|
|
hyprctl monitors
|
|
```
|
|
|
|
Common monitor names include:
|
|
- `DP-1`, `DP-2` (DisplayPort)
|
|
- `HDMI-A-1`, `HDMI-A-2` (HDMI)
|
|
- `eDP-1` (Laptop screen)
|
|
|
|
## Troubleshooting
|
|
|
|
### Service won't start
|
|
|
|
1. Ensure Hyprland is running and properly configured
|
|
2. Check that the port isn't already in use
|
|
3. View logs: `journalctl --user -u hyprmonitors.service`
|
|
|
|
### API requests fail
|
|
|
|
1. Verify the service is running: `hyprmonitors-test`
|
|
2. Check monitor names: `hyprctl monitors`
|
|
3. Ensure you're running commands in a Hyprland session
|
|
|
|
### Permission issues
|
|
|
|
The service runs as your user and should automatically have access to Hyprland's IPC socket. If you encounter permission issues, ensure:
|
|
|
|
1. You're running the service as the same user running Hyprland
|
|
2. The `XDG_RUNTIME_DIR` environment variable is properly set
|
|
|
|
## Security Considerations
|
|
|
|
- The service binds to localhost by default for security
|
|
- If you need remote access, change the host to `0.0.0.0` but ensure proper firewall configuration
|
|
- The service has restricted permissions and resource limits applied
|
|
|
|
## Complete Example
|
|
|
|
See `example-home-manager-config.nix` for a complete working example configuration.
|
|
|
|
## Requirements
|
|
|
|
- NixOS or Nix with Home Manager
|
|
- Hyprland window manager
|
|
- The module automatically handles all dependencies |