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: *#*, *:*, *.*.
69 The special selector *%<name>* can be used to select a monitor or a desktop with an invalid name.
77 NODE_SEL := [NODE_SEL#](DIR|CYCLE_DIR|PATH|any|first_ancestor|last|newest|
78 older|newer|focused|pointed|biggest|smallest|
79 <node_id>)[.[!]focused][.[!]active][.[!]automatic][.[!]local]
80 [.[!]leaf][.[!]window][.[!]STATE][.[!]FLAG][.[!]LAYER][.[!]SPLIT_TYPE]
81 [.[!]same_class][.[!]descendant_of][.[!]ancestor_of]
83 STATE := tiled|pseudo_tiled|floating|fullscreen
85 FLAG := hidden|sticky|private|locked|marked|urgent
87 LAYER := below|normal|above
89 SPLIT_TYPE := horizontal|vertical
91 PATH := @[DESKTOP_SEL:][[/]JUMP](/JUMP)*
93 JUMP := first|1|second|2|brother|parent|DIR
100 Selects the window in the given (spacial) direction relative to the reference node.
103 Selects the node in the given (cyclic) direction relative to the reference node within a depth-first in-order traversal of the tree.
106 Selects the node at the given path.
109 Selects the first node that matches the given selectors.
112 Selects the first ancestor of the reference node that matches the given selectors.
115 Selects the previously focused node relative to the reference node.
118 Selects the newest node in the history of the focused node.
121 Selects the node older than the reference node in the history.
124 Selects the node newer than the reference node in the history.
127 Selects the currently focused node.
130 Selects the leaf under the pointer.
133 Selects the biggest leaf.
136 Selects the smallest leaf.
139 Selects the node with the given ID.
144 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).
147 Jumps to the first child.
150 Jumps to the second child.
153 Jumps to the brother node.
156 Jumps to the parent node.
159 Jumps to the node holding the edge in the given direction.
165 Only consider the focused node.
168 Only consider nodes that are the focused node of their desktop.
171 Only consider nodes in automatic insertion mode. See also *--presel-dir* under *Node* in the *DOMAINS* section below.
174 Only consider nodes in the reference desktop.
177 Only consider leaf nodes.
180 Only consider nodes that hold a window.
182 [!](tiled|pseudo_tiled|floating|fullscreen)::
183 Only consider windows in the given state.
186 Only consider windows that have the same class as the reference window.
189 Only consider nodes that are descendants of the reference node.
192 Only consider nodes that are ancestors of the reference node.
194 [!](hidden|sticky|private|locked|marked|urgent)::
195 Only consider windows that have the given flag set.
197 [!](below|normal|above)::
198 Only consider windows in the given layer.
200 [!](horizontal|vertical)::
201 Only consider nodes with the given split type.
210 DESKTOP_SEL := [DESKTOP_SEL#](CYCLE_DIR|any|last|newest|older|newer|
211 [MONITOR_SEL:](focused|^<n>)|
212 <desktop_id>|<desktop_name>)[.[!]focused][.[!]active]
213 [.[!]occupied][.[!]urgent][.[!]local]
214 [.[!]LAYOUT][.[!]user_LAYOUT]
216 LAYOUT := tiled|monocle
223 Selects the desktop in the given direction relative to the reference desktop.
226 Selects the first desktop that matches the given selectors.
229 Selects the previously focused desktop relative to the reference desktop.
232 Selects the newest desktop in the history of the focused desktops.
235 Selects the desktop older than the reference desktop in the history.
238 Selects the desktop newer than the reference desktop in the history.
241 Selects the currently focused desktop.
244 Selects the nth desktop. If *MONITOR_SEL* is given, selects the nth desktop on the selected monitor.
247 Selects the desktop with the given ID.
250 Selects the desktop with the given name.
256 Only consider the focused desktop.
259 Only consider desktops that are the focused desktop of their monitor.
262 Only consider occupied desktops.
265 Only consider urgent desktops.
268 Only consider desktops inside the reference monitor.
271 Only consider desktops with the given layout.
273 [!](user_tiled|user_monocle)::
274 Only consider desktops which have the given layout as userLayout.
282 MONITOR_SEL := [MONITOR_SEL#](DIR|CYCLE_DIR|any|last|newest|older|newer|
283 focused|pointed|primary|^<n>|
284 <monitor_id>|<monitor_name>)[.[!]focused][.[!]occupied]
291 Selects the monitor in the given (spacial) direction relative to the reference monitor.
294 Selects the monitor in the given (cyclic) direction relative to the reference monitor.
297 Selects the first monitor that matches the given selectors.
300 Selects the previously focused monitor relative to the reference monitor.
303 Selects the newest monitor in the history of the focused monitors.
306 Selects the monitor older than the reference monitor in the history.
309 Selects the monitor newer than the reference monitor in the history.
312 Selects the currently focused monitor.
315 Selects the monitor under the pointer.
318 Selects the primary monitor.
321 Selects the nth monitor.
324 Selects the monitor with the given ID.
327 Selects the monitor with the given name.
334 Only consider the focused monitor.
337 Only consider monitors where the focused desktop is occupied.
345 Its size and position are determined by the window tree.
348 A tiled window that automatically shrinks but doesn't stretch beyond its floating size.
351 Can be moved/resized freely. Although it doesn't use any tiling space, it is still part of the window tree.
354 Fills its monitor rectangle and has no borders.
361 Is hidden and doesn't occupy any tiling space.
364 Stays in the focused desktop of its monitor.
367 Tries to keep the same tiling position/size.
370 Ignores the *node --close* message.
373 Is marked (useful for deferred actions). A marked node becomes unmarked after being sent on a preselected node.
376 Has its urgency hint set. This flag is set externally.
382 There's three stacking layers: BELOW, NORMAL and ABOVE.
384 In each layer, the window are orderered as follow: tiled & pseudo-tiled < floating < fullscreen.
389 A leaf node that doesn't hold any window is called a receptacle. When a node is inserted on a receptacle in automatic mode, it will replace the receptacle. A receptacle can be inserted on a node, preselected and killed. Receptacles can therefore be used to build a tree whose leaves are receptacles. Using the appropriate rules, one can then send windows on the leaves of this tree. This feature is used in 'examples/receptacles' to store and recreate layouts.
401 node ['NODE_SEL'] 'COMMANDS'
403 If 'NODE_SEL' is omitted, *focused* is assumed.
407 *-f*, *--focus* ['NODE_SEL']::
408 Focus the selected or given node.
410 *-a*, *--activate* ['NODE_SEL']::
411 Activate the selected or given node.
413 *-d*, *--to-desktop* 'DESKTOP_SEL' [*--follow*]::
414 Send the selected node to the given desktop. If *--follow* is passed, the focused node will stay focused.
416 *-m*, *--to-monitor* 'MONITOR_SEL' [*--follow*]::
417 Send the selected node to the given monitor. If *--follow* is passed, the focused node will stay focused.
419 *-n*, *--to-node* 'NODE_SEL' [*--follow*]::
420 Send the selected node on the given node. If *--follow* is passed, the focused node will stay focused.
422 *-s*, *--swap* 'NODE_SEL' [*--follow*]::
423 Swap the selected node with the given node. If *--follow* is passed, the focused node will stay focused.
425 *-p*, *--presel-dir* \[~]'DIR'|cancel::
426 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".
428 *-o*, *--presel-ratio* 'RATIO'::
429 Set the splitting ratio of the preselection area.
431 *-v*, *--move* 'dx' 'dy'::
432 Move the selected window by 'dx' pixels horizontally and 'dy' pixels vertically.
434 *-z*, *--resize* top|left|bottom|right|top_left|top_right|bottom_right|bottom_left 'dx' 'dy'::
435 Resize the selected window by moving the given handle by 'dx' pixels horizontally and 'dy' pixels vertically.
437 *-y*, *--type* 'CYCLE_DIR'|horizontal|vertical::
438 Set or cycle the splitting type of the selected node.
440 *-r*, *--ratio* 'RATIO'|(+|-)('PIXELS'|'FRACTION')::
441 Set the splitting ratio of the selected node (0 < 'RATIO' < 1).
443 *-R*, *--rotate* '90|270|180'::
444 Rotate the tree rooted at the selected node.
446 *-F*, *--flip* 'horizontal|vertical'::
447 Flip the tree rooted at selected node.
450 Reset the split ratios of the tree rooted at the selected node to their default value.
453 Adjust the split ratios of the tree rooted at the selected node so that all windows occupy the same area.
455 *-C*, *--circulate* forward|backward::
456 Circulate the windows of the tree rooted at the selected node.
458 *-t*, *--state* \~|\[~]'STATE'::
459 Set the state of the selected window. If *\~* is present and the current state matches 'STATE', then the argument is interpreted as its last state. If the argument is just *~* with 'STATE' omitted, then the state of the selected window is set to its last state.
461 *-g*, *--flag* hidden|sticky|private|locked|marked[=on|off]::
462 Set or toggle the given flag for the selected node.
464 *-l*, *--layer* below|normal|above::
465 Set the stacking layer of the selected window.
467 *-i*, *--insert-receptacle*::
468 Insert a receptacle node at the selected node.
471 Close the windows rooted at the selected node.
474 Kill the windows rooted at the selected node.
482 desktop ['DESKTOP_SEL'] 'COMMANDS'
484 If 'DESKTOP_SEL' is omitted, *focused* is assumed.
488 *-f*, *--focus* ['DESKTOP_SEL']::
489 Focus the selected or given desktop.
491 *-a*, *--activate* ['DESKTOP_SEL']::
492 Activate the selected or given desktop.
494 *-m*, *--to-monitor* 'MONITOR_SEL' [*--follow*]::
495 Send the selected desktop to the given monitor. If *--follow* is passed, the focused desktop will stay focused.
497 *-s*, *--swap* 'DESKTOP_SEL' [*--follow*]::
498 Swap the selected desktop with the given desktop. If *--follow* is passed, the focused desktop will stay focused.
500 *-l*, *--layout* 'CYCLE_DIR'|monocle|tiled::
501 Set or cycle the layout of the selected desktop.
503 *-n*, *--rename* <new_name>::
504 Rename the selected desktop.
506 *-b*, *--bubble* 'CYCLE_DIR'::
507 Bubble the selected desktop in the given direction.
510 Remove the selected desktop.
518 monitor ['MONITOR_SEL'] 'COMMANDS'
520 If 'MONITOR_SEL' is omitted, *focused* is assumed.
524 *-f*, *--focus* ['MONITOR_SEL']::
525 Focus the selected or given monitor.
527 *-s*, *--swap* 'MONITOR_SEL'::
528 Swap the selected monitor with the given monitor.
530 *-a*, *--add-desktops* <name>...::
531 Create desktops with the given names in the selected monitor.
533 *-o*, *--reorder-desktops* <name>...::
534 Reorder the desktops of the selected monitor to match the given order.
536 *-d*, *--reset-desktops* <name>...::
537 Rename, add or remove desktops depending on whether the number of given names is equal, superior or inferior to the number of existing desktops.
539 *-g*, *--rectangle* WxH+X+Y::
540 Set the rectangle of the selected monitor.
542 *-n*, *--rename* <new_name>::
543 Rename the selected monitor.
546 Remove the selected monitor.
554 query 'COMMANDS' ['OPTIONS']
559 The optional selectors are references.
561 *-N*, *--nodes* ['NODE_SEL']::
562 List the IDs of the matching nodes.
564 *-D*, *--desktops* ['DESKTOP_SEL']::
565 List the IDs (or names) of the matching desktops.
567 *-M*, *--monitors* ['MONITOR_SEL']::
568 List the IDs (or names) of the matching monitors.
571 Print a JSON representation of the matching item.
576 *-m*,*--monitor* ['MONITOR_SEL'|'MONITOR_MODIFIERS']::
577 *-d*,*--desktop* ['DESKTOP_SEL'|'DESKTOP_MODIFIERS']::
578 *-n*, *--node* ['NODE_SEL'|'NODE_MODIFIERS']::
579 Constrain matches to the selected monitors, desktops or nodes.
582 Print names instead of IDs. Can only be used with '-M' and '-D'.
595 *-d*, *--dump-state*::
596 Dump the current world state on standard output.
598 *-l*, *--load-state* <file_path>::
599 Load a world state from the given file. The path must be absolute.
601 *-a*, *--add-monitor* <name> WxH+X+Y::
602 Add a monitor for the given name and rectangle.
604 *-O*, *--reorder-monitors* <name>...::
605 Reorder the list of monitors to match the given order.
607 *-o*, *--adopt-orphans*::
608 Manage all the unmanaged windows remaining from a previous session.
610 *-h*, *--record-history* on|off::
611 Enable or disable the recording of node focus history.
613 *-g*, *--get-status*::
614 Print the current status information.
617 Restart the window manager
630 *-a*, *--add* (<class_name>|\*)[:(<instance_name>|\*)[:(<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|marked|center|follow|manage|focus|border)=(on|off)] [rectangle=WxH+X+Y]::
633 *-r*, *--remove* ^<n>|head|tail|(<class_name>|\*)[:(<instance_name>|\*)[:(<name>|*)]]...::
634 Remove the given rules.
645 config [-m 'MONITOR_SEL'|-d 'DESKTOP_SEL'|-n 'NODE_SEL'] <setting> [<value>]::
646 Get or set the value of <setting>.
653 subscribe ['OPTIONS'] (all|report|monitor|desktop|node|...)*::
654 Continuously print events. See the *EVENTS* section for the description of each event.
660 Print a path to a FIFO from which events can be read and return.
662 *-c*, *--count* 'COUNT'::
663 Stop the corresponding *bspc* process after having received 'COUNT' events.
672 Quit with an optional exit status.
677 If the server can't handle a message, *bspc* will return with a non-zero exit code.
681 Colors are in the form '#RRGGBB', booleans are 'true', 'on', 'false' or 'off'.
683 All the boolean settings are 'false' by default unless stated otherwise.
688 'normal_border_color'::
689 Color of the border of an unfocused window.
691 'active_border_color'::
692 Color of the border of a focused window of an unfocused monitor.
694 'focused_border_color'::
695 Color of the border of a focused window of a focused monitor.
697 'presel_feedback_color'::
698 Color of the *node --presel-{dir,ratio}* message feedback area.
704 Prefix prepended to each of the status lines.
706 'external_rules_command'::
707 Absolute path to the 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).
710 The insertion scheme used when the insertion point is in automatic mode. Accept the following values: *longest_side*, *alternate*, *spiral*.
713 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*.
715 'directional_focus_tightness'::
716 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*.
718 'removal_adjustment'::
719 Adjust the brother when unlinking a node from the tree in accordance with the automatic insertion scheme.
722 Draw the preselection feedback area. Defaults to 'true'.
724 'borderless_monocle'::
725 Remove borders of tiled windows for the *monocle* desktop layout.
728 Remove gaps of tiled windows for the *monocle* desktop layout.
730 'top_monocle_padding'::
731 'right_monocle_padding'::
732 'bottom_monocle_padding'::
733 'left_monocle_padding'::
734 Padding space added at the sides of the screen for the *monocle* desktop layout.
737 Set the desktop layout to *monocle* if there's only one tiled window in the tree.
739 'borderless_singleton'::
740 Remove borders of the only window on the only monitor regardless its layout.
742 'pointer_motion_interval'::
743 The minimum interval, in milliseconds, between two motion notify events.
746 Keyboard modifier used for moving or resizing windows. Accept the following values: *shift*, *control*, *lock*, *mod1*, *mod2*, *mod3*, *mod4*, *mod5*.
751 Action performed when pressing 'pointer_modifier' + 'button<n>'. Accept the following values: *move*, *resize_side*, *resize_corner*, *focus*, *none*.
754 Button used for focusing a window (or a monitor). The possible values are: *button1*, *button2*, *button3*, *any*, *none*. Defaults to *button1*.
756 'swallow_first_click'::
757 Don't replay the click that makes a window focused if 'click_to_focus' isn't *none*.
759 'focus_follows_pointer'::
760 Focus the window under the pointer.
762 'pointer_follows_focus'::
763 When focusing a window, put the pointer at its center.
765 'pointer_follows_monitor'::
766 When focusing a monitor, put the pointer at its center.
768 'mapping_events_count'::
769 Handle the next *mapping_events_count* mapping notify events. A negative value implies that every event needs to be handled.
771 'ignore_ewmh_focus'::
772 Ignore EWMH focus requests coming from applications.
774 'ignore_ewmh_fullscreen'::
775 Block the fullscreen state transitions that originate from an EWMH request. The possible values are: *none*, *all*, or a comma separated list of the following values: *enter*, *exit*.
777 'ignore_ewmh_struts'::
778 Ignore strut hinting from clients requesting to reserve space (i.e. task bars).
780 'center_pseudo_tiled'::
781 Center pseudo tiled windows into their tiling rectangles. Defaults to 'true'.
784 Apply ICCCM window size hints.
786 'remove_disabled_monitors'::
787 Consider disabled monitors as disconnected.
789 'remove_unplugged_monitors'::
790 Remove unplugged monitors.
792 'merge_overlapping_monitors'::
793 Merge overlapping monitors (the bigger remains).
795 Monitor and Desktop Settings
796 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
802 Padding space added at the sides of the monitor or desktop.
808 Size of the gap that separates windows.
820 Focus the window (or the monitor) under the pointer if the value isn't *none*.
822 'pointer_modifier' + 'button1'::
823 Move the window under the pointer.
825 'pointer_modifier' + 'button2'::
826 Resize the window under the pointer by dragging the nearest side.
828 'pointer_modifier' + 'button3'::
829 Resize the window under the pointer by dragging the nearest corner.
831 The behavior of 'pointer_modifier' + 'button<n>' can be modified through the 'pointer_action<n>' setting.
837 See the next section for the description of the format.
839 'monitor_add <monitor_id> <monitor_name> <monitor_geometry>'::
842 'monitor_rename <monitor_id> <old_name> <new_name>'::
843 A monitor is renamed.
845 'monitor_remove <monitor_id>'::
846 A monitor is removed.
848 'monitor_swap <src_monitor_id> <dst_monitor_id>'::
849 A monitor is swapped.
851 'monitor_focus <monitor_id>'::
852 A monitor is focused.
854 'monitor_geometry <monitor_id> <monitor_geometry>'::
855 The geometry of a monitor changed.
857 'desktop_add <monitor_id> <desktop_id> <desktop_name>'::
860 'desktop_rename <monitor_id> <desktop_id> <old_name> <new_name>'::
861 A desktop is renamed.
863 'desktop_remove <monitor_id> <desktop_id>'::
864 A desktop is removed.
866 'desktop_swap <src_monitor_id> <src_desktop_id> <dst_monitor_id> <dst_desktop_id>'::
867 A desktop is swapped.
869 'desktop_transfer <src_monitor_id> <src_desktop_id> <dst_monitor_id>'::
870 A desktop is transferred.
872 'desktop_focus <monitor_id> <desktop_id>'::
873 A desktop is focused.
875 'desktop_activate <monitor_id> <desktop_id>'::
876 A desktop is activated.
878 'desktop_layout <monitor_id> <desktop_id> tiled|monocle'::
879 The layout of a desktop changed.
881 'node_add <monitor_id> <desktop_id> <ip_id> <node_id>'::
884 'node_remove <monitor_id> <desktop_id> <node_id>'::
887 'node_swap <src_monitor_id> <src_desktop_id> <src_node_id> <dst_monitor_id> <dst_desktop_id> <dst_node_id>'::
890 'node_transfer <src_monitor_id> <src_desktop_id> <src_node_id> <dst_monitor_id> <dst_desktop_id> <dst_node_id>'::
891 A node is transferred.
893 'node_focus <monitor_id> <desktop_id> <node_id>'::
896 'node_activate <monitor_id> <desktop_id> <node_id>'::
899 'node_presel <monitor_id> <desktop_id> <node_id> (dir DIR|ratio RATIO|cancel)'::
900 A node is preselected.
902 'node_stack <node_id_1> below|above <node_id_2>'::
903 A node is stacked below or above another node.
905 'node_geometry <monitor_id> <desktop_id> <node_id> <node_geometry>'::
906 The geometry of a window changed.
908 'node_state <monitor_id> <desktop_id> <node_id> tiled|pseudo_tiled|floating|fullscreen on|off'::
909 The state of a window changed.
911 'node_flag <monitor_id> <desktop_id> <node_id> hidden|sticky|private|locked|marked|urgent on|off'::
912 One of the flags of a node changed.
914 'node_layer <monitor_id> <desktop_id> <node_id> below|normal|above'::
915 The layer of a window changed.
917 'pointer_action <monitor_id> <desktop_id> <node_id> move|resize_corner|resize_side begin|end'::
918 A pointer action occurred.
920 Please note that *bspwm* initializes monitors before it reads messages on its socket, therefore the initial monitor events can't be received.
925 Each report event message is composed of items separated by colons.
927 Each item has the form '<type><value>' where '<type>' is the first character of the item.
936 Occupied focused desktop.
939 Occupied unfocused desktop.
942 Free focused desktop.
945 Free unfocused desktop.
948 Urgent focused desktop.
951 Urgent unfocused desktop.
954 Layout of the focused desktop of a monitor.
957 State of the focused node of a focused desktop.
960 Active flags of the focused node of a focused desktop.
962 Environment Variables
963 ---------------------
966 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'.
971 * Steven Allen <steven at stebalien.com>
972 * Thomas Adam <thomas at xteddy.org>
973 * Ivan Kanakarakis <ivan.kanak at gmail.com>
978 Bastien Dejean <nihilhill at gmail.com>