189 lines
3.2 KiB
Markdown
189 lines
3.2 KiB
Markdown
# Hyprmonitors
|
|
|
|
A Rust web server for controlling Hyprland desktop monitors via HTTP API using `hyprctl dispatch dpms` commands.
|
|
|
|
## Features
|
|
|
|
- Turn all monitors on/off
|
|
- Control individual monitors by name
|
|
- Get current monitor status
|
|
- RESTful API with JSON responses
|
|
- CORS enabled for web applications
|
|
|
|
## Prerequisites
|
|
|
|
- Hyprland window manager
|
|
- Rust toolchain (1.70+)
|
|
- Running Hyprland session
|
|
|
|
## Installation
|
|
|
|
1. Clone or download this project
|
|
2. Build the project:
|
|
```bash
|
|
cargo build --release
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Starting the Server
|
|
|
|
```bash
|
|
cargo run
|
|
```
|
|
|
|
The server will start on `http://0.0.0.0:3000` by default.
|
|
|
|
### API Endpoints
|
|
|
|
#### Health Check
|
|
```bash
|
|
curl http://localhost:3000/health
|
|
```
|
|
|
|
#### Turn All Monitors On
|
|
```bash
|
|
curl -X POST http://localhost:3000/monitors/on
|
|
```
|
|
|
|
#### Turn All Monitors Off
|
|
```bash
|
|
curl -X POST http://localhost:3000/monitors/off
|
|
```
|
|
|
|
#### Turn Specific Monitor On
|
|
```bash
|
|
curl -X POST http://localhost:3000/monitors/DP-1/on
|
|
```
|
|
|
|
#### Turn Specific Monitor Off
|
|
```bash
|
|
curl -X POST http://localhost:3000/monitors/DP-1/off
|
|
```
|
|
|
|
#### Get Monitor Status
|
|
```bash
|
|
curl http://localhost:3000/monitors/status
|
|
```
|
|
|
|
### Example Responses
|
|
|
|
#### Success Response
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Monitor DP-1 turned on",
|
|
"monitor": "DP-1"
|
|
}
|
|
```
|
|
|
|
#### Status Response
|
|
```json
|
|
{
|
|
"success": true,
|
|
"monitors": {
|
|
"DP-1": "on",
|
|
"HDMI-A-1": "off"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Monitor Names
|
|
|
|
To find your monitor names, you can use:
|
|
```bash
|
|
hyprctl monitors
|
|
```
|
|
|
|
Common monitor names include:
|
|
- `DP-1`, `DP-2` (DisplayPort)
|
|
- `HDMI-A-1`, `HDMI-A-2` (HDMI)
|
|
- `eDP-1` (Laptop screen)
|
|
|
|
## Development
|
|
|
|
### Dependencies
|
|
|
|
- `axum` - Web framework
|
|
- `hyprland` - Hyprland IPC client
|
|
- `tokio` - Async runtime
|
|
- `serde` - Serialization
|
|
- `tower-http` - HTTP middleware
|
|
|
|
### Building
|
|
|
|
```bash
|
|
# Debug build
|
|
cargo build
|
|
|
|
# Release build
|
|
cargo build --release
|
|
|
|
# Run with logging
|
|
RUST_LOG=info cargo run
|
|
```
|
|
|
|
### Testing
|
|
|
|
Test the endpoints manually:
|
|
|
|
```bash
|
|
# Test health
|
|
curl http://localhost:3000/health
|
|
|
|
# Test turning monitors off and on
|
|
curl -X POST http://localhost:3000/monitors/off
|
|
sleep 2
|
|
curl -X POST http://localhost:3000/monitors/on
|
|
|
|
# Check status
|
|
curl http://localhost:3000/monitors/status
|
|
```
|
|
|
|
## Configuration
|
|
|
|
The server binds to `0.0.0.0:3000` by default. To change the port, modify the `main.rs` file:
|
|
|
|
```rust
|
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
|
|
```
|
|
|
|
## Systemd Service (Optional)
|
|
|
|
Create a systemd service to run the server automatically:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Hyprland Monitor Control Server
|
|
After=graphical-session.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
ExecStart=/path/to/hyprmonitors/target/release/hyprmonitors
|
|
Restart=always
|
|
User=%i
|
|
Environment=DISPLAY=:0
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
```
|
|
|
|
## License
|
|
|
|
This project is open source. Feel free to modify and distribute.
|
|
|
|
## Troubleshooting
|
|
|
|
### Server won't start
|
|
- Ensure you're running inside a Hyprland session
|
|
- Check that port 3000 is available
|
|
- Verify Rust toolchain is installed
|
|
|
|
### Monitor commands fail
|
|
- Confirm monitor names with `hyprctl monitors`
|
|
- Ensure Hyprland IPC is accessible
|
|
- Check server logs for error details
|
|
|
|
### Permission issues
|
|
- The server needs access to Hyprland's IPC socket
|
|
- Run the server as the same user running Hyprland |