:man source: Bspwm :man version: {revnumber} :man manual: Bspwm Manual bspwm(1) ======== Name ---- bspwm - Binary space partitioning window manager Synopsis -------- *bspwm* [*-h*|*-v*|*-c* 'CONFIG_PATH'] *bspc* 'DOMAIN' ['SELECTOR'] 'COMMANDS' *bspc* 'COMMAND' ['OPTIONS'] ['ARGUMENTS'] Description ----------- *bspwm* is a tiling window manager that represents windows as the leaves of a full binary tree. It is controlled and configured via *bspc*. Options ------- *-h*:: Print the synopsis and exit. *-v*:: Print the version and exit. *-c* 'CONFIG_PATH':: Use the given configuration file. Common Definitions ------------------ ---- DIR := north | west | south | east CYCLE_DIR := next | prev ---- Selectors --------- Selectors are used to select a target node, desktop, or monitor. A selector can either describe the target relatively or name it globally. Selectors consist of an optional reference, a descriptor and any number of non-conflicting modifiers as follows: [REFERENCE#]DESCRIPTOR(.MODIFIER)* The relative targets are computed in relation to the given reference (the default reference value is *focused*). An exclamation mark can be prepended to any modifier in order to reverse its meaning. The following characters cannot be used in monitor or desktop names: *#*, *:*, *.*. The special selector *%* can be used to select a monitor or a desktop with an invalid name. Node ~~~~ Select a node. ---- NODE_SEL := [NODE_SEL#](DIR|CYCLE_DIR|PATH|last| older|newer|focused|pointed| biggest|)[.[!]focused][.[!]automatic][.[!]local][.[!]active] [.[!]leaf][.[!]window][.[!]STATE][.[!]FLAG][.[!]LAYER] [.[!]same_class][.[!]descendant_of][.[!]ancestor_of] STATE := tiled|pseudo_tiled|floating|fullscreen FLAG := hidden|sticky|private|locked|urgent LAYER := below|normal|above PATH := @[DESKTOP_SEL:][[/]JUMP](/JUMP)* JUMP := first|1|second|2|brother|parent|DIR ---- Descriptors ^^^^^^^^^^^ 'DIR':: Selects the window in the given (spacial) direction relative to the reference node. 'CYCLE_DIR':: Selects the window in the given (cyclic) direction relative to the reference node. 'PATH':: Selects the node at the given path. last:: Selects the previously focused node relative to the reference node. older:: Selects the node older than the reference node in the history. newer:: Selects the node newer than the reference node in the history. focused:: Selects the currently focused node. pointed:: Selects the window under the pointer. biggest:: Selects the biggest window. :: Selects the node with the given ID. Path Jumps ^^^^^^^^^^ The initial node is the focused node (or the root if the path starts with '/') of the reference desktop (or the selected desktop if the path has a 'DESKTOP_SEL' prefix). 1|first:: Jumps to the first child. 2|second:: Jumps to the second child. brother:: Jumps to the brother node. parent:: Jumps to the parent node. 'DIR':: Jumps to the node holding the edge in the given direction. Modifiers ^^^^^^^^^ [!]focused:: Only consider focused or unfocused nodes. [!]automatic:: Only consider nodes in automatic or manual insertion mode. See also *--presel-dir* under *Node* in the *DOMAINS* section below. [!]local:: Only consider nodes in or not in the reference desktop. [!]active:: Only consider nodes in or not in the active desktop of their monitor. [!]leaf:: Only consider leaves or internal nodes. [!]window:: Only consider nodes that hold or don't hold a window. [!](tiled|pseudo_tiled|floating|fullscreen):: Only consider windows in or not in the given state. [!]same_class:: Only consider windows that have or don't have the same class as the reference window. [!]descendant_of:: Only consider nodes that are or aren't descendants of the reference node. [!]ancestor_of:: Only consider nodes that are or aren't ancestors of the reference node. [!](hidden|sticky|private|locked|urgent):: Only consider windows that have or don't have the given flag set. [!](below|normal|above):: Only consider windows in or not in the given layer. Desktop ~~~~~~~ Select a desktop. ---- DESKTOP_SEL := [DESKTOP_SEL#](CYCLE_DIR|last|older|newer| [MONITOR_SEL:](focused|^)| |)[.[!]occupied][.[!]focused][.[!]urgent][.[!]local] ---- Descriptors ^^^^^^^^^^^ 'CYCLE_DIR':: Selects the desktop in the given direction relative to the reference desktop. last:: Selects the previously focused desktop relative to the reference desktop. older:: Selects the desktop older than the reference desktop in the history. newer:: Selects the desktop newer than the reference desktop in the history. focused:: Selects the currently focused desktop. ^:: Selects the nth desktop. If *MONITOR_SEL* is given, selects the nth desktop on the selected monitor. :: Selects the desktop with the given ID. :: Selects the desktop with the given name. Modifiers ^^^^^^^^^ [!]occupied:: Only consider occupied or free desktops. [!]focused:: Only consider focused or unfocused desktops. [!]urgent:: Only consider urgent or non urgent desktops. [!]local:: Only consider desktops inside or outside of the reference monitor. Monitor ~~~~~~~ Select a monitor. ---- MONITOR_SEL := [MONITOR_SEL#](DIR|CYCLE_DIR|last|older|newer| focused|pointed|primary|^| |)[.[!]occupied][.[!]focused] ---- Descriptors ^^^^^^^^^^^ 'DIR':: Selects the monitor in the given (spacial) direction relative to the reference monitor. 'CYCLE_DIR':: Selects the monitor in the given (cyclic) direction relative to the reference monitor. last:: Selects the previously focused monitor relative to the reference monitor. older:: Selects the monitor older than the reference monitor in the history. newer:: Selects the monitor newer than the reference monitor in the history. focused:: Selects the currently focused monitor. pointed:: Selects the monitor under the pointer. primary:: Selects the primary monitor. ^:: Selects the nth monitor. :: Selects the monitor with the given ID. :: Selects the monitor with the given name. Modifiers ^^^^^^^^^ [!]occupied:: Only consider monitors where the focused desktop is occupied or free. [!]focused:: Only consider focused or unfocused monitors. Window States ------------- tiled:: Its size and position are determined by the splitting type and ratio of each node of its path in the window tree. pseudo_tiled:: Has an unrestricted size while being centered in its tiling space. floating:: Can be moved/resized freely. Although it doesn't occupy any tiling space, it is still part of the window tree. fullscreen:: Fills its monitor rectangle and has no borders. It is send in the ABOVE layer by default. Node Flags ---------- hidden:: Is hidden and doesn't occupy any tiling space. sticky:: Stays in the focused desktop of its monitor. private:: Tries to keep the same tiling position/size. locked:: Ignores the *node --close* message. urgent:: Has its urgency hint set. This flag is set externally. Stacking Layers -------------- There's three stacking layers: BELOW, NORMAL and ABOVE. In each layer, the window are orderered as follow: tiled & pseudo-tiled < fullscreen < floating. Domains ------- Node ~~~~ General Syntax ^^^^^^^^^^^^^^ node ['NODE_SEL'] 'COMMANDS' If 'NODE_SEL' is omitted, *focused* is assumed. Commands ^^^^^^^^ *-f*, *--focus* ['NODE_SEL']:: Focus the selected or given node. *-a*, *--activate* ['NODE_SEL']:: Activate the selected or given node. *-d*, *--to-desktop* 'DESKTOP_SEL':: Send the selected node to the given desktop. *-m*, *--to-monitor* 'MONITOR_SEL':: Send the selected node to the given monitor. *-n*, *--to-node* 'NODE_SEL':: Transplant the selected node to the given node. *-s*, *--swap* 'NODE_SEL':: Swap the selected node with the given node. *-p*, *--presel-dir* \[~]'DIR'|cancel:: Preselect the splitting area of the selected node (or cancel the preselection). If *~* is prepended to 'DIR' and the current preselection direction matches 'DIR', then the argument is interpreted as *cancel*. A node with a preselected area is said to be in "manual insertion mode". *-o*, *--presel-ratio* 'RATIO':: Set the splitting ratio of the preselection area. *-v*, *--move* 'dx' 'dy':: Move the selected window by 'dx' pixels horizontally and 'dy' pixels vertically. *-z*, *--resize* top|left|bottom|right|top_left|top_right|bottom_right|bottom_left 'dx' 'dy':: Resize the selected window by moving the given handle by 'dx' pixels horizontally and 'dy' pixels vertically. *-r*, *--ratio* 'RATIO'|(+|-)('PIXELS'|'FRACTION'):: Set the splitting ratio of the selected node (0 < 'RATIO' < 1). *-R*, *--rotate* '90|270|180':: Rotate the tree rooted at the selected node. *-F*, *--flip* 'horizontal|vertical':: Flip the the tree rooted at selected node. *-E*, *--equalize*:: Reset the split ratios of the tree rooted at the selected node to their default value. *-B*, *--balance*:: Adjust the split ratios of the tree rooted at the selected node so that all windows occupy the same area. *-C*, *--circulate* forward|backward:: Circulate the windows of the tree rooted at the selected node. *-t*, *--state* [~](tiled|pseudo_tiled|floating|fullscreen):: Set the state of the selected window. If *~* is present and the current state matches the given state, then the argument is interpreted as the last state. *-g*, *--flag* hidden|sticky|private|locked[=on|off]:: Set or toggle the given flag for the selected node. *-l*, *--layer* below|normal|above:: Set the stacking layer of the selected window. *-i*, *--insert-receptacle*:: Insert a receptacle node at the selected node. *-c*, *--close*:: Close the windows rooted at the selected node. *-k*, *--kill*:: Kill the windows rooted at the selected node. Desktop ~~~~~~~ General Syntax ^^^^^^^^^^^^^^ desktop ['DESKTOP_SEL'] 'COMMANDS' If 'DESKTOP_SEL' is omitted, *focused* is assumed. COMMANDS ^^^^^^^^ *-f*, *--focus* ['DESKTOP_SEL']:: Focus the selected or given desktop. *-a*, *--activate* ['DESKTOP_SEL']:: Activate the selected or given desktop. *-m*, *--to-monitor* 'MONITOR_SEL':: Send the selected desktop to the given monitor. *-l*, *--layout* 'CYCLE_DIR'|monocle|tiled:: Set or cycle the layout of the selected desktop. *-n*, *--rename* :: Rename the selected desktop. *-s*, *--swap* 'DESKTOP_SEL':: Swap the selected desktop with the given desktop. *-b*, *--bubble* 'CYCLE_DIR':: Bubble the selected desktop in the given direction. *-r*, *--remove*:: Remove the selected desktop. Monitor ~~~~~~~ General Syntax ^^^^^^^^^^^^^^ monitor ['MONITOR_SEL'] 'COMMANDS' If 'MONITOR_SEL' is omitted, *focused* is assumed. Commands ^^^^^^^^ *-f*, *--focus* ['MONITOR_SEL']:: Focus the selected or given monitor. *-s*, *--swap* 'MONITOR_SEL':: Swap the selected monitor with the given monitor. *-a*, *--add-desktops* ...:: Create desktops with the given names in the selected monitor. *-o*, *--reorder-desktops* ...:: Reorder the desktops of the selected monitor to match the given order. *-d*, *--reset-desktops* ...:: Rename, add or remove desktops depending on whether the number of given names is equal, superior or inferior to the number of existing desktops. *-g*, *--rectangle* WxH+X+Y:: Set the rectangle of the selected monitor. *-n*, *--rename* :: Rename the selected monitor. *-r*, *--remove*:: Remove the selected monitor. Query ~~~~~ General Syntax ^^^^^^^^^^^^^^ query 'COMMANDS' ['OPTIONS'] Commands ^^^^^^^^ The optional selectors are references. *-N*, *--nodes* ['NODE_SEL']:: List the IDs of the matching nodes. *-D*, *--desktops* ['DESKTOP_SEL']:: List the IDs (or names) of the matching desktops. *-M*, *--monitors* ['MONITOR_SEL']:: List the IDs (or names) of the matching monitors. *-T*, *--tree*:: Print a JSON representation of the matching item. Options ^^^^^^^ *-m*,*--monitor* ['MONITOR_SEL']:: *-d*,*--desktop* ['DESKTOP_SEL']:: *-n*, *--node* ['NODE_SEL']:: Constrain matches to the selected monitor, desktop or node. The descriptor can be omitted for '-M', '-D' and '-N'. *--names*:: Print names instead of IDs. Can only be used with '-M' and '-D'. Wm ~~ General Syntax ^^^^^^^^^^^^^^ wm 'COMMANDS' Commands ^^^^^^^^ *-d*, *--dump-state*:: Dump the current world state on standard output. *-l*, *--load-state* :: Load a world state from the given file. *-a*, *--add-monitor* WxH+X+Y:: Add a monitor for the given name and rectangle. *-O*, *--reorder-monitors* ...:: Reorder the list of monitors to match the given order. *-o*, *--adopt-orphans*:: Manage all the unmanaged windows remaining from a previous session. *-h*, *--record-history* on|off:: Enable or disable the recording of node focus history. *-g*, *--get-status*:: Print the current status information. Rule ~~~~ General Syntax ^^^^^^^^^^^^^^ rule 'COMMANDS' Commands ^^^^^^^^ *-a*, *--add* (|\*)[:(|\*)] [*-o*|*--one-shot*] [monitor=MONITOR_SEL|desktop=DESKTOP_SEL|node=NODE_SEL] [state=STATE] [layer=LAYER] [split_dir=DIR] [split_ratio=RATIO] [(hidden|sticky|private|locked|center|follow|manage|focus|border)=(on|off)] [rectangle=WxH+X+Y]:: Create a new rule. *-r*, *--remove* ^|head|tail|(|\*)[:(|*)]...:: Remove the given rules. *-l*, *--list*:: List the rules. Config ~~~~~~ General Syntax ^^^^^^^^^^^^^^ config [-m 'MONITOR_SEL'|-d 'DESKTOP_SEL'|-n 'NODE_SEL'] []:: Get or set the value of . Subscribe ~~~~~~~~~ General Syntax ^^^^^^^^^^^^^^ subscribe ['OPTIONS'] (all|report|monitor|desktop|node|...)*:: Continuously print events. See the *EVENTS* section for the description of each event. Options ^^^^^^^ *-f*, *--fifo*:: Print a path to a FIFO from which events can be read and return. *-c*, *--count* 'COUNT':: Stop the corresponding *bspc* process after having received 'COUNT' events. Quit ~~~~ General Syntax ^^^^^^^^^^^^^^ quit []:: Quit with an optional exit status. Exit Codes ---------- If the server can't handle a message, *bspc* will return with a non-zero exit code. Settings -------- Colors are in the form '#RRGGBB', booleans are 'true', 'on', 'false' or 'off'. All the boolean settings are 'false' by default unless stated otherwise. Global Settings ~~~~~~~~~~~~~~~ 'normal_border_color':: Color of the border of an unfocused window. 'active_border_color':: Color of the border of a focused window of an unfocused monitor. 'focused_border_color':: Color of the border of a focused window of a focused monitor. 'presel_feedback_color':: Color of the *node --presel-{dir,ratio}* message feedback area. 'split_ratio':: Default split ratio. 'status_prefix':: Prefix prepended to each of the status lines. 'external_rules_command':: External command used to retrieve rule consequences. The command will receive the following arguments: window ID, class name, instance name, and intermediate consequences. The output of that command must have the following format: *key1=value1 key2=value2 ...* (the valid key/value pairs are given in the description of the 'rule' command). 'initial_polarity':: On which child should a new window be attached when adding a window on a single window tree in automatic mode. Accept the following values: *first_child*, *second_child*. 'directional_focus_tightness':: The tightness of the algorithm used to decide whether a window is on the 'DIR' side of another window. Accept the following values: *high*, *low*. 'borderless_monocle':: Remove borders of tiled windows for the *monocle* desktop layout. 'gapless_monocle':: Remove gaps of tiled windows for the *monocle* desktop layout. 'paddingless_monocle':: Remove padding space for the *monocle* desktop layout. 'single_monocle':: Set the desktop layout to *monocle* if there's only one tiled window in the tree. 'pointer_motion_interval':: The minimum interval, in milliseconds, between two motion notify events. 'pointer_modifier':: Keyboard modifier used for moving or resizing windows. Accept the following values: *shift*, *control*, *lock*, *mod1*, *mod2*, *mod3*, *mod4*, *mod5*. 'pointer_action1':: 'pointer_action2':: 'pointer_action3':: Action performed when pressing 'pointer_modifier' + 'button'. Accept the following values: *move*, *resize_side*, *resize_corner*, *focus*, *none*. 'click_to_focus':: Button used for focusing a window (or a monitor). The possible values are: *button1*, *button2*, *button3*, *any*, *none*. 'swallow_first_click':: Don't replay the click that makes a window focused if 'click_to_focus' isn't *none*. 'focus_follows_pointer':: Focus the window under the pointer. 'pointer_follows_focus':: When focusing a window, put the pointer at its center. 'pointer_follows_monitor':: When focusing a monitor, put the pointer at its center. 'ignore_ewmh_focus':: Ignore EWMH focus requests coming from applications. 'center_pseudo_tiled':: Center pseudo tiled windows into their tiling rectangles. Defaults to 'true'. 'honor_size_hints':: Apply ICCCM window size hints. 'remove_disabled_monitors':: Consider disabled monitors as disconnected. 'remove_unplugged_monitors':: Remove unplugged monitors. 'merge_overlapping_monitors':: Merge overlapping monitors (the bigger remains). Monitor and Desktop Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'top_padding':: 'right_padding':: 'bottom_padding':: 'left_padding':: Padding space added at the sides of the monitor or desktop. Desktop Settings ~~~~~~~~~~~~~~~~ 'window_gap':: Size of the gap that separates windows. Node Settings ~~~~~~~~~~~~~ 'border_width':: Window border width. Pointer Bindings ---------------- 'click_to_focus':: Focus the window (or the monitor) under the pointer if the value isn't *none*. 'pointer_modifier' + 'button1':: Move the window under the pointer. 'pointer_modifier' + 'button2':: Resize the window under the pointer by dragging the nearest side. 'pointer_modifier' + 'button3':: Resize the window under the pointer by dragging the nearest corner. The behavior of 'pointer_modifier' + 'button' can be modified through the 'pointer_action' setting. Events ------ 'report':: See the next section for the description of the format. 'monitor_add ':: A monitor is added. 'monitor_rename ':: A monitor is renamed. 'monitor_remove ':: A monitor is removed. 'monitor_swap ':: A monitor is swapped. 'monitor_focus ':: A monitor is focused. 'monitor_geometry ':: The geometry of a monitor changed. 'desktop_add ':: A desktop is added. 'desktop_rename ':: A desktop is renamed. 'desktop_remove ':: A desktop is removed. 'desktop_swap ':: A desktop is swapped. 'desktop_transfer ':: A desktop is transferred. 'desktop_focus ':: A desktop is focused. 'desktop_activate ':: A desktop is activated. 'desktop_layout tiled|monocle':: The layout of a desktop changed. 'node_add ':: A node is added. 'node_remove ':: A node is removed. 'node_swap ':: A node is swapped. 'node_transfer ':: A node is transferred. 'node_focus ':: A node is focused. 'node_activate ':: A node is activated. 'node_presel (dir DIR|ratio RATIO|cancel)':: A node is preselected. 'node_stack below|above ':: A node is stacked below or above another node. 'node_geometry ':: The geometry of a window changed. 'node_state tiled|pseudo_tiled|floating|fullscreen on|off':: The state of a window changed. 'node_flag hidden|sticky|private|locked|urgent on|off':: One of the flags of a node changed. 'node_layer below|normal|above':: The layer of a window changed. 'pointer_action move|resize_corner|resize_side begin|end':: A pointer action occured. Please note that *bspwm* initializes monitors before it reads messages on its socket, therefore the initial monitor events can't be received. Report Format ------------- Each report event message is composed of items separated by colons. Each item has the form '' where '' is the first character of the item. 'M':: Focused monitor. 'm':: Unfocused monitor. 'O':: Occupied focused desktop. 'o':: Occupied unfocused desktop. 'F':: Free focused desktop. 'f':: Free unfocused desktop. 'U':: Urgent focused desktop. 'u':: Urgent unfocused desktop. 'L(T|M)':: Layout of the focused desktop of a monitor. 'T(T|P|F|=|@)':: State of the focused node of a focused desktop. 'G(S?P?L?)':: Active flags of the focused node of a focused desktop. Environment Variables --------------------- 'BSPWM_SOCKET':: The path of the socket used for the communication between *bspc* and *bspwm*. If it isn't defined, then the following path is used: '/tmp/bspwm__-socket'. Contributors ------------ * Steven Allen * Thomas Adam * Ivan Kanakarakis Author ------ Bastien Dejean