Skip to content

Monitors

Fields

All fields beyond output are optional and fall back to sensible defaults.

FieldDescriptionTypeDefault
outputOutput name or desc:... description prefixstr[[Required]]
disabledRemoves the monitor from the layoutboolfalse
modeResolution and refresh rate (e.g. "1920x1080@144"). See the note for predefined modes. Options: mode/"preferred"/"highres"/"highrr"/"maxwidth"str"preferred"
scaleScale factor (e.g., 1.5). "auto" = use monitor’s PPI to decide the scale. Options: scale/"auto"float or str"auto"
transformRotation/flip transform (0–7)int0
positionPosition in the virtual layout (e.g., "1920x0"). See the note for predefined positionsstr"auto"
mirrorOutput name to mirrorstr[[Empty]]
bitdepthBit depth. Options: 8/10int8
cmColor management presetstr"srgb"
sdr_eotfSDR transfer function Options: "default"/"gamma22"/"srgb"str"default"
vrrVRR modesint0
iccAbsolute path to an ICC profilestr[[Empty]]
reserved_areaReserved area: int for all sides or tablecss_gaps0
supports_wide_colorForce wide color gamut (-1 = off, 0 = auto, 1 = on)int0
supports_hdrForce HDR support. -1 = off, 0 = auto, 1 = on. Options: [-1 - 1]int0
sdrbrightnessSDR brightness in HDR modefloat1.0
sdrsaturationSDR saturation in HDR modefloat1.0
sdr_min_luminanceSDR minimum luminance for SDR→HDR mappingfloat0.2
sdr_max_luminanceSDR maximum luminanceint80
min_luminanceMonitor minimum luminancefloat-1
max_luminanceMonitor maximum possible luminanceint-1
max_avg_luminanceMonitor maximum average luminanceint-1

Leaving the output empty will define a fallback rule to use when no other rules match.

hl.monitor({ output = "", mode = "preferred", position = "auto", scale = 1 })

This will make any monitor that was not specified with an explicit rule be automatically placed on the right of the other(s), with its preferred resolution.

General

To list all available monitors (active and inactive), use:

hyprctl monitors all
Example output
Monitor DP-3 (ID 0):
    2560x1440@165.00000 at 0x0
    description: AOC Q27G2G3R3B RTEN1HA009998
    make: AOC
    model: Q27G2G3R3B
    physical size (mm): 600x340
    serial: RTEN1HA009998
    active workspace: 5 (5)
    special workspace: 0 ()
    reserved: 0 34 0 0
    scale: 1
    transform: 0
    focused: yes
    dpmsStatus: 1
    vrr: false
    solitary: 0
    solitaryBlockedBy: windowed mode,missing candidate
    activelyTearing: false
    tearingBlockedBy: next frame is not torn,user settings,missing candidate
    directScanoutTo: 0
    directScanoutBlockedBy: windowed mode,missing candidate
    disabled: false
    currentFormat: XRGB2101010
    mirrorOf: none
    availableModes: 2560x1440@59.95Hz 2560x1440@165.00Hz 2560x1440@143.91Hz 2560x1440@120.00Hz 1920x1080@120.00Hz 1920x1080@119.88Hz 1920x1080@60.00Hz 1920x1080@60.00Hz 1920x1080@59.94Hz 1920x1080@50.00Hz 1280x1440@59.91Hz 1280x1024@75.03Hz 1280x1024@60.02Hz 1280x720@60.00Hz 1280x720@59.94Hz 1280x720@50.00Hz 1024x768@119.93Hz 1024x768@99.99Hz 1024x768@75.03Hz 1024x768@70.07Hz 1024x768@60.00Hz 832x624@74.55Hz 800x600@119.93Hz 800x600@99.86Hz 800x600@75.00Hz 800x600@72.19Hz 800x600@60.32Hz 800x600@56.25Hz 720x576@50.00Hz 720x576@50.00Hz 720x480@60.00Hz 720x480@60.00Hz 720x480@59.94Hz 720x480@59.94Hz 640x480@119.80Hz 640x480@99.83Hz 640x480@75.00Hz 640x480@72.81Hz 640x480@66.67Hz 640x480@60.00Hz 640x480@59.94Hz 640x480@59.94Hz 720x400@70.08Hz
    colorManagementPreset: srgb
    sdrBrightness: 1
    sdrSaturation: 1
    sdrMinLuminance: 0.2
    sdrMaxLuminance: 80
    hardwareCursorsInUse: true

Disabling a monitor

Warning

Disabling a monitor will remove it from the monitor layout, moving all windows and workspaces to any remaining ones. If you want to disable your monitor the way a screensaver does (just turning off the monitor), use the dpms dispatcher.

To disable a monitor, set disabled = true:

hl.monitor({ output = "name", disabled = true })

Custom reserved area

A reserved area is an area that remains unoccupied by tiled windows. If your workflow requires a custom reserved area, you can add it with the reserved_area field. It accepts either a single integer (all sides) or a table with individual sides:

-- all sides
hl.monitor({ output = "name", reserved_area = 10 })

-- individual sides
hl.monitor({ output = "name", reserved_area = { top = 10, bottom = 10, left = 0, right = 0 } })

This stacks on top of the calculated reserved area (e.g., bars), but you may only use one of these rules per monitor in the config.

Default workspace

See Workspace Rules.

Binding workspaces to a monitor

See Workspace Rules.

Last updated on