# Light Switch

[Public Overview – Microsoft Learn](https://learn.microsoft.com/en-us/windows/powertoys/light-switch)

## Quick Links

* [All Issues](https://github.com/microsoft/PowerToys/issues?q=is%3Aissue%20state%3Aopen%20label%3AProduct-LightSwitch)
* [Bugs](https://github.com/microsoft/PowerToys/issues?q=is%3Aissue%20state%3Aopen%20label%3AProduct-LightSwitch%20label%3AIssue-Bug)
* [Pull Requests](https://github.com/microsoft/PowerToys/pulls?q=is%3Apr+is%3Aopen+label%3AProduct-LightSwitch)

## Overview

The **Light Switch** module lets users automatically transition between light and dark mode using a timed schedule or a keyboard shortcut.

## Features

* Set custom times to start and stop dark mode.
* Use geolocation to determine local sunrise and sunset times.
* Apply offsets in sunrise mode (e.g., 15 minutes before sunset).
* Quickly toggle between modes with a keyboard shortcut (`Ctrl+Shift+Win+D` by default).
* Choose whether theme changes apply to:

  * Apps only
  * System only
  * Both apps and system

## Architecture

### Main Components

* **Shortcut/Hotkey**
  Listens for a hotkey event. Calling `onHotkey()` flips the theme flags.

  > **Note:** Using the shortcut overrides the current schedule until the next transition event.

* **LightSwitchService.cpp**
  is the heart beat of the module. Controls ticking every minute and depending on user actions (manual override, settings changing, etc) triggers the state manager to perform the corresponding operation.
  
* **LightSwitchStateManager.cpp**
  handles updating the state based on the signals sent by LightSwitchService.
  
* **SettingsXAML/LightSwitch**
  Provides the settings UI for configuring schedules, syncing location, and customizing shortcuts.

* **Settings.UI/ViewModels/LightSwitchViewModel.cs**
  Handles updates to the settings file and communicates changes to the front end.

* **modules/LightSwitch/Tests**
  Contains UI tests that verify interactions between the settings UI, system state, and `settings.json`.

### Data Flow

1. User configures settings in the UI (default: manual mode, light mode from 06:00–18:00).
2. Every minute, the service checks the time.

   * If it’s not a threshold, the service sleeps until the next minute.
   * If it matches a threshold, the service applies the theme based on settings and returns to sleep.
3. At **midnight**, when in *Sunrise to Sunset* mode, the service updates daily sunrise and sunset times.
4. If the machine was asleep during a scheduled event, the service applies the correct settings at the next check.

## User Interface

The module’s settings are exposed in the PowerToys Settings UI. Options include:

* Shortcut customization
* Mode selection (Manual or Sunrise to Sunset)
* Manual start/stop times (manual mode only)
* Automatic sunrise/sunset calculation (location-based)
* Time offsets (sunrise mode)
* Target scope (system, apps, or both)

## Development Environment Setup

### Prerequisites

* Visual Studio 2019 or later
* Windows 10 SDK
* PowerToys repository cloned from GitHub

### Building and Testing

1. Clone the repo:

   ```sh
   git clone https://github.com/microsoft/PowerToys.git
   ```
2. Initialize submodules:

   ```sh
   git submodule update --init --recursive
   ```
3. Build the solution:

   ```sh
   msbuild -restore -p:RestorePackagesConfig=true -p:Platform=ARM64 -m PowerToys.slnx
   ```

   > Note: This may take some time.
4. Set `runner` as the startup project and press **F5**.
5. Enable Light Switch in PowerToys Settings.
6. To debug the service:

   * Press `Ctrl+Alt+P` or go to **Debug > Attach to Process**.
   * Select `LightSwitchService.exe` and click **Attach**.
   * You can now set breakpoints in the service files.
7. To debug the Settings UI:

   * Set the startup project to `PowerToys.Settings` and press **F5**.
   * Note: Light Switch settings will not persist in this mode (they depend on the service executable).
   * Alternatively, you can attach `PowerToys.Settings.exe` to the debugger while `runner` is running to test the full flow with breakpoints.
