Repository navigation
Displays
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).
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-profilesfeature (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.
-
Keys:
XF86MonBrightnessUp/Downrunscripts/brightness/brightness-key.sh, which writes the backlight withbrightnessctldirectly — 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, withosd.brightnessKeysOnlyon, 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 (brightnessctlnever 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
hyprsunsethas 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,timeout15 s; off by default because it changes hardware state unasked) lives in Settings → Power.
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.
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).
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.
| 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 |