2 :man version: {revnumber}
3 :man manual: Bspwm Manual
11 bspwm - Binary space partitioning window manager
16 *bspwm* [*-h*|*-v*|*-c* 'CONFIG_PATH']
18 *bspc* 'DOMAIN' ['SELECTOR'] 'COMMANDS'
20 *bspc* 'COMMAND' ['OPTIONS'] ['ARGUMENTS']
25 *bspwm* is a tiling window manager that represents windows as the leaves of a full binary tree.
27 It is controlled and configured via *bspc*.
34 Print the synopsis and exit.
37 Print the version and exit.
40 Use the given configuration file.
46 DIR := north | west | south | east
47 CYCLE_DIR := next | prev
53 Selectors are used to select a target node, desktop, or monitor. A selector
54 can either describe the target relatively or name it globally.
56 Selectors consist of an optional reference, a descriptor and any number of
57 non-conflicting modifiers as follows:
59 [REFERENCE#]DESCRIPTOR(.MODIFIER)*
61 The relative targets are computed in relation to the given reference (the
62 default reference value is *focused*).
64 An exclamation mark can be prepended to any modifier in order to reverse its
67 The following characters cannot be used in monitor or desktop names: *#*, *:*, *.*.
75 NODE_SEL := [NODE_SEL#](DIR|CYCLE_DIR|PATH|last|older|newer|focused|pointed|biggest|<node_id>)[.[!]focused][.[!]automatic][.[!]local][.[!]active][.[!]leaf][.[!]window][.[!]STATE][.[!]FLAG][.[!]LAYER][.[!]same_class][.[!]descendant_of][.[!]ancestor_of]
77 STATE := tiled|pseudo_tiled|floating|fullscreen
79 FLAG := hidden|sticky|private|locked|urgent
81 LAYER := below|normal|above
83 PATH := @[DESKTOP_SEL:][[/]JUMP](/JUMP)*
85 JUMP := first|1|second|2|brother|parent|DIR
92 Selects the window in the given (spacial) direction relative to the reference node.
95 Selects the window in the given (cyclic) direction relative to the reference node.
98 Selects the node at the given path.
101 Selects the previously focused node relative to the reference node.
104 Selects the node older than the reference node in the history.
107 Selects the node newer than the reference node in the history.
110 Selects the currently focused node.
113 Selects the window under the pointer.
116 Selects the biggest window.
119 Selects the node with the given ID.
124 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).
127 Jumps to the first child.
130 Jumps to the second child.
133 Jumps to the brother node.
136 Jumps to the parent node.
139 Jumps to the node holding the edge in the given direction.
145 Only consider focused or unfocused nodes.
148 Only consider nodes in automatic or manual insertion mode. See also *--presel-dir* under *Node* in the *DOMAINS* section below.
151 Only consider nodes in or not in the reference desktop.
154 Only consider nodes in or not in the active desktop of their monitor.
157 Only consider leaves or internal nodes.
160 Only consider nodes that hold or don't hold a window.
162 [!](tiled|pseudo_tiled|floating|fullscreen)::
163 Only consider windows in or not in the given state.
166 Only consider windows that have or don't have the same class as the reference window.
169 Only consider nodes that are or aren't descendants of the reference node.
172 Only consider nodes that are or aren't ancestors of the reference node.
174 [!](hidden|sticky|private|locked|urgent)::
175 Only consider windows that have or don't have the given flag set.
177 [!](below|normal|above)::
178 Only consider windows in or not in the given layer.
186 DESKTOP_SEL := [DESKTOP_SEL#](CYCLE_DIR|last|older|newer|[MONITOR_SEL:](focused|^<n>)|<desktop_id>|<desktop_name>)[.[!]occupied][.[!]focused][.[!]urgent][.[!]local]
193 Selects the desktop in the given direction relative to the reference desktop.
196 Selects the previously focused desktop relative to the reference desktop.
199 Selects the desktop older than the reference desktop in the history.
202 Selects the desktop newer than the reference desktop in the history.
205 Selects the currently focused desktop.
208 Selects the nth desktop. If *MONITOR_SEL* is given, selects the nth desktop on the selected monitor.
211 Selects the desktop with the given ID.
214 Selects the desktop with the given name.
220 Only consider occupied or free desktops.
223 Only consider focused or unfocused desktops.
226 Only consider urgent or non urgent desktops.
229 Only consider desktops inside or outside of the reference monitor.
237 MONITOR_SEL := [MONITOR_SEL#](DIR|CYCLE_DIR|last|older|newer|focused|pointed|primary|^<n>|<monitor_id>|<monitor_name>)[.[!]occupied][.[!]focused]
244 Selects the monitor in the given (spacial) direction relative to the reference monitor.
247 Selects the monitor in the given (cyclic) direction relative to the reference monitor.
250 Selects the previously focused monitor relative to the reference monitor.
253 Selects the monitor older than the reference monitor in the history.
256 Selects the monitor newer than the reference monitor in the history.
259 Selects the currently focused monitor.
262 Selects the monitor under the pointer.
265 Selects the primary monitor.
268 Selects the nth monitor.
271 Selects the monitor with the given ID.
274 Selects the monitor with the given name.
281 Only consider monitors where the focused desktop is occupied or free.
284 Only consider focused or unfocused monitors.
291 Its size and position are determined by the splitting type and ratio of each node of its path in the window tree.
294 Has an unrestricted size while being centered in its tiling space.
297 Can be moved/resized freely. Although it doesn't occupy any tiling space, it is still part of the window tree.
300 Fills its monitor rectangle and has no borders. It is send in the ABOVE layer by default.
307 Is hidden and doesn't occupy any tiling space.
310 Stays in the focused desktop of its monitor.
313 Tries to keep the same tiling position/size.
316 Ignores the *node --close* message.
319 Has its urgency hint set. This flag is set externally.
325 There's three stacking layers: BELOW, NORMAL and ABOVE.
327 In each layer, the window are orderered as follow: tiled & pseudo-tiled < fullscreen < floating.
339 node ['NODE_SEL'] 'COMMANDS'
341 If 'NODE_SEL' is omitted, *focused* is assumed.
345 *-f*, *--focus* ['NODE_SEL']::
346 Focus the selected or given node.
348 *-a*, *--activate* ['NODE_SEL']::
349 Activate the selected or given node.
351 *-d*, *--to-desktop* 'DESKTOP_SEL'::
352 Send the selected node to the given desktop.
354 *-m*, *--to-monitor* 'MONITOR_SEL'::
355 Send the selected node to the given monitor.
357 *-n*, *--to-node* 'NODE_SEL'::
358 Transplant the selected node to the given node.
360 *-s*, *--swap* 'NODE_SEL'::
361 Swap the selected node with the given node.
363 *-p*, *--presel-dir* \[~]'DIR'|cancel::
364 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".
366 *-o*, *--presel-ratio* 'RATIO'::
367 Set the splitting ratio of the preselection area.
369 *-v*, *--move* 'dx' 'dy'::
370 Move the selected window by 'dx' pixels horizontally and 'dy' pixels vertically.
372 *-z*, *--resize* top|left|bottom|right|top_left|top_right|bottom_right|bottom_left 'dx' 'dy'::
373 Resize the selected window by moving the given handle by 'dx' pixels horizontally and 'dy' pixels vertically.
375 *-r*, *--ratio* 'RATIO'|(+|-)('PIXELS'|'FRACTION')::
376 Set the splitting ratio of the selected node (0 < 'RATIO' < 1).
378 *-R*, *--rotate* '90|270|180'::
379 Rotate the tree rooted at the selected node.
381 *-F*, *--flip* 'horizontal|vertical'::
382 Flip the the tree rooted at selected node.
385 Reset the split ratios of the tree rooted at the selected node to their default value.
388 Adjust the split ratios of the tree rooted at the selected node so that all windows occupy the same area.
390 *-C*, *--circulate* forward|backward::
391 Circulate the windows of the tree rooted at the selected node.
393 *-t*, *--state* [~](tiled|pseudo_tiled|floating|fullscreen)::
394 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.
396 *-g*, *--flag* hidden|sticky|private|locked[=on|off]::
397 Set or toggle the given flag for the selected node.
399 *-l*, *--layer* below|normal|above::
400 Set the stacking layer of the selected window.
402 *-i*, *--insert-receptacle*::
403 Insert a receptacle node at the selected node.
406 Close the windows rooted at the selected node.
409 Kill the windows rooted at the selected node.
417 desktop ['DESKTOP_SEL'] 'COMMANDS'
419 If 'DESKTOP_SEL' is omitted, *focused* is assumed.
423 *-f*, *--focus* ['DESKTOP_SEL']::
424 Focus the selected or given desktop.
426 *-a*, *--activate* ['DESKTOP_SEL']::
427 Activate the selected or given desktop.
429 *-m*, *--to-monitor* 'MONITOR_SEL'::
430 Send the selected desktop to the given monitor.
432 *-l*, *--layout* 'CYCLE_DIR'|monocle|tiled::
433 Set or cycle the layout of the selected desktop.
435 *-n*, *--rename* <new_name>::
436 Rename the selected desktop.
438 *-s*, *--swap* 'DESKTOP_SEL'::
439 Swap the selected desktop with the given desktop.
441 *-b*, *--bubble* 'CYCLE_DIR'::
442 Bubble the selected desktop in the given direction.
445 Remove the selected desktop.
453 monitor ['MONITOR_SEL'] 'COMMANDS'
455 If 'MONITOR_SEL' is omitted, *focused* is assumed.
459 *-f*, *--focus* ['MONITOR_SEL']::
460 Focus the selected or given monitor.
462 *-s*, *--swap* 'MONITOR_SEL'::
463 Swap the selected monitor with the given monitor.
465 *-a*, *--add-desktops* <name>...::
466 Create desktops with the given names in the selected monitor.
468 *-o*, *--reorder-desktops* <name>...::
469 Reorder the desktops of the selected monitor to match the given order.
471 *-d*, *--reset-desktops* <name>...::
472 Rename, add or remove desktops depending on whether the number of given names is equal, superior or inferior to the number of existing desktops.
474 *-g*, *--rectangle* WxH+X+Y::
475 Set the rectangle of the selected monitor.
477 *-n*, *--rename* <new_name>::
478 Rename the selected monitor.
481 Remove the selected monitor.
489 query 'COMMANDS' ['OPTIONS']
494 The optional selectors are references.
496 *-N*, *--nodes* ['NODE_SEL']::
497 List the IDs of the matching nodes.
499 *-D*, *--desktops* ['DESKTOP_SEL']::
500 List the IDs (or names) of the matching desktops.
502 *-M*, *--monitors* ['MONITOR_SEL']::
503 List the IDs (or names) of the matching monitors.
506 Print a JSON representation of the matching item.
511 *-m*,*--monitor* ['MONITOR_SEL']::
512 *-d*,*--desktop* ['DESKTOP_SEL']::
513 *-n*, *--node* ['NODE_SEL']::
514 Constrain matches to the selected monitor, desktop or node. The descriptor can be omitted for '-M', '-D' and '-N'.
517 Print names instead of IDs. Can only be used with '-M' and '-D'.
530 *-d*, *--dump-state*::
531 Dump the current world state on standard output.
533 *-l*, *--load-state* <file_path>::
534 Load a world state from the given file.
536 *-a*, *--add-monitor* <name> WxH+X+Y::
537 Add a monitor for the given name and rectangle.
539 *-O*, *--reorder-monitors* <name>...::
540 Reorder the list of monitors to match the given order.
542 *-o*, *--adopt-orphans*::
543 Manage all the unmanaged windows remaining from a previous session.
545 *-h*, *--record-history* on|off::
546 Enable or disable the recording of node focus history.
548 *-g*, *--get-status*::
549 Print the current status information.
562 *-a*, *--add* (<class_name>|\*)[:(<instance_name>|\*)] [*-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]::
565 *-r*, *--remove* ^<n>|head|tail|(<class_name>|\*)[:(<instance_name>|*)]...::
566 Remove the given rules.
577 config [-m 'MONITOR_SEL'|-d 'DESKTOP_SEL'|-n 'NODE_SEL'] <setting> [<value>]::
578 Get or set the value of <setting>.
585 subscribe ['OPTIONS'] (all|report|monitor|desktop|node|...)*::
586 Continuously print events. See the *EVENTS* section for the description of each event.
592 Print a path to a FIFO from which events can be read and return.
594 *-c*, *--count* 'COUNT'::
595 Stop the corresponding *bspc* process after having received 'COUNT' events.
604 Quit with an optional exit status.
609 If the server can't handle a message, *bspc* will return with a non-zero exit code.
613 Colors are in the form '#RRGGBB', booleans are 'true', 'on', 'false' or 'off'.
615 All the boolean settings are 'false' by default unless stated otherwise.
620 'normal_border_color'::
621 Color of the border of an unfocused window.
623 'active_border_color'::
624 Color of the border of a focused window of an unfocused monitor.
626 'focused_border_color'::
627 Color of the border of a focused window of a focused monitor.
629 'presel_feedback_color'::
630 Color of the *node --presel-{dir,ratio}* message feedback area.
636 Prefix prepended to each of the status lines.
638 'external_rules_command'::
639 External command used to retrieve rule consequences. The command will receive the following arguments: window ID, class and instance names, monitor, desktop and node selectors. 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).
642 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*.
644 'directional_focus_tightness'::
645 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*.
647 'borderless_monocle'::
648 Remove borders of tiled windows for the *monocle* desktop layout.
651 Remove gaps of tiled windows for the *monocle* desktop layout.
653 'paddingless_monocle'::
654 Remove padding space for the *monocle* desktop layout.
657 Set the desktop layout to *monocle* if there's only one tiled window in the tree.
659 'pointer_motion_interval'::
660 The minimum interval, in milliseconds, between two motion notify events.
663 Keyboard modifier used for moving or resizing windows. Accept the following values: *shift*, *control*, *lock*, *mod1*, *mod2*, *mod3*, *mod4*, *mod5*.
668 Action performed when pressing 'pointer_modifier' + 'button<n>'. Accept the following values: *move*, *resize_side*, *resize_corner*, *focus*, *none*.
671 Button used for focusing a window (or a monitor). The possible values are: *button1*, *button2*, *button3*, *any*, *none*.
673 'swallow_first_click'::
674 Don't replay the click that makes a window focused if 'click_to_focus' isn't *none*.
676 'focus_follows_pointer'::
677 Focus the window under the pointer.
679 'pointer_follows_focus'::
680 When focusing a window, put the pointer at its center.
682 'pointer_follows_monitor'::
683 When focusing a monitor, put the pointer at its center.
685 'ignore_ewmh_focus'::
686 Ignore EWMH focus requests coming from applications.
688 'center_pseudo_tiled'::
689 Center pseudo tiled windows into their tiling rectangles. Defaults to 'true'.
692 Apply ICCCM window size hints.
694 'remove_disabled_monitors'::
695 Consider disabled monitors as disconnected.
697 'remove_unplugged_monitors'::
698 Remove unplugged monitors.
700 'merge_overlapping_monitors'::
701 Merge overlapping monitors (the bigger remains).
703 Monitor and Desktop Settings
704 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
710 Padding space added at the sides of the monitor or desktop.
716 Size of the gap that separates windows.
728 Focus the window (or the monitor) under the pointer if the value isn't *none*.
730 'pointer_modifier' + 'button1'::
731 Move the window under the pointer.
733 'pointer_modifier' + 'button2'::
734 Resize the window under the pointer by dragging the nearest side.
736 'pointer_modifier' + 'button3'::
737 Resize the window under the pointer by dragging the nearest corner.
739 The behavior of 'pointer_modifier' + 'button<n>' can be modified through the 'pointer_action<n>' setting.
745 See the next section for the description of the format.
747 'monitor_add <monitor_id> <monitor_name> <monitor_geometry>'::
750 'monitor_rename <monitor_id> <old_name> <new_name>'::
751 A monitor is renamed.
753 'monitor_remove <monitor_id>'::
754 A monitor is removed.
756 'monitor_swap <src_monitor_id> <dst_monitor_id>'::
757 A monitor is swapped.
759 'monitor_focus <monitor_id>'::
760 A monitor is focused.
762 'monitor_geometry <monitor_id> <monitor_geometry>'::
763 The geometry of a monitor changed.
765 'desktop_add <monitor_id> <desktop_id> <desktop_name>'::
768 'desktop_rename <monitor_id> <desktop_id> <old_name> <new_name>'::
769 A desktop is renamed.
771 'desktop_remove <monitor_id> <desktop_id>'::
772 A desktop is removed.
774 'desktop_swap <src_monitor_id> <src_desktop_id> <dst_monitor_id> <dst_desktop_id>'::
775 A desktop is swapped.
777 'desktop_transfer <src_monitor_id> <src_desktop_id> <dst_monitor_id>'::
778 A desktop is transferred.
780 'desktop_focus <monitor_id> <desktop_id>'::
781 A desktop is focused.
783 'desktop_activate <monitor_id> <desktop_id>'::
784 A desktop is activated.
786 'desktop_layout <monitor_id> <desktop_id> tiled|monocle'::
787 The layout of a desktop changed.
789 'node_add <monitor_id> <desktop_id> <ip_id> <node_id>'::
792 'node_remove <monitor_id> <desktop_id> <node_id>'::
795 'node_swap <src_monitor_id> <src_desktop_id> <src_node_id> <dst_monitor_id> <dst_desktop_id> <dst_node_id>'::
798 'node_transfer <src_monitor_id> <src_desktop_id> <src_node_id> <dst_monitor_id> <dst_desktop_id> <dst_node_id>'::
799 A node is transferred.
801 'node_focus <monitor_id> <desktop_id> <node_id>'::
804 'node_activate <monitor_id> <desktop_id> <node_id>'::
807 'node_presel <monitor_id> <desktop_id> <node_id> (dir DIR|ratio RATIO|cancel)'::
808 A node is preselected.
810 'node_stack <node_id_1> below|above <node_id_2>'::
811 A node is stacked below or above another node.
813 'node_geometry <monitor_id> <desktop_id> <node_id> <node_geometry>'::
814 The geometry of a window changed.
816 'node_state <monitor_id> <desktop_id> <node_id> tiled|pseudo_tiled|floating|fullscreen on|off'::
817 The state of a window changed.
819 'node_flag <monitor_id> <desktop_id> <node_id> hidden|sticky|private|locked|urgent on|off'::
820 One of the flags of a node changed.
822 'node_layer <monitor_id> <desktop_id> <node_id> below|normal|above'::
823 The layer of a window changed.
825 'pointer_action <monitor_id> <desktop_id> <node_id> move|resize_corner|resize_side begin|end'::
826 A pointer action occured.
828 Please note that *bspwm* initializes monitors before it reads messages on its socket, therefore the initial monitor events can't be received.
833 Each report event message is composed of items separated by colons.
835 Each item has the form '<type><value>' where '<type>' is the first character of the item.
844 Occupied focused desktop.
847 Occupied unfocused desktop.
850 Free focused desktop.
853 Free unfocused desktop.
856 Urgent focused desktop.
859 Urgent unfocused desktop.
862 Layout of the focused desktop of a monitor.
865 State of the focused node of a focused desktop.
868 Active flags of the focused node of a focused desktop.
870 Environment Variables
871 ---------------------
874 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<host_name>_<display_number>_<screen_number>-socket'.
879 * Steven Allen <steven at stebalien.com>
880 * Thomas Adam <thomas at xteddy.org>
881 * Ivan Kanakarakis <ivan.kanak at gmail.com>
886 Bastien Dejean <nihilhill at gmail.com>