Skip to content

Displays

P3DROVFX edited this page Oct 12, 2026 · 1 revision

Displays: Monitors, Brightness, Colour and Always On Display

Everything about the screens themselves: arranging and configuring monitors with saved profiles, brightness (keys, backlight, DDC/CI and "dim below the minimum" by gamma), colour and contrast calibration per monitor (hardware DDC/CI controls where the monitor supports them, a GPU colour filter everywhere else), Night Light, and an Always On Display for OLED panels. The configuration page is Settings → Displays (System group).

Monitor settings

This page drives hyprmon to read and write monitor configuration; the page tells you when it's missing and offers to open it in a terminal or open its project page. Install it with the optional monitor-profiles feature (ii-p3drovfx deps add monitor-profiles, see Installer and CLI).

  • Monitor overview — a canvas with every output as a draggable rectangle (arrange them by dragging), the selected monitor's name and an Enabled switch. On the Welcome app's "Set up your displays" step the same canvas appears, and each physical screen shows a big number for a few seconds so you know which is which (Welcome App).
  • Resolution & refresh rate, scale (shown as a multiplier), orientation, mirror screen and numeric position X / Y.
  • Advanced: bit depth (8 or 10-bit), colour management (sRGB, HDR, HDR (EDID), Wide colour gamut, Auto), and for HDR outputs SDR brightness and SDR-in-HDR saturation.
  • Profiles — save the current arrangement under a name and apply or delete it later (a notification confirms). Two floating buttons at the bottom right, Rollback (reload the layout from Hyprland, discarding what you tried) and Save to Hyprland (write it to your Hyprland config so it survives the next login), apply to the whole page.
  • Edge & interaction tweak — a 1-pixel screen-edge workaround that compensates for a 1-px margin discrepancy on the right and bottom screen edges in Hyprland.

Brightness

  • Keys: XF86MonBrightnessUp/Down run scripts/brightness/brightness-key.sh, which writes the backlight with brightnessctl directly — so the keys keep working while the shell reloads or isn't running at all. The shell watches the backlight and draws the on-screen display by itself; the press is also reported so that, with osd.brightnessKeysOnly on, a key can be told apart from an ambient-light daemon changing the backlight.
  • External monitors are driven through DDC/CI (ddcutil detect) so each monitor has its own brightness; the service follows the monitor under the pointer / focused monitor.
  • Dim below the minimum (light.gamma.dimBelowMinimum, on): the backlight can't go below its floor (brightnessctl never writes below 1), so at the floor the brightness keys and the combined gamma/brightness slider keep dimming by lowering gamma (down to 25 %), and raise gamma back to 100 % before the backlight moves up again. Turn it off to drive the backlight only.
  • Gamma per output. Gamma and Night Light colour temperature are applied by the shell's own controller of Hyprland's colour-transform manager, one value per monitor — the stock hyprsunset has a single value for the whole compositor, which couldn't follow the monitor under the pointer.
  • Keyboard backlight: auto-off after N seconds without input (light.keyboardBacklight.autoOff, timeout 15 s; off by default because it changes hardware state unasked) lives in Settings → Power.

Colour and contrast calibration

Settings → Displays → Color & Contrast adjusts the selected monitor:

Path Controls When it's available
Hardware (DDC/CI) Contrast and red / green / blue gain — a real tonal change in the monitor, not another brightness multiplier ddcutil installed, I²C access allowed, and the monitor reports those controls. The page says which condition fails: ddcutil is required…, could not enumerate DDC/CI monitors — check I²C permissions, this display does not expose DDC/CI, or does not report contrast or RGB gain controls (internal panels and some adapters don't)
GPU colour filter (experimental) Saturation, contrast and red / green / blue channel balance Any output. It's generated as a GLSL shader and uses Hyprland's single screen shader slot

Each write targets the I²C bus that belongs to one DRM connector, so changing one monitor never broadcasts to the others. Because the GPU filter and the Screen Shader feature (the dashboard's screen filters, including the Anti-flashbang toggle) share the one compositor slot, the explicit filter you pick wins: while it's active the calibration is paused (the page says so) and resumes afterwards, with your saved values preserved. Profiles per monitor are stored by output name.

Night Light

Per-output warm colour temperature on a schedule (light.night): automatic (on), from/to (19:00 → 06:30), colorTemperature (5000 K) and persistManual — how long a manual toggle (and the gamma level) survives: never, session or always (default; with automatic on, a restored toggle still expires at the next start/end time). Configured in Settings → Colors & Themes → scheduling (together with the Dark Mode schedule, light.darkMode) and toggled from the dashboard's Night Light quick toggle, whose dialog shows the colour temperature and schedule (Sidebar Dashboard).

Always On Display (OLED saver)

Super + R turns the focused monitor into an Always On Display: pure black, with the lock screen's widgets in grey where the lock screen places them, so an OLED panel lights as few pixels as possible. Click, press a key or use the shortcut again to wake it. Options (oledSaver, Settings → Displays):

Key Default Meaning
enable false Allow the AOD (shortcut and timer)
antiBurnIn false Shift the widgets slightly every minute to spread wear
cursorHideDelay 5 Seconds without mouse movement before the cursor hides again
lockTimeout 10 Minutes without input on the lock screen before it turns into the AOD; 0 turns the timer off (the shortcut still works)

Nothing here inhibits idle — the lock's own timeout still runs underneath; when it locks, the lock's AOD takes over the screen. An AOD still up at unlock (fingerprint unlock doesn't wake it) never follows you to the desktop. IPC: qs -c ii ipc call oledSaver toggle. See Lock Screen.

Under the hood

Piece Role
modules/settings/configs/DisplaysConfig.qml, MonitorProfileCard.qml The page (hyprmon-backed)
services/Brightness.qml, scripts/brightness/brightness-key.sh Backlight / DDC brightness, dim-below-minimum, key script, brightness IPC
services/Hyprsunset.qml Per-output gamma, Night Light, schedules
services/DisplayCalibration.qml, displayCalibration/ DDC/CI colour controls by output
services/DisplayColorFilter.qml, displayColorFilter/ Generated GPU shader
services/ScreenShader.qml, HyprlandAntiFlashbangShader.qml The single compositor shader slot
modules/ii/oledSaver/OledSaver.qml Always On Display

Related pages

← Back to Home

Clone this wiki locally