Files
2026-07-15 14:14:12 -03:00

3.4 KiB

Context

Currently, the system uses a default power management configuration. There is no easy way for the user to switch between different power-saving modes for different use cases, such as presenting, running a headless server, or normal desktop usage.

Goals / Non-Goals

Goals:

  • Implement a script to control power management settings.
  • Define three distinct power profiles: caffeinated, headless, and normal.
  • Integrate the script with Hyprland for key-based switching.
  • Provide visual feedback of the current profile in the Waybar status bar.
  • Manage the entire configuration using Nix and Home Manager.

Non-Goals:

  • Creating a graphical user interface for configuration.
  • Supporting operating systems other than NixOS.
  • Supporting display managers other than Wayland/Hyprland.

Decisions

  1. State Management: A state file at ~/.local/state/power-profile will store the name of the currently active profile (e.g., caffeinated). This simple approach allows the control script and Waybar module to easily share the current state.

  2. Control Script: A bash script will be the core of this feature. It will accept arguments like next, prev, or a specific profile name (caffeinated, headless, normal). When called, it will: a. Update the state file. b. Kill any existing hypridle process. c. Start a new hypridle process with the configuration corresponding to the selected profile. d. Send a signal to Waybar to refresh the module (pkill -RTMIN+8 waybar).

  3. Power Management Daemon: hypridle will be used to manage idle events. We will define three separate service configurations for it, one for each profile, with different timeouts for screen blanking (hyprlock), and system suspension.

    • Caffeinated: No timeouts. hypridle will run with no events configured.
    • Headless: Timeout for screen blanking and locking, but no suspend action.
    • Normal: Default timeouts for screen blanking, locking, and suspension.
  4. Waybar Module: A custom/power-profile module in Waybar will be used.

    • It will use Waybar's on-click functionality to call the control script to cycle profiles.
    • It will execute a small script (exec) that reads the state file and outputs JSON with an icon representing the current state (e.g., {"text": "", "tooltip": "Profile: Caffeinated"}).
    • The module will update automatically when it receives a real-time signal, which the control script will send.
  5. Hyprland Keybinding: A bind entry in hyprland.conf will be added to call the control script to cycle through the profiles, e.g., bind = $mainMod, BRACKETRIGHT, exec, ~/dotfiles/scripts/power-profile.sh next.

Risks / Trade-offs

  • [Risk] The pkill hypridle command could potentially interfere with other user-started hypridle instances if they exist.

  • Mitigation: This is unlikely in a typical user session. The script will be part of a managed dotfiles configuration where only one instance is expected.

  • Mitigation: systemctl --user restart hypridle.service should restart hypridle with new configuration

  • [Trade-off] Using a state file on disk introduces a small amount of I/O and a potential point of failure if file permissions are incorrect.

  • Rationale: This is a simple and reliable IPC mechanism for this use case, preferable to more complex solutions. The file will be managed by Home Manager, ensuring correct permissions.