Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
HERBSTLUFTWM(1) 						 HERBSTLUFTWM(1)

NAME
     herbstluftwm - a manual tiling window manager for X

SYNOPSIS
     herbstluftwm [OPTION ...]

DESCRIPTION
     Starts  the  herbstluftwm	window	manager  on DISPLAY. It also listens for
     calls from herbstclient(1) and executes them. The list  of  available  COM-
     MANDS is listed below.

     OPTION can be:

     -v, --version
	 print version and exit

     -h, --help
	 print a short help and exit

     -c, --autostart PATH
	 use PATH as autostart file instead of the one in $XDG_CONFIG_HOME

     --replace
	 Replace existing window manager.

     -l, --locked
	 Initially  set  the  monitors_locked  setting to 1. WARNING: this keeps
	 herbstluftwm locked until the unlock command is invoked (usually by the
	 autostart). If --locked is activated but the autostart does not  invoke
	 unlock  (or if its invokation is unreachable because of a blocking com-
	 mand before), then  herbstluftwm  stays  locked,  resulting  in  frozen
	 state. Only use with care!

     --exit-on-xerror
	 Make herbstluftwm exit whenever xlib reports an error. This may only be
	 activated for automated testing and never for actual sessions.

     --no-transparency
	 Disable true transparency.

     --no-tag-import
	 Do  not  preserve  the  tags (virtual desktops) from a previous running
	 window manager.

     --verbose
	 print verbose information to stderr. This can be switched  at	run-time
	 by the verbose setting.

     This manual documents the scripting and configuration interface. For a more
     verbose introduction see herbstluftwm-tutorial(7).

TILING ALGORITHM
     The  basic  tiling  concept  is  that the layout is represented by a binary
     tree. On startup you see one big frame across the entire  screen.	A  frame
     fulfills exactly one of the following conditions:

      1. Frame contains windows:

	 It  shows  some  clients  and arranges them. The available layout algo-
	 rithms are:

	 *   vertical - clients are placed below each other

	 *   horizontal - clients are placed next to each other

	 *   max - all clients are maximized in this frame

	 *   grid - clients are arranged in an almost quadratic grid

      2. Frame is split into subframes:

	 It is split into exactly two subframes in a configurable  fraction  ei-
	 ther  in  a vertical or horizontal way. So it produces two frames which
	 fulfill the same conditions (new frames always  are  about  to  contain
	 windows).  If you split a frame that already contains windows, the win-
	 dows are inherited by the first new child frame.

     If a new window appears, it is put in the currently focused frame. Only the
     leaves of the frame tree can be focused.

     A frame can be removed, it is then merged with its neighbour frame. Due  to
     the  layout  structure  of  a  binary tree, each frame (i.e. node in binary
     tree) has exactly one neighbour.

     The analogy to a binary tree is explained the best way with a  small  exam-
     ple: On startup you have a simple binary tree, with one frame that can con-
     tain clients:

	 C

     When  splitting  it (e.g. with the command split vertical 0.5) you will get
     this:

	   V
	  / \
	 C   C

     You also can split the left frame horizontally and you will get:

	     V
	    / \
	   H   C
	  / \
	 C   C

     If you change the focus to the client on the right and remove  this  frame,
     it will be merged with the left subtree and you will get:

	   H
	  / \
	 C   C

     The layout command prints the current layout of all tags as a tree.

FRAME INDEX
     The  exact  position  of a frame in the layout tree may be described by its
     index which is just a string of characters. The lookup algorithm starts  at
     the  root	frame  and interprets the index string character by character as
     follows:

     *	 0: select the first subtree

     *	 1: select the second subtree

     *	 .: select the subtree having the focus

     *	 /: select the subtree not having the focus

     *	 @: select the frame having the focus. In contrast  to	.,  this  passes
	 multiple layers all down to the focused leaf of the frame tree.

     *	 p: select the parent tree

     *	 e:  finds  a  suitable  empty frame: if the focused frame is not empty,
	 this selects the closest frame that is empty (in any subtree)

     For example:

     *	 An empty string refers to the root frame

     *	 00 refers to the first subtree of the first subtree of the root frame.

     *	 1e refers to the first empty frame in the second subtree.

     *	 /@ refers to the focused frame within the unfocused "half" of the frame
	 tree

     *	 @p/ refers to the sibling of the focused frame

TAGS
     Tags are very similar to workspaces, virtual  desktops  or  window  groups.
     Each  tag	has  one  layout. There is a list of tags. You can add or remove
     tags dynamically.

MONITORS
     Monitors in herbstluftwm are totally independent  of  the	actual	physical
     screens.  This  means  you can for example split your screen in two virtual
     monitors to view two tags at once on a big screen.

     Each monitor displays exactly one tag  on	a  specified  rectangle  on  the
     screen.

     Each  monitor  may  have  a  name, which can be set via add_monitor and re-
     name_monitor. It can be unset with the rename_monitor  command.  A  monitor
     name is an arbitrary non-empty string which must not start with +, - or any
     digit.

     A monitor can be referenced in different ways:

     *	 by its absolute index as listed in the list_monitors command.

     *	 by its relative index: a + or - followed by a delta, e.g.: +3

     *	 by  its relative position to the focused monitor.  -l denotes the moni-
	 tor left of the focused monitor, -r right of, -u above of, and -d below
	 of, respectively.

     *	 by "" (an empty string) which represents the current monitor.

     *	 by its name.

COMMANDS
     herbstluftwm is controlled by internal commands, which can be executed  via
     herbstclient(1) or via keybindings.

     quit
	 Quits herbstluftwm.

     reload
	 Executes the autostart file.

     version
	 Prints the version of the running herbstluftwm instance.

     echo [ARGS ...]
	 Prints  all given ARGS separated by a single space and a newline after-
	 wards.

     true
	 Ignores all arguments and always returns success, i.e. 0.

     false
	 Ignores all arguments and always returns failure, i.e. 1.

     help [OBJECT|ATTRIBUTE]
	 Print help on a given object or attribute. For example:

	 *   help clients.focus

	 *   help monitors

	 *   help types.color

     list_commands
	 Lists all available commands.

     list_monitors
	 List currently configured monitors with their index, area  (as  rectan-
	 gle), name (if named) and currently viewed tag.

     list_rules
	 Lists	all  active  rules. Each line consists of all the parameters the
	 rule was called with, plus its label, separated by tabs.

     list_keybinds
	 Lists all bound keys with their associated command. Each line	consists
	 of one key combination and the command with its parameters separated by
	 tabs.

	 Warning

	 Tabs within command parameters are not escaped!

     list_clients   [--tag=TAG|--monitor=MONITOR]   [--frame=FRAME_PATH|--float-
     ing|--tiling] [--title]
	 Lists the window ids of all clients on the given TAG or MONITOR (or the
	 current if unspecified). In addition  to  that,  one  can  restrict  to
	 clients  in a specific frame (--frame=) or to tiled or floated clients.
	 The output is one line per client; if --title is given, then  in  addi-
	 tion  to  every  client's window id, its window title is printed in the
	 same line.

     lock
	 Increases the monitors_locked setting. Use this if you want to do  mul-
	 tiple	window actions at once (i.e. without repainting between the sin-
	 gle steps). See also: unlock

     unlock
	 Decreases the monitors_locked setting. If monitors_locked is changed to
	 0, then all monitors are repainted again. See also: lock

     keybind KEY COMMAND [ARGS ...]
	 Adds a key binding. If there is already a binding for this KEY, it will
	 be overwritten. When KEY is pressed, the  internal  COMMAND  (with  its
	 ARGS)	is  executed.  A key binding is a (possibly empty) list of modi-
	 fiers (Mod1, Mod2, Mod3, Mod4, Mod5, Alt, Super,  Control/Ctrl,  Shift)
	 and one key (see keysymdef.h for a list of keys). Modifiers and the key
	 are  concatenated with - or + as separator. If KEY is prefixed with Re-
	 lease- then the keybinding is only active during the corresponding  key
	 release  event:  that	is,  in  order	to  run  the key binding for Re-
	 lease-Mod1-Shift-p one needs to first press Mod1-Shift-p and  then  re-
	 lease p. Examples:

	 *   keybind Mod4+Ctrl+q quit

	 *   keybind Mod4-Shift-d attr clients.focus.decorated toggle

	 *   keybind Mod1-Shift-space cycle_layout -1

	 *   keybind  Release-Mod4-Shift-p  spawn  scrot takes a screenshot when
	     the p is released while Mod4 and Shift are still pressed.

     keyunbind KEY|-F|--all
	 Removes the key binding for KEY. The syntax for KEY is defined in  key-
	 bind. If -F or --all is given, then all key bindings will be removed.

     mousebind BUTTON ACTION [COMMAND ...]
	 Adds a mouse binding for the floating mode. When BUTTON is pressed, the
	 specified ACTION will be performed.  BUTTON has a similar syntax to the
	 KEY  argument of keybind: It consists of a list of modifiers (separated
	 by - or +, valid modifiers are listed in the  description  of	keybind)
	 and exactly one button name:

	 *   B1 or Button1

	 *   B2 or Button2

	 *   ...

	 *   B9 or Button9

	 ACTION must be one of the following actions:

	 *   move: Moves the window by dragging the cursor.

	 *   resize: Resizes the window by dragging a corner.

	 *   zoom: Resizes the window into all four directions while keeping the
	     center of the window constant.

	 *   call:  Only  calls the specified COMMAND while client.dragged links
	     to the client on which the BUTTON has been performed.

	 While an ACTION is performed, client.dragged is  the  client  which  is
	 dragged. E.g.:

	 *   mousebind Mod1-Button3 zoom

	 *   mousebind	Mod1-B4  call substitute WID clients.dragged.winid spawn
	     transset-df --inc -i WID 0.05

	 *   mousebind Mod1-B5 call substitute WID  clients.dragged.winid  spawn
	     transset-df --dec -i WID -m 0.2 0.05

     drag WINID ACTION
	 Starts  dragging  the	specified client window WINID with the specified
	 ACTION (see mousebind). E.g.  drag '' resize starts  resizing	the  fo-
	 cused window.

     mouseunbind
	 Removes all mouse bindings.

     spawn EXECUTABLE [ARGS ...]
	 Spawns an EXECUTABLE with its ARGS. For details see man 3 execvp. Exam-
	 ple:

	 *   spawn xterm -e man 3 execvp

     wmexec [WINDOWMANAGER [ARGS ...]]
	 Executes  the WINDOWMANAGER with its ARGS. This is useful to switch the
	 window manager in the running session without restarting  the	session.
	 If  no  or  an  invalid  WINDOWMANAGER  is  given, then herbstluftwm is
	 restarted. For details see man 3 execvp. Example:

	 *   wmexec openbox

     chain SEPARATOR [COMMANDS ...]
	 chain expects a SEPARATOR and a list of COMMANDS  with  arguments.  The
	 commands have to be separated by the specified SEPARATOR. The SEPARATOR
	 can  by  any  word and only is recognized as the separator between com-
	 mands if it exactly matches SEPARATOR.  "chain"  outputs  the	appended
	 outputs  of all commands and returns the exit code of the last executed
	 command. Examples are:

	 *   Create a tag called "foo" and directly use it:

	     chain , add foo , use foo

	 *   Rotate the layout clockwise:

	     chain .-. lock .-. rotate .-. rotate .-. rotate .-. unlock

	 Counterexamples are:

	 *   This will only create a tag called "foo,":

	     chain , add foo, use foo

	 *   Separator "." defined, but "," is used:

	     chain . add foo , use foo

     and SEPARATOR [COMMANDS ...]
	 "and" behaves like the chain command but only	executes  the  specified
	 COMMANDS while the commands return the exit code 0.

     or SEPARATOR [COMMANDS ...]
	 "or"  behaves	like  the  chain command but only executes the specified
	 COMMANDS until one command returns the exit code 0.

     ! COMMAND
	 "!" executes the provided command, but inverts its return value. If the
	 provided command returns a nonzero, "!" returns a 0, if the command re-
	 turns a zero, "!" returns a 1.

     try COMMAND
	 "try" executes the provided command, prints its output, but always  re-
	 turns success, i.e. 0.

     silent COMMAND
	 "silent"  executes  the  provided  command, but discards its output and
	 only returns its exit code.

     focus_nth INDEX
	 Focuses the nth window in a frame. The first window has INDEX 0. If IN-
	 DEX is negative or greater than the last window index,  then  the  last
	 window is focused.

     cycle [DELTA]
	 Cycles  the  selection  within  the  current  frame  by DELTA or cycles
	 through the clients in the floating layer if that is focused. If  DELTA
	 is  omitted, DELTA = 1 will be used.  DELTA can be negative; DELTA = -1
	 means: cycle in the opposite direction by 1.

     cycle_all [--skip-invisible] [DIRECTION]
	 Cycles through all non-minimized windows and frames on the current tag.
	 DIRECTION = 1 means forward (default value), DIRECTION = -1 means back-
	 ward, DIRECTION = 0 has no effect. If there are multiple windows within
	 one frame, then it acts similar to the cycle command. If --skip-invisi-
	 ble is given, then this only cycles through  all  visible  windows  and
	 skips invisible windows in the max layout (the flag only affects invis-
	 ible  windows in the max layout; minimized windows are always skipped).
	 After each focus change, the focused window is raised.

     cycle_frame [DIRECTION]
	 Cycles through all frames on the current tag.	DIRECTION = 1 means for-
	 ward, DIRECTION = -1 means backward, DIRECTION = 0 has no effect.   DI-
	 RECTION defaults to 1.

     cycle_layout [DELTA [LAYOUTS ...]]
	 Cycles  the  layout algorithm in the current frame by DELTA.  DELTA de-
	 faults to 1. You can find a list of layout algorithms above. If a  list
	 of  LAYOUTS  is given, cycle_layout will cycle through those instead of
	 the default layout algorithm list. This is done by  finding  the  first
	 occurrence of the current layout in LAYOUTS and picking the next layout
	 according to DELTA. If the current layout doesn't occur in LAYOUTS, the
	 first entry is picked. Example:

	 *   cycle_layout -1

	 *   cycle_layout 1 vertical grid

     set_layout LAYOUT
	 Sets  the layout algorithm in the current frame to LAYOUT. For the list
	 of layouts, check the list of layout algorithms above.

     close WINID
	 Closes the specified window gracefully or the focused window if none is
	 given explicitly. See the section on WINDOW IDS how to reference a cer-
	 tain window.

     close_or_remove
	 Closes the focused window or removes the current frame if no window  is
	 focused. In floating mode, this acts as the close command.

     close_and_remove
	 Closes  the  focused  window  and removes the current frame if no other
	 window is present in that frame. In floating mode,  this  acts  as  the
	 close command.

     split ALIGN [FRACTION [FRAMEINDEX]]
	 Splits the focused frame (or the frame specified by FRAMEINDEX, see the
	 section  frame  index) into two subframes with a specified FRACTION be-
	 tween 0 and 1 which defaults to 0.5.  ALIGN is one of

	 *   top

	 *   bottom (= vertical)

	 *   left

	 *   right (= horizontal)

	 *   explode

	 *   auto (split along longest side)

	     It specifies which of the two halves will be empty after the split.
	     The other half will be occupied by the currently focused frame. Af-
	     ter splitting, the originally focused frame will stay focused.  One
	     special ALIGN mode is explode, which splits the frame in such a way
	     that the window focus, window sizes, and positions are kept as much
	     as  possible (so the default FRACTION is not always 0.5, unlike for
	     the other ALIGN modes). Example:

	 *   split explode

	 *   split bottom 0.5

	 *   split horiz 0.3

	 *   split vertical 0.5

	 *   split h

	 *   split top 0.2 '' (splits the root frame)

     focus [-i|-e|--level=LEVEL] DIRECTION
	 Moves the focus from current frame to the next frame or client  in  DI-
	 RECTION which is in:

	 *   l[eft]

	 *   r[ight]

	 *   u[p]

	 *   d[own]

	 If  there  is	no  client within this frame or LEVEL is frame, then the
	 next frame in specified DIRECTION will be focused. If LEVEL is  visible
	 or  default_direction_external_only  is  unset, then the next client in
	 DIRECTION can also be within the same frame, but has to be visible. For
	 tabs LEVEL, the next client may be hidden in a tabbed_max layout.  With
	 all  any  client within a max layout maybe selected before focusing the
	 next frame. The flag -i is an alias  for  --level=visible  and  -e  for
	 --level=frame.

	 The  direction  between frames is defined as follows: The focus is in a
	 leaf of the binary tree. Each inner node in the tree remembers the last
	 focus direction (child 0 or child 1). The algorithm uses  the	shortest
	 possible  way	from  the leaf (the currently focused frame) to the root
	 until it is possible to change focus in the specified	DIRECTION.  From
	 there the focus goes back to the leaf.

	 Example:  The	focus  is  at frame A. After executing focus right focus
	 will be at frame C.

	      Tree:  H,0     Screen: aaaaaaaaaaaaaa (before)
		     a+/- a^2		  a  B	aa  C  a
		    a+/-   a^2		  aaaaaaaaaaaaaa
		  V,1	V,0	     aaaaaaaaaaaaaa
		  a+/- a^2   a+/- a^2	       a  A* aa  D  a
		 B  A* C   D	     aaaaaaaaaaaaaa

	      Tree:  H,1     Screen: aaaaaaaaaaaaaa (after focus right)
		     a+/- a^2		  a  B	aa  C* a
		    a+/-   a^2		  aaaaaaaaaaaaaa
		  V,1	V,0	     aaaaaaaaaaaaaa
		  a+/- a^2   a+/- a^2	       a  A  aa  D  a
		 B   A C*  D	     aaaaaaaaaaaaaa

	 If the currently focused client is floated, then the next floating win-
	 dow in the specified direction is focused and raised.

	 If focus_crosses_monitor_boundaries is set and no client  or  frame  is
	 found	in the specified DIRECTION, then the next monitor in that DIREC-
	 TION is focused.

     focus_edge [-i|-e] DIRECTION
	 Focuses the window on the edge of the tag in the  specified  DIRECTION.
	 The DIRECTIONS and -e behave as specified at the focus command.

	 If  -i (internal) is given or default_direction_external_only is unset,
	 then the window on the edge of the tag will be focused. Else, only  the
	 frame	on  the edge of the tag will be focused, and the window that was
	 last focused in that frame will be focused.

     raise WINID
	 Raises the specified managed or unmanaged window. Managed  windows  are
	 only  moved  within the tag's stack (as reported by the stack command),
	 and unmanaged windows are raised globally, i.e. are  raised  above  all
	 managed  windows.  See  the section on WINDOW IDS on how to reference a
	 certain window. Its result is only visible for floating windows and un-
	 managed windows.

     lower WINID
	 Lowers the specified managed or unmanaged window,  analogously  to  the
	 raise command: managed windows are lowered within the stack of floating
	 windows  (with  no  effect for tiled windows) and unmanaged windows are
	 moved below all managed windows (for example, it can be used  to  lower
	 desktop windows).

     jumpto WINID
	 Puts  the  focus to the specified window. See the section on WINDOW IDS
	 on how to reference a certain window.

     bring WINID
	 Moves the specified window to the current frame and focuses it.  Float-
	 ing  windows  are  brought  to the current tag, but keep their floating
	 state. See the section on WINDOW IDS on how to reference a certain win-
	 dow.

     resize DIRECTION [FRACTIONDELTA]
	 Changes the size of the focused frame in  the	specified  DIRECTION  by
	 FRACTIONDELTA	(which defaults to 0.02 if none is supplied).  DIRECTION
	 behaves as specified at the focus command. If a floating window is  fo-
	 cused,  it  grows  towards  next edge, i.e. either the edge of the next
	 window or the monitor edge in the specified DIRECTION (FRACTIONDELTA is
	 ignored in that case). Example:

	 *   resize right +0.05

	 *   resize down -0.1

     shift_edge [-i|-e] DIRECTION
	 Shifts the focused window to the the edge of a tag in the specified DI-
	 RECTION. The DIRECTIONS behave as specified at the focus command and -i
	 and -e behave as specified at the focus_edge command.

     shift [-i|-e|--level=LEVEL] DIRECTION
	 Shifts the focused window to the next frame in the specified DIRECTION.
	 The DIRECTIONS and parameters -i|-e|--level=LEVEL behave  as  specified
	 at the focus command. If the focused client is floated instead of being
	 tiled, then client is shifted to the next window or screen edge. If the
	 window cannot be moved and the setting focus_crosses_monitor_boundaries
	 is  activated, then the window is moved to the monitor in the specified
	 DIRECTION.

     shift_to_monitor MONITOR
	 Moves the focused window to the tag on the specified MONITOR.	See  the
	 MONITORS section, how to address a monitor.

     remove
	 Removes  focused  frame and merges its windows to its closest neighbour
	 frame.

     rotate
	 Rotates the layout on the focused tag counterclockwise by  90	degrees.
	 This only manipulates the alignment of frames, not the content of them.

     mirror [vertical|horizontal|both]
	 Mirrors  the  layout  on  the	focused tag vertically, horizontally, or
	 both; the default is horizontal.  This  command  only	manipulates  the
	 alignment of frames, not the content of them.

     set NAME VALUE
	 Sets  the  specified  setting NAME to VALUE. Allowed values for boolean
	 settings are on or true for on, off or false for off, toggle to  toggle
	 its value. All settings are listed in the section below.

     get NAME
	 Prints  the  value of setting NAME. All settings are listed in the sec-
	 tion below.

     toggle NAME
	 Toggles the setting NAME if it's a boolean setting.

     cycle_value PATH VALUES ...
	 Cycles value of the attribute PATH through VALUES: I.e. it searches the
	 first occurrence of the current value in VALUES and changes  the  value
	 to  the  next	in the list or to the first one if the end is reached or
	 current value wasn't found. For compatibility reasons, PATH can also be
	 the name of a setting. Examples:

	 *   cycle_value settings.frame_gap 0 5 10 15

	 *   cycle_value theme.active.inner_color red green blue

	 *   the command cycle_layout +1 is equivalent to  cycle_value	tags.fo-
	     cus.tiling.focused_frame.algorithm

     cycle_monitor [DELTA]
	 Cycles monitor focused by DELTA.  DELTA defaults to 1.

     focus_monitor MONITOR
	 Puts  focus  to the specified monitor. See the MONITORS section, how to
	 address a monitor.

     add TAG
	 Creates a new empty tag named TAG.

     use TAG
	 Switches the focused monitor to specified TAG.

     use_index INDEX [--skip-visible]
	 Switches the focused monitor to the TAG with the  specified  INDEX.  If
	 INDEX starts with + or -, then INDEX is treated relative to the current
	 TAG.  If --skip-visible is passed and INDEX is relative, then tags that
	 are already visible on a monitor are skipped. E.g.  this  cycles  back-
	 wards through the tags:

	 *   use_index -1 --skip-visible

     use_previous
	 Switches the focused monitor to the previously viewed tag.

     merge_tag TAG [TARGET]
	 Removes  tag named TAG and moves all its windows to tag TARGET. If TAR-
	 GET is omitted, the focused tag will be used.

     rename OLDTAG NEWTAG
	 Renames tag named OLDTAG to NEWTAG.

     move TAG
	 Moves the focused window to the tag named TAG.

     move_index INDEX [--skip-visible]
	 Moves the focused window to the tag specified by INDEX.  Analogical  to
	 the  argument	for  use_index:  If INDEX starts with + or -, then it is
	 treated relative. If --skip-visible is passed with  a	relative  index,
	 then already visible tags are skipped.

     lock_tag [MONITOR]
	 Lock  the  tag  switching  on	the specified monitor. If no argument is
	 given, the currently focused monitor is used. When the tag switching is
	 disabled for a monitor, the commands use and use_index have  no  effect
	 when  executed there. When swap_monitors_to_get_tag is enabled, switch-
	 ing to a tag which is located on a locked  monitor,  switches	to  that
	 monitor  instead of stealing it from there. The lock state of a monitor
	 is indicated by "[LOCKED]" in the list_monitors output.

     unlock_tag [MONITOR]
	 Re-enables the tag switching on the specified monitor. If  no	argument
	 is  given,  the  currently focused monitor is used. This is the reverse
	 operation to lock_tag and has no further side effects but removing this
	 lock.

     disjoin_rects RECTS ...
	 Takes a list of rectangles and splits them into  smaller  pieces  until
	 all  rectangles are disjoint, the result rectangles are printed line by
	 line. This command does not modify the current  list  of  monitors!  So
	 this can be useful in combination with the set_monitors command.

	 *   E.g.  disjoin_rects 600x400+0+0 600x400+300+250 prints this:

		 300x150+300+250
		 600x250+0+0
		 300x150+0+250
		 300x150+600+250
		 600x250+300+400

	 *   In  the above example two monitors are split into 5 monitors, which
	     graphically means:

		 aaaaaaaa		   aaaaaaaa
		 a	a		   aaaaaaaa
		 a  aaaaa1/4aaaa	      aaaaaaaaaaaa
		 a  a	a   a	disjoin    a aa   aa  a
		 aaaa1/4aaaa   a  aaaaaaaaa>  aaaaaaaaaaaa
		    a	    a		      aaaaaaaaa
		    aaaaaaaaa		      aaaaaaaaa

     set_monitors RECTS ...
	 Sets the list of monitors exactly to the list of given rectangles:

	 *   The i'th existing monitor is moved to the i'th given RECT

	 *   New monitors are created if there are more RECTS than monitors

	 *   Existing monitors are deleted if there are more monitors than RECTS

     detect_monitors -l|--list|--list-all|--no-disjoin
	 Sets the list of monitors to the physically available monitors. If both
	 Xinerama and xrandr are missing, it  will  fall  back	to  one  monitor
	 across the entire screen. If the detected monitors overlap, the will be
	 split	into more monitors that are disjoint but cover the same area us-
	 ing disjoin_rects.

	 If -l or --list is passed, the list of rectangles of detected	physical
	 monitors  is  printed.  So hc detect_monitors is equivalent to the bash
	 command hc set_monitors $(hc disjoin_rects $(hc detect_monitors -l)).

	 If --list-all is passed, then it is printed which  multimonitor  detec-
	 tion (xinerama, xrandr) has which set of physical monitors.

     add_monitor RECT [TAG [NAME]]
	 Adds  a monitor on the specified rectangle RECT and displays TAG on it.
	 TAG currently must not be displayed on any other monitor.   RECT  is  a
	 string  of  the  form WxH+/-X+/-Y. If no or an empty TAG is given, then
	 any free/empty tag will be chosen, depending on the monitors.tag_selec-
	 tion_strategy attribute. If a NAME is given, you can reference to  this
	 monitor by its name instead of using an index. Example:

	 *   add_monitor 1024x768-20+0 mynewtag main

     remove_monitor MONITOR
	 Removes the specified monitor.

     move_monitor MONITOR RECT [PADUP [PADRIGHT [PADDOWN [PADLEFT]]]]
	 Moves	the  specified monitor to rectangle RECT.  RECT is defined as in
	 add_monitor. If no or an empty pad is given, it is not changed.

     raise_monitor [MONITOR]
	 Raises the specified monitor or the current one if MONITOR is omitted.

     rename_monitor MONITOR NAME
	 (Re)names an already existing monitor. If NAME is empty, it removes the
	 monitor's name.

     stack
	 Prints the stack of monitors with the visible tags and their layers  as
	 a  tree.  The order of the printed stack is top to bottom. The style is
	 configured by the tree_style setting.

     monitor_rect [[-p] MONITOR]
	 Prints the rectangle of the specified monitor in the format: X Y W H If
	 no MONITOR or cur is given, then the current monitor is used. If -p  is
	 supplied,  then  the remaining rect without the pad around this monitor
	 is printed.

     pad MONITOR [PADUP [PADRIGHT [PADDOWN [PADLEFT]]]]
	 Sets the pad of specified monitor to the specified padding. If no or an
	 empty padding is given, it is not changed.

     list_padding [MONITOR]
	 Lists the padding of the specified monitor, or  the  currently  focused
	 monitor if no monitor is given.

     layout [TAG [INDEX]]
	 Prints the layout of frame with INDEX on TAG, in a nice tree style. Its
	 style	is  defined  by  the tree_style setting. If no TAG is given, the
	 current tag is used. If no INDEX is given, the root frame is  used.  To
	 specify  INDEX  without  specifying TAG (i.e. use current tag), pass an
	 empty string as TAG.

	 An example output is:

	     a3/4aa horizontal 50% selection=1
	       aaa1/4 vertical: 0xe00009
	       aaa vertical 50% selection=0
		 aaa1/4 vertical: 0xa00009 [FOCUS]
		 aaa1/4 vertical: 0x1000009

     dump [TAG [INDEX]]
	 Prints the same information as the layout  command  but  in  a  machine
	 readable format. Its output can be read back with the load command.

	 An example output (formatted afterwards) is:

	     (split horizontal:0.500000:1
		 (clients vertical:0 0xe00009)
		 (split vertical:0.500000:1
		     (clients vertical:0 0xa00009)
		     (clients vertical:0 0x1000009)))

     load [TAG] LAYOUT
	 Loads	a given LAYOUT description to specified TAG or current tag if no
	 TAG is given.

	 Caution

	 LAYOUT is exactly one parameter. If you are calling  it  manually  from
	 your shell or from a script, quote it properly!

     complete POSITION [COMMAND ARGS ...]
	 Prints  the  result  of tab completion for the partial COMMAND with op-
	 tional ARGS. You usually do not need this, because there is already tab
	 completion for bash, zsh and fish. Example:

	 *   complete 0 m

	     prints all commands beginning with m

	 *   complete 1 toggle fra

	     prints all settings beginning with fra that can be toggled

     complete_shell POSITION [COMMAND ARGS ...]
	 Behaves like complete with the following extras, useful for  completion
	 on posix shells:

	 *   Escape sequences are removed in COMMAND and ARGS.

	 *   A space is appended to each full completion result.

	 *   Special characters will be escaped in the output.

     emit_hook NAME ARGS ...
	 Emits a custom hook NAME to all idling herbstclients.

     tag_status [MONITOR]
	 Print a tab separated list of all tags for the specified MONITOR index.
	 If  no  MONITOR  index  is given, the focused monitor is used. Each tag
	 name is prefixed with one char, which indicates its state:

	 *   .	the tag is empty

	 *   : the tag is not empty

	 *   + the tag is viewed on the specified MONITOR, but this  monitor  is
	     not focused.

	 *   # the tag is viewed on the specified MONITOR and it is focused.

	 *   - the tag is viewed on a different MONITOR, but this monitor is not
	     focused.

	 *   % the tag is viewed on a different MONITOR and it is focused.

	 *   !	the tag contains an urgent window

	 Warning

	 If  you  use a tab in one of the tag names, then tag_status is probably
	 quite useless for you.

     floating [[TAG] on|off|toggle|status]
	 Changes specified TAG to floating/tiling mode	or  prints  its  current
	 status.  If no TAG is given, the current tag is used. If no argument is
	 given, floating mode is toggled. If status is given, then on or off  is
	 printed, depending of the floating state of TAG.

     rule [[--]FLAG|[--]LABEL|[--]CONDITION|[--]CONSEQUENCE ...]
	 Defines  a rule which will be applied to all new clients. Its behaviour
	 is described in the RULES section.

     unrule LABEL|--all|-F
	 Removes all rules named LABEL. If --all or -F is passed, then all rules
	 are removed.

     apply_rules WINID|--all
	 Apply the rules to the specified window WINID. If --all is passed, then
	 the rules are applied to all clients.

     apply_tmp_rule WINID|--all [RULEDESCRIPTION...]
	 Apply the rule RULEDESCRIPTION to one particular client  WINID  or  all
	 clients  (--all)  without  adding  the  rule  to  the	rule  list.  The
	 RULEDESCRIPTION specifies a rule consisting of  conditions  and  conse-
	 quences  as  one  would pass it to the rule command as described in the
	 RULES section. This allows testing rules before  adding  them.  Running
	 apply_tmp_rule  only applies the particular rule given in the arguments
	 and ignores the existing rules.

     fullscreen [on|off|toggle]
	 Sets or toggles the fullscreen state of the focused client. If no argu-
	 ment is given, fullscreen mode is toggled.

     pseudotile [on|off|toggle]
	 Sets or toggles the pseudotile state of the focused client. If a client
	 is pseudotiled, then in tiling mode the client is only  moved	but  not
	 resized  - the client size will stay the floating size. The only reason
	 to resize the client is to ensure that it fits into its tile. If no ar-
	 gument is given, pseudotile mode is toggled.

     object_tree [PATH]
	 Prints the tree of objects. If the object path PATH is given, only  the
	 subtree  starting  at PATH is printed. See the OBJECTS section for more
	 details.

     attr [PATH [NEWVALUE]
	 Prints the children and attributes of the  given  object  addressed  by
	 PATH.	If PATH is an attribute, then print the attribute value. If NEW-
	 VALUE is given, assign NEWVALUE to the attribute given by PATH. See the
	 OBJECTS section for more details.

     get_attr ATTRIBUTE
	 Print the value of the specified ATTRIBUTE as described in the  OBJECTS
	 section.

     set_attr ATTRIBUTE NEWVALUE
	 Assign  NEWVALUE to the specified ATTRIBUTE as described in the OBJECTS
	 section.

     attr_type ATTRIBUTE
	 Print the type of the specified ATTRIBUTE.

     new_attr bool|color|int|string|uint PATH [VALUE]
	 Creates a new attribute with the name and in the  object  specified  by
	 PATH.	Its  type is specified by the first argument. The attribute name
	 has to begin with my_. If VALUE is supplied, then it is written to  the
	 attribute (if this fails the attribute still remains).

     watch PATH
	 Watch the value of the given attribute PATH. Whenever the value changes
	 from OLDVALUE to NEWVALUE, a hook is emitted:

	 attribute_changed PATH OLDVALUE NEWVALUE

     remove_attr PATH
	 Removes the user defined attribute PATH.

     substitute IDENTIFIER ATTRIBUTE COMMAND [ARGS ...]
	 Replaces all exact occurrences of IDENTIFIER in COMMAND and its ARGS by
	 the  value  of the ATTRIBUTE. Note that the COMMAND also is replaced by
	 the attribute value if it equals IDENTIFIER. The replaced command  with
	 its arguments then is executed. Example:

	 *   substitute MYTITLE clients.focus.title echo MYTITLE

	     Prints the title of the currently focused window.

     sprintf IDENTIFIER FORMAT [FORMATARG ...] COMMAND [CMDARGS ...]
	 Replaces all exact occurrences of IDENTIFIER in COMMAND and its CMDARGS
	 by  the  string specified by FORMAT. The FORMAT string may contain sev-
	 eral placeholders, similar to the printf(1) command:

	 *   %s inserts an attribute value whose path is  given  by  the  string
	     value of the next FORMATARG

	 *   %c ("constant") inserts the next FORMATARG without modification.

	 *   %{ATTR}  inserts  the current value of the attribute ATTR. The path
	     ATTR can itself contain format placeholders. This can  be	used  to
	     compose attribute paths at run time, e.g. in a foreach loop.

	 *   %% stands for a plain %

	 The replaced command with its arguments then is executed. Examples:

	 *   sprintf STR title=%s clients.focus.title echo STR

	     Prints  the  title of the currently focused window prepended by ti-
	     tle=.

	 *   sprintf X "%c %s tags" "there are" tags.count echo X

	     Prints there are N tags with N replaced by the number of tags.

	 *   sprintf X tag=%s tags.focus.name rule once X

	     Moves the next client that appears to the tag that is currently fo-
	     cused.

	 *   sprintf X %s/%s tags.focus.index tags.count echo X

	     Tells which tag is focused and how many tags there are

	 *   sprintf l somelongstring echo l l l

	     Prints somelongstring three times, separated by spaces.

	 *   sprintf VALUE "%{%c.client_count}" tags.0 echo VALUE

	     Prints the number of clients on the tag with index 0

	 *   foreach	--filter-name="[0-9]*"	   T	 tags.	   sprintf     S
	     "%{%c.client_count}" T echo T S

	     Prints the number of clients for each tag.

	 *   substitute X tags.count sprintf Y "number=%c" X echo Y

	     has the same output as

	     sprintf Y "number=%s" tags.count echo Y

	     (Note how the %c changes to %s)

     foreach  IDENTIFIER  OBJECT  [--recursive] [--unique] [--filter-name=REGEX]
     COMMAND [ARGS ...]
	 For each child of the given OBJECT the COMMAND is called with its ARGS,
	 where the IDENTIFIER is replaced by the path of the child. The  options
	 are:

	 *   --filter-name=REGEX  consider  children whose name match the speci-
	     fied REGEX.

	 *   --unique do not print duplicates (some objects can be  reached  via
	     multiple paths, such as clients.focus)

	 *   --recursive print OBJECT and all its children of arbitrary depth in
	     breadth-first search order. This implicitly activates --unique.

	 The exit code is the exit code of the command executed last. Examples:

	 *   foreach T tags.by-name. echo T

	     Prints:

		 tags.by-name.1
		 tags.by-name.2
		 tags.by-name.3
		 [...]

	 *   Note that foreach only iterates over children, but not over attrib-
	     utes,  so	foreach S settings echo S prints nothing, since the set-
	     tings object has only attributes but no child objects.

	 *   foreach C clients. echo C prints the object paths of  all	clients,
	     but  the  focused client twice, because it is mentioned in clients.
	     twice: by window id and as clients.focus.

	 *   foreach F tags.focus.tiling.root. --recursive echo F prints the ob-
	     ject paths of all frames on the focused tag.

     mktemp [bool|int|string|uint] IDENTIFIER COMMAND [ARGS ...]
	 Creates a temporary attribute with the given type and replaces all  oc-
	 currences  of	IDENTIFIER in COMMAND and ARGS by the path of the tempo-
	 rary attribute. The replaced command with  its  arguments  is	executed
	 then. The exit status of COMMAND is returned.

     compare ATTRIBUTE OPERATOR VALUE
	 Compares  the value of ATTRIBUTE with VALUE using the comparison method
	 OPERATOR. If the comparison succeeds, it returns 0, else 1. The  opera-
	 tors are:

	 *   =: ATTRIBUTE's value equals VALUE

	 *   !=: ATTRIBUTE's value does not equal VALUE

	 *   le: ATTRIBUTE's value <= VALUE

	 *   lt: ATTRIBUTE's value < VALUE

	 *   ge: ATTRIBUTE's value >= VALUE

	 *   gt: ATTRIBUTE's value > VALUE

	 The  OPERATORs le,lt,ge,gt can only be used if ATTRIBUTE is of the type
	 integer or unsigned integer. Note that the first parameter must  always
	 be an attribute and the second a constant value. If you want to compare
	 two attributes, use the substitute command:

	     substitute FC tags.focus.frame_count \
		 compare tags.focus.client_count gt FC

	 It  returns  success  if there are more clients on the focused tag than
	 frames.

     getenv NAME
	 Gets the value of the environment variable NAME.

     setenv NAME VALUE
	 Set the value of the environment variable NAME to VALUE. See the export
	 command for a convenience wrapper.

     unsetenv NAME
	 Unsets the environment variable NAME.

     export NAME=VALUE
	 Set the value of the environment variable NAME to VALUE. The syntax  is
	 the same as for export in unix shells (notice that there is a =). Intu-
	 itively,  if  you  forgot  to	run export FOO=BAR before starting herb-
	 stluftwm, you can run herbstclient  export  FOO=BAR  from  within  your
	 herbstluftwm  session	for  the  same effect. The export command is the
	 same as the setenv command with different syntax.

     debug_css [FLAGS]
	 This command exists solely for testing herbstluftwm; it has no  use  in
	 normal  hlwm  sessions.  Moreover,  the  interface  of this command may
	 change in incompatible ways. The command performs  various  operations,
	 specified by the optional FLAGS:

	 *   --stylesheet=CSS  specify	some stylesheet that is possibly used in
	     one of the other commands.

	 *   --print-css print the stylesheet in some normalized form

	 *   --tree=TREE a dom-style tree specification, where the syntax  of  a
	     tree starts with ( and ends with ). In between, the tree contains a
	     space-separated list of class names and subtrees.

	 *   --print-tree print the tree specification of TREE again.

	 *   --pretty-client-tree=CLIENT for the given CLIENT, print the tree of
	     its  widgets together with the classes, each widget has. Each class
	     is preceeded with a dot .	in the same way as in a css selector.

	 *   --query-tree-indices=SELECTOR print the tree  indices  (analogously
	     to frame indices) of those nodes that match the given css-style SE-
	     LECTOR.

	 *   --compute-style=INDEX  compute  the  box style of the node in above
	     TREE that has the tree index INDEX.

RULES
     Rules are used to change default properties for certain clients  when  they
     appear or when the apply_rules command is called. Each rule matches against
     a	certain  subset  of all clients and defines a set of properties for them
     (called CONSEQUENCEs). A rule can be defined with this command:

     rule [[--]FLAG|[--]LABEL|[--]CONDITION|[--]CONSEQUENCE ...]

     Each rule consists of a list of FLAGs, CONDITIONs,  CONSEQUENCEs  and,  op-
     tionally, a LABEL. (each of them can be optionally prefixed with two dashes
     (--) to provide a more iptables(8)-like feeling).

     Each rule can be given a custom label by specifying the LABEL property:

     *	 [--]label=VALUE

     If multiple labels are specified, the last one in the list will be applied.
     If no label is given, then the rule will be given an integer name that rep-
     resents  the  index  of the rule since the last unrule -F command (which is
     triggered in the default autostart).

	 Tip

	 Rule labels default to an incremental index. These default  labels  are
	 unique,  unless you assign a different rule a custom integer LABEL. De-
	 fault labels can be captured with the printlabel flag.

     If a new client appears, herbstluftwm tries to apply each rule to this  new
     client  as  follows:  If  each  CONDITION of this rule matches against this
     client, then every CONSEQUENCE is executed. (If  there  are  no  conditions
     given, then this rule is executed for each client)

     Each  CONDITION consists of a property name, an operator and a value. Valid
     operators are:

     *	 ~ matches if client's property is matched by the regex value.

     *	 = matches if client's property string is equal to value.

     Valid properties are:

     instance
	 the first entry in client's WM_CLASS.

     class
	 the second entry in client's WM_CLASS.

     title
	 client's window title.

     pid
	 the client's process id (Warning: the pid is not  available  for  every
	 client. This only matches if the client sets _NET_WM_PID to the pid it-
	 self).

     pgid
	 this  client's  process group id. Since the pgid of a window is derived
	 from its pid the same restrictions apply as above.

     maxage
	 matches if the age of the rule measured  in  seconds  does  not  exceed
	 value.  This  condition only can be used with the = operator. If maxage
	 already is exceeded (and never will match again), then this rule is re-
	 moved. (With this you can build rules that  only  live  for  a  certain
	 time.)

     windowtype
	 matches  the  _NET_WM_WINDOW_TYPE property of a window. If _NET_WM_WIN-
	 DOW_TYPE has multiple entries, then only the first entry is used here.

     windowrole
	 matches the WM_WINDOW_ROLE property of a window if it	is  set  by  the
	 window.

     fixedsize (no parameter)
	 matches if the window does not allow being resized (i.e. if the minimum
	 size  matches the maximum size). This condition does not take a parame-
	 ter. Example:

	     hc rule fixedsize floating=on

     Each CONSEQUENCE consists of a NAME=VALUE pair. Valid NAMES are:

     tag
	 moves the client to tag VALUE.

     monitor
	 moves the client to the tag on monitor VALUE. If  the	tag  consequence
	 was  also  specified,	and  switchtag	is  set for the client, move the
	 client to that tag, then display that tag on monitor VALUE. If the  tag
	 consequence  was  specified,  but switchtag was not, ignore this conse-
	 quence.

     focus
	 decides whether the client gets the input focus in its tag. The default
	 is off.  VALUE is a boolean (on or off).

     switchtag
	 if focus is activated and the client is put to a not focused tag,  then
	 switchtag  tells  whether the client's tag will be shown or not. If the
	 tag is shown on any monitor but is not focused, the client's  tag  only
	 is  brought to the current monitor if swap_monitors_to_get_tag is acti-
	 vated.  VALUE is a boolean (on or off).

     manage
	 decides whether the client will be managed or not. The default  is  on.
	 VALUE is a boolean (on or off).

     index
	 moves	the  window  to a specified index in the tree.	VALUE is a frame
	 index.

     floating
	 sets the floating state of the client.  VALUE is a boolean.

     pseudotile
	 sets the pseudotile state of the client.  VALUE is a boolean.

     sticky
	 sets the sticky attribute of the client.  VALUE is a boolean.

     ewmhrequests
	 sets whether the window state (the fullscreen state and the demands at-
	 tention flag) can be changed by the application via ewmh  itself.  This
	 does  not  affect the initial fullscreen state requested by the window.
	 VALUE is a boolean; it defaults to on.

     ewmhnotify
	 sets whether hlwm should let the client know about EMWH  changes  (cur-
	 rently  only the fullscreen state). If this is set, applications do not
	 change to their fullscreen-mode while still being fullscreen.	VALUE is
	 a boolean, it defaults to on.

     fullscreen
	 sets the fullscreen flag of the client.  VALUE is a boolean.

     hook
	 emits the custom hook rule VALUE WINID when this rule is triggered by a
	 new window with the id WINID. This consequence  can  be  used	multiple
	 times,  which	will cause a hook to be emitted for each occurrence of a
	 hook consequence.

     keymask
	 sets the keymask for a client (see  the  keymask  attribute  documenta-
	 tion).

     keys_inactive
	 sets  a  regex  that  determines  which key bindings are inactive for a
	 client (see the keys_inactive attribute documentation).

     floatplacement
	 changes the floating position of a window. The VALUE can be one of  the
	 following:

	 *   none does not change the placement at all

	 *   center centers the window on the monitor

	 *   smart  tries  to  place it with as little overlap to other floating
	     windows as possible. If there are multiple options with  the  least
	     overlap, then the position with the least overlap to tiling windows
	     is chosen.

	 *   topleft,  topright, bottomleft, bottomright moves the window to the
	     respective  corner  of  the  monitor  but	leaves	a  gap	of  set-
	     tings.snap_gap pixels.

     floating_geometry
	 Sets  the  client's floating_geometry attribute. The VALUE is a rectan-
	 gle, interpreted relatively to the monitor. If floatplacement	is  also
	 specified for the client (possibly by another rule), then only the size
	 of  the  floating_geometry is used. In order to force the position from
	 the geometry, it is necessary to add floatplacement=none.

     A rule's behaviour can be configured by some special FLAGS:

     *	 not: negates the next CONDITION.

     *	 !: same as not.

     *	 once: only apply this rule once (and delete it afterwards).

     *	 printlabel: prints the label of the newly created rule to stdout.

     *	 prepend: prepend the rule to the list of rules instead of appending it.
	 So its consequences may be overwritten by already existing rules.

     Examples:

     *	 rule --class=Netscape --tag=6 --focus=off

	 Moves all Netscape instances to tag 6, but doesn't give focus to them.

     *	 rule not class~.*[Tt]erm tag=2

	 Moves all clients to tag 2, if their class does not end  with	term  or
	 Term.

     *	 rule class=Thunderbird index=/0

	 Insert  all  Thunderbird  instances  in  the tree that has no focus and
	 there in the first child.

     *	 rule --windowtype=_NET_WM_WINDOW_TYPE_DIALOG --focus=on

	 Sets focus to new dialogs  which  set	their  _NET_WM_WINDOW_TYPE  cor-
	 rectly.

WINDOW IDS
     Several commands accept a window as reference, e.g. close. The syntax is as
     follows:

     *	 an  empty string -- or missing argument -- references the currently fo-
	 cused window.

     *	 urgent references some window that is urgent.

     *	 0xHEXID -- where HEXID is some hexadecimal  number  --  references  the
	 window with hexadecimal X11 window id HEXID.

     *	 longest-minimized  references	the  minimized window on the focused tag
	 that has been minimized for the longest time.

     *	 last-minimized references the minimized window on the focused tag  that
	 has been minimized most recently.

     *	 DECID	--  where  DECID is some decimal number -- references the window
	 with the decimal X11 window id DECID.

OBJECTS
     The object tree is a collection of objects with attributes similar to  /sys
     known  from  the Linux kernel. Many entities (like tags, monitors, clients,
     ...) have objects to access their attributes directly. The tree is  printed
     by the object_tree command and looks more or less as follows:

	 $ herbstclient object_tree
	 a3/4aa
	   aaa tags
	   a aaa by-name
	   a a aaa1/4 1
	   a a ...
	   a a aaa1/4 9
	   a aaa1/4 focus
	   aaa clients
	   a aaa1/4 0x1400022
	   a aaa1/4 focus
	   aaa monitors
	     aaa1/4 by-name
	     aaa1/4 focus

     To  print	a subtree starting at a certain object, pass the PATH of the ob-
     ject to object_tree. The object PATH is the  path	using  the  separator  .
     (dot), e.g. tags.by-name:

	 $ herbstclient object_tree tags.by-name.
	 a3/4aa tags.by-name.
	   aaa1/4 1
	   aaa1/4 2
	   ...
	   aaa1/4 9

     To query all attributes and children of a object, pass its PATH to attr:

	 $ herbstclient attr tags.
	 2 children:
	   by-name.
	   focus.

	 1 attributes:
	  .---- type
	  | .-- writable
	  V V
	  u - count		   = 9

	 $ herbstclient attr tags.focus.
	 0 children.
	 6 attributes:
	  .---- type
	  | .-- writable
	  V V
	  s w name		   = "1"
	  b w floating		   = false
	  i - frame_count	   = 2
	  i - client_count	   = 1
	  i - curframe_windex	   = 0
	  i - curframe_wcount	   = 1

     This  already  gives an intuition of the output: attr first lists the names
     of the child objects and then all attributes, telling for each attribute:

     *	 its type

	 *   b for boolean

	 *   c for color

	 *   i for integer

	 *   r for regex

	 *   s for string

	 *   u for unsigned integer

     *	 if it is writable by the user: w if yes, - else.

     *	 the name of the attribute

     *	 its current value (only quoted for strings)

     To get the unquoted value of a certain attribute, address the attribute us-
     ing the same syntax as for object paths and pass it to attr or get_attr:

	 $ herbstclient attr clients.focus.title
	 herbstluftwm.txt = (~/dev/c/herbstluftwm/doc) - VIM
	 $ herbstclient get_attr  clients.focus.title
	 herbstluftwm.txt = (~/dev/c/herbstluftwm/doc) - VIM

     To change a writable attribute value pass the  new  value	to  attr  or  to
     set_attr:

	 $ herbstclient attr tags.focus.floating
	 false
	 $ herbstclient attr tags.focus.floating true
	 $ herbstclient attr tags.focus.floating
	 true
	 $ herbstclient set_attr tags.focus.floating false
	 $ herbstclient attr tags.focus.floating
	 false

     More information on an attribute or object is given by the help command:

	 $ herbstclient help clients.focus

     Just  look around to get a feeling what is there. The entry point is a root
     object that has the following child objects:

   autostart:
     *	 string global_path =  globalAutostart:  Path  of  the	system-wide  au-
	 tostart, used as a fallback.

     *	 int  last_status = 0: the exit status of the last autostart run. if the
	 autostart is still running, then this status corresponds  to  the  exit
	 status of the previous autostart invocation.

     *	 string path = autostartFromCmdLine: Custom path to the user's autostart
	 path.	If  it is empty, then the autostart in $XDG_CONFIG_HOME or $HOME
	 is used.

     *	 uint pid = 0: the process id of the last autostart invocation. Even  if
	 the autostart is not running anymore, its pid is still present here.

     *	 bool running = false: whether the autostart process (with pid) is still
	 running.

   clients:
     The managed windows. For every (managed) window id there is an entry here.

     *	 dragged:  the	object	of  a  client  which is currently dragged by the
	 mouse, if any. See the documentation of the mousebind command for exam-
	 ples. For attributes and children, see clients.focus

     *	 focus: the focused client (only exists if a client is focused).  a man-
	 aged window

	 *   string class: the class of it (second entry in WM_CLASS)

	 *   Rectangle content_geometry: the geometry of  the  application  con-
	     tent,  that  is, not taking the decoration into account. Also, this
	     is the last window geometry that was reported to the client  appli-
	     cation.

	 *   bool decorated = true: whether window border and title are drawn

	 *   Rectangle	decoration_geometry:  the geometry of the client, taking
	     the window decoration into account. The position is the global win-
	     dow position, that is, relative to the top left corner of	the  en-
	     tire screen

	 *   bool  ewmhnotify  = true: if the client is told about its state via
	     ewmh

	 *   bool ewmhrequests = true: if ewmh requests are permitted  for  this
	     client

	 *   bool floating = false: whether this client is set as a (single-win-
	     dow) floating client. If set, the client is floated above the tiled
	     clients.

	 *   bool  floating_effectively  =  false: whether this client is in the
	     floating state currently. This is the case if the client's  tag  is
	     set  to  floating	mode or if the client itself is set as floating.
	     Its value is also indicated  via  the  X11  properties  HLWM_FLOAT-
	     ING_WINDOW and HLWM_TILING_WINDOW.

	 *   Rectangle floating_geometry = 0: the geometry of the client content
	     if  the client is in floating mode. The position is relative to the
	     monitor and does not take the window decoration into account.

	 *   bool fullscreen = false: whether this client covers all other  win-
	     dows and panels on its monitor.

	 *   string instance: the instance of it (first entry in WM_CLASS)

	 *   regex  keymask  =	"": A regular expression that is matched against
	     the string representation of all key bindings (as they are  printed
	     by list_keybinds). While this client is focused, only bindings that
	     match  the  expression  will  be active. Any other bindings will be
	     disabled. The default keymask is an empty string (), which does not
	     disable any keybinding.

	 *   regex keys_inactive = "": A regular expression that describes which
	     keybindings are inactive while the client is focused. If a key com-
	     bination is pressed and its  string  representation  (as  given  by
	     list_keybinds)  matches the regex, then the key press is propagated
	     to the client.

	 *   bool minimized = false: whether  this  client  is	minimized  (also
	     called iconified).

	 *   int pgid = -1

	 *   int pid = -1: the process id of it (-1 if unset).

	 *   bool  pseudotile  =  false: if activated, the client always has its
	     floating window size, even if it is in tiling mode.

	 *   bool sizehints_floating = true: if sizehints for this client should
	     be respected in floating mode

	 *   bool sizehints_tiling = false: if sizehints for this client  should
	     be respected in tiling mode

	 *   bool  sticky = false: whether this client is pinned to the monitor.
	     This means that the client stays on its monitor, even when the mon-
	     itor switches to another tag.

	 *   string tag: the name of the tag it's currently on.

	 *   string title = "": its window title

	 *   bool urgent = false: the urgency state (also known as: demands  at-
	     tention). The focused client can not be urgent.

	 *   bool  visible  =  visible_already:  whether this client is rendered
	     currently

	 *   string winid = "": its window id (as a hexadecimal number	with  0x
	     prefix)

	 *   parent_frame:  the  frame	contaning  this  client if the client is
	     tiled. For attributes and children, see tags.focus.tiling.root

   monitors:
     Every monitor is a rectangular part of the screen on which a tag is  shown.
     These  monitors  may or may not match the actual outputs. This has an entry
     INDEX for each monitor with index INDEX.

     *	 uint count

     *	 TagSelectionStrategy tag_selection_strategy = any_unshown: How  to  se-
	 lect a tag when a new monitor is created.

	 *   any_unshown: select the first tag that is not shown on any monitor

	 *   only_empty:  select  the first empty tag that isn'+++t shown, abort
	     if none is available

	 *   +prefer_empty: prefer an empty tag, but select any unshown  tag  if
	     no empty tag is available

     *	 by-name:  This  has an entry name for every object with the given name.
	 If an object has an empty name then it is not listed here.

     *	 focus: the focused monitor.  The monitor is a rectangular part  on  the
	 screen  that  holds precisely one tag at a time. The pad attributes re-
	 serve space on the monitor's edge for panels, so this space  (given  in
	 number of pixels) is never occupied by tiled clients.

	 *   Rectangle content_geometry: the inner geometry of the monitor, i.e.
	     the  geometry  with  the  pads deducted from all sides. This is the
	     area floating and tiled client windows are placed.

	 *   Rectangle geometry = rect_: the outer geometry of the monitor

	 *   uint index = 0: the monitor's index (starts at index 0)

	 *   bool lock_tag = false: if activated, then it it is not possible  to
	     switch this monitor to a different tag.

	 *   string name = "": the monitor's name (can be empty)

	 *   int pad_down = 0: space for panels at the monitor's lower edge

	 *   int pad_left = 0: space for panels at the monitor's left edge

	 *   int pad_right = 0: space for panels at the monitor's right edge

	 *   int pad_up = 0: space for panels at the monitor's upper edge

	 *   string tag: the name of the tag viewed here

   panels:
     For every panel window, there is an entry with the panel's window id here.

     *	 uint count

     *	 bool  geometry_fallback = false: when auto-detecting panels: if a panel
	 does not specify the amount of space it needs at the monitor edge, fall
	 back to reserve the panel's geometryat the screen edge.

     *	 0xWindowID: a panel is an unmanaged window that reserves space  at  the
	 edge  of  the	monitor it is on. The space depends on the _NET_WM_STRUT
	 defined by the panel. If it is however not defined explicitly, then the
	 amount of reserved space is inferred from the window geometry.

	 *   string class: the window class (second entry of WM_CLASS)

	 *   Rectangle geometry: the size and position of the window

	 *   string instance: the window instance (first entry of WM_CLASS)

	 *   WindowID winid = winid: the ID of the panel window

   settings:
     Settings configure the general behaviour of herbstluftwm and  can	be  con-
     trolled  via  the set, get and toggle commands. The settings. object has an
     attribute for each setting. Many settings are  wrappers  around  attributes
     and only remain for compatibility.

     *	 bool  always_show_frame = false: DEPRECATED, use show_frame_decorations
	 instead. If set, show_frame_decorations will be set to all (or  focused
	 if unset).

     *	 bool auto_detect_monitors = false: If set, detect_monitors is automati-
	 cally	executed  every time a monitor is connected, disconnected or re-
	 sized.

     *	 bool auto_detect_panels = true: If set, EWMH panels  are  automatically
	 detected and reserve space at the side of the monitors they are on (via
	 pad attributes of each monitor). This setting is activated per default.

     *	 bool default_direction_external_only = false: This setting controls the
	 behaviour  of focus and shift if no -e or -i argument is given. If set,
	 then focus and shift changes the focused frame even if there are  other
	 clients in this frame in the specified DIRECTION. Else, a client within
	 current frame is selected if it is in the specified DIRECTION.

     *	 LayoutAlgorithm default_frame_layout = vertical: Name of the layout al-
	 gorithm,  which is used if a new frame is created (on a new tag or by a
	 non-trivial split). See above for the list of layout algorithms.

     *	 string ellipsis = ...: string to append when window or tab  titles  are
	 shortened to fit in the available space.

     *	 bool  focus_crosses_monitor_boundaries  =  true: If set, commands focus
	 and shift cross monitor boundaries. If there is no client in the direc-
	 tion given to focus, then the monitor in the specified direction is fo-
	 cused. Similarly, if shift cannot move a window within a tag, the  win-
	 dow is moved to the neighbour monitor in the desired direction.

     *	 bool  focus_follows_mouse  =  false:  If set and a window is focused by
	 mouse cursor, this window is focused (this feature  is  also  known  as
	 sloppy  focus).  If unset, you need to click to change the window focus
	 by mouse.

	 If another window is hidden by  the  focus  change  (e.g.  when  having
	 pseudotiled  windows in the max layout) then an extra click is required
	 to change the focus.

     *	 bool focus_stealing_prevention = true: If set, only pagers and taskbars
	 are allowed to change the focus. If unset, all applications can request
	 a focus change.

     *	 int frame_active_opacity = 100: Focused frame opacity in  percent.  Re-
	 quires a running compositing manager to take actual effect.

     *	 color frame_bg_active_color = black: The fill color of a focused frame.

     *	 color	frame_bg_normal_color  =  black:  The fill color of an unfocused
	 frame (It is only visible if non-focused frames are  configured  to  be
	 visible, see show_frame_decorations).

     *	 bool frame_bg_transparent = false: If set, the background of frames are
	 transparent. That means a rectangle is cut out from the inner such that
	 only the frame border and a stripe of width frame_transparent_width can
	 be  seen.  Use  frame_active_opacity  and frame_normal_opacity for real
	 transparency.

     *	 color frame_border_active_color = red: The border color  of  a  focused
	 frame.

     *	 color	frame_border_inner_color  = black: The color of the inner border
	 of a frame.

     *	 int frame_border_inner_width = 0: The width of the inner  border  of  a
	 frame.  Must  be less than frame_border_width, since it does not add to
	 the frame border width but is a part of it.

     *	 color frame_border_normal_color = blue: The border color  of  an  unfo-
	 cused frame.

     *	 int frame_border_width = 2: Border width of a frame.

     *	 int frame_gap = 5: The gap between frames in the tiling mode.

     *	 int frame_normal_opacity = 100: Unfocused frame opacity in percent. Re-
	 quires a running compositing manager to take actual effect.

     *	 int  frame_padding  = 0: The padding within a frame in the tiling mode,
	 i.e. the space between the border of a frame and the windows within it.

     *	 int frame_transparent_width = 0: Specifies the width of  the  remaining
	 frame	colored  with  frame_bg_active_color  if frame_bg_transparent is
	 set.

     *	 bool gapless_grid = true: This setting affects the  size  of  the  last
	 client  in  a	frame  that is arranged by grid layout. If set, then the
	 last client always fills the gap within this frame. If unset, then  the
	 last client has the same size as all other clients in this frame.

     *	 bool hide_covered_windows = false: If activated, windows are explicitly
	 hidden when they are covered by another window in a frame with max lay-
	 out.  This  only has a visible effect if a compositor is used. If acti-
	 vated, shadows do not stack up and transparent windows show the wallpa-
	 per behind them instead of the other clients in the max layout.

     *	 uint monitors_locked = 0: If greater than 0, then the	clients  on  all
	 monitors  aren't  moved or resized anymore. If it is set to 0, then the
	 arranging of monitors is enabled again, and all monitors are rearranged
	 if their content has changed in the meantime.	You  should  not  change
	 this  setting manually due to concurrency issues; use the commands lock
	 and unlock instead.

     *	 int mouse_recenter_gap = 0: Specifies the gap around a monitor. If  the
	 monitor  is selected and the mouse position would be restored into this
	 gap, it is set to the center of the monitor. This is useful,  when  the
	 monitor  was left via mouse movement, but is reselected by keyboard. If
	 the gap is 0 (default), the mouse is never recentered.

     *	 int pseudotile_center_threshold = 10: If greater than 0,  it  specifies
	 the  least distance between a centered pseudotile window and the border
	 of the frame or tile it is assigned to. If this distance is lower  than
	 pseudotile_center_threshold,  it  is  aligned	to  the  top left of the
	 client's tile.

     *	 bool raise_on_click = true: If  set,  a  window  is  raised  if  it  is
	 clicked. The value of this setting is only noticed in floating mode.

     *	 bool  raise_on_focus  =  false: If set, a window is raised if it is fo-
	 cused. The value of this setting is only used in floating mode.

     *	 bool raise_on_focus_temporarily = false: If set,  a  window  is  raised
	 temporarily if it is focused on its tag. Temporarily in this case means
	 that  the  window  will return to its previous stacking position if an-
	 other window is focused.

     *	 ShowFrameDecorations show_frame_decorations = focused_if_multiple: This
	 controls, which frame decorations are shown at all.

	 *   none shows no frame decorations at all,

	 *   nonempty shows decorations of frames that have client windows,

	 *   if_multiple shows decorations on the tags with at least two frames,

	 *   if_empty shows decorations of frames that have no client windows,

	 *   if_multiple_empty shows decorations of frames that have  no  client
	     windows on tags with at least two frames,

	 *   focused shows the decoration of focused and nonempty frames,

	 *   focused_if_multiple  shows  decorations  of  focused  and non-empty
	     frames on tags with at least two frames.

	 *   all shows all frame decorations.

     *	 SmartFrameSurroundings  smart_frame_surroundings  =  off:  If	set   to
	 hide_all, frame borders and gaps will be removed when there is no ambi-
	 guity regarding the focused frame. If set to hide_gaps, only frame gaps
	 will be removed when there is no ambiguity regarding the focused frame.
	 Turn off to always show frame borders and gaps.

     *	 SmartWindowSurroundings  smart_window_surroundings  =	off:  If  set to
	 one_window (or on), then window borders and gaps will be hidden in each
	 frame that shows only one window. If set to one_window_and_frame,  then
	 only  those  frames  are affected that are the only frame on their tag.
	 Still, these hidden decorations can be configured by the  theme.minimal
	 object. Turn off to always show window borders and gaps.

     *	 int  snap_distance  = 10: If a client is dragged in floating mode, then
	 it snaps to neighbour clients if the distance between them  is  smaller
	 than snap_distance.

     *	 int snap_gap = 5: Specifies the remaining gap if a dragged client snaps
	 to  an  edge in floating mode. If snap_gap is set to 0, no gap will re-
	 main.

     *	 bool swap_monitors_to_get_tag = true: If set: If you  want  to  view  a
	 tag,  that  already is viewed on another monitor, then the monitor con-
	 tents will be swapped and you see the wanted tag on the  focused  moni-
	 tor.  If  not set, the other monitor is focused if it shows the desired
	 tag.

     *	 bool tabbed_max = true: if activated, multiple windows in a frame  with
	 the max layout algorithm are drawn as tabs.

     *	 string  tree_style = "*| +`--.": It contains the chars that are used to
	 print a nice ascii tree. It must contain at least  8  characters.  e.g.
	 X|:#+*-.  produces a tree like:

	     X-.
	       #-. child 0
	       | #-* child 00
	       | +-* child 01
	       +-. child 1
	       : #-* child 10
	       : +-* child 11

	 Useful  values for tree_style are: ^a3/4^a ^a^a^a1/4^a^a or -| |'--.	or ^a3/4^a
	 ^a^a<degree>^a1/4^a^a(R).

     *	 bool update_dragged_clients = false: If set, a client's window  content
	 is resized immediately during resizing it with the mouse. If unset, the
	 client's content is resized after the mouse button is released.

     *	 bool  verbose	=  false:  If  set,  verbose  output  is logged to herb-
	 stluftwm's stderr. The default value is  controlled  by  the  --verbose
	 command line flag.

     *	 color window_border_active_color: Border color of a focused window.

	 Warning:  This  only  exists  for  compatibility reasons; it is only an
	 alias for the attribute theme.active.color.

     *	 color window_border_inner_color: Color of the inner border of a window.
	 Warning: This only exists for compatibility  reasons;	it  is	only  an
	 alias for the attribute theme.inner_color.

     *	 int  window_border_inner_width: The width of the inner border of a win-
	 dow. Must be less than window_border_width, since it does  not  add  to
	 the window border width but is a part of it.

	 Warning:  This  only  exists  for  compatibility reasons; it is only an
	 alias for the attribute theme.inner_width.

     *	 color window_border_normal_color: Border color of an unfocused window.

	 Warning: This only exists for compatibility  reasons;	it  is	only  an
	 alias for the attribute theme.normal.color.

     *	 color	window_border_urgent_color: Border color of an unfocused but ur-
	 gent window.

	 Warning: This only exists for compatibility  reasons;	it  is	only  an
	 alias for the attribute theme.urgent.color.

     *	 int window_border_width: Border width of a window.

	 Warning:  This  only  exists  for  compatibility reasons; it is only an
	 alias for the attribute theme.border_width.

     *	 int window_gap = 0: The gap between windows within  one  frame  in  the
	 tiling mode.

     *	 string wmname = herbstluftwm: It controls the value of the _NET_WM_NAME
	 property  on  the  root window, which specifies the name of the running
	 window manager. The value of this setting is not updated if the  actual
	 _NET_WM_NAME property on the root window is changed externally. Example
	 usage:

	 *   cycle_value wmname herbstluftwm LG3D

   tags:
     The  tags (or virtual desktops or workspaces). This contains an entry index
     for each tag with the given index.

     *	 uint count

     *	 by-name: For attributes and children, see monitors.by-name

     *	 focus: the object of the focused tag, equivalently, the tag on the  fo-
	 cused monitor.

	 *   bool  at_end = false: all tags with this property activated will be
	     kept at the end of the tag list. Usually, this property is set  for
	     special purpose tags like scratchpads.

	 *   int client_count: the number of clients on this tag

	 *   int curframe_wcount: number of clients in the selected frame

	 *   int  curframe_windex:  index  of the focused client in the selected
	     frame

	 *   bool floating = false: if the entire tag is set to floating mode

	 *   bool floating_focused = false: if the  floating  layer  is  focused
	     (otherwise the tiling layer is)

	 *   int frame_count: the number of frames on this tag

	 *   uint index = 0: index of this tag (the first index is 0)

	 *   string name = name_: name of the tag (must be non-empty)

	 *   int urgent_count: the number of urgent clients on this tag

	 *   bool visible = false: if this tag is shown on some monitor

	 *   focused_client: For attributes and children, see clients.focus

	 *   tiling:

	     *	 focused_frame: The focused frame (leaf) in this frame tree. For
		 attributes and children, see tags.focus.tiling.root

	     *	 root can be a frame leaf.

		 *   LayoutAlgorithm algorithm

		 *   int client_count

		 *   Rectangle	content_geometry:  the	geometry  of the frame's
		     contents, i.e. of the area filled by child frames or client
		     windows.

		 *   string index: A string containing only 0  and  1  that  de-
		     scribes  the  position  of the frame in the tree. The empty
		     string denotes the root frame. Appending 0 (respectively 1)
		     to a frame index yields the frame index of the  first  (re-
		     spectively second) subtree.

		 *   int selection

	     *	 root can be a frame split.

		 *   Rectangle	content_geometry:  the	geometry  of the frame's
		     contents, i.e. of the area filled by child frames or client
		     windows.

		 *   decimal fraction

		 *   string index: A string containing only 0  and  1  that  de-
		     scribes  the  position  of the frame in the tree. The empty
		     string denotes the root frame. Appending 0 (respectively 1)
		     to a frame index yields the frame index of the  first  (re-
		     spectively second) subtree.

		 *   int selection

		 *   SplitAlign split_type

		 *   0	can  be  a  frame leaf. For attributes and children, see
		     tags.focus.tiling.root

		 *   0 can be a frame split. For attributes  and  children,  see
		     tags.focus.tiling.root

		 *   1	can  be  a  frame leaf. For attributes and children, see
		     tags.focus.tiling.root

		 *   1 can be a frame split. For attributes  and  children,  see
		     tags.focus.tiling.root

   theme:
	 inner_color/inner_width
	       a>>	  outer_color/outer_width
	       a		  a>>
	       a		  a
	 aaaaaa'aa<paragraph>aaaaaaaaaaaaaaaaaa.aaaaaa a<< border_width
	 a     a      color		a a~ + title_height + title_depth
	 a  aaaa.aaaaaaaaaaaaaaaaaaaaaa  a a + padding_top
	 a  a====================....a	a
	 a  a== window content ==....a	a
	 a  a====================..a3/4aaaaaaaa background_color
	 a  a........................a	a
	 a  aaaaaaaaaaaaaaaaaaaaaaaaaa	a a+/- border_width +
	 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa a<degree> padding_bottom

     Setting  an  attribute of the theme object just propagates the value to the
     respective attribute of the tiling and the floating object.  If  the  title
     area  is  divided into tabs, then the not selected tabs can be styled using
     the tab_... attributes. If these attributes are empty, then the colors  are
     taken from the theme of the client to which the tab refers to.

     *	 color background_color = black: color behind window contents visible on
	 resize

     *	 uint border_width = 0: the base width of the border

     *	 color color = black: the basic background color of the border

     *	 color inner_color = black: color of the inner border

     *	 uint inner_width = 0: width of the border around the clients content

     *	 CssFile::Ptr  name:  the  absolute path to a css theme file. if this is
	 empty, then the theme is specified by the attributes.

     *	 color outer_color = black: color of the outer border

     *	 uint outer_width = 0: width of an border close to the edge

     *	 uint padding_bottom = 0: additional border width on the bottom

     *	 uint padding_left = 0: additional border width on the left

     *	 uint padding_right = 0: additional border width on the right

     *	 uint padding_top = 0: additional border width on the top

     *	 string reset: writing this resets all attributes to a default value

     *	 CssSource style_override: additional css source to overwrite  parts  of
	 the  theme. All rules here have higher precedence than all rules in the
	 theme

     *	 MaybeColor tab_color = Inherit: if non-empty, the color  of  non-urgent
	 and unfocused tabs

     *	 MaybeColor  tab_outer_color  =  Inherit: if non-empty, the outer border
	 color of non-urgent and unfocused tabs; if empty, the colors are  taken
	 from the tab'sclient decoration settings.

     *	 MaybeULong  tab_outer_width  =  Inherit: if non-empty, the outer border
	 width of non-urgent and unfocused tabs

     *	 MaybeColor tab_title_color = Inherit: if non-empty, the title color  of
	 non-urgent and unfocused tabs

     *	 bool  tight_decoration  =  false: specifies whether the size hints also
	 affect the window decoration or  only	the  window  contents  of  tiled
	 clients (requires enabled sizehints_tiling)

     *	 TextAlign  title_align  =  left:  the horizontal alignment of the title
	 within the tab or title bar. The value is one of: left, center, right

     *	 color title_color = black

     *	 MaybeInt title_depth = 0: the space below the baseline  of  the  window
	 title, or '' for an automatic calculation based on the font.

     *	 font title_font = fixed

     *	 MaybeULong title_height = 0: the space above the baseline of the window
	 title, or '' for an automatic calculation based on the font.

     *	 TitleWhen  title_when	= always: when to show the window title: always,
	 never, if the the client is in a  tabbed  scenario  like  a  max  frame
	 (one_tab), if there are multiple_tabs to be shown.

     *	 active: configures the decoration of the focused client.

	 *   color  background_color = black: color behind window contents visi-
	     ble on resize

	 *   uint border_width = 0: the base width of the border

	 *   color color = black: the basic background color of the border

	 *   color inner_color = black: color of the inner border

	 *   uint inner_width = 0: width of the border around the  clients  con-
	     tent

	 *   color outer_color = black: color of the outer border

	 *   uint outer_width = 0: width of an border close to the edge

	 *   uint padding_bottom = 0: additional border width on the bottom

	 *   uint padding_left = 0: additional border width on the left

	 *   uint padding_right = 0: additional border width on the right

	 *   uint padding_top = 0: additional border width on the top

	 *   string reset: writing this resets all attributes to a default value

	 *   MaybeColor  tab_color = Inherit: if non-empty, the color of non-ur-
	     gent and unfocused tabs

	 *   MaybeColor tab_outer_color = Inherit: if non-empty, the outer  bor-
	     der  color  of  non-urgent and unfocused tabs; if empty, the colors
	     are taken from the tab'sclient decoration settings.

	 *   MaybeULong tab_outer_width = Inherit: if non-empty, the outer  bor-
	     der width of non-urgent and unfocused tabs

	 *   MaybeColor tab_title_color = Inherit: if non-empty, the title color
	     of non-urgent and unfocused tabs

	 *   bool  tight_decoration  =	false:	specifies whether the size hints
	     also affect the window decoration or only the  window  contents  of
	     tiled clients (requires enabled sizehints_tiling)

	 *   TextAlign title_align = left: the horizontal alignment of the title
	     within  the  tab  or  title bar. The value is one of: left, center,
	     right

	 *   color title_color = black

	 *   MaybeInt title_depth = 0: the space below the baseline of the  win-
	     dow title, or '' for an automatic calculation based on the font.

	 *   font title_font = fixed

	 *   MaybeULong  title_height  =  0: the space above the baseline of the
	     window title, or '' for an automatic calculation based on the font.

	 *   TitleWhen title_when = always: when to show the window  title:  al-
	     ways,  never,  if the the client is in a tabbed scenario like a max
	     frame (one_tab), if there are multiple_tabs to be shown.

     *	 floating: behaves analogously to tiling.

	 *   color background_color = black: color behind window contents  visi-
	     ble on resize

	 *   uint border_width = 0: the base width of the border

	 *   color color = black: the basic background color of the border

	 *   color inner_color = black: color of the inner border

	 *   uint  inner_width	= 0: width of the border around the clients con-
	     tent

	 *   color outer_color = black: color of the outer border

	 *   uint outer_width = 0: width of an border close to the edge

	 *   uint padding_bottom = 0: additional border width on the bottom

	 *   uint padding_left = 0: additional border width on the left

	 *   uint padding_right = 0: additional border width on the right

	 *   uint padding_top = 0: additional border width on the top

	 *   string reset: writing this resets all attributes to a default value

	 *   MaybeColor tab_color = Inherit: if non-empty, the color of  non-ur-
	     gent and unfocused tabs

	 *   MaybeColor  tab_outer_color = Inherit: if non-empty, the outer bor-
	     der color of non-urgent and unfocused tabs; if  empty,  the  colors
	     are taken from the tab'sclient decoration settings.

	 *   MaybeULong  tab_outer_width = Inherit: if non-empty, the outer bor-
	     der width of non-urgent and unfocused tabs

	 *   MaybeColor tab_title_color = Inherit: if non-empty, the title color
	     of non-urgent and unfocused tabs

	 *   bool tight_decoration = false: specifies  whether	the  size  hints
	     also  affect  the	window decoration or only the window contents of
	     tiled clients (requires enabled sizehints_tiling)

	 *   TextAlign title_align = left: the horizontal alignment of the title
	     within the tab or title bar. The value is	one  of:  left,  center,
	     right

	 *   color title_color = black

	 *   MaybeInt  title_depth = 0: the space below the baseline of the win-
	     dow title, or '' for an automatic calculation based on the font.

	 *   font title_font = fixed

	 *   MaybeULong title_height = 0: the space above the  baseline  of  the
	     window title, or '' for an automatic calculation based on the font.

	 *   TitleWhen	title_when  = always: when to show the window title: al-
	     ways, never, if the the client is in a tabbed scenario like  a  max
	     frame (one_tab), if there are multiple_tabs to be shown.

	 *   active:  configures  the  decoration of the focused client. For at-
	     tributes and children, see theme.active

	 *   normal: the default decoration scheme for clients.  For  attributes
	     and children, see theme.active

	 *   urgent: configures the decoration of urgent clients. For attributes
	     and children, see theme.active

     *	 fullscreen:  configures clients in fullscreen state. For attributes and
	 children, see theme.floating

     *	 minimal: configures  clients  with  minimal  decorations  triggered  by
	 smart_window_surroundings.    For    attributes   and	 children,   see
	 theme.floating

     *	 normal: the default decoration scheme for clients. For  attributes  and
	 children, see theme.active

     *	 tiling:  configures the decoration of tiled clients, setting one of its
	 attributes propagates the respective attribute of  the  active,  normal
	 and urgent child objects. For attributes and children, see theme.float-
	 ing

     *	 urgent: configures the decoration of urgent clients. For attributes and
	 children, see theme.active

   types:
     This lists the types that are used for attributes and command arguments.

     *	 bool:	Type  representing boolean values, i.e. an on or off state, with
	 aliases true and false. When writing to a boolean value, one  can  also
	 specify toggle in order to alter its value.

	 *   string fullname: the full and unique name of this type

	 *   string  shortname:  A  short (one-character long) name of this type
	     which is used in the output of the attr command

     *	 color: Type representing colors. A color can be defined in one  of  the
	 following formats:

	   1. #RRGGBB  where  R, G, B are hexidecimal digits (0-9, A-F), and RR,
	     GG, BB represent the values for red, green, blue.

	  2. #RRGGBBAA represents a color with alpha-value AA. The  alpha  value
	     00 is fully transparent and FF is fully opaque/intransparent.

	  3. a common color name like red, blue, orange, etc. For attributes and
	     children, see types.bool

     *	 decimal: Fixed precision decimal numbers, e.g. 0.34. For attributes and
	 children, see types.bool

     *	 font:	A font specification (font family with modifiers regarding size,
	 weight, etc.) in one of the following formats:

	 *   Fontconfig description. This supports antialiased fonts, for  exam-
	     ple:

	     *	 Dejavu Sans:pixelsize=12

	     *	 Bitstream Vera Sans:size=12:bold

	 *   X	logical  font  description  (XLFD),  as provided by the xfontsel
	     tool. No antialiasing is supported here, but this is usually  supe-
	     rior for bitmap fonts. For example:

	     *	 -*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*  for  a  standard bitmap
		 font available on most systems. For  attributes  and  children,
		 see types.bool

     *	 int:  Type  representing  signed integers. When overwriting an integer,
	 you can increase or decrease its value relatively by writing +=N or -=N
	 where N is an integer. So for example, writing +=3 to an attribute  in-
	 creases its value by 3. For attributes and children, see types.bool

     *	 names:  A  fixed  set of names, depending on the context, e.g. names of
	 layout algorithms or the split type of a non-leaf frame (which is  only
	 horizontal or vertical). For attributes and children, see types.bool

     *	 rectangle: A rectangle on the screen consisting of a size and the posi-
	 tion  on  the	screen. The format is WxH+X+Y where W is the width, H is
	 the height, and X and Y are the coordinates of the top left  corner  of
	 the  rectangle: X is the number of pixels to the left screen edge and Y
	 is the number of pixels to the top screen edge. (if X or Y is negative,
	 then the + turns into -). For example: 800x600+800+0 or  400x200-10+30.
	 For attributes and children, see types.bool

     *	 regex:  A  POSIX  extended regular expression. Note that when passing a
	 regex on the command line, additional quoting can be necessary. For ex-
	 planations and  examples,  see  section  9.4.6  of  the  documentation:
	 https://pubs.opengroup.org/on-
	 linepubs/9699919799/basedefs/V1_chap09.html#tag_09_04_06.  For  attrib-
	 utes and children, see types.bool

     *	 string: Type representing normal text. For attributes and children, see
	 types.bool

     *	 uint: Type representing unsigned  (i.e.  non-negative)  integers.  When
	 overwriting  an  integer,  you can increase or decrease its value rela-
	 tively by writing +=N or -=N where N is an integer. For attributes  and
	 children, see types.bool

     *	 windowid:  The  window id is the number of a window. This can be a man-
	 aged window (i.e. client) or an unmanaged window (e.g. a panel, a menu,
	 or a desktop window). The default format is 0xHEX where HEX is a  hexa-
	 decimal number (digits 0-9 and a-f) but it can also be specified in the
	 decimal system (base 10), or as an octal number (with prefix 0 and base
	 8). When a window id is printed, it is always printed in the 0xHEX for-
	 mat  and  without  any leading zeroes. For attributes and children, see
	 types.bool

   watchers:
     *	 uint count: the number of attributes that are watched

AUTOSTART FILE
     There is no configuration file but an autostart file, which is executed  on
     startup.  It  is  also  executed on command reload. If not specified by the
     --autostart argument, autostart file is located  at  $XDG_CONFIG_HOME/herb-
     stluftwm/autostart or at ~/.config/herbstluftwm/autostart. Normally it con-
     sists  of	a  few	herbstclient calls. If executing the autostart file in a
     user's  home  fails  the  global	autostart   file   (mostly   placed   at
     /etc/xdg/herbstluftwm/autostart) is executed as a fallback.

     For  a  quick  install,  copy the default autostart file to ~/.config/herb-
     stluftwm/.

HOOKS
     On special events, herbstluftwm emits some hooks (with parameters). You can
     receive or wait for them with herbstclient(1). Also  custom  hooks  can  be
     emitted  with  the  emit_hook  command.  The following hooks are emitted by
     herbstluftwm itself:

     attribute_changed PATH OLDVALUE NEWVALUE
	 The attribute PATH was changed from OLDVALUE to NEWVALUE. Requires that
	 the attribute PATH has been passed to the watch command before.

     fullscreen [on|off] WINID
	 The fullscreen state of window WINID was changed to [on|off].

     tag_changed TAG MONITOR
	 The tag TAG was selected on MONITOR.

     focus_changed WINID TITLE
	 The window WINID was focused. Its window title is TITLE.

     window_title_changed WINID TITLE
	 The title of the focused window was changed. Its window id is WINID and
	 its new title is TITLE.

     tag_flags
	 The flags (i.e. urgent or filled state) have been changed.

     tag_added TAG
	 A tag named TAG was added.

     tag_removed TAG
	 The tag named TAG was removed.

     tag_renamed OLD NEW
	 The tag name changed from OLD to NEW.

     urgent [on|off] WINID
	 The urgent state of  client  with  given  WINID  has  been  changed  to
	 [on|off].

     rule NAME WINID
	 A  window  with  the  id WINID appeared which triggered a rule with the
	 consequence hook=NAME.

     There are also other useful hooks, which never will  be  emitted  by  herb-
     stluftwm itself, but which can be emitted with the emit_hook command:

     quit_panel
	 Tells	a  panel  to quit. The default panel.sh quits on this hook. Many
	 scripts are using this hook.

     reload
	 Tells all daemons that the autostart file is reloaded -- and tells them
	 to quit. This hook should be emitted in the first  line  of  every  au-
	 tostart file.

THEMES/STYLESHEETS
     The  look	of client decorations can be controlled via the attributes under
     the theme. object, or in a more granular way via stylesheets,  inspired  by
     CSS.

     More documentation on the theme format will come soon.

STACKING
     Every tag has its own stack of clients that are on this tag. Similar to the
     EWMH  specification  each tag stack contains several layers, which are from
     top to bottom:

     *	 the focused client (if raise_on_focus_temporarily is enabled)

     *	 clients in fullscreen

     *	 normal clients

     *	 frame decorations

     All monitors are managed in one large stack  which  only  consists  of  the
     stacks  of  the  visible  tags  put above each other. The stacking order of
     these monitors is independent from their indices and can be modified  using
     the  raise_monitor  command.  The current stack is illustrated by the stack
     command.

EWMH AND X11 PROPERTIES
     As far as possible, herbstluftwm tries to be EWMH compliant. That includes:

     *	 Information about tag names and client lists is provided.

     *	 Desktop windows from desktop environments are not managed and kept  be-
	 low the other windows.

     *	 Client  requests like getting focused are only processed if the setting
	 focus_stealing_prevention is disabled.

     Moreover, herbstluftwm sets the  X11  properties  HLWM_FLOATING_WINDOW  and
     HLWM_TILING_WINDOW  to  indicate  whether a window is in floating or tiling
     mode, that is, the value of the client's floating_effectively attribute.

ENVIRONMENT VARIABLES
     DISPLAY
	 Specifies the DISPLAY to use.

FILES
     The following files are used by herbstluftwm:

     *	 autostart, see section AUTOSTART FILE.

EXIT STATUS
     Returns 0 on success. Returns EXIT_FAILURE  if  it  cannot  startup  or  if
     wmexec fails.

BUGS
     See  the  herbstluftwm Github issues: https://github.com/herbstluftwm/herb-
     stluftwm/issues

COMMUNITY
     Feel free to join the IRC channel #herbstluftwm on irc.libera.chat.

AUTHOR
     herbstluftwm was written by Thorsten WiAmann. All contributors  are  listed
     in the herbstluftwm distribution AUTHORS file.

RESOURCES
     Homepage: http://herbstluftwm.org

     Github page: http://github.com/herbstluftwm/herbstluftwm

     Patch submission and bug reporting:

	 hlwm@lists.herbstluftwm.org

COPYING
     Copyright 2011-2020 Thorsten WiAmann. All rights reserved.

     This  software  is licensed under the "Simplified BSD License". See LICENSE
     for details.

  herbstluftwm 0.9.6		   2026-04-03			 HERBSTLUFTWM(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=herbstluftwm&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help