Skip to content
Scrolling layout

Scrolling layout

Scrolling is a layout where windows are positioned on an infinitely growing tape.

Config

Path: scrolling

NameDescriptionTypeDefaultLimits
fullscreen_on_one_columnwhen enabled, a single column on a workspace will always span the entire screen.booltrue
column_widththe default width of a columnfloat0.5[0.1 - 1.0]
focus_fit_methodWhen a column is focused, what method should be used to bring it into view. 0 = center, 1 = fitint1[0 - 1]
follow_focuswhen a window is focused, should the layout move to bring it into view automaticallybooltrue
follow_min_visiblewhen a window is focused, require that at least a given fraction of it is visible for focus to follow. Hard input (e.g., binds, clicks) will always followfloat0.4[0.0 - 1.0]
explicit_column_widthsA comma-separated list of preconfigured widths for colresize +conf/-confstr"0.333, 0.5, 0.667, 1.0"
wrap_focusWhen enabled, causes hl.dsp.layout("focus l/r") to wrap around at the beginning and end.booltrue
wrap_swapcolWhen enabled, causes hl.dsp.layout("swapcol l/r") to wrap around at the beginning and end.booltrue
directionDirection in which new windows appear and the layout scrolls. "left"/"right"/"down"/"up"str"right"

Workspace rules

namedescriptiontype
directionSame as hl.config({ scrolling{ direction } })str

For example:

hl.workspace_rule({ workspace = "2", layout_opts = { direction = "right" } })

Layout messages

Dispatcher hl.dsp.layout(msg) params:

namedescriptionparams
movemove the layout horizontally, by either a relative logical px (-200, +200) or columns (+col, -col)move data
colresizeresize the current column, to either a value or by a relative value (e.g., 0.5, +0.2, -0.2), or cycle the preconfigured ones with +conf or -conf. Can also be all (number) for resizing all columns to a specific widthrelative float/relative conf
fitexecutes a fit operation based on the argument. Available: active, visible, all, toend, tobeg, expand.
fit expand Will expand the current window to take up the remaining free space on the monitor
fit mode
fit_into_viewfits the currently active column fully into viewnone
focusmoves the focus and centers the layout, while also wrapping instead of moving to neighboring monitors.direction
promotemoves a window to its own new columnnone
expelmoves the current window to a dedicated columnnone
consumemoves the current window into the previous columnnone
consume_or_expelexpel if not alone, consume if alone in a columnprev or next
swapcolSwaps the current column with its neighbor to the left (l) or right (r). The swap wraps around (e.g., swapping the first column left moves it to the end).l or r
centerCenters the currently focused column.none
inhibit_scrollPrevents the scrolling view from moving for the currently active workspace. The switch is independent for each workspaceleft empty for toggle, or bool for explicitly enabling/disabling

Example key bindings for your Hyprland config:

hl.bind(mainMod .. " + period", hl.dsp.layout("move +col"))
hl.bind(mainMod .. " + comma", hl.dsp.layout("swapcol l"))

Window rules

With the static rule scrolling_width you can set a starting column width for a window.

hl.window_rule({ name = "kitty_starting_width", match = { class = "kitty" }, scrolling_width = 0.5})

Layout-Handled Fullscreen

Scrolling has an optional layout-handled fullscreen behavior, which uses its own fullscreen handler. This custom fullscreen behavior allows you to scroll away from your fullscreen windows without them being un-fullscreened.

You can use it by using layout_aware = true (or not specifying layout_aware option at all) in your fullscreen dispatches when on a scrolling layout workspace. It also works with existing window/workspace fullscreen-related selectors.

Learn more about Fullscreen Handlers here.

Last updated on