Independent Display Workspaces
Display 1: Workspace 1 Terminal VS Code ★ Browser Display 2: Workspace 3 Slack Discord

How It Works

Parked Window Thumbnails

When a column would extend more than 50% of its width onto an adjacent display (screen overlap), macOS would move the window to that display. To stop this, FazerWM shows a thumbnail. The thumbnail shows what would remain visible on the original display. FazerWM then parks the window offscreen:

Display 1: Workspace 1 Terminal VS Code ★ Browser Display 2: Workspace 3 Thumbnail Slack Discord

The parked thumbnail (dashed) on Display 2 shows the sliver of the VS Code column. That sliver would have crossed the display boundary.

Cross-Screen Drag

Drag windows between displays in normal mode and in overview mode:

Display Hotplug

FazerWM remembers how your windows are arranged across displays, so plugging in or unplugging a monitor moves your windows intelligently instead of dumping them all on one screen.

Returning to a remembered setup

When you reconnect a set of displays you have used before in this session, every window goes back to the exact display and workspace it was on. Dock your laptop at the desk you used this morning and your windows snap back to where you left them.

Switching to a new setup

When a set of displays you have not used before connects, FazerWM places your windows by their role:

Windows you moved yourself

A window you repositioned by hand is not snapped back to a stale remembered spot. On the next setup switch, Pro re-places it by its role (a side-monitor window lands on a side monitor again), and Free moves it to the primary. Once it settles onto a display and is re-remembered there, that setup's memory is fresh again.

Manually resized columns

A column whose width you set by hand (keyboard steps or an edge drag) keeps that width through display changes. Reconnect the same display and the width returns exactly. If a removed display's windows migrate to a surviving monitor with different dimensions, the column keeps the same proportion of the tiled area; a 75% column is still 75% there. The same applies when you move a column or window to another monitor yourself, by keyboard or by dragging: the width follows the window and lands at the same proportion on the new display. See Resizing.

How many setups are remembered

Free remembers up to 2 display setups; when a third appears, the least-recently-used one is forgotten. Pro remembers as many as you use. A forgotten setup behaves like a brand-new one the next time it connects.

Dock blips, sleep, and wake

Brief disconnects (a loose cable, a dock that drops for a second) and staggered wake-from-sleep, where displays come back one at a time over several seconds, are handled without thrash. FazerWM waits for the connected set to settle before moving anything, so a display arriving late does not trigger a partial reshuffle. Manually resized columns get their width back once the set has settled.

⚠️ v1 limitation: in-memory only

Remembered setups live in memory for as long as FazerWM is running. They survive sleep and wake while the app stays open, but they are lost if you quit FazerWM or restart your Mac.

Rearranging displays

Moving monitors around in System Settings without unplugging anything keeps the connected set, and with it your arrangement memory, the same, so every window stays on the display and workspace it was on. While you drag the arrangement around, macOS sometimes re-anchors a window onto a different display; FazerWM notices and pulls it back to its remembered display. The overview is also rebuilt against the new geometry, so its overlays and drop zones track the moved screens.

Other hotplug details

⚠️ Display Arrangement

FazerWM requires each display to have at least one bottom corner. This corner must not overlap with the adjacent displays. If your arrangement is invalid, FazerWM shows a warning at startup. Fix this in System Settings → Displays.

Display Focus

ShortcutAction
Hyper+LCmd+←/→/↑/↓Focus an adjacent display

The cursor follows the focused or the moved window, per the pointerFollowsFocus setting (see Configuration). The setting can be the focused display, the focused window, or nowhere. This setting is a Pro feature. On the free tier, the cursor does not follow the focus. It applies to display focus, to move-to-monitor, and to cross-display wrap alike.

Move to Monitor

Move columns or windows to the adjacent displays. A manually resized column keeps its width, landing at the same proportion of the new display's tiled area:

ActionBehavior
Move column to monitorMoves the whole column to the current workspace of the target display. It lands at the edge that is nearest to where it came from.
Move window to monitorMoves a single window to the target display. It is inserted as a new column at the nearest edge.

Cross-Display Wrap Pro

When cross-display-wrap is enabled (the default for Pro), the focus and the window-move actions do not stop at the workspace edge. They continue onto the physically adjacent display. The displays themselves stay independent, each with its own workspaces and layout:

Per pointerFollowsFocus, the cursor follows the wrapped-to window. So repeated presses continue across each display in that direction (in display or window mode).

The wrap detent (crossDisplayWrapDetent, on by default) guards these edges; see Two-Press Detent below.

Window rules take precedence

A window that is pinned by a rule (to a named workspace or a preferred display) is not moved across displays in a way that breaks the rule. The move is blocked at the edge. It does not snap back. This prevents stale tab indicators and duplicate windows.

Toggle Wrap focus & moves across displays under Settings → General → Window Behavior. Or set it in the config file:

layout:
  crossDisplayWrap: true

Two-Press Detent

With cross-display-wrap-detent (default on), the first press toward an adjacent display only arms the crossing. Nothing visibly happens. The second press does the jump or the move. This guards against a single stray keypress that carries you onto another monitor. The detent applies only while wrap is on.

Toggle Require two presses to cross displays under Settings → General → Window Behavior. Or set it in the config file:

layout:
  crossDisplayWrapDetent: true