← Otto User GuideWindow Management

Otto is a stacking window manager: windows float, overlap, and go where you put them. There is no automatic tiling layout — but there are tiling shortcuts, smart initial placement, and animated state changes.

Focus and raising

Otto uses click-to-focus. Clicking anywhere in a window raises it to the top of the stack and gives it keyboard focus. Focus also follows:

The focused window’s name and menus appear in the Top Bar.

Moving and resizing

Drag a window by its title bar to move it; drag an edge or corner to resize.

On a window Otto decorates, both are the compositor’s own: the title bar starts the move, and a narrow strip along the window’s four edges and corners — about six points wide, hit-tested ahead of everything else — starts a resize. Such a window draws no frame of its own and so never asks for a resize; the border is what gives it one. The cursor changes over it to name the edge you would grab.

On a window that draws its own decorations, both are driven by the application: Otto starts the move or resize when the app asks it to, which is what happens when you grab the parts of the window its toolkit designates for that.

Dragging a maximized window unmaximizes it and keeps the grab point under your pointer, proportionally — so the window shrinks to its restored size around where you grabbed it rather than jumping away.

There is no modifier-drag (Alt+drag) to move a window from anywhere yet.

Drag to tile

Hold Ctrl while dragging a window and Otto previews where it would land — a translucent rectangle over the target area, animating as you move between zones. Release to snap the window there; let go of Ctrl first and the drag stays an ordinary move.

Where the pointer isZone
Top band of the usable area, its middle halfMaximize
Left of centreLeft half
Right of centreRight half

Only a narrow column down the middle arms no zone at all, so nudging a window off centre is enough to tile it to that side.

Decorations

Otto draws window decorations itself. A client that binds xdg-decoration without stating a preference — or that unsets the one it had — is told server-side, and gets an Otto-drawn title bar with the close, minimize and maximize controls. The compositor owns that strip: it is hit-tested before the client’s surfaces, so dragging it moves the window and the controls work even when the application is busy.

window_controls_side = "right"   # or "left"

window_controls_side picks which end of the title bar those controls sit at. It applies to Otto-drawn decorations and to Otto’s own applications, and takes effect after a restart.

Clients that explicitly ask for client-side are honoured. GTK and Electron apps request it and keep drawing their own title bars, so those look like whatever the toolkit does.

Otto answers on both decoration protocols — xdg-decoration, which Qt and KDE apps use, and KDE’s older org_kde_kwin_server_decoration, which is the only one GTK applications look for. Ghostty’s window-decoration = server, for instance, reaches Otto through the latter.

The ToggleDecorations shortcut action flips the decoration mode of every window that negotiated one, which is mostly useful for testing how apps respond.

Maximize

ToggleMaximizeWindow (Ctrl+Up by default) maximizes the focused window to fill its monitor’s usable area — that is, minus any exclusive zones claimed by the top bar or other panels. Pressing it again restores the previous geometry.

The transition is animated: the window grows or shrinks into place rather than snapping.

Applications with their own maximize button use the same path.

Tiling to halves

ShortcutEffect
Ctrl+LeftSnap the focused window to the left half of its monitor
Ctrl+RightSnap it to the right half

These are one-shot geometry changes, not a managed tiling mode: nothing keeps the two windows in sync, and moving or resizing either one afterwards just works normally. Tiling a maximized window unmaximizes it first.

The same three targets are reachable with the pointer — see Drag to tile.

Fullscreen

Fullscreen is driven by the application (a video player’s fullscreen button, a game’s settings, F11 in a browser). Otto animates the window into the monitor’s full extent and hides the dock while it is up.

Fullscreen windows are the best case for Otto’s direct-scanout path on the --tty-udev backend: a fullscreen window can be handed straight to the display hardware without going through composition at all, which is why fullscreen games and video playback are noticeably more efficient. This includes X11 games under XWayland.

Minimize

Minimizing sends the window into the Dock with a genie animation — the window stretches and funnels down into the dock’s minimized-windows area. Clicking its thumbnail in the dock plays the animation in reverse.

The animation itself has no settings; dock.genie_scale and dock.genie_span shape the dock’s icon magnification, not this — see Dock.

Minimized windows are excluded from Exposé.

Where new windows appear

Otto places a new window where it overlaps existing windows the least, rather than cascading from a corner.

It considers the four corners of the usable area first (clockwise from top-left), then positions flush to the right edge and bottom edge of every window already on screen. Whichever candidate produces the smallest total overlap area wins, with ties going to the earlier candidate — so an empty top-left corner is preferred over a technically-equal position elsewhere.

Windows that end up disjoint rather than overlapping also stay eligible for hardware plane scanout, which is a rendering win, not just a visual preference.

Applications that position their own windows (dialogs anchored to a parent, tooltips, menus) are unaffected; this only governs top-level windows that leave placement to the compositor.

Closing

CloseWindow politely asks the focused window to close, the same as clicking its close button — the application can still prompt you about unsaved work. There is no force-kill shortcut.

ApplicationSwitchQuit (Ctrl+Q by default, while the app switcher is open) quits the highlighted application, closing all of its windows.

Moving windows between workspaces and monitors

Drag a window preview in Exposé onto a workspace thumbnail in the selector strip to move it there. Dragging a window across the boundary between two monitors moves it to the other monitor. See Workspaces.

X11 applications

X11 apps run under XWayland and are managed exactly like native ones — same focus, tiling, minimize and exposé behaviour.

Two things get special handling:

What is not there yet