2023-06-15 16:00:16 +00:00
'\" t
2023-06-15 16:10:22 +00:00
. \" Title: tspwm
2023-06-15 16:00:16 +00:00
. \" Author: [see the "Author" section]
. \" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
. \" Date: 04/05/2023
2023-06-15 16:10:22 +00:00
. \" Manual: Tspwm Manual
. \" Source: Tspwm 0.9.10-49-gc58c67a
2023-06-15 16:00:16 +00:00
. \" Language: English
. \"
2023-06-15 16:10:22 +00:00
.TH "TSPWM" "1" "04/05/2023" "Tspwm 0\&.9\&.10\-49\-gc58c67a" "Tspwm Manual"
2023-06-15 16:00:16 +00:00
. \" -----------------------------------------------------------------
. \" * Define some portability stuff
. \" -----------------------------------------------------------------
. \" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
. \" http://bugs.debian.org/507673
. \" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
. \" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n (.g .ds Aq \(aq
.el .ds Aq '
. \" -----------------------------------------------------------------
. \" * set default formatting
. \" -----------------------------------------------------------------
. \" disable hyphenation
.nh
. \" disable justification (adjust text to left margin only)
.ad l
. \" -----------------------------------------------------------------
. \" * MAIN CONTENT STARTS HERE *
. \" -----------------------------------------------------------------
.SH "NAME"
2023-06-15 16:10:22 +00:00
tspwm \- Binary space partitioning window manager
2023-06-15 16:00:16 +00:00
.SH "SYNOPSIS"
.sp
2023-06-15 16:10:22 +00:00
\fB tspwm\fR [\fB \- h\fR |\fB \- v\fR |\fB \- c\fR \fI CONFIG_PATH\fR ]
2023-06-15 16:00:16 +00:00
.sp
2023-06-15 16:10:22 +00:00
\fB tspc \- \- print\- socket\- path\fR
2023-06-15 16:00:16 +00:00
.sp
2023-06-15 16:10:22 +00:00
\fB tspc\fR \fI DOMAIN\fR [\fI SELECTOR\fR ] \fI COMMANDS\fR
2023-06-15 16:00:16 +00:00
.sp
2023-06-15 16:10:22 +00:00
\fB tspc\fR \fI COMMAND\fR [\fI OPTIONS\fR ] [\fI ARGUMENTS\fR ]
2023-06-15 16:00:16 +00:00
.SH "DESCRIPTION"
.sp
2023-06-15 16:10:22 +00:00
\fB tspwm\fR is a tiling window manager that represents windows as the leaves of a full binary tree\& .
2023-06-15 16:00:16 +00:00
.sp
2023-06-15 16:10:22 +00:00
It is controlled and configured via \fB tspc\fR \& .
.sp
It is a rewrite of github.com/baskerville/bspwm, but in go.
2023-06-15 16:00:16 +00:00
.SH "OPTIONS"
.PP
\fB \- h\fR
.RS 4
Print the synopsis and exit\& .
.RE
.PP
\fB \- v\fR
.RS 4
Print the version and exit\& .
.RE
.PP
\fB \- c\fR \fI CONFIG_PATH\fR
.RS 4
Use the given configuration file\& .
.RE
.PP
\fB \- \- print\- socket\- path\fR
.RS 4
Print the
2023-06-15 16:10:22 +00:00
\fB tspwm\fR
2023-06-15 16:00:16 +00:00
socket path and exit\& .
.RE
.SH "COMMON DEFINITIONS"
.sp
.if n \{ \
.RS 4
. \}
.nf
DIR := north | west | south | east
CYCLE_DIR := next | prev
.fi
.if n \{ \
.RE
. \}
.SH "SELECTORS"
.sp
Selectors are used to select a target node, desktop, or monitor\& . A selector can either describe the target relatively or name it globally\& .
.sp
Selectors consist of an optional reference, a descriptor and any number of non\- conflicting modifiers as follows:
.sp
.if n \{ \
.RS 4
. \}
.nf
[REFERENCE#]DESCRIPTOR(\& .MODIFIER)*
.fi
.if n \{ \
.RE
. \}
.sp
The relative targets are computed in relation to the given reference (the default reference value is \fB focused\fR )\& .
.sp
An exclamation mark can be prepended to any modifier in order to reverse its meaning\& .
.sp
The following characters cannot be used in monitor or desktop names: \fB #\fR , \fB :\fR , \fB \& .\fR \& .
.sp
The special selector \fB %<name>\fR can be used to select a monitor or a desktop with an invalid name\& .
.SS "Node"
.sp
Select a node\& .
.sp
.if n \{ \
.RS 4
. \}
.nf
NODE_SEL := [NODE_SEL#](DIR|CYCLE_DIR|PATH|any|first_ancestor|last|newest|
older|newer|focused|pointed|biggest|smallest|
<node_id>)[\& .[!]focused][\& .[!]active][\& .[!]automatic][\& .[!]local]
[\& .[!]leaf][\& .[!]window][\& .[!]STATE][\& .[!]FLAG][\& .[!]LAYER][\& .[!]SPLIT_TYPE]
[\& .[!]same_class][\& .[!]descendant_of][\& .[!]ancestor_of]
STATE := tiled|pseudo_tiled|floating|fullscreen
FLAG := hidden|sticky|private|locked|marked|urgent
LAYER := below|normal|above
SPLIT_TYPE := horizontal|vertical
PATH := @[DESKTOP_SEL:][[/]JUMP](/JUMP)*
JUMP := first|1|second|2|brother|parent|DIR
.fi
.if n \{ \
.RE
. \}
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Descriptors\fR
.RS 4
.PP
\fI DIR\fR
.RS 4
Selects the window in the given (spacial) direction relative to the reference node\& .
.RE
.PP
\fI CYCLE_DIR\fR
.RS 4
Selects the node in the given (cyclic) direction relative to the reference node within a depth\- first in\- order traversal of the tree\& .
.RE
.PP
\fI PATH\fR
.RS 4
Selects the node at the given path\& .
.RE
.PP
any
.RS 4
Selects the first node that matches the given selectors\& .
.RE
.PP
first_ancestor
.RS 4
Selects the first ancestor of the reference node that matches the given selectors\& .
.RE
.PP
last
.RS 4
Selects the previously focused node relative to the reference node\& .
.RE
.PP
newest
.RS 4
Selects the newest node in the history of the focused node\& .
.RE
.PP
older
.RS 4
Selects the node older than the reference node in the history\& .
.RE
.PP
newer
.RS 4
Selects the node newer than the reference node in the history\& .
.RE
.PP
focused
.RS 4
Selects the currently focused node\& .
.RE
.PP
pointed
.RS 4
Selects the leaf under the pointer\& .
.RE
.PP
biggest
.RS 4
Selects the biggest leaf\& .
.RE
.PP
smallest
.RS 4
Selects the smallest leaf\& .
.RE
.PP
<node_id>
.RS 4
Selects the node with the given ID\& .
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Path Jumps\fR
.RS 4
.sp
The initial node is the focused node (or the root if the path starts with \fI /\fR ) of the reference desktop (or the selected desktop if the path has a \fI DESKTOP_SEL\fR prefix)\& .
.PP
1|first
.RS 4
Jumps to the first child\& .
.RE
.PP
2|second
.RS 4
Jumps to the second child\& .
.RE
.PP
brother
.RS 4
Jumps to the brother node\& .
.RE
.PP
parent
.RS 4
Jumps to the parent node\& .
.RE
.PP
\fI DIR\fR
.RS 4
Jumps to the node holding the edge in the given direction\& .
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Modifiers\fR
.RS 4
.PP
[!]focused
.RS 4
Only consider the focused node\& .
.RE
.PP
[!]active
.RS 4
Only consider nodes that are the focused node of their desktop\& .
.RE
.PP
[!]automatic
.RS 4
Only consider nodes in automatic insertion mode\& . See also
\fB \- \- presel\- dir\fR
under
\fB Node\fR
in the
\fB DOMAINS\fR
section below\& .
.RE
.PP
[!]local
.RS 4
Only consider nodes in the reference desktop\& .
.RE
.PP
[!]leaf
.RS 4
Only consider leaf nodes\& .
.RE
.PP
[!]window
.RS 4
Only consider nodes that hold a window\& .
.RE
.PP
[!](tiled|pseudo_tiled|floating|fullscreen)
.RS 4
Only consider windows in the given state\& .
.RE
.PP
[!]same_class
.RS 4
Only consider windows that have the same class as the reference window\& .
.RE
.PP
[!]descendant_of
.RS 4
Only consider nodes that are descendants of the reference node\& .
.RE
.PP
[!]ancestor_of
.RS 4
Only consider nodes that are ancestors of the reference node\& .
.RE
.PP
[!](hidden|sticky|private|locked|marked|urgent)
.RS 4
Only consider windows that have the given flag set\& .
.RE
.PP
[!](below|normal|above)
.RS 4
Only consider windows in the given layer\& .
.RE
.PP
[!](horizontal|vertical)
.RS 4
Only consider nodes with the given split type\& .
.RE
.RE
.SS "Desktop"
.sp
Select a desktop\& .
.sp
.if n \{ \
.RS 4
. \}
.nf
DESKTOP_SEL := [DESKTOP_SEL#](CYCLE_DIR|any|last|newest|older|newer|
[MONITOR_SEL:](focused|^<n>)|
<desktop_id>|<desktop_name>)[\& .[!]focused][\& .[!]active]
[\& .[!]occupied][\& .[!]urgent][\& .[!]local]
[\& .[!]LAYOUT][\& .[!]user_LAYOUT]
LAYOUT := tiled|monocle
.fi
.if n \{ \
.RE
. \}
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Descriptors\fR
.RS 4
.PP
\fI CYCLE_DIR\fR
.RS 4
Selects the desktop in the given direction relative to the reference desktop\& .
.RE
.PP
any
.RS 4
Selects the first desktop that matches the given selectors\& .
.RE
.PP
last
.RS 4
Selects the previously focused desktop relative to the reference desktop\& .
.RE
.PP
newest
.RS 4
Selects the newest desktop in the history of the focused desktops\& .
.RE
.PP
older
.RS 4
Selects the desktop older than the reference desktop in the history\& .
.RE
.PP
newer
.RS 4
Selects the desktop newer than the reference desktop in the history\& .
.RE
.PP
focused
.RS 4
Selects the currently focused desktop\& .
.RE
.PP
^<n>
.RS 4
Selects the nth desktop\& . If
\fB MONITOR_SEL\fR
is given, selects the nth desktop on the selected monitor\& .
.RE
.PP
<desktop_id>
.RS 4
Selects the desktop with the given ID\& .
.RE
.PP
<desktop_name>
.RS 4
Selects the desktop with the given name\& .
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Modifiers\fR
.RS 4
.PP
[!]focused
.RS 4
Only consider the focused desktop\& .
.RE
.PP
[!]active
.RS 4
Only consider desktops that are the focused desktop of their monitor\& .
.RE
.PP
[!]occupied
.RS 4
Only consider occupied desktops\& .
.RE
.PP
[!]urgent
.RS 4
Only consider urgent desktops\& .
.RE
.PP
[!]local
.RS 4
Only consider desktops inside the reference monitor\& .
.RE
.PP
[!](tiled|monocle)
.RS 4
Only consider desktops with the given layout\& .
.RE
.PP
[!](user_tiled|user_monocle)
.RS 4
Only consider desktops which have the given layout as userLayout\& .
.RE
.RE
.SS "Monitor"
.sp
Select a monitor\& .
.sp
.if n \{ \
.RS 4
. \}
.nf
MONITOR_SEL := [MONITOR_SEL#](DIR|CYCLE_DIR|any|last|newest|older|newer|
focused|pointed|primary|^<n>|
<monitor_id>|<monitor_name>)[\& .[!]focused][\& .[!]occupied]
.fi
.if n \{ \
.RE
. \}
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Descriptors\fR
.RS 4
.PP
\fI DIR\fR
.RS 4
Selects the monitor in the given (spacial) direction relative to the reference monitor\& .
.RE
.PP
\fI CYCLE_DIR\fR
.RS 4
Selects the monitor in the given (cyclic) direction relative to the reference monitor\& .
.RE
.PP
any
.RS 4
Selects the first monitor that matches the given selectors\& .
.RE
.PP
last
.RS 4
Selects the previously focused monitor relative to the reference monitor\& .
.RE
.PP
newest
.RS 4
Selects the newest monitor in the history of the focused monitors\& .
.RE
.PP
older
.RS 4
Selects the monitor older than the reference monitor in the history\& .
.RE
.PP
newer
.RS 4
Selects the monitor newer than the reference monitor in the history\& .
.RE
.PP
focused
.RS 4
Selects the currently focused monitor\& .
.RE
.PP
pointed
.RS 4
Selects the monitor under the pointer\& .
.RE
.PP
primary
.RS 4
Selects the primary monitor\& .
.RE
.PP
^<n>
.RS 4
Selects the nth monitor\& .
.RE
.PP
<monitor_id>
.RS 4
Selects the monitor with the given ID\& .
.RE
.PP
<monitor_name>
.RS 4
Selects the monitor with the given name\& .
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Modifiers\fR
.RS 4
.PP
[!]focused
.RS 4
Only consider the focused monitor\& .
.RE
.PP
[!]occupied
.RS 4
Only consider monitors where the focused desktop is occupied\& .
.RE
.RE
.SH "WINDOW STATES"
.PP
tiled
.RS 4
Its size and position are determined by the window tree\& .
.RE
.PP
pseudo_tiled
.RS 4
A tiled window that automatically shrinks but doesn\(cq t stretch beyond its floating size\& .
.RE
.PP
floating
.RS 4
Can be moved/resized freely\& . Although it doesn\(cq t use any tiling space, it is still part of the window tree\& .
.RE
.PP
fullscreen
.RS 4
Fills its monitor rectangle and has no borders\& .
.RE
.SH "NODE FLAGS"
.PP
hidden
.RS 4
Is hidden and doesn\(cq t occupy any tiling space\& .
.RE
.PP
sticky
.RS 4
Stays in the focused desktop of its monitor\& .
.RE
.PP
private
.RS 4
Tries to keep the same tiling position/size\& .
.RE
.PP
locked
.RS 4
Ignores the
\fB node \- \- close\fR
message\& .
.RE
.PP
marked
.RS 4
Is marked (useful for deferred actions)\& . A marked node becomes unmarked after being sent on a preselected node\& .
.RE
.PP
urgent
.RS 4
Has its urgency hint set\& . This flag is set externally\& .
.RE
.SH "STACKING LAYERS"
.sp
There\(cq s three stacking layers: BELOW, NORMAL and ABOVE\& .
.sp
In each layer, the window are orderered as follow: tiled & pseudo\- tiled < floating < fullscreen\& .
.SH "RECEPTACLES"
.sp
A leaf node that doesn\(cq t hold any window is called a receptacle\& . When a node is inserted on a receptacle in automatic mode, it will replace the receptacle\& . A receptacle can be inserted on a node, preselected and killed\& . Receptacles can therefore be used to build a tree whose leaves are receptacles\& . Using the appropriate rules, one can then send windows on the leaves of this tree\& . This feature is used in \fI examples/receptacles\fR to store and recreate layouts\& .
.SH "DOMAINS"
.SS "Node"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.sp
node [\fI NODE_SEL\fR ] \fI COMMANDS\fR
.sp
If \fI NODE_SEL\fR is omitted, \fB focused\fR is assumed\& .
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Commands\fR
.RS 4
.PP
\fB \- f\fR , \fB \- \- focus\fR [\fI NODE_SEL\fR ]
.RS 4
Focus the selected or given node\& .
.RE
.PP
\fB \- a\fR , \fB \- \- activate\fR [\fI NODE_SEL\fR ]
.RS 4
Activate the selected or given node\& .
.RE
.PP
\fB \- d\fR , \fB \- \- to\- desktop\fR \fI DESKTOP_SEL\fR [\fB \- \- follow\fR ]
.RS 4
Send the selected node to the given desktop\& . If
\fB \- \- follow\fR
is passed, the focused node will stay focused\& .
.RE
.PP
\fB \- m\fR , \fB \- \- to\- monitor\fR \fI MONITOR_SEL\fR [\fB \- \- follow\fR ]
.RS 4
Send the selected node to the given monitor\& . If
\fB \- \- follow\fR
is passed, the focused node will stay focused\& .
.RE
.PP
\fB \- n\fR , \fB \- \- to\- node\fR \fI NODE_SEL\fR [\fB \- \- follow\fR ]
.RS 4
Send the selected node on the given node\& . If
\fB \- \- follow\fR
is passed, the focused node will stay focused\& .
.RE
.PP
\fB \- s\fR , \fB \- \- swap\fR \fI NODE_SEL\fR [\fB \- \- follow\fR ]
.RS 4
Swap the selected node with the given node\& . If
\fB \- \- follow\fR
is passed, the focused node will stay focused\& .
.RE
.PP
\fB \- p\fR , \fB \- \- presel\- dir\fR [~]\fI DIR\fR |cancel
.RS 4
Preselect the splitting area of the selected node (or cancel the preselection)\& . If
\fB ~\fR
is prepended to
\fI DIR\fR
and the current preselection direction matches
\fI DIR\fR , then the argument is interpreted as
\fB cancel\fR \& . A node with a preselected area is said to be in "manual insertion mode"\& .
.RE
.PP
\fB \- o\fR , \fB \- \- presel\- ratio\fR \fI RATIO\fR
.RS 4
Set the splitting ratio of the preselection area\& .
.RE
.PP
\fB \- v\fR , \fB \- \- move\fR \fI dx\fR \fI dy\fR
.RS 4
Move the selected window by
\fI dx\fR
pixels horizontally and
\fI dy\fR
pixels vertically\& .
.RE
.PP
\fB \- z\fR , \fB \- \- resize\fR top|left|bottom|right|top_left|top_right|bottom_right|bottom_left \fI dx\fR \fI dy\fR
.RS 4
Resize the selected window by moving the given handle by
\fI dx\fR
pixels horizontally and
\fI dy\fR
pixels vertically\& .
.RE
.PP
\fB \- y\fR , \fB \- \- type\fR \fI CYCLE_DIR\fR |horizontal|vertical
.RS 4
Set or cycle the splitting type of the selected node\& .
.RE
.PP
\fB \- r\fR , \fB \- \- ratio\fR \fI RATIO\fR |(+|\- )(\fI PIXELS\fR |\fI FRACTION\fR )
.RS 4
Set the splitting ratio of the selected node (0 <
\fI RATIO\fR
< 1)\& .
.RE
.PP
\fB \- R\fR , \fB \- \- rotate\fR \fI 90|270|180\fR
.RS 4
Rotate the tree rooted at the selected node\& .
.RE
.PP
\fB \- F\fR , \fB \- \- flip\fR \fI horizontal|vertical\fR
.RS 4
Flip the tree rooted at selected node\& .
.RE
.PP
\fB \- E\fR , \fB \- \- equalize\fR
.RS 4
Reset the split ratios of the tree rooted at the selected node to their default value\& .
.RE
.PP
\fB \- B\fR , \fB \- \- balance\fR
.RS 4
Adjust the split ratios of the tree rooted at the selected node so that all windows occupy the same area\& .
.RE
.PP
\fB \- C\fR , \fB \- \- circulate\fR forward|backward
.RS 4
Circulate the windows of the tree rooted at the selected node\& .
.RE
.PP
\fB \- t\fR , \fB \- \- state\fR ~|[~]\fI STATE\fR
.RS 4
Set the state of the selected window\& . If
\fB ~\fR
is present and the current state matches
\fI STATE\fR , then the argument is interpreted as its last state\& . If the argument is just
\fB ~\fR
with
\fI STATE\fR
omitted, then the state of the selected window is set to its last state\& .
.RE
.PP
\fB \- g\fR , \fB \- \- flag\fR hidden|sticky|private|locked|marked[=on|off]
.RS 4
Set or toggle the given flag for the selected node\& .
.RE
.PP
\fB \- l\fR , \fB \- \- layer\fR below|normal|above
.RS 4
Set the stacking layer of the selected window\& .
.RE
.PP
\fB \- i\fR , \fB \- \- insert\- receptacle\fR
.RS 4
Insert a receptacle node at the selected node\& .
.RE
.PP
\fB \- c\fR , \fB \- \- close\fR
.RS 4
Close the windows rooted at the selected node\& .
.RE
.PP
\fB \- k\fR , \fB \- \- kill\fR
.RS 4
Kill the windows rooted at the selected node\& .
.RE
.RE
.SS "Desktop"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.sp
desktop [\fI DESKTOP_SEL\fR ] \fI COMMANDS\fR
.sp
If \fI DESKTOP_SEL\fR is omitted, \fB focused\fR is assumed\& .
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB COMMANDS\fR
.RS 4
.PP
\fB \- f\fR , \fB \- \- focus\fR [\fI DESKTOP_SEL\fR ]
.RS 4
Focus the selected or given desktop\& .
.RE
.PP
\fB \- a\fR , \fB \- \- activate\fR [\fI DESKTOP_SEL\fR ]
.RS 4
Activate the selected or given desktop\& .
.RE
.PP
\fB \- m\fR , \fB \- \- to\- monitor\fR \fI MONITOR_SEL\fR [\fB \- \- follow\fR ]
.RS 4
Send the selected desktop to the given monitor\& . If
\fB \- \- follow\fR
is passed, the focused desktop will stay focused\& .
.RE
.PP
\fB \- s\fR , \fB \- \- swap\fR \fI DESKTOP_SEL\fR [\fB \- \- follow\fR ]
.RS 4
Swap the selected desktop with the given desktop\& . If
\fB \- \- follow\fR
is passed, the focused desktop will stay focused\& .
.RE
.PP
\fB \- l\fR , \fB \- \- layout\fR \fI CYCLE_DIR\fR |monocle|tiled
.RS 4
Set or cycle the layout of the selected desktop\& .
.RE
.PP
\fB \- n\fR , \fB \- \- rename\fR <new_name>
.RS 4
Rename the selected desktop\& .
.RE
.PP
\fB \- b\fR , \fB \- \- bubble\fR \fI CYCLE_DIR\fR
.RS 4
Bubble the selected desktop in the given direction\& .
.RE
.PP
\fB \- r\fR , \fB \- \- remove\fR
.RS 4
Remove the selected desktop\& .
.RE
.RE
.SS "Monitor"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.sp
monitor [\fI MONITOR_SEL\fR ] \fI COMMANDS\fR
.sp
If \fI MONITOR_SEL\fR is omitted, \fB focused\fR is assumed\& .
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Commands\fR
.RS 4
.PP
\fB \- f\fR , \fB \- \- focus\fR [\fI MONITOR_SEL\fR ]
.RS 4
Focus the selected or given monitor\& .
.RE
.PP
\fB \- s\fR , \fB \- \- swap\fR \fI MONITOR_SEL\fR
.RS 4
Swap the selected monitor with the given monitor\& .
.RE
.PP
\fB \- a\fR , \fB \- \- add\- desktops\fR <name>\& ...
.RS 4
Create desktops with the given names in the selected monitor\& .
.RE
.PP
\fB \- o\fR , \fB \- \- reorder\- desktops\fR <name>\& ...
.RS 4
Reorder the desktops of the selected monitor to match the given order\& .
.RE
.PP
\fB \- d\fR , \fB \- \- reset\- desktops\fR <name>\& ...
.RS 4
Rename, add or remove desktops depending on whether the number of given names is equal, superior or inferior to the number of existing desktops\& .
.RE
.PP
\fB \- g\fR , \fB \- \- rectangle\fR WxH+X+Y
.RS 4
Set the rectangle of the selected monitor\& .
.RE
.PP
\fB \- n\fR , \fB \- \- rename\fR <new_name>
.RS 4
Rename the selected monitor\& .
.RE
.PP
\fB \- r\fR , \fB \- \- remove\fR
.RS 4
Remove the selected monitor\& .
.RE
.RE
.SS "Query"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.sp
query \fI COMMANDS\fR [\fI OPTIONS\fR ]
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Commands\fR
.RS 4
.sp
The optional selectors are references\& .
.PP
\fB \- N\fR , \fB \- \- nodes\fR [\fI NODE_SEL\fR ]
.RS 4
List the IDs of the matching nodes\& .
.RE
.PP
\fB \- D\fR , \fB \- \- desktops\fR [\fI DESKTOP_SEL\fR ]
.RS 4
List the IDs (or names) of the matching desktops\& .
.RE
.PP
\fB \- M\fR , \fB \- \- monitors\fR [\fI MONITOR_SEL\fR ]
.RS 4
List the IDs (or names) of the matching monitors\& .
.RE
.PP
\fB \- T\fR , \fB \- \- tree\fR
.RS 4
Print a JSON representation of the matching item\& .
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Options\fR
.RS 4
.PP
\fB \- m\fR ,\fB \- \- monitor\fR [\fI MONITOR_SEL\fR |\fI MONITOR_MODIFIERS\fR ], \fB \- d\fR ,\fB \- \- desktop\fR [\fI DESKTOP_SEL\fR |\fI DESKTOP_MODIFIERS\fR ], \fB \- n\fR ,\fB \- \- node\fR [\fI NODE_SEL\fR |\fI NODE_MODIFIERS\fR ]
.RS 4
Constrain matches to the selected monitors, desktops or nodes\& .
.RE
.PP
\fB \- \- names\fR
.RS 4
Print names instead of IDs\& . Can only be used with
\fI \- M\fR
and
\fI \- D\fR \& .
.RE
.RE
.SS "Wm"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.sp
wm \fI COMMANDS\fR
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Commands\fR
.RS 4
.PP
\fB \- d\fR , \fB \- \- dump\- state\fR
.RS 4
Dump the current world state on standard output\& .
.RE
.PP
\fB \- l\fR , \fB \- \- load\- state\fR <file_path>
.RS 4
Load a world state from the given file\& . The path must be absolute\& .
.RE
.PP
\fB \- a\fR , \fB \- \- add\- monitor\fR <name> WxH+X+Y
.RS 4
Add a monitor for the given name and rectangle\& .
.RE
.PP
\fB \- O\fR , \fB \- \- reorder\- monitors\fR <name>\& ...
.RS 4
Reorder the list of monitors to match the given order\& .
.RE
.PP
\fB \- o\fR , \fB \- \- adopt\- orphans\fR
.RS 4
Manage all the unmanaged windows remaining from a previous session\& .
.RE
.PP
\fB \- h\fR , \fB \- \- record\- history\fR on|off
.RS 4
Enable or disable the recording of node focus history\& .
.RE
.PP
\fB \- g\fR , \fB \- \- get\- status\fR
.RS 4
Print the current status information\& .
.RE
.PP
\fB \- r\fR , \fB \- \- restart\fR
.RS 4
Restart the window manager
.RE
.RE
.SS "Rule"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.sp
rule \fI COMMANDS\fR
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Commands\fR
.RS 4
.PP
\fB \- a\fR , \fB \- \- add\fR (<class_name>|*)[:(<instance_name>|*)[:(<name>|*)]] [\fB \- o\fR |\fB \- \- one\- shot\fR ] [monitor=MONITOR_SEL|desktop=DESKTOP_SEL|node=NODE_SEL] [state=STATE] [layer=LAYER] [honor_size_hints=(true|false|tiled|floating)] [split_dir=DIR] [split_ratio=RATIO] [(hidden|sticky|private|locked|marked|center|follow|manage|focus|border)=(on|off)] [rectangle=WxH+X+Y]
.RS 4
Create a new rule\& . Colons in the
\fI instance_name\fR ,
\fI class_name\fR , or
\fI name\fR
fields can be escaped with a backslash\& .
.RE
.PP
\fB \- r\fR , \fB \- \- remove\fR ^<n>|head|tail|(<class_name>|*)[:(<instance_name>|*)[:(<name>|*)]]\& ...
.RS 4
Remove the given rules\& .
.RE
.PP
\fB \- l\fR , \fB \- \- list\fR
.RS 4
List the rules\& .
.RE
.RE
.SS "Config"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.PP
config [\- m \fI MONITOR_SEL\fR |\- d \fI DESKTOP_SEL\fR |\- n \fI NODE_SEL\fR ] <setting> [<value>]
.RS 4
Get or set the value of <setting>\& .
.RE
.RE
.SS "Subscribe"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.PP
subscribe [\fI OPTIONS\fR ] (all|report|monitor|desktop|node|\& ...)*
.RS 4
Continuously print events\& . See the
\fB EVENTS\fR
section for the description of each event\& .
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB Options\fR
.RS 4
.PP
\fB \- f\fR , \fB \- \- fifo\fR
.RS 4
Print a path to a FIFO from which events can be read and return\& .
.RE
.PP
\fB \- c\fR , \fB \- \- count\fR \fI COUNT\fR
.RS 4
Stop the corresponding
2023-06-15 16:10:22 +00:00
\fB tspc\fR
2023-06-15 16:00:16 +00:00
process after having received
\fI COUNT\fR
events\& .
.RE
.RE
.SS "Quit"
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fB General Syntax\fR
.RS 4
.PP
quit [<status>]
.RS 4
Quit with an optional exit status\& .
.RE
.RE
.SH "EXIT CODES"
.sp
2023-06-15 16:10:22 +00:00
If the server can\(cq t handle a message, \fB tspc\fR will return with a non\- zero exit code\& .
2023-06-15 16:00:16 +00:00
.SH "SETTINGS"
.sp
Colors are in the form \fI #RRGGBB\fR , booleans are \fI true\fR , \fI on\fR , \fI false\fR or \fI off\fR \& .
.sp
All the boolean settings are \fI false\fR by default unless stated otherwise\& .
.SS "Global Settings"
.PP
\fI normal_border_color\fR
.RS 4
Color of the border of an unfocused window\& .
.RE
.PP
\fI active_border_color\fR
.RS 4
Color of the border of a focused window of an unfocused monitor\& .
.RE
.PP
\fI focused_border_color\fR
.RS 4
Color of the border of a focused window of a focused monitor\& .
.RE
.PP
\fI presel_feedback_color\fR
.RS 4
Color of the
\fB node \- \- presel\- {dir,ratio}\fR
message feedback area\& .
.RE
.PP
\fI split_ratio\fR
.RS 4
Default split ratio\& .
.RE
.PP
\fI status_prefix\fR
.RS 4
Prefix prepended to each of the status lines\& .
.RE
.PP
\fI external_rules_command\fR
.RS 4
Absolute path to the command used to retrieve rule consequences\& . The command will receive the following arguments: window ID, class name, instance name, and intermediate consequences\& . The output of that command must have the following format:
\fB key1=value1 key2=value2 \& ...\fR
(the valid key/value pairs are given in the description of the
\fI rule\fR
command)\& .
.RE
.PP
\fI automatic_scheme\fR
.RS 4
The insertion scheme used when the insertion point is in automatic mode\& . Accept the following values:
\fB longest_side\fR ,
\fB alternate\fR ,
\fB spiral\fR \& .
.RE
.PP
\fI initial_polarity\fR
.RS 4
On which child should a new window be attached when adding a window on a single window tree in automatic mode\& . Accept the following values:
\fB first_child\fR ,
\fB second_child\fR \& .
.RE
.PP
\fI directional_focus_tightness\fR
.RS 4
The tightness of the algorithm used to decide whether a window is on the
\fI DIR\fR
side of another window\& . Accept the following values:
\fB high\fR ,
\fB low\fR \& .
.RE
.PP
\fI removal_adjustment\fR
.RS 4
Adjust the brother when unlinking a node from the tree in accordance with the automatic insertion scheme\& .
.RE
.PP
\fI presel_feedback\fR
.RS 4
Draw the preselection feedback area\& . Defaults to
\fI true\fR \& .
.RE
.PP
\fI borderless_monocle\fR
.RS 4
Remove borders of tiled windows for the
\fB monocle\fR
desktop layout\& .
.RE
.PP
\fI gapless_monocle\fR
.RS 4
Remove gaps of tiled windows for the
\fB monocle\fR
desktop layout\& .
.RE
.PP
\fI top_monocle_padding\fR , \fI right_monocle_padding\fR , \fI bottom_monocle_padding\fR , \fI left_monocle_padding\fR
.RS 4
Padding space added at the sides of the screen for the
\fB monocle\fR
desktop layout\& .
.RE
.PP
\fI single_monocle\fR
.RS 4
Set the desktop layout to
\fB monocle\fR
if there\(cq s only one tiled window in the tree\& .
.RE
.PP
\fI borderless_singleton\fR
.RS 4
Remove borders of the only window on the only monitor regardless its layout\& .
.RE
.PP
\fI pointer_motion_interval\fR
.RS 4
The minimum interval, in milliseconds, between two motion notify events\& .
.RE
.PP
\fI pointer_modifier\fR
.RS 4
Keyboard modifier used for moving or resizing windows\& . Accept the following values:
\fB shift\fR ,
\fB control\fR ,
\fB lock\fR ,
\fB mod1\fR ,
\fB mod2\fR ,
\fB mod3\fR ,
\fB mod4\fR ,
\fB mod5\fR \& .
.RE
.PP
\fI pointer_action1\fR , \fI pointer_action2\fR , \fI pointer_action3\fR
.RS 4
Action performed when pressing
\fI pointer_modifier\fR
+
\fI button<n>\fR \& . Accept the following values:
\fB move\fR ,
\fB resize_side\fR ,
\fB resize_corner\fR ,
\fB focus\fR ,
\fB none\fR \& .
.RE
.PP
\fI click_to_focus\fR
.RS 4
Button used for focusing a window (or a monitor)\& . The possible values are:
\fB button1\fR ,
\fB button2\fR ,
\fB button3\fR ,
\fB any\fR ,
\fB none\fR \& . Defaults to
\fB button1\fR \& .
.RE
.PP
\fI swallow_first_click\fR
.RS 4
Don\(cq t replay the click that makes a window focused if
\fI click_to_focus\fR
isn\(cq t
\fB none\fR \& .
.RE
.PP
\fI focus_follows_pointer\fR
.RS 4
Focus the window under the pointer\& .
.RE
.PP
\fI pointer_follows_focus\fR
.RS 4
When focusing a window, put the pointer at its center\& .
.RE
.PP
\fI pointer_follows_monitor\fR
.RS 4
When focusing a monitor, put the pointer at its center\& .
.RE
.PP
\fI mapping_events_count\fR
.RS 4
Handle the next
\fB mapping_events_count\fR
mapping notify events\& . A negative value implies that every event needs to be handled\& .
.RE
.PP
\fI ignore_ewmh_focus\fR
.RS 4
Ignore EWMH focus requests coming from applications\& .
.RE
.PP
\fI ignore_ewmh_fullscreen\fR
.RS 4
Block the fullscreen state transitions that originate from an EWMH request\& . The possible values are:
\fB none\fR ,
\fB all\fR , or a comma separated list of the following values:
\fB enter\fR ,
\fB exit\fR \& .
.RE
.PP
\fI ignore_ewmh_struts\fR
.RS 4
Ignore strut hinting from clients requesting to reserve space (i\& .e\& . task bars)\& .
.RE
.PP
\fI center_pseudo_tiled\fR
.RS 4
Center pseudo tiled windows into their tiling rectangles\& . Defaults to
\fI true\fR \& .
.RE
.PP
\fI remove_disabled_monitors\fR
.RS 4
Consider disabled monitors as disconnected\& .
.RE
.PP
\fI remove_unplugged_monitors\fR
.RS 4
Remove unplugged monitors\& .
.RE
.PP
\fI merge_overlapping_monitors\fR
.RS 4
Merge overlapping monitors (the bigger remains)\& .
.RE
.SS "Monitor and Desktop Settings"
.PP
\fI top_padding\fR , \fI right_padding\fR , \fI bottom_padding\fR , \fI left_padding\fR
.RS 4
Padding space added at the sides of the monitor or desktop\& .
.RE
.SS "Desktop Settings"
.PP
\fI window_gap\fR
.RS 4
Size of the gap that separates windows\& .
.RE
.SS "Node Settings"
.PP
\fI border_width\fR
.RS 4
Window border width\& .
.RE
.PP
\fI honor_size_hints\fR
.RS 4
If
\fI true\fR , apply ICCCM window size hints to all windows\& . If
\fI floating\fR , only apply them to floating and pseudo tiled windows\& . If
\fI tiled\fR , only apply them to tiled windows\& . If
\fI false\fR , don\(cq t apply them\& . Defaults to
\fI false\fR \& .
.RE
.SH "POINTER BINDINGS"
.PP
\fI click_to_focus\fR
.RS 4
Focus the window (or the monitor) under the pointer if the value isn\(cq t
\fB none\fR \& .
.RE
.PP
\fI pointer_modifier\fR + \fI button1\fR
.RS 4
Move the window under the pointer\& .
.RE
.PP
\fI pointer_modifier\fR + \fI button2\fR
.RS 4
Resize the window under the pointer by dragging the nearest side\& .
.RE
.PP
\fI pointer_modifier\fR + \fI button3\fR
.RS 4
Resize the window under the pointer by dragging the nearest corner\& .
.RE
.sp
The behavior of \fI pointer_modifier\fR + \fI button<n>\fR can be modified through the \fI pointer_action<n>\fR setting\& .
.SH "EVENTS"
.PP
\fI report\fR
.RS 4
See the next section for the description of the format\& .
.RE
.PP
\fI monitor_add <monitor_id> <monitor_name> <monitor_geometry>\fR
.RS 4
A monitor is added\& .
.RE
.PP
\fI monitor_rename <monitor_id> <old_name> <new_name>\fR
.RS 4
A monitor is renamed\& .
.RE
.PP
\fI monitor_remove <monitor_id>\fR
.RS 4
A monitor is removed\& .
.RE
.PP
\fI monitor_swap <src_monitor_id> <dst_monitor_id>\fR
.RS 4
A monitor is swapped\& .
.RE
.PP
\fI monitor_focus <monitor_id>\fR
.RS 4
A monitor is focused\& .
.RE
.PP
\fI monitor_geometry <monitor_id> <monitor_geometry>\fR
.RS 4
The geometry of a monitor changed\& .
.RE
.PP
\fI desktop_add <monitor_id> <desktop_id> <desktop_name>\fR
.RS 4
A desktop is added\& .
.RE
.PP
\fI desktop_rename <monitor_id> <desktop_id> <old_name> <new_name>\fR
.RS 4
A desktop is renamed\& .
.RE
.PP
\fI desktop_remove <monitor_id> <desktop_id>\fR
.RS 4
A desktop is removed\& .
.RE
.PP
\fI desktop_swap <src_monitor_id> <src_desktop_id> <dst_monitor_id> <dst_desktop_id>\fR
.RS 4
A desktop is swapped\& .
.RE
.PP
\fI desktop_transfer <src_monitor_id> <src_desktop_id> <dst_monitor_id>\fR
.RS 4
A desktop is transferred\& .
.RE
.PP
\fI desktop_focus <monitor_id> <desktop_id>\fR
.RS 4
A desktop is focused\& .
.RE
.PP
\fI desktop_activate <monitor_id> <desktop_id>\fR
.RS 4
A desktop is activated\& .
.RE
.PP
\fI desktop_layout <monitor_id> <desktop_id> tiled|monocle\fR
.RS 4
The layout of a desktop changed\& .
.RE
.PP
\fI node_add <monitor_id> <desktop_id> <ip_id> <node_id>\fR
.RS 4
A node is added\& .
.RE
.PP
\fI node_remove <monitor_id> <desktop_id> <node_id>\fR
.RS 4
A node is removed\& .
.RE
.PP
\fI node_swap <src_monitor_id> <src_desktop_id> <src_node_id> <dst_monitor_id> <dst_desktop_id> <dst_node_id>\fR
.RS 4
A node is swapped\& .
.RE
.PP
\fI node_transfer <src_monitor_id> <src_desktop_id> <src_node_id> <dst_monitor_id> <dst_desktop_id> <dst_node_id>\fR
.RS 4
A node is transferred\& .
.RE
.PP
\fI node_focus <monitor_id> <desktop_id> <node_id>\fR
.RS 4
A node is focused\& .
.RE
.PP
\fI node_activate <monitor_id> <desktop_id> <node_id>\fR
.RS 4
A node is activated\& .
.RE
.PP
\fI node_presel <monitor_id> <desktop_id> <node_id> (dir DIR|ratio RATIO|cancel)\fR
.RS 4
A node is preselected\& .
.RE
.PP
\fI node_stack <node_id_1> below|above <node_id_2>\fR
.RS 4
A node is stacked below or above another node\& .
.RE
.PP
\fI node_geometry <monitor_id> <desktop_id> <node_id> <node_geometry>\fR
.RS 4
The geometry of a window changed\& .
.RE
.PP
\fI node_state <monitor_id> <desktop_id> <node_id> tiled|pseudo_tiled|floating|fullscreen on|off\fR
.RS 4
The state of a window changed\& .
.RE
.PP
\fI node_flag <monitor_id> <desktop_id> <node_id> hidden|sticky|private|locked|marked|urgent on|off\fR
.RS 4
One of the flags of a node changed\& .
.RE
.PP
\fI node_layer <monitor_id> <desktop_id> <node_id> below|normal|above\fR
.RS 4
The layer of a window changed\& .
.RE
.PP
\fI pointer_action <monitor_id> <desktop_id> <node_id> move|resize_corner|resize_side begin|end\fR
.RS 4
A pointer action occurred\& .
.RE
.sp
2023-06-15 16:10:22 +00:00
Please note that \fB tspwm\fR initializes monitors before it reads messages on its socket, therefore the initial monitor events can\(cq t be received\& .
2023-06-15 16:00:16 +00:00
.SH "REPORT FORMAT"
.sp
Each report event message is composed of items separated by colons\& .
.sp
Each item has the form \fI <type><value>\fR where \fI <type>\fR is the first character of the item\& .
.PP
\fI M<monitor_name>\fR
.RS 4
Focused monitor\& .
.RE
.PP
\fI m<monitor_name>\fR
.RS 4
Unfocused monitor\& .
.RE
.PP
\fI O<desktop_name>\fR
.RS 4
Occupied focused desktop\& .
.RE
.PP
\fI o<desktop_name>\fR
.RS 4
Occupied unfocused desktop\& .
.RE
.PP
\fI F<desktop_name>\fR
.RS 4
Free focused desktop\& .
.RE
.PP
\fI f<desktop_name>\fR
.RS 4
Free unfocused desktop\& .
.RE
.PP
\fI U<desktop_name>\fR
.RS 4
Urgent focused desktop\& .
.RE
.PP
\fI u<desktop_name>\fR
.RS 4
Urgent unfocused desktop\& .
.RE
.PP
\fI L(T|M)\fR
.RS 4
Layout of the focused desktop of a monitor\& .
.RE
.PP
\fI T(T|P|F|=|@)\fR
.RS 4
State of the focused node of a focused desktop\& .
.RE
.PP
\fI G(S?P?L?M?)\fR
.RS 4
Active flags of the focused node of a focused desktop\& .
.RE
.SH "ENVIRONMENT VARIABLES"
.PP
2023-06-15 16:10:22 +00:00
\fI tspwm_SOCKET\fR
2023-06-15 16:00:16 +00:00
.RS 4
The path of the socket used for the communication between
2023-06-15 16:10:22 +00:00
\fB tspc\fR
2023-06-15 16:00:16 +00:00
and
2023-06-15 16:10:22 +00:00
\fB tspwm\fR \& . If it isn\(cq t defined, then the following path is used:
\fI /tmp/tspwm<host_name>_<display_number>_<screen_number>\- socket\fR \& .
2023-06-15 16:00:16 +00:00
.RE
.SH "CONTRIBUTORS"
.sp
.RS 4
.ie n \{ \
\h '-04'\(bu \h '+03'\c
. \}
.el \{ \
.sp -1
.IP \(bu 2 .3
. \}
Steven Allen <steven at stebalien\& .com>
.RE
.sp
.RS 4
.ie n \{ \
\h '-04'\(bu \h '+03'\c
. \}
.el \{ \
.sp -1
.IP \(bu 2 .3
. \}
Thomas Adam <thomas at xteddy\& .org>
.RE
.sp
.RS 4
.ie n \{ \
\h '-04'\(bu \h '+03'\c
. \}
.el \{ \
.sp -1
.IP \(bu 2 .3
. \}
Ivan Kanakarakis <ivan\& .kanak at gmail\& .com>
.RE
.SH "AUTHOR"
.sp
Bastien Dejean <nihilhill at gmail\& .com>