]> git.lizzy.rs Git - bspwm.git/blob - doc/bspwm.1.asciidoc
d0163e19fa8d83cbf371517c677746f4b69393e6
[bspwm.git] / doc / bspwm.1.asciidoc
1 :man source:   Bspwm
2 :man version:  {revnumber}
3 :man manual:   Bspwm Manual
4
5 bspwm(1)
6 ========
7
8 Name
9 ----
10
11 bspwm - Binary space partitioning window manager
12
13 Synopsis
14 --------
15
16 *bspwm* [*-h*|*-v*|*-c* 'CONFIG_PATH']
17
18 *bspc* 'COMMAND' ['ARGUMENTS']
19
20 Description
21 -----------
22
23 *bspwm* is a tiling window manager that represents windows as the leaves of a full binary tree.
24
25 It is controlled and configured via *bspc*.
26
27
28 Options
29 -------
30
31 *-h*::
32         Print the synopsis and exit.
33
34 *-v*::
35         Print the version and exit.
36
37 *-c* 'CONFIG_PATH'::
38         Use the given configuration file.
39
40 Common Definitions
41 ------------------
42
43 ----
44 DIR         := left | right | up | down
45 CYCLE_DIR   := next | prev
46 ----
47
48 Selectors
49 ---------
50
51 Selectors are used to select a target window, desktop, or monitor. A selector
52 can either describe the target relatively or name it globally.
53
54 Descriptive (relative) selectors consist of a primary selector and any number
55 of non-conflicting modifiers as follows:
56
57         PRIMARY_SELECTOR[.MODIFIER]*
58
59 For obvious reasons, neither desktop nor monitor names may be valid descriptive
60 selectors.
61
62 Window
63 ~~~~~~
64
65 Select a window.
66
67 ----
68 WINDOW_SEL := <window_id> 
69             | (DIR|CYCLE_DIR|biggest|last|focused|older|newer)[.manual|.automatic][.tiled|nontiled][.pseudotiled|.nonpseudotiled][.floating|.nonfloating][.fullscreen|.nonfullscreen][.below|.normal|.above][.local|.foreign][.like|.unlike][.focused|.unfocused][.urgent|.nonurgent][.sticky|.nonsticky][.public|.private][.locked|.unlocked]
70 ----
71
72 Primary Selectors
73 ^^^^^^^^^^^^^^^^^
74
75 'DIR'::
76         Selects the window in the given (spacial) direction relative to the active window.
77
78 'CYCLE_DIR'::
79         Selects the window in the given (cyclic) direction.
80
81 biggest::
82         Selects the biggest window on the current desktop.
83
84 last::
85         Selects the previously focused window.
86
87 focused::
88         Selects the currently focused window.
89
90 older::
91         Selects the window older than the focused window in the history.
92
93 newer::
94         Selects the window newer than the focused window in the history.
95
96 Modifiers
97 ^^^^^^^^^
98
99 tiled::
100         Only consider tiled windows.
101
102 nontiled::
103         Only consider non tiled windows.
104
105 pseudotiled::
106         Only consider pseudo-tiled windows.
107
108 nonpseudotiled::
109         Only consider non pseudo-tiled windows.
110
111 floating::
112         Only consider floating windows.
113
114 nonfloating::
115         Only consider non floating windows.
116
117 fullscreen::
118         Only consider fullscreen windows.
119
120 nonfullscreen::
121         Only consider non fullscreen windows.
122
123 manual::
124         Only consider windows in manual splitting mode.
125
126 automatic::
127         Only consider windows in automatic splitting mode.
128
129 focused::
130         Only consider focused windows.
131
132 unfocused::
133         Only consider unfocused windows.
134
135 below::
136         Only consider windows of the BELOW layer.
137
138 normal::
139         Only consider windows of the NORMAL layer.
140
141 above::
142         Only consider windows of the ABOVE layer.
143
144 like::
145         Only consider windows that have the same class as the current window.
146
147 unlike::
148         Only consider windows that have a different class than the current window.
149
150 local::
151         Only consider windows of the current desktop.
152
153 foreign::
154         Only consider windows outside of the current desktop.
155
156 private::
157         Only consider private windows.
158
159 public::
160         Only consider non private windows.
161
162 urgent::
163         Only consider urgent windows.
164
165 nonurgent::
166         Only consider non urgent windows.
167
168 sticky::
169         Only consider sticky windows.
170
171 nonsticky::
172         Only consider non sticky windows.
173
174 locked::
175         Only consider locked windows.
176
177 unlocked::
178         Only consider non locked windows.
179
180 Desktop
181 ~~~~~~~
182
183 Select a desktop.
184
185 ----
186 DESKTOP_SEL := <desktop_name>
187              | [MONITOR_SEL:]^<n>
188              | (CYCLE_DIR|last|[MONITOR_SEL:]focused|older|newer)[.occupied|.free][.urgent|.nonurgent][.local|.foreign]
189 ----
190
191 Primary Selectors
192 ^^^^^^^^^^^^^^^^^
193
194 <desktop_name>::
195         Selects the desktop with the given name.
196
197 ^<n>::
198         Selects the nth desktop.
199
200 'CYCLE_DIR'::
201         Selects the desktop in the given direction relative to the active desktop.
202
203 last::
204         Selects the previously focused desktop.
205
206 focused::
207         Selects the currently focused desktop.
208
209 older::
210         Selects the desktop older than the focused desktop in the history.
211
212 newer::
213         Selects the desktop newer than the focused desktop in the history.
214
215 Modifiers
216 ^^^^^^^^^
217
218 occupied::
219         Only consider occupied desktops.
220
221 free::
222         Only consider free desktops.
223
224 urgent::
225         Only consider urgent desktops.
226
227 nonurgent::
228         Only consider non urgent desktops.
229
230 local::
231         Only consider desktops of the current monitor.
232
233 foreign::
234         Only consider desktops outside of the current monitor.
235
236 Monitor
237 ~~~~~~~
238
239 Select a monitor.
240
241 ----
242 MONITOR_SEL := <monitor_name>
243              | ^<n>
244              | (DIR|CYCLE_DIR|last|primary|focused|older|newer)[.occupied|.free]
245 ----
246
247 Primary Selectors
248 ^^^^^^^^^^^^^^^^^
249
250 <monitor_name>::
251         Selects the monitor with the given name.
252
253 ^<n>::
254         Selects the nth monitor.
255
256 'DIR'::
257         Selects the monitor in the given (spacial) direction relative to the active monitor.
258
259 'CYCLE_DIR'::
260         Selects the monitor in the given (cyclic) direction relative to the active monitor.
261
262 primary::
263         Selects the primary monitor.
264
265 last::
266         Selects the previously focused monitor.
267
268 focused::
269         Selects the currently focused monitor.
270
271 older::
272         Selects the monitor older than the focused monitor in the history.
273
274 newer::
275         Selects the monitor newer than the focused monitor in the history.
276
277 Modifiers
278 ^^^^^^^^^
279
280 occupied::
281         Only consider monitors where the focused desktop is occupied.
282
283 free::
284         Only consider monitors where the focused desktop is free.
285
286
287 Window States
288 -------------
289
290 tiled::
291         Its size and position are determined by the splitting type and ratio of each node of its path in the window tree.
292
293 pseudo_tiled::
294         Has an unrestricted size while being centered in its tiling space.
295
296 floating::
297         Can be moved/resized freely. Although it doesn't occupy any tiling space, it is still part of the window tree.
298
299 fullscreen::
300         Fills its monitor rectangle and has no borders. It is send in the ABOVE layer by default.
301
302
303 Window Flags
304 -------------
305
306 locked::
307         Ignores the *window --close* message.
308
309 sticky::
310         Stays in the focused desktop of its monitor.
311
312 private::
313         Tries to keep the same tiling position/size.
314
315 urgent::
316         Has its urgency hint set. This flag is set externally.
317
318
319 Stacking Layers
320 --------------
321
322 There's three stacking layers: BELOW, NORMAL and ABOVE.
323
324 In each layer, the window are orderered as follow: tiled & pseudo-tiled < fullscreen < floating.
325
326
327 Commands
328 --------
329
330 Window
331 ~~~~~~
332
333 General Syntax
334 ^^^^^^^^^^^^^^
335
336 window ['WINDOW_SEL'] 'OPTIONS'
337
338 Options
339 ^^^^^^^
340 *-f*, *--focus* ['WINDOW_SEL']::
341         Focus the selected or given window.
342
343 *-a*, *--activate* ['WINDOW_SEL']::
344         Activate the selected or given window.
345
346 *-d*, *--to-desktop* 'DESKTOP_SEL'::
347         Send the selected window to the given desktop.
348
349 *-m*, *--to-monitor* 'MONITOR_SEL'::
350         Send the selected window to the given monitor.
351
352 *-w*, *--to-window* 'WINDOW_SEL'::
353         Transplant the selected window to the given window.
354
355 *-s*, *--swap* 'WINDOW_SEL'::
356         Swap the selected window with the given window.
357
358 *-p*, *--presel* 'DIR'|cancel::
359         Preselect the splitting area of the selected window (or cancel the preselection).
360
361 *-r*, *--ratio* 'RATIO'::
362         Set the splitting ratio of the selected window (0 < 'RATIO' < 1).
363
364 *-e*, *--edge* 'DIR' 'RATIO'|±'PIXELS'::
365         Set or change the splitting ratio of the edge located in the given direction in relation to the selected window.
366
367 *-R*, *--rotate* 'DIR' '90|270|180'::
368         Rotate the tree holding the edge located in the given direction in relation to the selected window.
369
370 *-t*, *--state* tiled|pseudo_tiled|floating|fullscreen::
371         Set the state of the selected window.
372
373 *-g*, *--flag* locked|sticky|private[=on|off]::
374         Set or toggle the given flag for the selected window.
375
376 *-l*, *--layer* below|normal|above::
377         Set the stacking layer of the selected window.
378
379 *-c*, *--close*::
380         Close the selected window.
381
382 *-k*, *--kill*::
383         Kill the selected window.
384
385 Desktop
386 ~~~~~~~
387
388 General Syntax
389 ^^^^^^^^^^^^^^
390
391 desktop ['DESKTOP_SEL'] 'OPTIONS'
392
393 Options
394 ^^^^^^^
395 *-f*, *--focus* ['DESKTOP_SEL']::
396         Focus the selected or given desktop.
397
398 *-m*, *--to-monitor* 'MONITOR_SEL'::
399         Send the selected desktop to the given monitor.
400
401 *-l*, *--layout* 'CYCLE_DIR'|monocle|tiled::
402         Set or cycle the layout of the selected desktop.
403
404 *-n*, *--rename* <new_name>::
405         Rename the selected desktop.
406
407 *-s*, *--swap* 'DESKTOP_SEL'::
408         Swap the selected desktop with the given desktop.
409
410 *-b*, *--bubble* 'CYCLE_DIR'::
411         Bubble the selected desktop in the given direction.
412
413 *-r*, *--remove*::
414         Remove the selected desktop.
415
416 *-c*, *--cancel-presel*::
417         Cancel the preselection of all the windows of the selected desktop.
418
419 *-F*, *--flip* 'horizontal|vertical'::
420         Flip the tree of the selected desktop.
421
422 *-R*, *--rotate* '90|270|180'::
423         Rotate the tree of the selected desktop.
424
425 *-E*, *--equalize*::
426         Reset the split ratios of the tree of the selected desktop.
427
428 *-B*, *--balance*::
429         Adjust the split ratios of the tree of the selected desktop so that all windows occupy the same area.
430
431 *-C*, *--circulate* forward|backward::
432         Circulate the leaves of the tree of the selected desktop.
433
434
435 Monitor
436 ~~~~~~~
437
438 General Syntax
439 ^^^^^^^^^^^^^^
440
441 monitor ['MONITOR_SEL'] 'OPTIONS'
442
443 Options
444 ^^^^^^^
445 *-f*, *--focus* ['MONITOR_SEL']::
446         Focus the selected or given monitor.
447
448 *-a*, *--add-desktops* <name>...::
449         Create desktops with the given names in the selected monitor.
450
451 *-r*, *--remove-desktops* <name>...::
452         Remove desktops with the given names.
453
454 *-o*, *--reorder-desktops* <name>...::
455         Reorder the desktops of the selected monitor to match the given order.
456
457 *-d*, *--reset-desktops* <name>...::
458         Rename, add or remove desktops depending on whether the number of given names is equal, superior or inferior to the number of existing desktops. Incidentally reset the settings of the existing desktops.
459
460 *-n*, *--rename* <new_name>::
461         Rename the selected monitor.
462
463 *-s*, *--swap* 'MONITOR_SEL'::
464         Swap the selected monitor with the given monitor.
465
466 Query
467 ~~~~~
468
469 General Syntax
470 ^^^^^^^^^^^^^^
471
472 query 'OPTIONS'
473
474 Options
475 ^^^^^^^
476 *-W*, *--windows*::
477         List matching windows.
478
479 *-D*, *--desktops*::
480         List matching desktops.
481
482 *-M*, *--monitors*::
483         List matching monitors.
484
485 *-T*, *--tree*::
486         Print tree rooted at query.
487
488 *-H*, *--history*::
489         Print the history as it relates to the query.
490
491 *-S*, *--stack*::
492         Print the window stacking order.
493
494 [*-m*,*--monitor* ['MONITOR_SEL']] | [*-d*,*--desktop* ['DESKTOP_SEL']] | [*-w*, *--window* ['WINDOW_SEL']]::
495         Constrain matches to the selected monitor, desktop or window.
496
497 Restore
498 ~~~~~~~
499
500 General Syntax
501 ^^^^^^^^^^^^^^
502
503 restore 'OPTIONS'
504
505 Options
506 ^^^^^^^
507
508 *-T*, *--tree* <file_path>::
509         Load the desktop trees from the given file.
510
511 *-H*, *--history* <file_path>::
512         Load the focus history from the given file.
513
514 *-S*, *--stack* <file_path>::
515         Load the window stacking order from the given file.
516
517 Control
518 ~~~~~~~
519
520 General Syntax
521 ^^^^^^^^^^^^^^
522
523 control 'OPTIONS'
524
525 Options
526 ^^^^^^^
527
528 *--adopt-orphans*::
529         Manage all the unmanaged windows remaining from a previous session.
530
531 *--toggle-visibility*::
532         Toggle the visibility of all the windows.
533
534 *--record-history* on|off::
535         Enable or disable the recording of window focus history.
536
537 *--subscribe* (all|report|monitor|desktop|window|...)*::
538         Continuously print status information. See the *EVENTS* section for the detailed description of each event.
539
540 *--get-status*::
541         Print the current status information.
542
543 Pointer
544 ~~~~~~~
545
546 General Syntax
547 ^^^^^^^^^^^^^^
548
549 pointer 'OPTIONS'
550
551 Options
552 ^^^^^^^
553
554 *-g*, *--grab* focus|move|resize_side|resize_corner::
555         Initiate the given pointer action.
556
557 *-t*, *--track* <x> <y>::
558         Pass the pointer root coordinates for the current pointer action.
559
560 *-u*, *--ungrab*::
561         Terminate the current pointer action.
562
563 Rule
564 ~~~~
565
566 General Syntax
567 ^^^^^^^^^^^^^^
568
569 rule 'OPTIONS'
570
571 Options
572 ^^^^^^^
573
574 *-a*, *--add* <class_name>|<instance_name>|* [*-o*|*--one-shot*] [monitor=MONITOR_SEL|desktop=DESKTOP_SEL|window=WINDOW_SEL] [state=STATE] [layer=LAYER] [split_dir=DIR] [split_ratio=RATIO] [(locked|sticky|private|center|follow|manage|focus|border)=(on|off)]::
575         Create a new rule.
576
577 *-r*, *--remove* ^<n>|head|tail|<class_name>|<instance_name>|*...::
578         Remove the given rules.
579
580 *-l*, *--list* [<class_name>|<instance_name>|*]::
581         List the rules.
582
583 Config
584 ~~~~~~
585
586 General Syntax
587 ^^^^^^^^^^^^^^
588
589 config [-m 'MONITOR_SEL'|-d 'DESKTOP_SEL'|-w 'WINDOW_SEL'] <key> [<value>]::
590         Get or set the value of <key>.
591
592 Quit
593 ~~~~
594
595 General Syntax
596 ^^^^^^^^^^^^^^
597
598 quit [<status>]::
599         Quit with an optional exit status.
600
601 Exit Codes
602 ----------
603
604 If the server can't handle a message, *bspc* will return with one of the following exit codes:
605
606 1::
607         Failure.
608 2::
609         Syntax error.
610 3::
611         Unknown command.
612
613
614 Settings
615 --------
616 Colors are either '#RRGGBB' or http://en.wikipedia.org/wiki/X11_color_names[X color names], booleans are 'true', 'on', 'false' or 'off'.
617
618 All the boolean settings are 'false' by default unless stated otherwise.
619
620 Global Settings
621 ~~~~~~~~~~~~~~~
622
623 'focused_border_color'::
624         Color of the border of a focused window of a focused monitor.
625
626 'active_border_color'::
627         Color of the border of a focused window of an unfocused monitor.
628
629 'normal_border_color'::
630         Color of the border of an unfocused window.
631
632 'presel_border_color'::
633         Color of the *window --presel* message feedback.
634
635 'focused_locked_border_color'::
636         Color of the border of a focused locked window of a focused monitor.
637
638 'active_locked_border_color'::
639         Color of the border of a focused locked window of an unfocused monitor.
640
641 'normal_locked_border_color'::
642         Color of the border of an unfocused locked window.
643
644 'focused_sticky_border_color'::
645         Color of the border of a focused sticky window of a focused monitor.
646
647 'active_sticky_border_color'::
648         Color of the border of a focused sticky window of an unfocused monitor.
649
650 'normal_sticky_border_color'::
651         Color of the border of an unfocused sticky window.
652
653 'focused_private_border_color'::
654         Color of the border of a focused private window of a focused monitor.
655
656 'active_private_border_color'::
657         Color of the border of a focused private window of an unfocused monitor.
658
659 'normal_private_border_color'::
660         Color of the border of an unfocused private window.
661
662 'urgent_border_color'::
663         Color of the border of an urgent window.
664
665 'split_ratio'::
666         Default split ratio.
667
668 'status_prefix'::
669         Prefix prepended to each of the status lines.
670
671 'external_rules_command'::
672         External command used to retrieve rule consequences. The command will receive the the ID of the window being processed as its first argument and the class and instance names as second and third arguments. The output of that command must have the following format: *key1=value1 key2=value2 ...* (the valid key/value pairs are given in the description of the 'rule' command).
673
674 'initial_polarity'::
675         On which child should a new window be attached when adding a window on a single window tree in automatic mode. Accept the following values: *first_child*, *second_child*.
676
677 'history_aware_focus'::
678         Give priority to the focus history when focusing nodes.
679
680 'focus_by_distance'::
681         Base focusing on distances between windows.
682
683 'borderless_monocle'::
684         Remove borders of tiled windows for the *monocle* desktop layout.
685
686 'gapless_monocle'::
687         Remove gaps of tiled windows for the *monocle* desktop layout.
688
689 'leaf_monocle'::
690         Set the desktop layout to *monocle* if there's only one tiled window in the tree.
691
692 'focus_follows_pointer'::
693         Focus the window under the pointer.
694
695 'pointer_follows_focus'::
696         When focusing a window, put the pointer at its center.
697
698 'pointer_follows_monitor'::
699         When focusing a monitor, put the pointer at its center.
700
701 'auto_alternate'::
702         Interpret consecutive identical *--focus* arguments as the *last* selector for the *monitor* and *desktop* commands.
703
704 'auto_cancel'::
705         Interpret consecutive identical *--presel* arguments as *--cancel-presel* option.
706
707 'ignore_ewmh_focus'::
708         Ignore EWMH focus requests coming from applications.
709
710 'center_pseudo_tiled'::
711         Center pseudo tiled windows into their tiling rectangles. Defaults to 'true'.
712
713 'remove_disabled_monitors'::
714         Consider disabled monitors as disconnected.
715
716 'remove_unplugged_monitors'::
717         Remove unplugged monitors.
718
719 'merge_overlapping_monitors'::
720         Merge overlapping monitors (the bigger remains).
721
722 Monitor and Desktop Settings
723 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
724
725 'top_padding'::
726 'right_padding'::
727 'bottom_padding'::
728 'left_padding'::
729         Padding space added at the sides of the monitor or desktop.
730
731 Default, Desktop Default and Window Settings
732 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
733
734 'border_width'::
735         Window border width.
736
737 Default and Desktop Settings
738 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
739
740 'window_gap'::
741         Size of the gap that separates windows.
742
743
744 Events
745 ------
746
747 'report'::
748         See the next section for the description of the format.
749
750 'monitor_add <monitor_name> <monitor_id> <monitor_geometry>'::
751         A monitor is added.
752
753 'monitor_rename <old_name> <new_name>'::
754         A monitor is renamed.
755
756 'monitor_remove <monitor_name>'::
757         A monitor is removed.
758
759 'monitor_focus <monitor_name>'::
760         A monitor is focused.
761
762 'monitor_geometry <monitor_name> <monitor_geometry>'::
763         The geometry of a monitor changed.
764
765 'desktop_add <monitor_name> <desktop_name>'::
766         A desktop is added.
767
768 'desktop_rename <monitor_name> <old_name> <new_name>'::
769         A desktop is renamed.
770
771 'desktop_remove <monitor_name> <desktop_name>'::
772         A desktop is removed.
773
774 'desktop_swap <src_monitor_name> <src_desktop_name> <dst_monitor_name> <dst_desktop_name>'::
775         A desktop is swapped.
776
777 'desktop_transfer <src_monitor_name> <src_desktop_name> <dst_monitor_name>'::
778         A desktop is transferred.
779
780 'desktop_focus <monitor_name> <desktop_name>'::
781         A desktop is focused.
782
783 'desktop_layout <monitor_name> <desktop_name> tiled|monocle'::
784         The layout of a desktop changed.
785
786 'window_manage <monitor_name> <desktop_name> <window_id> <ip_id>'::
787         A window is managed.
788
789 'window_unmanage <monitor_name> <desktop_name> <window_id>'::
790         A window is unmanaged.
791
792 'window_swap <src_monitor_name> <src_desktop_name> <src_window_id> <dst_monitor_name> <dst_desktop_name> <dst_window_id>'::
793         A window is swapped.
794
795 'window_transfer <src_monitor_name> <src_desktop_name> <src_window_id> <dst_monitor_name> <dst_desktop_name> <dst_window_id>'::
796         A window is transferred.
797
798 'window_focus <monitor_name> <desktop_name> <window_id>'::
799         A window is focused.
800
801 'window_activate <monitor_name> <desktop_name> <window_id>'::
802         A window is activated.
803
804 'window_geometry <monitor_name> <desktop_name> <window_id> <window_geometry>'::
805         The geometry of a window changed.
806
807 'window_state <monitor_name> <desktop_name> <window_id> tiled|pseudo_tiled|floating|fullscreen on|off'::
808         The state of a window changed.
809
810 'window_flag <monitor_name> <desktop_name> <window_id> sticky|private|locked|urgent on|off'::
811         One of the flags of a window changed.
812
813 'window_layer <monitor_name> <desktop_name> <window_id> below|normal|above'::
814         The layer of a window changed.
815
816 Please note that *bspwm* initializes monitors before it reads messages on its socket, therefore the initial monitor events can't be received.
817
818 Report Format
819 -------------
820
821 Each report event message is composed of items separated by colons.
822
823 Each item has the form '<type><value>' where '<type>' is the first character of the item.
824
825 'M<monitor_name>'::
826         Focused monitor.
827
828 'm<monitor_name>'::
829         Unfocused monitor.
830
831 'O<desktop_name>'::
832         Occupied focused desktop.
833
834 'o<desktop_name>'::
835         Occupied unfocused desktop.
836
837 'F<desktop_name>'::
838         Free focused desktop.
839
840 'f<desktop_name>'::
841         Free unfocused desktop.
842
843 'U<desktop_name>'::
844         Urgent focused desktop.
845
846 'u<desktop_name>'::
847         Urgent unfocused desktop.
848
849 'L(T|M)'::
850         Layout of the focused desktop of a monitor.
851
852 Environment Variables
853 ---------------------
854
855 'BSPWM_SOCKET'::
856         The path of the socket used for the communication between *bspc* and *bspwm*. If it isn't defined, then the following path is used: '/tmp/bspwm<host_name>_<display_number>_<screen_number>-socket'.
857
858 Contributors
859 ------------
860
861 * Steven Allen <steven at stebalien.com>
862 * Thomas Adam <thomas at xteddy.org>
863 * Ivan Kanakarakis <ivan.kanak at gmail.com>
864
865 Author
866 ------
867
868 Bastien Dejean <nihilhill at gmail.com>