Files
redshift-rebooted/rewrite

Redshift Rewrite in Rust

This is a Rust rewrite of Redshift, a screen color temperature adjustment tool. This initial version includes the core functionality needed to calculate and display color temperatures based on geographic location and time of day.

Current Status

Phase 1: Core Foundation ✅ Complete

  • Module structure set up with separate files for types, solar, colorramp, gamma, and location
  • Core types ported from C: Location, ColorSetting, Period, TransitionScheme, ProgramMode
  • Solar calculations fully ported with astronomical algorithms for day/night timing
  • Color ramp logic ported with blackbody color table for temperature-to-RGB conversion

Phase 2: Basic Functionality ✅ Complete

  • Dummy gamma method implemented (no-op for safe testing)
  • Manual location provider implemented (lat/lon specification)
  • CLI argument parsing using clap crate
  • Basic main loop that calculates solar position and applies color temperature

Phase 3: Basic Testing ✅ Complete

  • Solar calculations tested and working correctly
  • Color temperature output tested with dummy method

Phase 4: Continual Mode ✅ Complete

  • Main event loop implemented with periodic updates
  • Smooth fade animations between color temperatures
  • Intelligent sleep intervals (5s normal, 100ms during fades)
  • Period change detection and verbose status updates

Building

cd rewrite
cargo build --release

Installation

The easiest way to install redshift-rebooted is using the installation script:

cd rewrite
./scripts/install.sh

This will:

  1. Build the release binary
  2. Install to ~/.local/bin/redshift-rebooted
  3. Install systemd user service to ~/.config/systemd/user/
  4. Provide instructions for enabling and starting the service

System-Wide Installation

For system-wide installation (requires root):

cd rewrite
sudo ./scripts/install.sh --system

This installs:

  • Binary to /usr/bin/redshift-rebooted
  • Systemd service to /usr/lib/systemd/user/ (still runs as user service)

Starting the Service

After installation, enable and start the service:

# Enable service to start automatically at login
systemctl --user enable redshift-rebooted

# Start the service now
systemctl --user start redshift-rebooted

# Check service status
systemctl --user status redshift-rebooted

# View logs
journalctl --user -u redshift-rebooted -f

Uninstallation

To uninstall redshift-rebooted:

# User mode
./scripts/uninstall.sh

# System mode
sudo ./scripts/uninstall.sh --system

Configuration

Before starting the service, configure your location in ~/.config/redshift/redshift.conf. See redshift.conf.sample for an example configuration.

The service will automatically:

  • Start when you log in (if enabled)
  • Restart on failure
  • Run in the background continuously
  • Adjust screen temperature based on time of day

Usage

The basic command matches the legacy C version:

# Print current color temperature for a location
./target/debug/redshift-rebooted -l 40.7:-74.0 -m dummy -pv

# Continual mode (continuously updates temperature)
./target/debug/redshift-rebooted -l 40.7:-74.0 -m dummy -v

# One-shot mode (set temperature once and exit)
./target/debug/redshift-rebooted -l 12:-34 -m dummy -o

# Custom day/night temperatures
./target/debug/redshift-rebooted -l 12:-34 -t 5500 --temp-night 3000 -p

Options

  • -l, --location <LAT:LON> - Location as latitude:longitude (required)
  • -m, --method <METHOD> - Gamma adjustment method (currently only 'dummy')
  • -o, --one-shot - Set temperature once and exit
  • -p, --print - Print current settings and exit
  • -v, --verbose - Verbose output
  • -t, --temp-day - Day temperature in Kelvin (default: 6500)
  • --temp-night - Night temperature in Kelvin (default: 3500)

Architecture

Module Structure

src/
├── main.rs         - Entry point, CLI parsing, main loop
├── types.rs        - Core type definitions
├── solar.rs        - Solar position calculations
├── colorramp.rs    - Color temperature to RGB conversion
├── gamma.rs        - Gamma adjustment method trait and implementations
└── location.rs     - Location provider trait and implementations

Key Components

Solar Module (solar.rs)

  • Implements astronomical algorithms from "Astronomical Algorithms" by Jean Meeus
  • Calculates solar elevation for any time and location
  • Determines day/night periods based on sun position

Color Ramp Module (colorramp.rs)

  • Contains blackbody color table (1000K-25100K in 100K intervals)
  • Interpolates between table values for precise temperatures
  • Applies brightness and gamma correction

Gamma Methods (gamma.rs)

  • Trait-based design for multiple adjustment methods
  • Currently implements dummy method (prints temperature, no display changes)
  • Ready for additional methods: DRM, RandR, VidMode

Location Providers (location.rs)

  • Trait-based design for multiple location sources
  • Currently implements manual provider (user-specified lat/lon)
  • Ready for additional provider: GeoClue2

Systemd Service

The systemd service integration allows redshift-rebooted to run automatically in the background:

Service Features

  • Automatic startup: Starts at login when enabled
  • Auto-restart: Restarts automatically if it crashes (3-second delay)
  • User service: Runs as your user account with display access
  • Graphical session: Only starts after graphical session is available

Service Management

# Enable auto-start at login
systemctl --user enable redshift-rebooted

# Start immediately
systemctl --user start redshift-rebooted

# Stop the service
systemctl --user stop redshift-rebooted

# Disable auto-start
systemctl --user disable redshift-rebooted

# Restart after config changes
systemctl --user restart redshift-rebooted

# View status and recent logs
systemctl --user status redshift-rebooted

# Follow logs in real-time
journalctl --user -u redshift-rebooted -f

# View all logs
journalctl --user -u redshift-rebooted

Troubleshooting

Service fails to start:

  • Check logs: journalctl --user -u redshift-rebooted
  • Verify configuration file exists: ~/.config/redshift/redshift.conf
  • Test manually: redshift-rebooted -v to see errors

Screen temperature not changing:

  • Ensure you're using the correct gamma method for your system
  • Check that location is configured correctly
  • Verify service is running: systemctl --user status redshift-rebooted

Service not starting at login:

  • Enable the service: systemctl --user enable redshift-rebooted
  • Ensure systemd user services are enabled (should be default on most systems)

Next Steps

To complete the rewrite, the following work remains:

  1. Real Gamma Methods - Port Linux gamma adjustment methods:
    • DRM (Direct Rendering Manager for TTY/framebuffer)
    • RandR (X11 RandR extension, preferred, multi-output)
    • VidMode (X11 VidMode extension, legacy, single output)
  2. Additional Location Provider - Port automatic location detection:
    • GeoClue2 (Linux location service)
  3. Configuration File Support ✅ Complete - INI-style config files supported
  4. Signal Handling ✅ Complete - SIGUSR1 (toggle), SIGINT/SIGTERM (restore & exit)
  5. Hook Scripts - Execute user scripts on period changes

Testing

The Rust rewrite has been tested and verified to:

  • Parse command-line arguments correctly
  • Calculate solar elevation accurately
  • Determine day/night/transition periods
  • Compute appropriate color temperatures
  • Display verbose output with solar information
  • Run continuously with smooth fade transitions
  • Update temperature based on changing solar position

Example test (print mode - shows current status and exits):

$ ./target/debug/redshift-rebooted -l 12:-34 -m dummy -pv
Location: 12.00, -34.00
Period: Night
Color temperature: 3500K
Brightness: 1.00
Gamma: 1.00, 1.00, 1.00
Solar elevation: -44.03°

Example test (continual mode - runs forever with updates):

$ ./target/debug/redshift-rebooted -l 40:-74 -m dummy -v
Location: 40.00, -74.00
Period: Night
Color temperature: 3500K
# Smooth fade from initial 6500K to target 3500K over ~4 seconds
Temperature: 6494
Temperature: 6478
...
Temperature: 3500
# Then continues monitoring, sleeping 5 seconds between checks

Unit Tests

Comprehensive test suites have been created for all non-dummy/non-placeholder code:

cargo test

Test Coverage:

  • types_tests.rs (9 tests): Core type definitions, bounds checking, defaults
  • solar_tests.rs (8 tests): Solar elevation calculations, time-based variations
  • colorramp_tests.rs (13 tests): Color temperature conversions, gamma/brightness adjustments
  • location_tests.rs (19 tests): Manual location provider functionality, option parsing
  • continual_mode_tests.rs (24 tests): Event loop logic, transition progress, fade animations, color interpolation

Total: 73 passing tests

All tests verify correct behavior against the legacy C implementation, including:

  • Solar position calculations at various latitudes/longitudes
  • Color temperature interpolation from blackbody table
  • Gamma ramp adjustments with brightness and gamma correction
  • Location provider initialization and configuration
  • Transition progress calculation from solar elevation
  • Fade animation smoothness and easing functions
  • Color setting interpolation and major difference detection
  • Complete event loop iteration logic

Compatibility

This rewrite maintains compatibility with the legacy C version's command-line interface for basic operations. The output format and calculation methods are designed to match the original implementation.

Credits

Original author of Redshift for C source code Simple Maps for the country/city data under Creative Commons 4.0 liscense https://creativecommons.org/licenses/by/4.0/ https://simplemaps.com/data/world-cities