Actions
Every layout action and its arguments — the same grammar scoot msg --help prints, and config [binds] values and [autostart] entries use.
Actions
Section titled “Actions”One parser handles scoot msg --help, scoot --help, and config [binds] values:
focus-column|move-column|consume-or-expel left|rightfocus-window|move-window up|downfocus-workspace|move-window-to-workspace up|downfocus-window-id ID | focus-workspace-index N [--output ID] | move-window-to-workspace-index N | focus-output ID | move-window-to-output ID | focus-output-index N | move-window-to-output-index N | focus-output-left | focus-output-right | move-window-to-output-left | move-window-to-output-right | cycle-column-width | set-column-width N | scroll-view-to-column N | toggle-fullscreen | set-fullscreen ID on|off | toggle-maximize | set-maximized ID on|off | close | spawn COMMAND... | show-keymap | quittoggle-floating | set-floating ID on|off | toggle-floating-focusmove-floating ID X Y | resize-floating ID WIDTH HEIGHTfocus-workspace-index N and move-window-to-workspace-index N are 0-based; out of range does nothing (a move leaves the window where it is). With --output ID, focus-workspace-index N switches that output’s workspace instead of the focused output’s, which is what a per-output bar’s workspace buttons drive. The switch moves keyboard focus to that output, the way a click on a window focuses its output, even onto the already-active workspace. An unknown id or a stale index does nothing at all, not even moving focus. The id is the output id scoot msg outputs reports (stable for the session, never reused). On the wire this is a separate action tag: {"action":"focus_output_workspace_index","output":2,"index":1}.
set-column-width N is 0-based into the session’s [layout] column_widths; out of range does nothing. scroll-view-to-column N focuses the Nth column (0-based, strip order) and scrolls the view so its left edge sits at the usable edge, clamped to the strip like every other scroll. Out of range does nothing, and with a floating window focused it leaves the floating layer like focus-window-id. On the wire: {"action":"scroll_view_to_column","index":2}.
focus-output ID and move-window-to-output ID take an output id as scoot msg outputs reports it; an unknown id does nothing. focus-output-index N and move-window-to-output-index N take a 0-based position in the output list in creation order instead, so they keep reaching a monitor that was unplugged and plugged back in (which comes back under a fresh id); out of range does nothing. focus-output-left, focus-output-right, move-window-to-output-left and move-window-to-output-right step to the neighbouring output in geometry order (x, then y), wrapping around: left of the leftmost is the rightmost, and the reverse. With one output there is nowhere to go, so either direction does nothing; with two, either names the other. These four are what the default Super+comma / Super+period binds send (see configuration.md for the order rule). On the wire: {"action":"focus_output_direction","direction":"left"} (or "right") and {"action":"move_window_to_output_direction","direction":"left"} (or "right"). A move carries the focused window to the target output’s active workspace and follows it there; focusing an output with no windows focuses nothing.
toggle-fullscreen flips the focused window in and out of fullscreen (the Super+f bind). set-fullscreen ID on|off sets one window’s state by id, idempotently, without moving focus. A window whose column is not focused becomes fullscreen but does not cover the screen until its column is focused. An unknown id, or a window stacked under another in its column, does nothing (see configuration.md for what fullscreen does to the layout). toggle-maximize flips the focused window in and out of maximized (the Super+m bind): it fills the output’s usable area, bar visible, instead of covering the whole output like fullscreen. set-maximized ID on|off sets one window’s state by id, idempotently, without moving focus, with the same non-focused-column and stacked-window rules. Fullscreen wins while both hold: leaving fullscreen returns to maximized.
toggle-floating floats the focused window above its workspace’s strip or puts it back as a column right of the strip’s focused one (the Super+Shift+Space bind). set-floating ID on|off does the same to one window by id, idempotently, without moving focus. toggle-floating-focus moves focus between the focused workspace’s floating windows and its strip (Super+Space), and does nothing when the other side is empty. With a floating window focused, focus-column returns to the strip, scroll-view-to-column leaves the floating layer like focus-window-id, focus-window cycles the floating windows, and move-column, move-window, consume-or-expel, cycle-column-width and set-column-width do nothing (see configuration.md).
move-floating ID X Y puts a floating window’s top-left corner at X, Y in the same global logical coordinates windows reports rect in, clamped inside the usable area of the output it lands on. A position whose middle is over another output moves the window to that output’s active workspace (and focus with it, if it was focused). resize-floating ID WIDTH HEIGHT asks a floating window to take that size, keeping its top-left corner. The size is clamped to the window’s own minimum and maximum size, to the room between that corner and the usable area’s bottom-right (the room wins over a minimum that does not fit), and to at least 1. The window draws the new size when it answers the configure, so windows reports it a frame or so later (wait-idle first when that matters). Both are kept: the window stays where it was put until something moves it (a user’s drag, another action, or its output changing size, which re-centres it). Both do nothing (answering ok, like every by-id action) for an unknown id, a tiled window, a fullscreen one or a maximized one. On the wire: {"action":"move_floating","id":7,"x":10,"y":12}, {"action":"resize_floating","id":7,"width":640,"height":480} (a negative size is a decode error), {"action":"focus_output_index","index":1}, {"action":"toggle_maximize"} and {"action":"set_maximized","id":7,"maximized":true}; move_focused_window_to_output_index is the tag for move-window-to-output-index.
All the wire tags named above are additive: PROTOCOL_VERSION did not change.
spawn is split on whitespace and not run through a shell, so an argument containing a space can’t be expressed this way. show-keymap opens the live keymap the way the default Super+Shift+/ bind does: a terminal running scoot msg binds in a pager. Which terminal is decided at fire time: xdg-terminal-exec when it is on PATH, else the live table’s Super+Return terminal when that bind is a spawn (a rebind there moves the keymap with it), else foot. The pager degrades to plain output plus a wait for Enter when less is missing. It is a unit like quit (on the wire {"action":"show_keymap"}) and never repeats even when a bind flags it.
Every action is refused while the session is locked.
A focus-window-id naming no window is a miss: it answers ok and changes
nothing – not window focus, and not the click that gave an on_demand
layer surface the keyboard. See
Requests and the focus rules.
