From 3b75be351599a21356665f731b4ec92d9bb9aefa Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 22 Jul 2011 20:38:31 +0200 Subject: [PATCH] add docs (with custom stylesheet) --- _docs/Makefile | 27 + _docs/conf/i3html.conf | 691 +++++++++++++++++++++++ _docs/debugging | 104 ++++ _docs/hacking-howto | 524 ++++++++++++++++++ _docs/ipc | 326 +++++++++++ _docs/multi-monitor | 60 ++ _docs/tree-migrating | 192 +++++++ _docs/userguide | 998 +++++++++++++++++++++++++++++++++ _docs/wsbar | 94 ++++ css/xhtml11.css | 404 ++++++++++++++ docs/bigpicture.png | Bin 0 -> 9179 bytes docs/debugging.html | 148 +++++ docs/hacking-howto.html | 891 ++++++++++++++++++++++++++++++ docs/ipc.html | 530 ++++++++++++++++++ docs/keyboard-layer1.png | Bin 0 -> 43543 bytes docs/keyboard-layer2.png | Bin 0 -> 42056 bytes docs/modes.png | Bin 0 -> 5826 bytes docs/multi-monitor.html | 109 ++++ docs/refcard.pdf | Bin 0 -> 61582 bytes docs/single_terminal.png | Bin 0 -> 3382 bytes docs/snapping.png | Bin 0 -> 4880 bytes docs/stacklimit.png | Bin 0 -> 4988 bytes docs/tree-layout1.png | Bin 0 -> 27856 bytes docs/tree-layout2.png | Bin 0 -> 20101 bytes docs/tree-migrating.html | 270 +++++++++ docs/tree-shot1.png | Bin 0 -> 3665 bytes docs/tree-shot2.png | Bin 0 -> 3383 bytes docs/tree-shot3.png | Bin 0 -> 4001 bytes docs/tree-shot4.png | Bin 0 -> 3050 bytes docs/two_columns.png | Bin 0 -> 4624 bytes docs/two_terminals.png | Bin 0 -> 4901 bytes docs/userguide.html | 1129 ++++++++++++++++++++++++++++++++++++++ docs/wsbar.html | 148 +++++ docs/wsbar.png | Bin 0 -> 14339 bytes fonts/DroidSansMono.ttf | Bin 0 -> 75530 bytes js/asciidoc-xhtml11.js | 128 +++++ 36 files changed, 6773 insertions(+) create mode 100644 _docs/Makefile create mode 100644 _docs/conf/i3html.conf create mode 100644 _docs/debugging create mode 100644 _docs/hacking-howto create mode 100644 _docs/ipc create mode 100644 _docs/multi-monitor create mode 100644 _docs/tree-migrating create mode 100644 _docs/userguide create mode 100644 _docs/wsbar create mode 100644 css/xhtml11.css create mode 100644 docs/bigpicture.png create mode 100644 docs/debugging.html create mode 100644 docs/hacking-howto.html create mode 100644 docs/ipc.html create mode 100644 docs/keyboard-layer1.png create mode 100644 docs/keyboard-layer2.png create mode 100644 docs/modes.png create mode 100644 docs/multi-monitor.html create mode 100644 docs/refcard.pdf create mode 100644 docs/single_terminal.png create mode 100644 docs/snapping.png create mode 100644 docs/stacklimit.png create mode 100644 docs/tree-layout1.png create mode 100644 docs/tree-layout2.png create mode 100644 docs/tree-migrating.html create mode 100644 docs/tree-shot1.png create mode 100644 docs/tree-shot2.png create mode 100644 docs/tree-shot3.png create mode 100644 docs/tree-shot4.png create mode 100644 docs/two_columns.png create mode 100644 docs/two_terminals.png create mode 100644 docs/userguide.html create mode 100644 docs/wsbar.html create mode 100644 docs/wsbar.png create mode 100644 fonts/DroidSansMono.ttf create mode 100644 js/asciidoc-xhtml11.js diff --git a/_docs/Makefile b/_docs/Makefile new file mode 100644 index 0000000..8914d06 --- /dev/null +++ b/_docs/Makefile @@ -0,0 +1,27 @@ + +all: hacking-howto.html debugging.html userguide.html ipc.html multi-monitor.html wsbar.html tree-migrating.html + +hacking-howto.html: hacking-howto + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< + +debugging.html: debugging + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -n $< + +userguide.html: userguide + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< + +tree-migrating.html: tree-migrating + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< + +ipc.html: ipc + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< + +multi-monitor.html: multi-monitor + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< + +wsbar.html: wsbar + asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< + +clean: + rm -f */*.{aux,log,toc,bm,pdf,dvi} + rm -f *.log *.html diff --git a/_docs/conf/i3html.conf b/_docs/conf/i3html.conf new file mode 100644 index 0000000..990a5bf --- /dev/null +++ b/_docs/conf/i3html.conf @@ -0,0 +1,691 @@ +# +# xhtml11.conf +# +# Asciidoc configuration file. +# xhtml11 backend, generates XHTML 1.1 conformant markup. +# + +[miscellaneous] +outfilesuffix=.html + +[attributes] +basebackend=html +basebackend-html= +basebackend-xhtml11= + +[replacements2] +# Line break. +(?m)^(.*)\s\+$=\1
+ +[replacements] +ifdef::asciidoc7compatible[] +# Superscripts. +\^(.+?)\^=\1 +# Subscripts. +~(.+?)~=\1 +endif::asciidoc7compatible[] + +[ruler-blockmacro] +
+ +[pagebreak-blockmacro] +
+ +[blockdef-pass] +asciimath-style=template="asciimathblock",subs=[] +latexmath-style=template="latexmathblock",subs=[] + +[macros] +# math macros. +# Special characters are escaped in HTML math markup. +(?su)[\\]?(?Pasciimath|latexmath):(?P\S*?)\[(?P.*?)(?asciimath|latexmath)::(?P\S*?)(\[(?P.*?)\])$=#[specialcharacters] + +[asciimath-inlinemacro] +`{passtext}` + +[asciimath-blockmacro] +
+
+
{title}
+`{passtext}` +
+ +[asciimathblock] +
+
+
{title}
+`|` +
+ +[latexmath-inlinemacro] +{passtext} + +[latexmath-blockmacro] +
+
+
{title}
+{passtext} +
+ +[latexmathblock] +
+
+
{title}
+| +
+ +[image-inlinemacro] + + +{data-uri%}{alt={target}} +{data-uri#}{alt={target}} +{link#} + + +[image-blockmacro] +
+ +
{caption={figure-caption} {counter:figure-number}. }{title}
+
+ +[unfloat-blockmacro] +
+ +[indexterm-inlinemacro] +# Index term. +{empty} + +[indexterm2-inlinemacro] +# Index term. +# Single entry index term that is visible in the primary text flow. +{1} + +[footnote-inlinemacro] +# footnote:[]. +
[{0}]
+ +[footnoteref-inlinemacro] +# footnoteref:[], create reference to footnote. +{2%}
[{1}]
+# footnoteref:[,], create footnote with ID. +{2#}
[{2}]
+ +[callout-inlinemacro] +ifndef::icons[] +<{index}> +endif::icons[] +ifdef::icons[] +ifndef::data-uri[] +{index} +endif::data-uri[] +ifdef::data-uri[] +{index} +endif::data-uri[] +endif::icons[] + +# Comment line macros. +[comment-inlinemacro] +{showcomments#}
{passtext}
+ +[comment-blockmacro] +{showcomments#}

{passtext}

+ +[literal-inlinemacro] +# Inline literal. +{passtext} + +# List tags. +[listtags-bulleted] +list=
{title?
{title}
}
    |
+item=
  • |
  • +text=

    |

    + +[listtags-numbered] +# The start attribute is not valid XHTML 1.1 but all browsers support it. +list=
    {title?
    {title}
    }
      |
    +item=
  • |
  • +text=

    |

    + +[listtags-labeled] +list=
    {title?
    {title}
    }
    |
    +entry= +label= +term=
    |
    +item=
    |
    +text=

    |

    + +[listtags-horizontal] +list=
    {title?
    {title}
    }{labelwidth?}{itemwidth?}|
    +label=| +term=|
    +entry=| +item=| +text=

    |

    + +[listtags-qanda] +list=
    {title?
    {title}
    }
      |
    +entry=
  • |
  • +label= +term=

    |

    +item= +text=

    |

    + +[listtags-callout] +ifndef::icons[] +list=
    {title?
    {title}
    }
      |
    +item=
  • |
  • +text=

    |

    +endif::icons[] +ifdef::icons[] +list=
    {title?
    {title}
    }|
    +ifndef::data-uri[] +item={listindex}| +endif::data-uri[] +ifdef::data-uri[] +item={listindex}| +endif::data-uri[] +text=| +endif::icons[] + +[listtags-glossary] +list=
    {title?
    {title}
    }
    |
    +label= +entry= +term=
    |
    +item=
    |
    +text=

    |

    + +[listtags-bibliography] +list=
    {title?
    {title}
    }
      |
    +item=
  • |
  • +text=

    |

    + +[tags] +# Quoted text. +emphasis={1?}|{1?} +strong={1?}|{1?} +monospaced={1?}|{1?} +singlequoted={lsquo}{1?}|{1?}{rsquo} +doublequoted={ldquo}{1?}|{1?}{rdquo} +unquoted={1?}|{1?} +superscript={1?}|{1?} +subscript={1?}|{1?} + +ifdef::deprecated-quotes[] +# Override with deprecated quote attributes. +emphasis={role?}|{role?} +strong={role?}|{role?} +monospaced={role?}|{role?} +singlequoted={role?}{1,2,3?}{amp}#8216;|{amp}#8217;{1,2,3?}{role?} +doublequoted={role?}{1,2,3?}{amp}#8220;|{amp}#8221;{1,2,3?}{role?} +unquoted={role?}{1,2,3?}|{1,2,3?}{role?} +superscript={role?}|{role?} +subscript={role?}|{role?} +endif::deprecated-quotes[] + +# Inline macros +[http-inlinemacro] +{0={name}:{target}} +[https-inlinemacro] +{0={name}:{target}} +[ftp-inlinemacro] +{0={name}:{target}} +[file-inlinemacro] +{0={name}:{target}} +[irc-inlinemacro] +{0={name}:{target}} +[mailto-inlinemacro] +{0={target}} +[link-inlinemacro] +{0={target}} +[callto-inlinemacro] +{0={target}} +# anchor:id[text] +[anchor-inlinemacro] + +# [[id,text]] +[anchor2-inlinemacro] + +# [[[id]]] +[anchor3-inlinemacro] +[{1}] +# xref:id[text] +[xref-inlinemacro] +{0=[{target}]} +# <> +[xref2-inlinemacro] +{2=[{1}]} + +# Special word substitution. +[emphasizedwords] +{words} +[monospacedwords] +{words} +[strongwords] +{words} + +# Paragraph substitution. +[paragraph] +
    {title?
    {title}
    }

    +| +

    + +[admonitionparagraph] +template::[admonitionblock] + +# Delimited blocks. +[listingblock] +
    +
    {caption=}{title}
    +
    +
    
    +|
    +
    +
    + +[literalblock] +
    +
    {title}
    +
    +
    
    +|
    +
    +
    + +[sidebarblock] +
    +
    +
    {title}
    +| +
    + +[openblock] +
    +
    {title}
    +
    +| +
    + +[partintroblock] +template::[openblock] + +[abstractblock] +template::[quoteblock] + +[quoteblock] +
    +
    {title}
    +
    +| +
    +
    +{citetitle}{attribution?
    } +— {attribution} +
    + +[verseblock] +
    +
    {title}
    +
    +|
    +
    +
    +{citetitle}{attribution?
    } +— {attribution} +
    + +[exampleblock] +
    +
    {caption={example-caption} {counter:example-number}. }{title}
    +
    +| +
    + +[admonitionblock] +
    + + + +
    +{data-uri%}{icons#}{caption} +{data-uri#}{icons#}{caption} +{icons%}
    {caption}
    +
    +
    {title}
    +| +
    +
    + +# Tables. +[tabletags-default] +colspec= +bodyrow=| +headdata=| +bodydata=| +paragraph=

    |

    + +[tabletags-header] +paragraph=

    |

    + +[tabletags-emphasis] +paragraph=

    |

    + +[tabletags-strong] +paragraph=

    |

    + +[tabletags-monospaced] +paragraph=

    |

    + +[tabletags-verse] +bodydata=
    |
    +paragraph= + +[tabletags-literal] +bodydata=
    |
    +paragraph= + +[tabletags-asciidoc] +bodydata=
    |
    +paragraph= + +[table] +
    + + +{colspecs} +{headrows#} +{headrows} +{headrows#} +{footrows#} +{footrows} +{footrows#} + +{bodyrows} + +
    {caption={table-caption} {counter:table-number}. }{title}
    +
    + +#-------------------------------------------------------------------- +# Deprecated old table definitions. +# + +[miscellaneous] +# Screen width in pixels. +pagewidth=800 +pageunits= + +[old_tabledef-default] +template=old_table +colspec= +bodyrow=| +headdata=| +footdata=| +bodydata=| + +[old_table] +
    + + +{colspecs} +{headrows#} +{headrows} +{headrows#} +{footrows#} +{footrows} +{footrows#} + +{bodyrows} + +
    {caption={table-caption}}{title}
    +
    + +# End of deprecated old table definitions. +#-------------------------------------------------------------------- + +[floatingtitle] +{title} + +[preamble] +# Untitled elements between header and first section title. +
    +
    +| +
    +
    + +# Document sections. +[sect0] +{title} +| + +[sect1] +
    +{numbered?{sectnum} }{title} +
    +| +
    +
    + +[sect2] +
    +{numbered?{sectnum} }{title} +| +
    + +[sect3] +
    +{numbered?{sectnum} }{title} +| +
    + +[sect4] +
    +{title} +| +
    + +[appendix] +
    +{numbered?{sectnum} }{appendix-caption} {counter:appendix-number:A}: {title} +
    +| +
    +
    + +[toc] +
    +
    {toc-title}
    + +
    + +[header] + + + + + + + +i3: {title} +{title%}i3: {doctitle=} + +ifdef::linkcss[] + +{doctype-manpage} +ifdef::quirks[] + +endif::quirks[] + +ifdef::pygments[] +endif::linkcss[] +ifndef::linkcss[] + +endif::linkcss[] +ifndef::disable-javascript[] +ifdef::linkcss[] + + +endif::linkcss[] +ifndef::linkcss[] + +endif::linkcss[] +endif::disable-javascript[] +ifdef::asciimath[] +ifdef::linkcss[] + +endif::linkcss[] +ifndef::linkcss[] + +endif::linkcss[] +endif::asciimath[] +ifdef::latexmath[] +ifdef::linkcss[] + +endif::linkcss[] +ifndef::linkcss[] + +endif::linkcss[] +endif::latexmath[] +{docinfo1,docinfo2#}{include:{docdir}/docinfo.html} +{docinfo,docinfo2#}{include:{docdir}/{docname}-docinfo.html} + + + +
    +

    i3 - improved tiling WM

    + +
    +
    +# Article, book header. +ifndef::doctype-manpage[] + +endif::doctype-manpage[] +# Man page header. +ifdef::doctype-manpage[] + +endif::doctype-manpage[] + +[footer] +
    +{disable-javascript%

    } + + + + +ifdef::doctype-manpage[] +[synopsis] +template::[sect1] +endif::doctype-manpage[] + +ifdef::quirks[] +include::{backend}-quirks.conf[] +endif::quirks[] diff --git a/_docs/debugging b/_docs/debugging new file mode 100644 index 0000000..d52edea --- /dev/null +++ b/_docs/debugging @@ -0,0 +1,104 @@ +Debugging i3: How To +==================== +Michael Stapelberg +March 2010 + +This document describes how to debug i3 suitably for sending us useful bug +reports, even if you have no clue of C programming. + +First of all: Thank you for being interested in debugging i3. It really means +something to us to get your bug fixed. If you have any questions about the +debugging and/or need further help, do not hesitate to contact us! + +== Enabling logging + +i3 spits out much information onto stdout, if told so. To have a clearly +defined place where log files will be saved, you should redirect stdout and +stderr in xsession. While you’re at it, putting each run of i3 in a separate +log file with date/time in it is a good idea to not get confused about the +different log files later on. + +-------------------------------------------------------------------- +exec /usr/bin/i3 -V -d all >/home/michael/i3/i3log-$(date +'%F-%k-%M-%S') 2>&1 +-------------------------------------------------------------------- + +== Enabling core dumps + +When i3 crashes, often you have the chance of getting a 'core dump' (an image +of the memory of the i3 process which can be loaded into a debugger). To get a +core dump, you have to make sure that the user limit for core dump files is set +high enough. Many systems ship with a default value which even forbids core +dumps completely. To disable the limit completely and thus enable core dumps, +use the following command (in your .xsession, before starting i3): + +------------------- +ulimit -c unlimited +------------------- + +Furthermore, to easily recognize core dumps and allow multiple of them, you +should set a custom core dump filename pattern, using a command like the +following: + +--------------------------------------------- +sudo sysctl -w kernel.core_pattern=core.%e.%p +--------------------------------------------- + +This will generate files which have the executable’s file name (%e) and the +process id (%p) in it. You can save this setting across reboots using ++/etc/sysctl.conf+. + +== Compiling with debug symbols + +To actually get useful core dumps, you should make sure that your version of i3 +is compiled with debug symbols, that is, that they are not stripped during the +build process. You can check whether your executable contains symbols by +issuing the following command: + +---------------- +file $(which i3) +---------------- + +You should get an output like this: +------------------------------------------------------------------------------ +/usr/bin/i3: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically +linked (uses shared libs), for GNU/Linux 2.6.18, not stripped +------------------------------------------------------------------------------ + +Notice the +not stripped+, which is the important part. If you have a version +which is stripped, please have a look if your distribution provides debug +symbols (package +i3-wm-dbg+ on Debian for example) or if you can turn off +stripping. If nothing helps, please build i3 from source. + +== Generating a backtrace + +Once you have made sure that your i3 is compiled with debug symbols and that +core dumps are enabled, you can start making sense out of the core dumps. + +Because the core dump depends on the original executable (and its debug +symbols), please do this as soon as you encounter the problem. If you +re-compile i3, your core dump might be useless afterwards. + +Please install +gdb+, a debugger for C. No worries, you don’t need to learn it +now. Start gdb using the following command (replacing the actual name of the +core dump of course): + +---------------------------- +gdb $(which i3) core.i3.3849 +---------------------------- + +Then, generate a backtrace using: + +-------------- +backtrace full +-------------- + +== Sending bug reports/debugging on IRC + +When sending bug reports, please paste the relevant part of the log (if in +doubt, please send us rather too much information than too less) and the whole +backtrace (if there was a core dump). + +When debugging with us in IRC, be prepared to use a so called nopaste service +such as http://nopaste.info or http://pastebin.com because pasting large +amounts of text in IRC sometimes leads to incomplete lines (servers have line +length limitations) or flood kicks. diff --git a/_docs/hacking-howto b/_docs/hacking-howto new file mode 100644 index 0000000..dff074c --- /dev/null +++ b/_docs/hacking-howto @@ -0,0 +1,524 @@ +Hacking i3: How To +================== +Michael Stapelberg +December 2009 + +This document is intended to be the first thing you read before looking and/or +touching i3’s source code. It should contain all important information to help +you understand why things are like they are. If it does not mention something +you find necessary, please do not hesitate to contact me. + +== Window Managers + +A window manager is not necessarily needed to run X, but it is usually used in +combination with X to facilitate some things. The window manager's job is to +take care of the placement of windows, to provide the user with some mechanisms +to change the position/size of windows and to communicate with clients to a +certain extent (for example handle fullscreen requests of clients such as +MPlayer). + +There are no different contexts in which X11 clients run, so a window manager +is just another client, like all other X11 applications. However, it handles +some events which normal clients usually don’t handle. + +In the case of i3, the tasks (and order of them) are the following: + +. Grab the key bindings (events will be sent upon keypress/keyrelease) +. Iterate through all existing windows (if the window manager is not started as + the first client of X) and manage them (reparent them, create window + decorations, etc.) +. When new windows are created, manage them +. Handle the client’s `_WM_STATE` property, but only the `_WM_STATE_FULLSCREEN` +. Handle the client’s `WM_NAME` property +. Handle the client’s size hints to display them proportionally +. Handle the client’s urgency hint +. Handle enter notifications (focus follows mouse) +. Handle button (as in mouse buttons) presses for focus/raise on click +. Handle expose events to re-draw own windows such as decorations +. React to the user’s commands: Change focus, Move windows, Switch workspaces, + Change the layout mode of a container (default/stacking/tabbed), start a new + application, restart the window manager + +In the following chapters, each of these tasks and their implementation details +will be discussed. + +=== Tiling window managers + +Traditionally, there are two approaches to managing windows: The most common +one nowadays is floating, which means the user can freely move/resize the +windows. The other approach is called tiling, which means that your window +manager distributes windows to use as much space as possible while not +overlapping each other. + +The idea behind tiling is that you should not need to waste your time +moving/resizing windows while you usually want to get some work done. After +all, most users sooner or later tend to lay out their windows in a way which +corresponds to tiling or stacking mode in i3. Therefore, why not let i3 do this +for you? Certainly, it’s faster than you could ever do it. + +The problem with most tiling window managers is that they are too unflexible. +In my opinion, a window manager is just another tool, and similar to vim which +can edit all kinds of text files (like source code, HTML, …) and is not limited +to a specific file type, a window manager should not limit itself to a certain +layout (like dwm, awesome, …) but provide mechanisms for you to easily create +the layout you need at the moment. + +=== The layout table + +To accomplish flexible layouts, we decided to simply use a table. The table +grows and shrinks as you need it. Each cell holds a container which then holds +windows (see picture below). You can use different layouts for each container +(default layout and stacking layout). + +So, when you open a terminal and immediately open another one, they reside in +the same container, in default layout. The layout table has exactly one column, +one row and therefore one cell. When you move one of the terminals to the +right, the table needs to grow. It will be expanded to two columns and one row. +This enables you to have different layouts for each container. The table then +looks like this: + +[width="15%",cols="^,^"] +|======== +| T1 | T2 +|======== + +When moving terminal 2 to the bottom, the table will be expanded again. + +[width="15%",cols="^,^"] +|======== +| T1 | +| | T2 +|======== + +You can really think of the layout table like a traditional HTML table, if +you’ve ever designed one. Especially col- and rowspan work similarly. Below, +you see an example of colspan=2 for the first container (which has T1 as +window). + +[width="15%",cols="^asciidoc"] +|======== +| T1 +| +[cols="^,^",frame="none"] +!======== +! T2 ! T3 +!======== +|======== + +Furthermore, you can freely resize table cells. + +== Files + +include/data.h:: +Contains data definitions used by nearly all files. You really need to read +this first. + +include/*.h:: +Contains forward definitions for all public functions, as well as +doxygen-compatible comments (so if you want to get a bit more of the big +picture, either browse all header files or use doxygen if you prefer that). + +src/cfgparse.l:: +Contains the lexer for i3’s configuration file, written for +flex(1)+. + +src/cfgparse.y:: +Contains the parser for i3’s configuration file, written for +bison(1)+. + +src/click.c:: +Contains all functions which handle mouse button clicks (right mouse button +clicks initiate resizing and thus are relatively complex). + +src/client.c:: +Contains all functions which are specific to a certain client (make it +fullscreen, see if its class/name matches a pattern, kill it, …). + +src/commands.c:: +Parsing commands and actually executing them (focusing, moving, …). + +src/config.c:: +Parses the configuration file. + +src/debug.c:: +Contains debugging functions to print unhandled X events. + +src/floating.c:: +Contains functions for floating mode (mostly resizing/dragging). + +src/handlers.c:: +Contains all handlers for all kinds of X events (new window title, new hints, +unmapping, key presses, button presses, …). + +src/ipc.c:: +Contains code for the IPC interface. + +src/layout.c:: +Renders your layout (screens, workspaces, containers). + +src/mainx.c:: +Initializes the window manager. + +src/manage.c:: +Looks at existing or new windows and decides whether to manage them. If so, it +reparents the window and inserts it into our data structures. + +src/resize.c:: +Contains the functions to resize columns/rows in the table. + +src/table.c:: +Manages the most important internal data structure, the design table. + +src/util.c:: +Contains useful functions which are not really dependant on anything. + +src/workspace.c:: +Contains all functions related to workspaces (displaying, hiding, renaming…) + +src/xcb.c:: +Contains wrappers to use xcb more easily. + +src/xinerama.c:: +(Re-)initializes the available screens and converts them to virtual screens +(see below). + +== Data structures + +See include/data.h for documented data structures. The most important ones are +explained right here. + +image:bigpicture.png[The Big Picture] + +So, the hierarchy is: + +. *Virtual screens* (Screen 0 in this example) +. *Workspaces* (Workspace 1 in this example) +. *Table* (There can only be one table per Workspace) +. *Container* (left and right in this example) +. *Client* (The two clients in the left container) + +=== Virtual screens + +A virtual screen (type `i3Screen`) is generated from the connected screens +obtained through Xinerama. The difference to the raw Xinerama monitors as seen +when using +xrandr(1)+ is that it falls back to the lowest common resolution of +the logical screens. + +For example, if your notebook has 1280x800 and you connect a video projector +with 1024x768, set up in clone mode (+xrandr \--output VGA \--mode 1024x768 +\--same-as LVDS+), i3 will have one virtual screen. + +However, if you configure it using +xrandr \--output VGA \--mode 1024x768 +\--right-of LVDS+, i3 will generate two virtual screens. For each virtual +screen, a new workspace will be assigned. New workspaces are created on the +screen you are currently on. + +=== Workspace + +A workspace is identified by its number. Basically, you could think of +workspaces as different desks in your office, if you like the desktop +methaphor. They just contain different sets of windows and are completely +separate of each other. Other window managers also call this ``Virtual +desktops''. + +=== The layout table + +Each workspace has a table, which is just a two-dimensional dynamic array +containing Containers (see below). This table grows and shrinks as you need it +(by moving windows to the right you can create a new column in the table, by +moving them to the bottom you create a new row). + +=== Container + +A container is the content of a table’s cell. It holds an arbitrary amount of +windows and has a specific layout (default layout, stack layout or tabbed +layout). Containers can consume multiple table cells by modifying their +colspan/rowspan attribute. + +=== Client + +A client is x11-speak for a window. + +== List/queue macros + +i3 makes heavy use of the list macros defined in BSD operating systems. To +ensure that the operating system on which i3 is compiled has all the expected +features, i3 comes with `include/queue.h`. On BSD systems, you can use man +`queue(3)`. On Linux, you have to use google (or read the source). + +The lists used are `SLIST` (single linked lists), `CIRCLEQ` (circular +queues) and TAILQ (tail queues). Usually, only forward traversal is necessary, +so an `SLIST` works fine. If inserting elements at arbitrary positions or at +the end of a list is necessary, a `TAILQ` is used instead. However, for the +windows inside a container, a `CIRCLEQ` is necessary to go from the currently +selected window to the window above/below. + +== Naming conventions + +There is a row of standard variables used in many events. The following names +should be chosen for those: + + * ``conn'' is the xcb_connection_t + * ``event'' is the event of the particular type + * ``container'' names a container + * ``client'' names a client, for example when using a +CIRCLEQ_FOREACH+ + +== Startup (src/mainx.c, main()) + + * Establish the xcb connection + * Check for XKB extension on the separate X connection + * Check for Xinerama screens + * Grab the keycodes for which bindings exist + * Manage all existing windows + * Enter the event loop + +== Keybindings + +=== Grabbing the bindings + +Grabbing the bindings is quite straight-forward. You pass X your combination of +modifiers and the keycode you want to grab and whether you want to grab them +actively or passively. Most bindings (everything except for bindings using +Mode_switch) are grabbed passively, that is, just the window manager gets the +event and cannot replay it. + +We need to grab bindings that use Mode_switch actively because of a bug in X. +When the window manager receives the keypress/keyrelease event for an actively +grabbed keycode, it has to decide what to do with this event: It can either +replay it so that other applications get it or it can prevent other +applications from receiving it. + +So, why do we need to grab keycodes actively? Because X does not set the +state-property of keypress/keyrelease events properly. The Mode_switch bit is +not set and we need to get it using XkbGetState. This means we cannot pass X +our combination of modifiers containing Mode_switch when grabbing the key and +therefore need to grab the keycode itself without any modifiers. This means, +if you bind Mode_switch + keycode 38 ("a"), i3 will grab keycode 38 ("a") and +check on each press of "a" if the Mode_switch bit is set using XKB. If yes, it +will handle the event, if not, it will replay the event. + +=== Handling a keypress + +As mentioned in "Grabbing the bindings", upon a keypress event, i3 first gets +the correct state. + +Then, it looks through all bindings and gets the one which matches the received +event. + +The bound command is parsed directly in command mode. + +== Manage windows (src/mainx.c, manage_window() and reparent_window()) + +`manage_window()` does some checks to decide whether the window should be +managed at all: + + * Windows have to be mapped, that is, visible on screen + * The override_redirect must not be set. Windows with override_redirect shall + not be managed by a window manager + +Afterwards, i3 gets the intial geometry and reparents the window (see +`reparent_window()`) if it wasn’t already managed. + +Reparenting means that for each window which is reparented, a new window, +slightly larger than the original one, is created. The original window is then +reparented to the bigger one (called "frame"). + +After reparenting, the window type (`_NET_WM_WINDOW_TYPE`) is checked to see +whether this window is a dock (`_NET_WM_WINDOW_TYPE_DOCK`), like dzen2 for +example. Docks are handled differently, they don’t have decorations and are not +assigned to a specific container. Instead, they are positioned at the bottom +of the screen. To get the height which needsd to be reserved for the window, +the `_NET_WM_STRUT_PARTIAL` property is used. + +Furthermore, the list of assignments (to other workspaces, which may be on +other screens) is checked. If the window matches one of the user’s criteria, +it may either be put in floating mode or moved to a different workspace. If the +target workspace is not visible, the window will not be mapped. + +== What happens when an application is started? + +i3 does not care for applications. All it notices is when new windows are +mapped (see `src/handlers.c`, `handle_map_request()`). The window is then +reparented (see section "Manage windows"). + +After reparenting the window, `render_layout()` is called which renders the +internal layout table. The new window has been placed in the currently focused +container and therefore the new window and the old windows (if any) need to be +moved/resized so that the currently active layout (default/stacking/tabbed mode) +is rendered correctly. To move/resize windows, a window is ``configured'' in +X11-speak. + +Some applications, such as MPlayer obviously assume the window manager is +stupid and try to configure their windows by themselves. This generates an +event called configurerequest. i3 handles these events and tells the window the +size it had before the configurerequest (with the exception of not yet mapped +windows, which get configured like they want to, and floating windows, which +can reconfigure themselves). + +== _NET_WM_STATE + +Only the _NET_WM_STATE_FULLSCREEN atom is handled. It calls +``toggle_fullscreen()'' for the specific client which just configures the +client to use the whole screen on which it currently is. Also, it is set as +fullscreen_client for the i3Screen. + +== WM_NAME + +When the WM_NAME property of a window changes, its decoration (containing the +title) is re-rendered. Note that WM_NAME is in COMPOUND_TEXT encoding which is +totally uncommon and cumbersome. Therefore, the _NET_WM_NAME atom will be used +if present. + +== _NET_WM_NAME + +Like WM_NAME, this atom contains the title of a window. However, _NET_WM_NAME +is encoded in UTF-8. i3 will recode it to UCS-2 in order to be able to pass it +to X. Using an appropriate font (ISO-10646), you can see most special +characters (every special character contained in your font). + +== Size hints + +Size hints specify the minimum/maximum size for a given window as well as its +aspect ratio. This is important for clients like mplayer, who only set the +aspect ratio and resize their window to be as small as possible (but only with +some video outputs, for example in Xv, while when using x11, mplayer does the +necessary centering for itself). + +So, when an aspect ratio was specified, i3 adjusts the height of the window +until the size maintains the correct aspect ratio. For the code to do this, see +src/layout.c, function resize_client(). + +== Rendering (src/layout.c, render_layout() and render_container()) + +There are several entry points to rendering: `render_layout()`, +`render_workspace()` and `render_container()`. The former one calls +`render_workspace()` for every screen, which in turn will call +`render_container()` for every container inside its layout table. Therefore, if +you need to render only a single container, for example because a window was +removed, added or changed its title, you should directly call +render_container(). + +Rendering consists of two steps: In the first one, in `render_workspace()`, each +container gets its position (screen offset + offset in the table) and size +(container's width times colspan/rowspan). Then, `render_container()` is called, +which takes different approaches, depending on the mode the container is in: + +=== Common parts + +On the frame (the window which was created around the client’s window for the +decorations), a black rectangle is drawn as a background for windows like +MPlayer, which do not completely fit into the frame. + +=== Default mode + +Each clients gets the container’s width and an equal amount of height. + +=== Stack mode + +In stack mode, a window containing the decorations of all windows inside the +container is placed at the top. The currently focused window is then given the +whole remaining space. + +=== Tabbed mode + +Tabbed mode is like stack mode, except that the window decorations are drawn +in one single line at the top of the container. + +=== Window decorations + +The window decorations consist of a rectangle in the appropriate color (depends +on whether this window is the currently focused one, the last focused one in a +not focused container or not focused at all) forming the background. +Afterwards, two lighter lines are drawn and the last step is drawing the +window’s title (see WM_NAME) onto it. + +=== Fullscreen windows + +For fullscreen windows, the `rect` (x, y, width, height) is not changed to +allow the client to easily go back to its previous position. Instead, +fullscreen windows are skipped when rendering. + +=== Resizing containers + +By clicking and dragging the border of a container, you can resize the whole +column (respectively row) which this container is in. This is necessary to keep +the table layout working and consistent. + +The resizing works similarly to the resizing of floating windows or movement of +floating windows: + +* A new, invisible window with the size of the root window is created + (+grabwin+) +* Another window, 2px width and as high as your screen (or vice versa for + horizontal resizing) is created. Its background color is the border color and + it is only there to inform the user how big the container will be (it + creates the impression of dragging the border out of the container). +* The +drag_pointer+ function of +src/floating.c+ is called to grab the pointer + and enter its own event loop which will pass all events (expose events) but + motion notify events. This function then calls the specified callback + (+resize_callback+) which does some boundary checking and moves the helper + window. As soon as the mouse button is released, this loop will be + terminated. +* The new width_factor for each involved column (respectively row) will be + calculated. + +== User commands / commandmode (src/commands.c) + +Like in vim, you can control i3 using commands. They are intended to be a +powerful alternative to lots of shortcuts, because they can be combined. There +are a few special commands, which are the following: + +exec :: +Starts the given command by passing it to `/bin/sh`. + +restart:: +Restarts i3 by executing `argv[0]` (the path with which you started i3) without +forking. + +w:: +"With". This is used to select a bunch of windows. Currently, only selecting +the whole container in which the window is in, is supported by specifying "w". + +f, s, d:: +Toggle fullscreen, stacking, default mode for the current window/container. + +The other commands are to be combined with a direction. The directions are h, +j, k and l, like in vim (h = left, j = down, k = up, l = right). When you just +specify the direction keys, i3 will move the focus in that direction. You can +provide "m" or "s" before the direction to move a window respectively or snap. + +== Gotchas + +* Forgetting to call `xcb_flush(conn);` after sending a request. This usually + leads to code which looks like it works fine but which does not work under + certain conditions. + +== Using git / sending patches + +For a short introduction into using git, see +http://www.spheredev.org/wiki/Git_for_the_lazy or, for more documentation, see +http://git-scm.com/documentation + +When you want to send a patch because you fixed a bug or implemented a cool +feature (please talk to us before working on features to see whether they are +maybe already implemented, not possible for some some reason, or don’t fit +into the concept), please use git to create a patchfile. + +First of all, update your working copy to the latest version of the master +branch: + +-------- +git pull +-------- + +Afterwards, make the necessary changes for your bugfix/feature. Then, review +the changes using +git diff+ (you might want to enable colors in the diff using ++git config diff.color auto+). When you are definitely done, use +git commit +-a+ to commit all changes you’ve made. + +Then, use the following command to generate a patchfile which we can directly +apply to the branch, preserving your commit message and name: + +----------------------- +git format-patch origin +----------------------- + +Just send us the generated file via email. diff --git a/_docs/ipc b/_docs/ipc new file mode 100644 index 0000000..5db6f00 --- /dev/null +++ b/_docs/ipc @@ -0,0 +1,326 @@ +IPC interface (interprocess communication) +========================================== +Michael Stapelberg +March 2010 + +This document describes how to interface with i3 from a separate process. This +is useful for example to remote-control i3 (to write test cases for example) or +to get various information like the current workspaces to implement an external +workspace bar. + +The method of choice for IPC in our case is a unix socket because it has very +little overhead on both sides and is usually available without headaches in +most languages. In the default configuration file, no ipc-socket path is +specified and thus no socket is created. The standard path (which +i3-msg+ and ++i3-input+ use) is +~/.i3/ipc.sock+. + +== Establishing a connection + +To establish a connection, simply open the IPC socket. The following code +snippet illustrates this in Perl: + +------------------------------------------------------------- +use IO::Socket::UNIX; +my $sock = IO::Socket::UNIX->new(Peer => '~/.i3/ipc.sock'); +------------------------------------------------------------- + +== Sending messages to i3 + +To send a message to i3, you have to format in the binary message format which +i3 expects. This format specifies a magic string in the beginning to ensure +the integrity of messages (to prevent follow-up errors). Following the magic +string comes the length of the payload of the message as 32-bit integer, and +the type of the message as 32-bit integer (the integers are not converted, so +they are in native byte order). + +The magic string currently is "i3-ipc" and will only be changed when a change +in the IPC API is done which breaks compatibility (we hope that we don’t need +to do that). + +Currently implemented message types are the following: + +COMMAND (0):: + The payload of the message is a command for i3 (like the commands you + can bind to keys in the configuration file) and will be executed + directly after receiving it. There is no reply to this message. +GET_WORKSPACES (1):: + Gets the current workspaces. The reply will be a JSON-encoded list of + workspaces (see the reply section). +SUBSCRIBE (2):: + Subscribes your connection to certain events. See <> for a + description of this message and the concept of events. +GET_OUTPUTS (3):: + Gets the current outputs. The reply will be a JSON-encoded list of outputs + (see the reply section). + +So, a typical message could look like this: +-------------------------------------------------- +"i3-ipc" +-------------------------------------------------- + +Or, as a hexdump: +------------------------------------------------------------------------------ +00000000 69 33 2d 69 70 63 04 00 00 00 00 00 00 00 65 78 |i3-ipc........ex| +00000010 69 74 0a |it.| +------------------------------------------------------------------------------ + +To generate and send such a message, you could use the following code in Perl: +------------------------------------------------------------ +sub format_ipc_command { + my ($msg) = @_; + my $len; + # Get the real byte count (vs. amount of characters) + { use bytes; $len = length($msg); } + return "i3-ipc" . pack("LL", $len, 0) . $msg; +} + +$sock->write(format_ipc_command("exit")); +------------------------------------------------------------------------------ + +== Receiving replies from i3 + +Replies from i3 usually consist of a simple string (the length of the string +is the message_length, so you can consider them length-prefixed) which in turn +contain the JSON serialization of a data structure. For example, the +GET_WORKSPACES message returns an array of workspaces (each workspace is a map +with certain attributes). + +=== Reply format + +The reply format is identical to the normal message format. There also is +the magic string, then the message length, then the message type and the +payload. + +The following reply types are implemented: + +COMMAND (0):: + Confirmation/Error code for the COMMAND message. +GET_WORKSPACES (1):: + Reply to the GET_WORKSPACES message. +SUBSCRIBE (2):: + Confirmation/Error code for the SUBSCRIBE message. +GET_OUTPUTS (3):: + Reply to the GET_OUTPUTS message. + +=== COMMAND reply + +The reply consists of a single serialized map. At the moment, the only +property is +success (bool)+, but this will be expanded in future versions. + +*Example:* +------------------- +{ "success": true } +------------------- + +=== GET_WORKSPACES reply + +The reply consists of a serialized list of workspaces. Each workspace has the +following properties: + +num (integer):: + The logical number of the workspace. Corresponds to the command + to switch to this workspace. +name (string):: + The name of this workspace (by default num+1), as changed by the + user. Encoded in UTF-8. +visible (boolean):: + Whether this workspace is currently visible on an output (multiple + workspaces can be visible at the same time). +focused (boolean):: + Whether this workspace currently has the focus (only one workspace + can have the focus at the same time). +urgent (boolean):: + Whether a window on this workspace has the "urgent" flag set. +rect (map):: + The rectangle of this workspace (equals the rect of the output it + is on), consists of x, y, width, height. +output (string):: + The video output this workspace is on (LVDS1, VGA1, …). + +*Example:* +------------------- +[ + { + "num": 0, + "name": "1", + "visible": true, + "focused": true, + "urgent": false, + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 800 + }, + "output": "LVDS1" + }, + { + "num": 1, + "name": "2", + "visible": false, + "focused": false, + "urgent": false, + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 800 + }, + "output": "LVDS1" + } +] +------------------- + +=== SUBSCRIBE reply + +The reply consists of a single serialized map. The only property is ++success (bool)+, indicating whether the subscription was successful (the +default) or whether a JSON parse error occurred. + +*Example:* +------------------- +{ "success": true } +------------------- + +=== GET_OUTPUTS reply + +The reply consists of a serialized list of outputs. Each output has the +following properties: + +name (string):: + The name of this output (as seen in +xrandr(1)+). Encoded in UTF-8. +active (boolean):: + Whether this output is currently active (has a valid mode). +current_workspace (integer):: + The current workspace which is visible on this output. +null+ if the + output is not active. +rect (map):: + The rectangle of this output (equals the rect of the output it + is on), consists of x, y, width, height. + +*Example:* +------------------- +[ + { + "name": "LVDS1", + "active": true, + "current_workspace": 4, + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 800 + } + }, + { + "name": "VGA1", + "active": true, + "current_workspace": 1, + "rect": { + "x": 1280, + "y": 0, + "width": 1280, + "height": 1024 + }, + } +] +------------------- + +== Events + +[[events]] + +To get informed when certain things happen in i3, clients can subscribe to +events. Events consist of a name (like "workspace") and an event reply type +(like I3_IPC_EVENT_WORKSPACE). The events sent by i3 are in the same format +as replies to specific commands. However, the highest bit of the message type +is set to 1 to indicate that this is an event reply instead of a normal reply. + +Caveat: As soon as you subscribe to an event, it is not guaranteed any longer +that the requests to i3 are processed in order. This means, the following +situation can happen: You send a GET_WORKSPACES request but you receive a +"workspace" event before receiving the reply to GET_WORKSPACES. If your +program does not want to cope which such kinds of race conditions (an +event based library may not have a problem here), I suggest you create a +separate connection to receive events. + +=== Subscribing to events + +By sending a message of type SUBSCRIBE with a JSON-encoded array as payload +you can register to an event. + +*Example:* +--------------------------------- +type: SUBSCRIBE +payload: [ "workspace", "focus" ] +--------------------------------- + + +=== Available events + +The numbers in parenthesis is the event type (keep in mind that you need to +strip the highest bit first). + +workspace (0):: + Sent when the user switches to a different workspace, when a new + workspace is initialized or when a workspace is removed (because the + last client vanished). +output (1):: + Sent when RandR issues a change notification (of either screens, + outputs, CRTCs or output properties). + +*Example:* +-------------------------------------------------------------------- +# the appropriate 4 bytes read from the socket are stored in $input + +# unpack a 32-bit unsigned integer +my $message_type = unpack("L", $input); + +# check if the highest bit is 1 +my $is_event = (($message_type >> 31) == 1); + +# use the other bits +my $event_type = ($message_type & 0x7F); + +if ($is_event) { + say "Received event of type $event_type"; +} +-------------------------------------------------------------------- + +=== workspace event + +This event consists of a single serialized map containing a property ++change (string)+ which indicates the type of the change ("focus", "init", +"empty", "urgent"). + +*Example:* +--------------------- +{ "change": "focus" } +--------------------- + +=== output event + +This event consists of a single serialized map containing a property ++change (string)+ which indicates the type of the change (currently only +"unspecified"). + +*Example:* +--------------------------- +{ "change": "unspecified" } +--------------------------- + +== See also + +For some languages, libraries are available (so you don’t have to implement +all this on your own). This list names some (if you wrote one, please let me +know): + +C:: + i3 includes a headerfile +i3/ipc.h+ which provides you all constants. + However, there is no library yet. +Ruby:: + http://github.com/badboy/i3-ipc +Perl:: + http://search.cpan.org/search?query=AnyEvent::I3 +Python:: + http://github.com/thepub/i3ipc diff --git a/_docs/multi-monitor b/_docs/multi-monitor new file mode 100644 index 0000000..ec0256c --- /dev/null +++ b/_docs/multi-monitor @@ -0,0 +1,60 @@ +The multi-monitor situation +=========================== +Michael Stapelberg +March 2010 + +…or: oh no, I have an nVidia graphics card! + +== The quick fix + +If you are using the nVidia binary graphics driver (also known as 'blob') +you need to use the +--force-xinerama+ flag (in your .xsession) when starting +i3, like so: + +.Example: +---------------------------------------------- +exec i3 --force-xinerama -V >>~/.i3/i3log 2>&1 +---------------------------------------------- + +== The explanation + +Starting with version 3.ε, i3 uses the RandR (Rotate and Resize) API instead +of Xinerama. The reason for this, is that RandR provides more information +about your outputs and connected screens than Xinerama does. To be specific, +the code which handled on-the-fly screen reconfiguration (meaning without +restarting the X server) was a very messy heuristic and most of the time did +not work correctly -- that is just not possible with the little information +Xinerama offers (just a list of screen resolutions, no identifiers for the +screens or any additional information). Xinerama simply was not designed +for dynamic configuration. + +So RandR came along, as a more powerful alternative (RandR 1.2 to be specific). +It offers all of Xinerama’s possibilities and lots more. Using the RandR API +made our code much more robust and clean. Also, you can now reliably assign +workspaces to output names instead of some rather unreliable screen identifier +(position inside the list of screens, which could change, and so on…). + +As RandR has been around for about three years as of this writing, it seemed +like a very good idea to us, and it still is a very good one. What we did not +expect, however, was the nVidia binary driver. It still does not support RandR +(as of March 2010), even though nVidia has announced that it will support RandR +eventually. What does this mean for you, if you are stuck with the binary +driver for some reason (say the free drivers don’t work with your card)? First +of all, you are stuck with TwinView and cannot use +xrandr+. While this ruins +the user experience, the more grave problem is that the nVidia driver not only +does not support dynamic configuration using RandR, it also does not expose +correct multi-monitor information via the RandR API. So, in some setups, i3 +will not find any screens; in others, it will find one large screen which +actually contains both of your physical screens (but it will not know that +these are two screens). + +For this very reason, we decided to implement the following workaround: As +long as the nVidia driver does not support RandR, an option called ++--force-xinerama+ is available in i3. This option gets the list of screens +*once* when starting, and never updates it. As the nVidia driver cannot do +dynamic configuration anyways, this is not a big deal. + +== See also + +For more information on how to use multi-monitor setups, see the i3 User’s +Guide. diff --git a/_docs/tree-migrating b/_docs/tree-migrating new file mode 100644 index 0000000..15ea54e --- /dev/null +++ b/_docs/tree-migrating @@ -0,0 +1,192 @@ +Tree branch: Migrating +====================== +Michael Stapelberg +November 2010 + +== Introduction + +The tree branch (referring to a branch of i3 in the git repository) is the new +version of i3. Due to the very deep changes and heavy refactoring of the source +source, we decided to develop it in a seperate branch (instead of using the +next/master-branch system like before). + +== Current status + +Currently, the code is mostly working. Some of the i3 core developers have been +using the tree branch version for a few weeks now. So, if you are eager to try +out the new features and help us find bugs, give it a try! + +At the same time, a word of warning is appropriate: This version of i3 might +crash unexpectedly, so please be careful with important data (do not work for +two days without saving…). + +== Getting the latest tree branch version + +Check out the latest version: +--------------------------------------------- +$ git clone -b tree git://code.stapelberg.de/i3 +--------------------------------------------- + +Then build and install it (has the same dependencies as the latest stable i3 +version): +----------------------------- +$ cd i3 +$ make +$ sudo cp i3 /usr/bin/i3-tree +----------------------------- + +…and execute +i3-tree+ instead of +i3+ in your Xsession. + +*IMPORTANT:* Please note that configuration file compatibility is not yet done. +So, make sure you use/customize the provided +i3.config+ file. + +== Tree + +The most important change and reason for the name is that i3 stores all +information about the X11 outputs, workspaces and layout of the windows on them +in a tree. The root node is the X11 root window, followed by the X11 outputs, +then workspaces and finally the windows themselve. In previous versions of i3 +we had multiple lists (of outputs, workspaces) and a table for each workspace. +That approach turned out to be complicated to use (snapping), understand and +implement. + +=== The tree consists of Containers + +The building blocks of our tree are so called +Containers+. A +Container+ can +host a window (meaning an X11 window, one that you can actually see and use, +like a browser). Alternatively, it could contain one or more +Containers+. A +simple example is the workspace: When you start i3 with a single monitor, a +single workspace and you open two terminal windows, you will end up with a tree +like this: + +image::tree-layout2.png["layout2",float="right"] +image::tree-shot4.png["shot4",title="Two terminals on standard workspace"] + +=== Orientation and Split Containers + +[[OrientationSplit]] + +It is only natural to use so-called +Split Containers+ in order to build a +layout when using a tree as data structure. In i3, every +Container+ has an +orientation (horizontal, vertical or unspecified). So, in our example with the +workspace, the default orientation of the workspace +Container+ is horizontal +(most monitors are widescreen nowadays). If you change the orientation to +vertical (+Alt+v+ in the default config) and *then* open two terminals, i3 will +configure your windows like this: + +image::tree-shot2.png["shot2",title="Vertical Workspace Orientation"] + +An interesting new feature of the tree branch is the ability to split anything: +Let’s assume you have two terminals on a workspace (with horizontal +orientation), focus is on the right terminal. Now you want to open another +terminal window below the current one. If you would just open a new terminal +window, it would show up to the right due to the horizontal workspace +orientation. Instead, press +Alt+v+ to create a +Vertical Split Container+ (to +open a +Horizontal Split Container+, use +Alt+h+). Now you can open a new +terminal and it will open below the current one: + +image::tree-layout1.png["Layout",float="right"] +image::tree-shot1.png["shot",title="Vertical Split Container"] + +unfloat::[] + +You probably guessed it already: There is no limit on how deep your hierarchy +of splits can be. + +=== Level up + +Let’s stay with our example from above. We have a terminal on the left and two +vertically split terminals on the right, focus is on the bottom right one. When +you open a new terminal, it will open below the current one. + +So, how can you open a new terminal window to the *right* of the current one? +The solution is to use +level up+, which will focus the +Parent Container+ of +the current +Container+. In this case, you would focus the +Vertical Split +Container+ which is *inside* the horizontally oriented workspace. Thus, now new +windows will be opened to the right of the +Vertical Split Container+: + +image::tree-shot3.png["shot3",title="Level Up, then open new terminal"] + +== Commands + +The authoritive reference for commands is +src/cmdparse.y+. You can also find +most commands in +i3.config+. Here comes a short overview over the important +commands: + +=== Manipulating layout + +------------------------------- +layout +------------------------------- + +=== Changing Focus + +-------------------------- +next +prev +-------------------------- + +.Examples: +------------------------- +bindsym Mod1+Left prev h +bindsym Mod1+Right next h +bindsym Mod1+Down next v +bindsym Mod1+Up prev v +------------------------- + +=== Moving + +----------------------------------------- +move +----------------------------------------- + +.Examples: +----------------------------------------- +bindsym Mod1+Shift+Left move before h +bindsym Mod1+Shift+Right move after h +bindsym Mod1+Shift+Down move before v +bindsym Mod1+Shift+Up move after v +----------------------------------------- + +=== Changing workspace + +--------------------------- +workspace +--------------------------- + +.Examples: +--------------------------- +bindsym Mod1+1 workspace 1 +bindsym Mod1+2 workspace 2 +… +--------------------------- + +=== Moving Containers to workspaces + +--------------------- +move workspace +--------------------- + +------------------------------------- +bindsym Mod1+Shift+1 move workspace 1 +bindsym Mod1+Shift+2 move workspace 2 +… +------------------------------------- + +=== Changing border style + +--------------------------- +border +--------------------------- + +=== Changing container mode + +----------------------------- +mode +----------------------------- + +== The rest + +What is not mentioned here explicitly is either unchanged and can be read in +the http://i3.zekjur.net/docs/userguide.html[i3 User’s Guide] or it is not yet +implemented. diff --git a/_docs/userguide b/_docs/userguide new file mode 100644 index 0000000..42599ca --- /dev/null +++ b/_docs/userguide @@ -0,0 +1,998 @@ +i3 User’s Guide +=============== +Michael Stapelberg +March 2010 + +This document contains all the information you need to configure and use the i3 +window manager. If it does not, please contact me on IRC, Jabber or E-Mail and +I’ll help you out. + +== Default keybindings + +For the "too long; didn’t read" people, here is an overview of the default +keybindings (click to see the full size image): + +*Keys to use with Mod1 (alt):* + +image:keyboard-layer1.png["Keys to use with Mod1 (alt)",width=600,link="keyboard-layer1.png"] + +*Keys to use with Shift+Mod1:* + +image:keyboard-layer2.png["Keys to use with Shift+Mod1",width=600,link="keyboard-layer2.png"] + +As i3 uses keycodes in the default configuration, it does not matter which +keyboard layout you actually use. The key positions are what matters (of course +you can also use keysymbols, see <>). + +The red keys are the modifiers you need to press (by default), the blue keys +are your homerow. + +== Using i3 + +=== Opening terminals and moving around + +One very basic operation is opening a new terminal. By default, the keybinding +for this is Mod1+Enter, that is Alt+Enter in the default configuration. By +pressing Mod1+Enter, a new terminal will be opened. It will fill the whole +space available on your screen. + +image:single_terminal.png[Single terminal] + +It is important to keep in mind that i3 uses a table to manage your windows. At +the moment, you have exactly one column and one row which leaves you with one +cell. In this cell there is a container, which is where your new terminal is +opened. + +If you now open another terminal, you still have only one cell. However, the +container in that cell holds both of your terminals. So, a container is just a +group of clients with a specific layout. Containers can be resized by adjusting +the size of the cell that holds them. + +image:two_terminals.png[Two terminals] + +To move the focus between the two terminals, you use the direction keys which +you may know from the editor +vi+. However, in i3, your homerow is used for +these keys (in +vi+, the keys are shifted to the left by one for compatibility +with most keyboard layouts). Therefore, +Mod1+J+ is left, +Mod1+K+ is down, ++Mod1+L+ is up and `Mod1+;` is right. So, to switch between the terminals, +use +Mod1+K+ or +Mod1+L+. + +To create a new row/column (and a new cell), you can simply move a terminal (or +any other window) in the direction you want to expand your table. So, let’s +expand the table to the right by pressing `Mod1+Shift+;`. + +image:two_columns.png[Two columns] + +=== Changing container modes + +A container can have the following modes: + +default:: +Windows are sized so that every window gets an equal amount of space in the +container. +stacking:: +Only the focused window in the container is displayed. You get a list of +windows at the top of the container. +tabbed:: +The same principle as +stacking+, but the list of windows at the top is only +a single line which is vertically split. + +To switch modes, press +Mod1+e+ for default, +Mod1+h+ for stacking and ++Mod1+w+ for tabbed. + +image:modes.png[Container modes] + +=== Toggling fullscreen mode for a window + +To display a window fullscreen or to go out of fullscreen mode again, press ++Mod1+f+. + +There is also a global fullscreen mode in i3 in which the client will use all +available outputs. To use it, or to get out of it again, press +Mod1+Shift+f+. + +=== Opening other applications + +Aside from opening applications from a terminal, you can also use the handy ++dmenu+ which is opened by pressing +Mod1+v+ by default. Just type the name +(or a part of it) of the application which you want to open. The application +typed has to be in your +$PATH+ for this to work. + +Additionally, if you have applications you open very frequently, you can +create a keybinding for starting the application directly. See the section +"Configuring i3" for details. + +=== Closing windows + +If an application does not provide a mechanism for closing (most applications +provide a menu, the escape key or a shortcut like +Control+W+ to close), you +can press +Mod1+Shift+q+ to kill a window. For applications which support +the WM_DELETE protocol, this will correctly close the application (saving +any modifications or doing other cleanup). If the application doesn’t support +the WM_DELETE protocol your X server will kill the window and the behaviour +depends on the application. + +=== Using workspaces + +Workspaces are an easy way to group a set of windows. By default, you are on +the first workspace, as the bar on the bottom left indicates. To switch to +another workspace, press +Mod1+num+ where +num+ is the number of the workspace +you want to use. If the workspace does not exist yet, it will be created. + +A common paradigm is to put the web browser on one workspace, communication +applications (+mutt+, +irssi+, ...) on another one, and the ones with which you +work, on the third one. Of course, there is no need to follow this approach. + +If you have multiple screens, a workspace will be created on each screen at +startup. If you open a new workspace, it will be bound to the screen you +created it on. When you switch to a workspace on another screen, i3 will set +focus to that screen. + +=== Moving windows to workspaces + +To move a window to another workspace, simply press +Mod1+Shift+num+ where ++num+ is (like when switching workspaces) the number of the target workspace. +Similarly to switching workspaces, the target workspace will be created if +it does not yet exist. + +=== Resizing columns/rows + +To resize columns or rows, just grab the border between the two columns/rows +and move it to the wanted size. Please keep in mind that each cell of the table +holds a +container+ and thus you cannot horizontally resize single windows. If +you need applications with different horizontal sizes, place them in seperate +cells one above the other. + +See <> for how to configure i3 to be able to resize +columns/rows with your keyboard. + +=== Restarting i3 inplace + +To restart i3 inplace (and thus get into a clean state if there is a bug, or +to upgrade to a newer version of i3) you can use +Mod1+Shift+r+. Be aware, +though, that this kills your current layout and all the windows you have opened +will be put in a default container in only one cell. Saving layouts will be +implemented in a later version. + +=== Exiting i3 + +To cleanly exit i3 without killing your X server, you can use +Mod1+Shift+e+. + +=== Snapping + +Snapping is a mechanism to increase/decrease the colspan/rowspan of a container. +Colspan/rowspan is the number of columns/rows a specific cell of the table +consumes. This is easier explained by giving an example, so take the following +layout: + +image:snapping.png[Snapping example] + +To use the full size of your screen, you can now snap container 3 downwards +by pressing +Mod1+Control+k+ (or snap container 2 rightwards). + +=== Floating + +Floating mode is the opposite of tiling mode. The position and size of a window +are not managed by i3, but by you. Using this mode violates the tiling +paradigm but can be useful for some corner cases like "Save as" dialog +windows, or toolbar windows (GIMP or similar). + +You can enable floating mode for a window by pressing +Mod1+Shift+Space+. By +dragging the window’s titlebar with your mouse you can move the window +around. By grabbing the borders and moving them you can resize the window. You +can also do that by using the <>. + +For resizing floating windows with your keyboard, see <>. + +Floating windows are always on top of tiling windows. + +== Configuring i3 + +This is where the real fun begins ;-). Most things are very dependant on your +ideal working environment so we can’t make reasonable defaults for them. + +While not using a programming language for the configuration, i3 stays +quite flexible in regards to the things you usually want your window manager +to do. + +For example, you can configure bindings to jump to specific windows, +you can set specific applications to start on specific workspaces, you can +automatically start applications, you can change the colors of i3, and you +can bind your keys to do useful things. + +To change the configuration of i3, copy +/etc/i3/config+ to +\~/.i3/config+ +(or +~/.config/i3/config+ if you like the XDG directory scheme) and edit it +with a text editor. + +=== Comments + +It is possible and recommended to use comments in your configuration file to +properly document your setup for later reference. Comments are started with +a # and can only be used at the beginning of a line: + +*Examples*: +------------------- +# This is a comment +------------------- + +=== Fonts + +i3 uses X core fonts (not Xft) for rendering window titles and the internal +workspace bar. You can use +xfontsel(1)+ to generate such a font description. +To see special characters (Unicode), you need to use a font which supports +the ISO-10646 encoding. + +*Syntax*: +------------------------------ +font +------------------------------ + +*Examples*: +-------------------------------------------------------------- +font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 +-------------------------------------------------------------- + +[[keybindings]] + +=== Keyboard bindings + +A keyboard binding makes i3 execute a command (see below) upon pressing a +specific key. i3 allows you to bind either on keycodes or on keysyms (you can +also mix your bindings, though i3 will not protect you from overlapping ones). + +* A keysym (key symbol) is a description for a specific symbol, like "a" + or "b", but also more strange ones like "underscore" instead of "_". These + are the ones you use in Xmodmap to remap your keys. To get the current + mapping of your keys, use +xmodmap -pke+. + +* Keycodes do not need to have a symbol assigned (handy for some hotkeys + on some notebooks) and they will not change their meaning as you switch to a + different keyboard layout (when using +xmodmap+). + +My recommendation is: If you often switch keyboard layouts but you want to keep +your bindings in the same physical location on the keyboard, use keycodes. +If you don’t switch layouts, and want a clean and simple config file, use +keysyms. + +*Syntax*: +---------------------------------- +bindsym [Modifiers+]keysym command +bind [Modifiers+]keycode command +---------------------------------- + +*Examples*: +-------------------------------- +# Fullscreen +bindsym Mod1+f f + +# Restart +bindsym Mod1+Shift+r restart + +# Notebook-specific hotkeys +bind 214 exec /home/michael/toggle_beamer.sh +-------------------------------- + +Available Modifiers: + +Mod1-Mod5, Shift, Control:: +Standard modifiers, see +xmodmap(1)+ + +Mode_switch:: +Unlike other window managers, i3 can use Mode_switch as a modifier. This allows +you to remap capslock (for example) to Mode_switch and use it for both: typing +umlauts or special characters 'and' having some comfortably reachable key +bindings. For example, when typing, capslock+1 or capslock+2 for switching +workspaces is totally convenient. Try it :-). + +[[floating_modifier]] + +=== The floating modifier + +To move floating windows with your mouse, you can either grab their titlebar +or configure the so called floating modifier which you can then press and +click anywhere in the window itself to move it. The most common setup is to +use the same key you use for managing windows (Mod1 for example). Then +you can press Mod1, click into a window using your left mouse button, and drag +it to the position you want. + +When holding the floating modifier, you can resize a floating window by +pressing the right mouse button on it and moving around while holding it. If +you hold the shift button as well, the resize will be proportional. + +*Syntax*: +-------------------------------- +floating_modifier +-------------------------------- + +*Examples*: +-------------------------------- +floating_modifier Mod1 +-------------------------------- + +=== Layout mode for new containers + +This option determines in which mode new containers will start. See also +<>. + +*Syntax*: +--------------------------------------------- +new_container +new_container stack-limit +--------------------------------------------- + +*Examples*: +--------------------- +new_container tabbed +--------------------- + +=== Border style for new windows + +This option determines which border style new windows will have. + +*Syntax*: +--------------------------------------------- +new_window +--------------------------------------------- + +*Examples*: +--------------------- +new_window bp +--------------------- + +=== Variables + +As you learned in the section about keyboard bindings, you will have +to configure lots of bindings containing modifier keys. If you want to save +yourself some typing and be able to change the modifier you use later, +variables can be handy. + +*Syntax*: +-------------- +set name value +-------------- + +*Examples*: +------------------------ +set $m Mod1 +bindsym $m+Shift+r restart +------------------------ + +Variables are directly replaced in the file when parsing. There is no fancy +handling and there are absolutely no plans to change this. If you need a more +dynamic configuration you should create a little script which generates a +configuration file and run it before starting i3 (for example in your ++.xsession+ file). + +=== Automatically putting clients on specific workspaces + +[[assign_workspace]] + +It is recommended that you match on window classes wherever possible because +some applications first create their window, and then worry about setting the +correct title. Firefox with Vimperator comes to mind. The window starts up +being named Firefox, and only when Vimperator is loaded does the title change. +As i3 will get the title as soon as the application maps the window (mapping +means actually displaying it on the screen), you’d need to have to match on +'Firefox' in this case. + +You can prefix or suffix workspaces with a `~` to specify that matching clients +should be put into floating mode. If you specify only a `~`, the client will +not be put onto any workspace, but will be set floating on the current one. + +*Syntax*: +------------------------------------------------------------ +assign ["]window class[/window title]["] [→] [~ | workspace] +------------------------------------------------------------ + +*Examples*: +---------------------- +assign urxvt 2 +assign urxvt → 2 +assign "urxvt" → 2 +assign "urxvt/VIM" → 3 +assign "gecko" → ~4 +assign "xv/MPlayer" → ~ +---------------------- + +Note that the arrow is not required, it just looks good :-). If you decide to +use it, it has to be a UTF-8 encoded arrow, not "->" or something like that. + +=== Automatically starting applications on i3 startup + +By using the +exec+ keyword outside a keybinding, you can configure which +commands will be performed by i3 on initial startup (not when restarting i3 +in-place however). These commands will be run in order. + +*Syntax*: +------------ +exec command +------------ + +*Examples*: +-------------------------------- +exec sudo i3status | dzen2 -dock +-------------------------------- + +[[workspace_screen]] + +=== Automatically putting workspaces on specific screens + +If you assign clients to workspaces, it might be handy to put the +workspaces on specific screens. Also, the assignment of workspaces to screens +will determine which workspace i3 uses for a new screen when adding screens +or when starting (e.g., by default it will use 1 for the first screen, 2 for +the second screen and so on). + +*Syntax*: +---------------------------------- +workspace output +---------------------------------- + +The 'output' is the name of the RandR output you attach your screen to. On a +laptop, you might have VGA1 and LVDS1 as output names. You can see the +available outputs by running +xrandr --current+. + +*Examples*: +--------------------------- +workspace 1 output LVDS1 +workspace 5 output VGA1 +--------------------------- + +=== Named workspaces + +If you always have a certain arrangement of workspaces, you might want to give +them names (of course UTF-8 is supported): + +*Syntax*: +--------------------------------------- +workspace +workspace output name +--------------------------------------- + +For more details about the 'output' part of this command, see above. + +*Examples*: +-------------------------- +workspace 1 www +workspace 2 work +workspace 3 i ♥ workspaces +-------------------------- + +=== Changing colors + +You can change all colors which i3 uses to draw the window decorations and the +bottom bar. + +*Syntax*: +-------------------------------------------- +colorclass border background text +-------------------------------------------- + +Where colorclass can be one of: + +client.focused:: + A client which currently has the focus. +client.focused_inactive:: + A client which is the focused one of its container, but it does not have + the focus at the moment. +client.unfocused:: + A client which is not the focused one of its container. +client.urgent:: + A client which has its urgency hint activated. +bar.focused:: + The current workspace in the bottom bar. +bar.unfocused:: + All other workspaces in the bottom bar. +bar.urgent:: + A workspace which has at least one client with an activated urgency hint. + +You can also specify the color to be used to paint the background of the client +windows. This color will be used to paint the window on top of which the client +will be rendered. + +*Syntax*: +----------------------- +client.background color +----------------------- + +Only clients that do not cover the whole area of this window expose the color +used to paint it. If you use a color other than black for your terminals, you +most likely want to set the client background color to the same color as your +terminal program's background color to avoid black gaps between the rendered +area of the termianal and the i3 border. + +Colors are in HTML hex format (#rrggbb), see the following example: + +*Examples*: +-------------------------------------- +# class border backgr. text +client.focused #2F343A #900000 #FFFFFF +-------------------------------------- + +Note that for the window decorations, the color around the child window is the +background color, and the border color is only the two thin lines at the top of +the window. + +=== Interprocess communication + +i3 uses unix sockets to provide an IPC interface. This allows third-party +programs to get information from i3, such as the current workspaces +(to display a workspace bar), and to control i3. + +To enable it, you have to configure a path where the unix socket will be +stored. The default path is +~/.i3/ipc.sock+. + +*Examples*: +---------------------------- +ipc-socket ~/.i3/ipc.sock +---------------------------- + +You can then use the +i3-msg+ application to perform any command listed in +the next section. + +=== Disable focus follows mouse + +If you have a setup where your mouse usually is in your way (like a touchpad +on your laptop which you do not want to disable completely), you might want +to disable 'focus follows mouse' and control focus only by using your keyboard. +The mouse will still be useful inside the currently active window (for example +to click on links in your browser window). + +*Syntax*: +---------------------------- +focus_follows_mouse +---------------------------- + +*Examples*: +---------------------- +focus_follows_mouse no +---------------------- + +=== Internal workspace bar + +The internal workspace bar (the thing at the bottom of your screen) is very +simple -- it does not provide a way to display custom text and it does not +offer advanced customization features. This is intended because we do not +want to duplicate functionality of tools like +dzen2+, +xmobar+ and so on +(they render bars, we manage windows). Instead, there is an option which will +turn off the internal bar completely, so that you can use a separate program to +display it (see +i3-wsbar+, a sample implementation of such a program): + +*Syntax*: +---------------------- +workspace_bar +---------------------- + +*Examples*: +---------------- +workspace_bar no +---------------- + +== List of commands + +=== Manipulating layout + +To change the layout of the current container to stacking, use +s+, for default +use +d+ and for tabbed, use +T+. To make the current client (!) fullscreen, +use +f+, to make it span all outputs, use +fg+, to make it floating (or +tiling again) use +t+: + +*Examples*: +-------------- +bindsym Mod1+s s +bindsym Mod1+l d +bindsym Mod1+w T + +# Toggle fullscreen +bindsym Mod1+f f + +# Toggle global fullscreen +bindsym Mod1+Shift+f fg + +# Toggle floating/tiling +bindsym Mod1+t t +-------------- + +=== Focusing/Moving/Snapping clients/containers/screens + +To change the focus, use one of the +h+, +j+, +k+ and +l+ commands, meaning +left, down, up, right (respectively). To focus a container, prefix it with ++wc+. To focus a screen, prefix it with +ws+. + +The same principle applies for moving and snapping: just prefix the command +with +m+ when moving and with +s+ when snapping: + +*Examples*: +---------------------- +# Focus clients on the left, bottom, top, right: +bindsym Mod1+j h +bindsym Mod1+k j +bindsym Mod1+j k +bindsym Mod1+semicolon l + +# Move client to the left, bottom, top, right: +bindsym Mod1+j mh +bindsym Mod1+k mj +bindsym Mod1+j mk +bindsym Mod1+semicolon ml + +# Snap client to the left, bottom, top, right: +bindsym Mod1+j sh +bindsym Mod1+k sj +bindsym Mod1+j sk +bindsym Mod1+semicolon sl + +# Focus container on the left, bottom, top, right: +bindsym Mod3+j wch +… +---------------------- + +=== Changing workspaces/moving clients to workspaces + +To change to a specific workspace, the command is just the number of the +workspace, e.g. +1+ or +3+. To move the current client to a specific workspace, +prefix the number with an +m+. + +You can also switch to the next and previous workspace with the commands +nw+ +and +pw+, which is handy, for example, if you have workspace 1, 3, 4 and 9 and +you want to cycle through them with a single key combination. + +*Examples*: +------------------------- +bindsym Mod1+1 1 +bindsym Mod1+2 2 +... + +bindsym Mod1+Shift+1 m1 +bindsym Mod1+Shift+2 m2 +... + +bindsym Mod1+o nw +bindsym Mod1+p pw +------------------------- + +[[resizingconfig]] + +=== Resizing columns/rows + +If you want to resize columns/rows using your keyboard, you can use the ++resize+ command, I recommend using it inside a so called +mode+: + +.Example: Configuration file, defining a mode for resizing +---------------------------------------------------------------------- +mode "resize" { + # These bindings trigger as soon as you enter the resize mode + + # They resize the border in the direction you pressed, e.g. + # when pressing left, the window is resized so that it has + # more space on its left + + bindsym n resize left -10 + bindsym Shift+n resize left +10 + + bindsym r resize bottom +10 + bindsym Shift+r resize bottom -10 + + bindsym t resize top -10 + bindsym Shift+t resize top +10 + + bindsym d resize right +10 + bindsym Shift+d resize right -10 + + bind 36 mode default +} + +# Enter resize mode +bindsym Mod1+r mode resize +---------------------------------------------------------------------- + +=== Jumping to specific windows + +Often when in a multi-monitor environment, you want to quickly jump to a +specific window. For example, while working on workspace 3 you may want to +jump to your mail client to email your boss that you’ve achieved some +important goal. Instead of figuring out how to navigate to your mailclient, +it would be more convenient to have a shortcut. + +*Syntax*: +---------------------------------------------------- +jump ["]window class[/window title]["] +jump workspace [ column row ] +---------------------------------------------------- + +You can either use the same matching algorithm as in the +assign+ command +(see above) or you can specify the position of the client if you always use +the same layout. + +*Examples*: +-------------------------------------- +# Get me to the next open VIM instance +bindsym Mod1+a jump "urxvt/VIM" +-------------------------------------- + +=== VIM-like marks (mark/goto) + +[[vim_like_marks]] + +This feature is like the jump feature: It allows you to directly jump to a +specific window (this means switching to the appropriate workspace and setting +focus to the windows). However, you can directly mark a specific window with +an arbitrary label and use it afterwards. You do not need to ensure that your +windows have unique classes or titles, and you do not need to change your +configuration file. + +As the command needs to include the label with which you want to mark the +window, you cannot simply bind it to a key. +i3-input+ is a tool created +for this purpose: It lets you input a command and sends the command to i3. It +can also prefix this command and display a custom prompt for the input dialog. + +*Syntax*: +----------------- +mark +goto +----------------- + +*Examples*: +--------------------------------------- +# Read 1 character and mark the current window with this character +bindsym Mod1+m exec i3-input -p 'mark ' -l 1 -P 'Mark: ' + +# Read 1 character and go to the window with the character +bindsym Mod1+g exec i3-input -p 'goto ' -l 1 -P 'Goto: ' +--------------------------------------- + +Alternatively, if you do not want to mess with +i3-input+, you could create +seperate bindings for a specific set of labels and then only use those labels. + +=== Traveling the focus stack + +This mechanism can be thought of as the opposite of the +jump+ command. +It travels the focus stack and jumps to the window which had focus previously. + +*Syntax*: +-------------- +focus [number] | floating | tiling | ft +-------------- + +Where +number+ by default is 1 meaning that the next client in the focus stack +will be selected. + +The special values have the following meaning: + +floating:: + The next floating window is selected. +tiling:: + The next tiling window is selected. +ft:: + If the current window is floating, the next tiling window will be + selected; and vice-versa. + +=== Changing border style + +To change the border of the current client, you can use +bn+ to use the normal +border (including window title), +bp+ to use a 1-pixel border (no window title) +and +bb+ to make the client borderless. There is also +bt+ which will toggle +the different border styles. + +*Examples*: +------------------ +bindsym Mod1+t bn +bindsym Mod1+y bp +bindsym Mod1+u bb +------------------ + +[[stack-limit]] + +=== Changing the stack-limit of a container + +If you have a single container with a lot of windows inside it (say, more than +10), the default layout of a stacking container can get a little unhandy. +Depending on your screen’s size, you might end up seeing only half of the +titlebars for each window in the container. + +Using the +stack-limit+ command, you can limit the number of rows or columns +in a stacking container. i3 will create columns or rows (depending on what +you limited) automatically as needed. + +*Syntax*: +-------------------------------- +stack-limit +-------------------------------- + +*Examples*: +------------------- +# I always want to have two window titles in one line +stack-limit cols 2 + +# Not more than 5 rows in this stacking container +stack-limit rows 5 +------------------- + +image:stacklimit.png[Container limited to two columns] + +=== Reloading/Restarting/Exiting + +You can make i3 reload its configuration file with +reload+. You can also +restart i3 inplace with the +restart+ command to get it out of some weird state +(if that should ever happen) or to perform an upgrade without having to restart +your X session. However, your layout is not preserved at the moment, meaning +that all open windows will end up in a single container in default layout +after the restart. To exit i3 properly, you can use the +exit+ command, +however you don’t need to (simply killing your X session is fine as well). + +*Examples*: +---------------------------- +bindsym Mod1+Shift+r restart +bindsym Mod1+Shift+w reload +bindsym Mod1+Shift+e exit +---------------------------- + +[[multi_monitor]] + +== Multiple monitors + +As you can see in the goal list on the website, i3 was specifically developed +with support for multiple monitors in mind. This section will explain how to +handle multiple monitors. + +When you have only one monitor, things are simple. You usually start with +workspace 1 on your monitor and open new ones as you need them. + +When you have more than one monitor, each monitor will get an initial +workspace. The first monitor gets 1, the second gets 2 and a possible third +would get 3. When you switch to a workspace on a different monitor, i3 will +switch to that monitor and then switch to the workspace. This way, you don’t +need shortcuts to switch to a specific monitor, and you don’t need to remember +where you put which workspace. New workspaces will be opened on the currently +active monitor. It is not possible to have a monitor without a workspace. + +The idea of making workspaces global is based on the observation that most +users have a very limited set of workspaces on their additional monitors. +They are often used for a specific task (browser, shell) or for monitoring +several things (mail, IRC, syslog, …). Thus, using one workspace on one monitor +and "the rest" on the other monitors often makes sense. However, as you can +create an unlimited number of workspaces in i3 and tie them to specific +screens, you can have the "traditional" approach of having X workspaces per +screen by changing your configuration (using modes, for example). + +=== Configuring your monitors + +To help you get going if you have never used multiple monitors before, here is +a short overview of the xrandr options which will probably be of interest to +you. It is always useful to get an overview of the current screen configuration. +Just run "xrandr" and you will get an output like the following: +------------------------------------------------------------------------------- +$ xrandr +Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192 +VGA1 disconnected (normal left inverted right x axis y axis) +LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm + 1280x800 60.0*+ 50.0 + 1024x768 85.0 75.0 70.1 60.0 + 832x624 74.6 + 800x600 85.1 72.2 75.0 60.3 56.2 + 640x480 85.0 72.8 75.0 59.9 + 720x400 85.0 + 640x400 85.1 + 640x350 85.1 +-------------------------------------------------------------------------------------- + +Several things are important here: You can see that +LVDS1+ is connected (of +course, it is the internal flat panel) but +VGA1+ is not. If you have a monitor +connected to one of the ports but xrandr still says "disconnected", you should +check your cable, monitor or graphics driver. + +The maximum resolution you can see at the end of the first line is the maximum +combined resolution of your monitors. By default, it is usually too low and has +to be increased by editing +/etc/X11/xorg.conf+. + +So, say you connected VGA1 and want to use it as an additional screen: +------------------------------------------- +xrandr --output VGA1 --auto --left-of LVDS1 +------------------------------------------- +This command makes xrandr try to find the native resolution of the device +connected to +VGA1+ and configures it to the left of your internal flat panel. +When running "xrandr" again, the output looks like this: +------------------------------------------------------------------------------- +$ xrandr +Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192 +VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm + 1280x1024 60.0*+ 75.0 + 1280x960 60.0 + 1152x864 75.0 + 1024x768 75.1 70.1 60.0 + 832x624 74.6 + 800x600 72.2 75.0 60.3 56.2 + 640x480 72.8 75.0 66.7 60.0 + 720x400 70.1 +LVDS1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 261mm x 163mm + 1280x800 60.0*+ 50.0 + 1024x768 85.0 75.0 70.1 60.0 + 832x624 74.6 + 800x600 85.1 72.2 75.0 60.3 56.2 + 640x480 85.0 72.8 75.0 59.9 + 720x400 85.0 + 640x400 85.1 + 640x350 85.1 +------------------------------------------------------------------------------- +Please note that i3 uses exactly the same API as xrandr does, so it will see +only what you can see in xrandr. + +See also <> for more examples of multi-monitor setups. + +=== Interesting configuration for multi-monitor environments + +There are several things to configure in i3 which may be interesting if you +have more than one monitor: + +1. You can specify which workspace should be put on which screen. This + allows you to have a different set of workspaces when starting than just + 1 for the first monitor, 2 for the second and so on. See + <>. +2. If you want some applications to generally open on the bigger screen + (MPlayer, Firefox, …), you can assign them to a specific workspace, see + <>. +3. If you have many workspaces on many monitors, it might get hard to keep + track of which window you put where. Thus, you can use vim-like marks to + quickly switch between windows. See <>. + +== i3 and the rest of your software world + +=== Displaying a status line + +A very common thing amongst users of exotic window managers is a status line at +some corner of the screen. It is an often superior replacement to the widget +approach you have in the task bar of a traditional desktop environment. + +If you don’t already have your favorite way of generating such a status line +(self-written scripts, conky, …), then i3status is the recommended tool for +this task. It was written in C with the goal of using as few syscalls as +possible to reduce the time your CPU is woken up from sleep states. + +Regardless of which application you use to generate the status line, you +want to make sure that the application does one of the following things: + +1. Register as a dock window using EWMH hints. This will make i3 position the + window above the workspace bar but below every other client. This is the + recommended way, but in case of dzen2, for example, you need to check out + the source of dzen2 from subversion, as the -dock option is not present + in the released versions. +2. Overlay the internal workspace bar. This method will not waste any space + on the workspace bar, however, it is rather hackish. Just configure + the output window to be over the workspace bar (say -x 200 and -y 780 if + your screen is 800 px height). + +The planned solution for this problem is to make the workspace bar optional +and switch to a third party application completely (dzen2 for example) +which will then contain the workspace bar. + +=== Giving presentations (multi-monitor) + +When giving a presentation, you typically want the audience to see what you see +on your screen and then go through a series of slides (if the presentation is +simple). For more complex presentations, you might want to have some notes +which only you can see on your screen, while the audience can only see the +slides. + +[[presentations]] +==== Case 1: everybody gets the same output +This is the simple case. You connect your computer to the video projector, +turn on both (computer and video projector) and configure your X server to +clone the internal flat panel of your computer to the video output: +----------------------------------------------------- +xrandr --output VGA1 --mode 1024x768 --same-as LVDS1 +----------------------------------------------------- +i3 will then use the lowest common subset of screen resolutions, the rest of +your screen will be left untouched (it will show the X background). So, in +our example, this would be 1024x768 (my notebook has 1280x800). + +==== Case 2: you can see more than your audience +This case is a bit harder. First of all, you should configure the VGA output +somewhere near your internal flat panel, say right of it: +----------------------------------------------------- +xrandr --output VGA1 --mode 1024x768 --right-of LVDS1 +----------------------------------------------------- +Now, i3 will put a new workspace (depending on your settings) on the new screen +and you are in multi-monitor mode (see <>). + +Because i3 is not a compositing window manager, there is no ability to +display a window on two screens at the same time. Instead, your presentation +software needs to do this job (that is, open a window on each screen). diff --git a/_docs/wsbar b/_docs/wsbar new file mode 100644 index 0000000..9e379dd --- /dev/null +++ b/_docs/wsbar @@ -0,0 +1,94 @@ +External workspace bars +======================= +Michael Stapelberg +May 2010 + +This document describes why the internal workspace bar is minimal and how an +external workspace bar can be used. It explains the concepts using +i3-wsbar+ +as the reference implementation. + +== Internal and external bars + +The internal workspace bar of i3 is meant to be a reasonable default so that +you can use i3 without having too much hassle when setting it up. It is quite +simple and intended to stay this way. So, there is no way to display your own +information in this bar (unlike dwm, wmii, awesome, …). + +We chose not to implement such a mechanism because that would be duplicating +already existing functionality of tools such as dzen2, xmobar and similar. +Instead, you should disable the internal bar and use an external workspace bar +(which communicates with i3 through its IPC interface). + +== dock mode + +You typically want to see the same workspace bar on every workspace on a +specific screen. Also, you don’t want to place the workspace bar somewhere +in your layout by hand. This is where dock mode comes in: When a program sets +the appropriate hint (_NET_WM_WINDOW_TYPE_DOCK), it will be managed in dock +mode by i3. That means it will be placed at the bottom of the screen (while +other edges of the screen are possible in the NetWM standard, this is not yet +implemented in i3), it will not overlap any other window and it will be on +every workspace for the specific screen it was placed on initially. + +== The IPC interface + +In the context of using an external workspace bar, the IPC interface needs to +provide the bar program with the current workspaces and output (as in VGA-1, +LVDS-1, …) configuration. In the other direction, the program has to be able +to switch to specific workspaces. + +By default, the IPC interface is enabled and places its UNIX socket in ++~/.i3/ipc.sock+. + +To learn more about the protocol which is used for IPC, see +docs/ipc+. + +== Output changes (on-the-fly) + +i3 implements the RandR API and can handle changing outputs quite well. So, an +external workspace bar implementation needs to make sure that when you change +the resolution of any of your screens (or enable/disable an output), the bars +will be adjusted properly. + +== i3-wsbar, the reference implementation + +Please keep in mind that +i3-wsbar+ is just a reference implementation. It is +shipped with i3 to have a reasonable default. Thus, +i3-wsbar+ is designed to +work well with dzen2 and there are no plans to make it more generic. + +=== The big picture + +The most common reason to use an external workspace bar is to integrate system +information such as what +i3status+ provides into the workspace bar (to save +screen space). So, we have +i3status+ or a similar program, which only provides +text output (formatted in some way). To display this text nicely on the screen, +there are programs such as dzen2, xmobar and similar. We will stick to dzen2 +from here on. So, we have the output of i3status, which needs to go into dzen2 +somehow. But we also want to display the list of workspaces. +i3-wsbar+ takes +input on stdin, combines it with a formatted workspace list and pipes it to +dzen2. + +Please note that +i3-wsbar+ does not print its output to stdout. Instead, it +launches the dzen2 instances on its own. This is necessary to handle changes +in the available outputs (to place a new dzen2 on a new screen for example). + +image:wsbar.png["Overview",link="wsbar.png"] + +=== Running i3-wsbar + +The most simple usage of i3-wsbar looks like this: +------------------------------- +i3-wsbar -c "dzen2 -x %x -dock" +------------------------------- + +The +%x+ in the command name will be replaced by the X position of the output +for which this workspace bar is running. i3 will automatically place the +workspace bar on the correct output when dzen2 is started in dock mode. The +bar which you will see should look exactly like the internal bar of i3. + +To actually get a benefit, you want to give +i3-wsbar+ some input: +------------------------------------------ +i3status | i3-wsbar -c "dzen2 -x %x -dock" +------------------------------------------ + +It is recommended to place the above command in your i3 configuration file +to start it automatically with i3. diff --git a/css/xhtml11.css b/css/xhtml11.css new file mode 100644 index 0000000..f4fd4d4 --- /dev/null +++ b/css/xhtml11.css @@ -0,0 +1,404 @@ +a { + color: #3ec2ff; + text-decoration: underline; +} +a:visited { + color: fuchsia; +} + +em { + font-style: italic; + color: #3ec2ff; +} + +strong { + font-weight: bold; + color: #3ec2ff; +} + +tt { + font-family: 'Droid Sans Mono', sans-serif; + font-size: inherit; + color: #3ec2ff; +} + +div.listingblock tt { + color: black; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 1.2em; + margin-bottom: 0.5em; +} + +h2 { + padding-top: 0.5em; +} +h3 { + float: left; +} +h3 + * { + clear: left; +} + +div.sectionbody { + margin-left: 0; +} + +hr { + border: 1px solid silver; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +ul, ol, li > p { + margin-top: 0; +} +/*ul > li { color: #aaa; }*/ +/*ul > li > * { color: black; }*/ + +pre { + padding: 0; + margin: 0; +} + +span#author { + font-weight: bold; + font-size: 1.1em; +} +span#email { +} +span#revnumber, span#revdate, span#revremark { +} + +div#footer { + font-size: small; + border-top: 2px solid silver; + padding-top: 0.5em; + margin-top: 4.0em; +} +div#footer-text { + float: left; + padding-bottom: 0.5em; +} +div#footer-badges { + float: right; + padding-bottom: 0.5em; +} + +div#preamble { + margin-top: 1.5em; + margin-bottom: 1.5em; +} +div.tableblock, div.imageblock, div.exampleblock, div.verseblock, +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, +div.admonitionblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.admonitionblock { + margin-top: 2.0em; + margin-bottom: 2.0em; + margin-right: 10%; + color: #606060; +} + +div.content { /* Block element content. */ + padding: 0; +} + +/* Block element titles. */ +div.title, caption.title { + font-weight: bold; + text-align: left; + margin-top: 1.0em; + margin-bottom: 0.5em; +} +div.title + * { + margin-top: 0; +} + +td div.title:first-child { + margin-top: 0.0em; +} +div.content div.title:first-child { + margin-top: 0.0em; +} +div.content + div.title { + margin-top: 0.0em; +} + +div.sidebarblock > div.content { + border: 1px solid #dddddd; + border-left: 4px solid #f0f0f0; + padding: 0.5em; +} + +div.listingblock > div.content { + border: 1px solid #dddddd; + border-left: 5px solid #f0f0f0; + background: #f8f8f8; + padding: 0.5em; +} + +div.quoteblock, div.verseblock { + padding-left: 1.0em; + margin-left: 1.0em; + margin-right: 10%; + border-left: 5px solid #f0f0f0; + color: #777777; +} + +div.quoteblock > div.attribution { + padding-top: 0.5em; + text-align: right; +} + +div.verseblock > pre.content { + font-family: inherit; + font-size: inherit; +} +div.verseblock > div.attribution { + padding-top: 0.75em; + text-align: left; +} +/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ +div.verseblock + div.attribution { + text-align: left; +} + +div.admonitionblock .icon { + vertical-align: top; + font-size: 1.1em; + font-weight: bold; + text-decoration: underline; + color: #3ec2ff; + padding-right: 0.5em; +} +div.admonitionblock td.content { + padding-left: 0.5em; + border-left: 3px solid #dddddd; +} + +div.exampleblock > div.content { + border-left: 3px solid #dddddd; + padding-left: 0.5em; +} + +div.imageblock div.content { padding-left: 0; } +span.image img { border-style: none; } +a.image:visited { color: white; } + +dl { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +dt { + margin-top: 0.5em; + margin-bottom: 0; + font-style: normal; + color: #3ec2ff; +} +dd > *:first-child { + margin-top: 0.1em; +} + +ul, ol { + list-style-position: outside; +} +ol.arabic { + list-style-type: decimal; +} +ol.loweralpha { + list-style-type: lower-alpha; +} +ol.upperalpha { + list-style-type: upper-alpha; +} +ol.lowerroman { + list-style-type: lower-roman; +} +ol.upperroman { + list-style-type: upper-roman; +} + +div.compact ul, div.compact ol, +div.compact p, div.compact p, +div.compact div, div.compact div { + margin-top: 0.1em; + margin-bottom: 0.1em; +} + +div.tableblock > table { + border: 3px solid #3ec2ff; +} +thead, p.table.header { + font-weight: bold; + color: #3ec2ff; +} +tfoot { + font-weight: bold; +} +td > div.verse { + white-space: pre; +} +p.table { + margin-top: 0; +} +/* Because the table frame attribute is overriden by CSS in most browsers. */ +div.tableblock > table[frame="void"] { + border-style: none; +} +div.tableblock > table[frame="hsides"] { + border-left-style: none; + border-right-style: none; +} +div.tableblock > table[frame="vsides"] { + border-top-style: none; + border-bottom-style: none; +} + + +div.hdlist { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +div.hdlist tr { + padding-bottom: 15px; +} +dt.hdlist1.strong, td.hdlist1.strong { + font-weight: bold; +} +td.hdlist1 { + vertical-align: top; + font-style: normal; + padding-right: 0.8em; + color: navy; +} +td.hdlist2 { + vertical-align: top; +} +div.hdlist.compact tr { + margin: 0; + padding-bottom: 0; +} + +.comment { + background: yellow; +} + +.footnote, .footnoteref { + font-size: 0.8em; +} + +span.footnote, span.footnoteref { + vertical-align: super; +} + +#footnotes { + margin: 20px 0 20px 0; + padding: 7px 0 0 0; +} + +#footnotes div.footnote { + margin: 0 0 5px 0; +} + +#footnotes hr { + border: none; + border-top: 1px solid silver; + height: 1px; + text-align: left; + margin-left: 0; + width: 20%; + min-width: 100px; +} + +div.colist td { + padding-right: 0.5em; + padding-bottom: 0.3em; + vertical-align: top; +} +div.colist td img { + margin-top: 0.3em; +} + +@media print { + div#footer-badges { display: none; } +} + +div#toc { + margin-bottom: 2.5em; +} + +div#toctitle { + color: #3ec2ff; + font-size: 1.1em; + font-weight: bold; + margin-top: 1.0em; + margin-bottom: 0.1em; +} + +div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { + margin-top: 0; + margin-bottom: 0; +} +div.toclevel2 { + margin-left: 2em; + font-size: 0.9em; +} +div.toclevel3 { + margin-left: 4em; + font-size: 0.9em; +} +div.toclevel4 { + margin-left: 6em; + font-size: 0.9em; +} + +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +@font-face { + font-family: 'Droid Sans Mono'; + font-style: normal; + font-weight: normal; + src: local('Droid Sans Mono'), local('DroidSansMono'), url('/fonts/DroidSansMono.ttf') format('truetype'); +} diff --git a/docs/bigpicture.png b/docs/bigpicture.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3c8db751232c1cdb2b7132a19de8bef39f7a39 GIT binary patch literal 9179 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 literal 0 HcmV?d00001 diff --git a/docs/debugging.html b/docs/debugging.html new file mode 100644 index 0000000..51abbf9 --- /dev/null +++ b/docs/debugging.html @@ -0,0 +1,148 @@ + + + + + +i3: Debugging i3: How To + + + + + + + +
    +

    i3 - improved tiling WM

    + +
    +
    + +
    +
    +

    This document describes how to debug i3 suitably for sending us useful bug +reports, even if you have no clue of C programming.

    +

    First of all: Thank you for being interested in debugging i3. It really means +something to us to get your bug fixed. If you have any questions about the +debugging and/or need further help, do not hesitate to contact us!

    +
    +
    +
    +

    1. Enabling logging

    +
    +

    i3 spits out much information onto stdout, if told so. To have a clearly +defined place where log files will be saved, you should redirect stdout and +stderr in xsession. While you’re at it, putting each run of i3 in a separate +log file with date/time in it is a good idea to not get confused about the +different log files later on.

    +
    +
    +
    exec /usr/bin/i3 -V -d all >/home/michael/i3/i3log-$(date +'%F-%k-%M-%S') 2>&1
    +
    +
    +
    +
    +

    2. Enabling core dumps

    +
    +

    When i3 crashes, often you have the chance of getting a core dump (an image +of the memory of the i3 process which can be loaded into a debugger). To get a +core dump, you have to make sure that the user limit for core dump files is set +high enough. Many systems ship with a default value which even forbids core +dumps completely. To disable the limit completely and thus enable core dumps, +use the following command (in your .xsession, before starting i3):

    +
    +
    +
    ulimit -c unlimited
    +
    +

    Furthermore, to easily recognize core dumps and allow multiple of them, you +should set a custom core dump filename pattern, using a command like the +following:

    +
    +
    +
    sudo sysctl -w kernel.core_pattern=core.%e.%p
    +
    +

    This will generate files which have the executable’s file name (%e) and the +process id (%p) in it. You can save this setting across reboots using +/etc/sysctl.conf.

    +
    +
    +
    +

    3. Compiling with debug symbols

    +
    +

    To actually get useful core dumps, you should make sure that your version of i3 +is compiled with debug symbols, that is, that they are not stripped during the +build process. You can check whether your executable contains symbols by +issuing the following command:

    +
    +
    +
    file $(which i3)
    +
    +

    You should get an output like this:

    +
    +
    +
    /usr/bin/i3: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
    +linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
    +
    +

    Notice the not stripped, which is the important part. If you have a version +which is stripped, please have a look if your distribution provides debug +symbols (package i3-wm-dbg on Debian for example) or if you can turn off +stripping. If nothing helps, please build i3 from source.

    +
    +
    +
    +

    4. Generating a backtrace

    +
    +

    Once you have made sure that your i3 is compiled with debug symbols and that +core dumps are enabled, you can start making sense out of the core dumps.

    +

    Because the core dump depends on the original executable (and its debug +symbols), please do this as soon as you encounter the problem. If you +re-compile i3, your core dump might be useless afterwards.

    +

    Please install gdb, a debugger for C. No worries, you don’t need to learn it +now. Start gdb using the following command (replacing the actual name of the +core dump of course):

    +
    +
    +
    gdb $(which i3) core.i3.3849
    +
    +

    Then, generate a backtrace using:

    +
    +
    +
    backtrace full
    +
    +
    +
    +
    +

    5. Sending bug reports/debugging on IRC

    +
    +

    When sending bug reports, please paste the relevant part of the log (if in +doubt, please send us rather too much information than too less) and the whole +backtrace (if there was a core dump).

    +

    When debugging with us in IRC, be prepared to use a so called nopaste service +such as http://nopaste.info or http://pastebin.com because pasting large +amounts of text in IRC sometimes leads to incomplete lines (servers have line +length limitations) or flood kicks.

    +
    +
    +
    +

    + + + diff --git a/docs/hacking-howto.html b/docs/hacking-howto.html new file mode 100644 index 0000000..d99aad9 --- /dev/null +++ b/docs/hacking-howto.html @@ -0,0 +1,891 @@ + + + + + +i3: Hacking i3: How To + + + + + + + +
    +

    i3 - improved tiling WM

    + +
    +
    + +
    +
    +

    This document is intended to be the first thing you read before looking and/or +touching i3’s source code. It should contain all important information to help +you understand why things are like they are. If it does not mention something +you find necessary, please do not hesitate to contact me.

    +
    +
    +
    +

    1. Window Managers

    +
    +

    A window manager is not necessarily needed to run X, but it is usually used in +combination with X to facilitate some things. The window manager’s job is to +take care of the placement of windows, to provide the user with some mechanisms +to change the position/size of windows and to communicate with clients to a +certain extent (for example handle fullscreen requests of clients such as +MPlayer).

    +

    There are no different contexts in which X11 clients run, so a window manager +is just another client, like all other X11 applications. However, it handles +some events which normal clients usually don’t handle.

    +

    In the case of i3, the tasks (and order of them) are the following:

    +
      +
    1. +

      +Grab the key bindings (events will be sent upon keypress/keyrelease) +

      +
    2. +
    3. +

      +Iterate through all existing windows (if the window manager is not started as + the first client of X) and manage them (reparent them, create window + decorations, etc.) +

      +
    4. +
    5. +

      +When new windows are created, manage them +

      +
    6. +
    7. +

      +Handle the client’s _WM_STATE property, but only the _WM_STATE_FULLSCREEN +

      +
    8. +
    9. +

      +Handle the client’s WM_NAME property +

      +
    10. +
    11. +

      +Handle the client’s size hints to display them proportionally +

      +
    12. +
    13. +

      +Handle the client’s urgency hint +

      +
    14. +
    15. +

      +Handle enter notifications (focus follows mouse) +

      +
    16. +
    17. +

      +Handle button (as in mouse buttons) presses for focus/raise on click +

      +
    18. +
    19. +

      +Handle expose events to re-draw own windows such as decorations +

      +
    20. +
    21. +

      +React to the user’s commands: Change focus, Move windows, Switch workspaces, + Change the layout mode of a container (default/stacking/tabbed), start a new + application, restart the window manager +

      +
    22. +
    +

    In the following chapters, each of these tasks and their implementation details +will be discussed.

    +
    +

    1.1. Tiling window managers

    +

    Traditionally, there are two approaches to managing windows: The most common +one nowadays is floating, which means the user can freely move/resize the +windows. The other approach is called tiling, which means that your window +manager distributes windows to use as much space as possible while not +overlapping each other.

    +

    The idea behind tiling is that you should not need to waste your time +moving/resizing windows while you usually want to get some work done. After +all, most users sooner or later tend to lay out their windows in a way which +corresponds to tiling or stacking mode in i3. Therefore, why not let i3 do this +for you? Certainly, it’s faster than you could ever do it.

    +

    The problem with most tiling window managers is that they are too unflexible. +In my opinion, a window manager is just another tool, and similar to vim which +can edit all kinds of text files (like source code, HTML, …) and is not limited +to a specific file type, a window manager should not limit itself to a certain +layout (like dwm, awesome, …) but provide mechanisms for you to easily create +the layout you need at the moment.

    +
    +
    +

    1.2. The layout table

    +

    To accomplish flexible layouts, we decided to simply use a table. The table +grows and shrinks as you need it. Each cell holds a container which then holds +windows (see picture below). You can use different layouts for each container +(default layout and stacking layout).

    +

    So, when you open a terminal and immediately open another one, they reside in +the same container, in default layout. The layout table has exactly one column, +one row and therefore one cell. When you move one of the terminals to the +right, the table needs to grow. It will be expanded to two columns and one row. +This enables you to have different layouts for each container. The table then +looks like this:

    +
    + +++ + + + + + +

    T1

    T2

    +
    +

    When moving terminal 2 to the bottom, the table will be expanded again.

    +
    + +++ + + + + + + + + + +

    T1

    T2

    +
    +

    You can really think of the layout table like a traditional HTML table, if +you’ve ever designed one. Especially col- and rowspan work similarly. Below, +you see an example of colspan=2 for the first container (which has T1 as +window).

    +
    + ++ + + + + + + + +
    +
    +
    T1
    +
    + +++ + + + + + +

    T2

    T3

    +
    +
    +

    Furthermore, you can freely resize table cells.

    +
    +
    +
    +
    +

    2. Files

    +
    +
    +
    +include/data.h +
    +
    +

    +Contains data definitions used by nearly all files. You really need to read +this first. +

    +
    +
    +include/*.h +
    +
    +

    +Contains forward definitions for all public functions, as well as +doxygen-compatible comments (so if you want to get a bit more of the big +picture, either browse all header files or use doxygen if you prefer that). +

    +
    +
    +src/cfgparse.l +
    +
    +

    +Contains the lexer for i3’s configuration file, written for flex(1). +

    +
    +
    +src/cfgparse.y +
    +
    +

    +Contains the parser for i3’s configuration file, written for bison(1). +

    +
    +
    +src/click.c +
    +
    +

    +Contains all functions which handle mouse button clicks (right mouse button +clicks initiate resizing and thus are relatively complex). +

    +
    +
    +src/client.c +
    +
    +

    +Contains all functions which are specific to a certain client (make it +fullscreen, see if its class/name matches a pattern, kill it, …). +

    +
    +
    +src/commands.c +
    +
    +

    +Parsing commands and actually executing them (focusing, moving, …). +

    +
    +
    +src/config.c +
    +
    +

    +Parses the configuration file. +

    +
    +
    +src/debug.c +
    +
    +

    +Contains debugging functions to print unhandled X events. +

    +
    +
    +src/floating.c +
    +
    +

    +Contains functions for floating mode (mostly resizing/dragging). +

    +
    +
    +src/handlers.c +
    +
    +

    +Contains all handlers for all kinds of X events (new window title, new hints, +unmapping, key presses, button presses, …). +

    +
    +
    +src/ipc.c +
    +
    +

    +Contains code for the IPC interface. +

    +
    +
    +src/layout.c +
    +
    +

    +Renders your layout (screens, workspaces, containers). +

    +
    +
    +src/mainx.c +
    +
    +

    +Initializes the window manager. +

    +
    +
    +src/manage.c +
    +
    +

    +Looks at existing or new windows and decides whether to manage them. If so, it +reparents the window and inserts it into our data structures. +

    +
    +
    +src/resize.c +
    +
    +

    +Contains the functions to resize columns/rows in the table. +

    +
    +
    +src/table.c +
    +
    +

    +Manages the most important internal data structure, the design table. +

    +
    +
    +src/util.c +
    +
    +

    +Contains useful functions which are not really dependant on anything. +

    +
    +
    +src/workspace.c +
    +
    +

    +Contains all functions related to workspaces (displaying, hiding, renaming…) +

    +
    +
    +src/xcb.c +
    +
    +

    +Contains wrappers to use xcb more easily. +

    +
    +
    +src/xinerama.c +
    +
    +

    +(Re-)initializes the available screens and converts them to virtual screens +(see below). +

    +
    +
    +
    +
    +
    +

    3. Data structures

    +
    +

    See include/data.h for documented data structures. The most important ones are +explained right here.

    +

    +The Big Picture +

    +

    So, the hierarchy is:

    +
      +
    1. +

      +Virtual screens (Screen 0 in this example) +

      +
    2. +
    3. +

      +Workspaces (Workspace 1 in this example) +

      +
    4. +
    5. +

      +Table (There can only be one table per Workspace) +

      +
    6. +
    7. +

      +Container (left and right in this example) +

      +
    8. +
    9. +

      +Client (The two clients in the left container) +

      +
    10. +
    +
    +

    3.1. Virtual screens

    +

    A virtual screen (type i3Screen) is generated from the connected screens +obtained through Xinerama. The difference to the raw Xinerama monitors as seen +when using xrandr(1) is that it falls back to the lowest common resolution of +the logical screens.

    +

    For example, if your notebook has 1280x800 and you connect a video projector +with 1024x768, set up in clone mode (xrandr --output VGA --mode 1024x768 +--same-as LVDS), i3 will have one virtual screen.

    +

    However, if you configure it using xrandr --output VGA --mode 1024x768 +--right-of LVDS, i3 will generate two virtual screens. For each virtual +screen, a new workspace will be assigned. New workspaces are created on the +screen you are currently on.

    +
    +
    +

    3.2. Workspace

    +

    A workspace is identified by its number. Basically, you could think of +workspaces as different desks in your office, if you like the desktop +methaphor. They just contain different sets of windows and are completely +separate of each other. Other window managers also call this “Virtual +desktops”.

    +
    +
    +

    3.3. The layout table

    +

    Each workspace has a table, which is just a two-dimensional dynamic array +containing Containers (see below). This table grows and shrinks as you need it +(by moving windows to the right you can create a new column in the table, by +moving them to the bottom you create a new row).

    +
    +
    +

    3.4. Container

    +

    A container is the content of a table’s cell. It holds an arbitrary amount of +windows and has a specific layout (default layout, stack layout or tabbed +layout). Containers can consume multiple table cells by modifying their +colspan/rowspan attribute.

    +
    +
    +

    3.5. Client

    +

    A client is x11-speak for a window.

    +
    +
    +
    +
    +

    4. List/queue macros

    +
    +

    i3 makes heavy use of the list macros defined in BSD operating systems. To +ensure that the operating system on which i3 is compiled has all the expected +features, i3 comes with include/queue.h. On BSD systems, you can use man +queue(3). On Linux, you have to use google (or read the source).

    +

    The lists used are SLIST (single linked lists), CIRCLEQ (circular +queues) and TAILQ (tail queues). Usually, only forward traversal is necessary, +so an SLIST works fine. If inserting elements at arbitrary positions or at +the end of a list is necessary, a TAILQ is used instead. However, for the +windows inside a container, a CIRCLEQ is necessary to go from the currently +selected window to the window above/below.

    +
    +
    +
    +

    5. Naming conventions

    +
    +

    There is a row of standard variables used in many events. The following names +should be chosen for those:

    +
      +
    • +

      +“conn” is the xcb_connection_t +

      +
    • +
    • +

      +“event” is the event of the particular type +

      +
    • +
    • +

      +“container” names a container +

      +
    • +
    • +

      +“client” names a client, for example when using a CIRCLEQ_FOREACH +

      +
    • +
    +
    +
    +
    +

    6. Startup (src/mainx.c, main())

    +
    +
      +
    • +

      +Establish the xcb connection +

      +
    • +
    • +

      +Check for XKB extension on the separate X connection +

      +
    • +
    • +

      +Check for Xinerama screens +

      +
    • +
    • +

      +Grab the keycodes for which bindings exist +

      +
    • +
    • +

      +Manage all existing windows +

      +
    • +
    • +

      +Enter the event loop +

      +
    • +
    +
    +
    +
    +

    7. Keybindings

    +
    +
    +

    7.1. Grabbing the bindings

    +

    Grabbing the bindings is quite straight-forward. You pass X your combination of +modifiers and the keycode you want to grab and whether you want to grab them +actively or passively. Most bindings (everything except for bindings using +Mode_switch) are grabbed passively, that is, just the window manager gets the +event and cannot replay it.

    +

    We need to grab bindings that use Mode_switch actively because of a bug in X. +When the window manager receives the keypress/keyrelease event for an actively +grabbed keycode, it has to decide what to do with this event: It can either +replay it so that other applications get it or it can prevent other +applications from receiving it.

    +

    So, why do we need to grab keycodes actively? Because X does not set the +state-property of keypress/keyrelease events properly. The Mode_switch bit is +not set and we need to get it using XkbGetState. This means we cannot pass X +our combination of modifiers containing Mode_switch when grabbing the key and +therefore need to grab the keycode itself without any modifiers. This means, +if you bind Mode_switch + keycode 38 ("a"), i3 will grab keycode 38 ("a") and +check on each press of "a" if the Mode_switch bit is set using XKB. If yes, it +will handle the event, if not, it will replay the event.

    +
    +
    +

    7.2. Handling a keypress

    +

    As mentioned in "Grabbing the bindings", upon a keypress event, i3 first gets +the correct state.

    +

    Then, it looks through all bindings and gets the one which matches the received +event.

    +

    The bound command is parsed directly in command mode.

    +
    +
    +
    +
    +

    8. Manage windows (src/mainx.c, manage_window() and reparent_window())

    +
    +

    manage_window() does some checks to decide whether the window should be +managed at all:

    +
      +
    • +

      +Windows have to be mapped, that is, visible on screen +

      +
    • +
    • +

      +The override_redirect must not be set. Windows with override_redirect shall + not be managed by a window manager +

      +
    • +
    +

    Afterwards, i3 gets the intial geometry and reparents the window (see +reparent_window()) if it wasn’t already managed.

    +

    Reparenting means that for each window which is reparented, a new window, +slightly larger than the original one, is created. The original window is then +reparented to the bigger one (called "frame").

    +

    After reparenting, the window type (_NET_WM_WINDOW_TYPE) is checked to see +whether this window is a dock (_NET_WM_WINDOW_TYPE_DOCK), like dzen2 for +example. Docks are handled differently, they don’t have decorations and are not +assigned to a specific container. Instead, they are positioned at the bottom +of the screen. To get the height which needsd to be reserved for the window, +the _NET_WM_STRUT_PARTIAL property is used.

    +

    Furthermore, the list of assignments (to other workspaces, which may be on +other screens) is checked. If the window matches one of the user’s criteria, +it may either be put in floating mode or moved to a different workspace. If the +target workspace is not visible, the window will not be mapped.

    +
    +
    +
    +

    9. What happens when an application is started?

    +
    +

    i3 does not care for applications. All it notices is when new windows are +mapped (see src/handlers.c, handle_map_request()). The window is then +reparented (see section "Manage windows").

    +

    After reparenting the window, render_layout() is called which renders the +internal layout table. The new window has been placed in the currently focused +container and therefore the new window and the old windows (if any) need to be +moved/resized so that the currently active layout (default/stacking/tabbed mode) +is rendered correctly. To move/resize windows, a window is “configured” in +X11-speak.

    +

    Some applications, such as MPlayer obviously assume the window manager is +stupid and try to configure their windows by themselves. This generates an +event called configurerequest. i3 handles these events and tells the window the +size it had before the configurerequest (with the exception of not yet mapped +windows, which get configured like they want to, and floating windows, which +can reconfigure themselves).

    +
    +
    +
    +

    10. _NET_WM_STATE

    +
    +

    Only the _NET_WM_STATE_FULLSCREEN atom is handled. It calls +“toggle_fullscreen()” for the specific client which just configures the +client to use the whole screen on which it currently is. Also, it is set as +fullscreen_client for the i3Screen.

    +
    +
    +
    +

    11. WM_NAME

    +
    +

    When the WM_NAME property of a window changes, its decoration (containing the +title) is re-rendered. Note that WM_NAME is in COMPOUND_TEXT encoding which is +totally uncommon and cumbersome. Therefore, the _NET_WM_NAME atom will be used +if present.

    +
    +
    +
    +

    12. _NET_WM_NAME

    +
    +

    Like WM_NAME, this atom contains the title of a window. However, _NET_WM_NAME +is encoded in UTF-8. i3 will recode it to UCS-2 in order to be able to pass it +to X. Using an appropriate font (ISO-10646), you can see most special +characters (every special character contained in your font).

    +
    +
    +
    +

    13. Size hints

    +
    +

    Size hints specify the minimum/maximum size for a given window as well as its +aspect ratio. This is important for clients like mplayer, who only set the +aspect ratio and resize their window to be as small as possible (but only with +some video outputs, for example in Xv, while when using x11, mplayer does the +necessary centering for itself).

    +

    So, when an aspect ratio was specified, i3 adjusts the height of the window +until the size maintains the correct aspect ratio. For the code to do this, see +src/layout.c, function resize_client().

    +
    +
    +
    +

    14. Rendering (src/layout.c, render_layout() and render_container())

    +
    +

    There are several entry points to rendering: render_layout(), +render_workspace() and render_container(). The former one calls +render_workspace() for every screen, which in turn will call +render_container() for every container inside its layout table. Therefore, if +you need to render only a single container, for example because a window was +removed, added or changed its title, you should directly call +render_container().

    +

    Rendering consists of two steps: In the first one, in render_workspace(), each +container gets its position (screen offset + offset in the table) and size +(container’s width times colspan/rowspan). Then, render_container() is called, +which takes different approaches, depending on the mode the container is in:

    +
    +

    14.1. Common parts

    +

    On the frame (the window which was created around the client’s window for the +decorations), a black rectangle is drawn as a background for windows like +MPlayer, which do not completely fit into the frame.

    +
    +
    +

    14.2. Default mode

    +

    Each clients gets the container’s width and an equal amount of height.

    +
    +
    +

    14.3. Stack mode

    +

    In stack mode, a window containing the decorations of all windows inside the +container is placed at the top. The currently focused window is then given the +whole remaining space.

    +
    +
    +

    14.4. Tabbed mode

    +

    Tabbed mode is like stack mode, except that the window decorations are drawn +in one single line at the top of the container.

    +
    +
    +

    14.5. Window decorations

    +

    The window decorations consist of a rectangle in the appropriate color (depends +on whether this window is the currently focused one, the last focused one in a +not focused container or not focused at all) forming the background. +Afterwards, two lighter lines are drawn and the last step is drawing the +window’s title (see WM_NAME) onto it.

    +
    +
    +

    14.6. Fullscreen windows

    +

    For fullscreen windows, the rect (x, y, width, height) is not changed to +allow the client to easily go back to its previous position. Instead, +fullscreen windows are skipped when rendering.

    +
    +
    +

    14.7. Resizing containers

    +

    By clicking and dragging the border of a container, you can resize the whole +column (respectively row) which this container is in. This is necessary to keep +the table layout working and consistent.

    +

    The resizing works similarly to the resizing of floating windows or movement of +floating windows:

    +
      +
    • +

      +A new, invisible window with the size of the root window is created + (grabwin) +

      +
    • +
    • +

      +Another window, 2px width and as high as your screen (or vice versa for + horizontal resizing) is created. Its background color is the border color and + it is only there to inform the user how big the container will be (it + creates the impression of dragging the border out of the container). +

      +
    • +
    • +

      +The drag_pointer function of src/floating.c is called to grab the pointer + and enter its own event loop which will pass all events (expose events) but + motion notify events. This function then calls the specified callback + (resize_callback) which does some boundary checking and moves the helper + window. As soon as the mouse button is released, this loop will be + terminated. +

      +
    • +
    • +

      +The new width_factor for each involved column (respectively row) will be + calculated. +

      +
    • +
    +
    +
    +
    +
    +

    15. User commands / commandmode (src/commands.c)

    +
    +

    Like in vim, you can control i3 using commands. They are intended to be a +powerful alternative to lots of shortcuts, because they can be combined. There +are a few special commands, which are the following:

    +
    +
    +exec <command> +
    +
    +

    +Starts the given command by passing it to /bin/sh. +

    +
    +
    +restart +
    +
    +

    +Restarts i3 by executing argv[0] (the path with which you started i3) without +forking. +

    +
    +
    +w +
    +
    +

    +"With". This is used to select a bunch of windows. Currently, only selecting +the whole container in which the window is in, is supported by specifying "w". +

    +
    +
    +f, s, d +
    +
    +

    +Toggle fullscreen, stacking, default mode for the current window/container. +

    +
    +
    +

    The other commands are to be combined with a direction. The directions are h, +j, k and l, like in vim (h = left, j = down, k = up, l = right). When you just +specify the direction keys, i3 will move the focus in that direction. You can +provide "m" or "s" before the direction to move a window respectively or snap.

    +
    +
    +
    +

    16. Gotchas

    +
    +
      +
    • +

      +Forgetting to call xcb_flush(conn); after sending a request. This usually + leads to code which looks like it works fine but which does not work under + certain conditions. +

      +
    • +
    +
    +
    +
    +

    17. Using git / sending patches

    +
    +

    For a short introduction into using git, see +http://www.spheredev.org/wiki/Git_for_the_lazy or, for more documentation, see +http://git-scm.com/documentation

    +

    When you want to send a patch because you fixed a bug or implemented a cool +feature (please talk to us before working on features to see whether they are +maybe already implemented, not possible for some some reason, or don’t fit +into the concept), please use git to create a patchfile.

    +

    First of all, update your working copy to the latest version of the master +branch:

    +
    +
    +
    git pull
    +
    +

    Afterwards, make the necessary changes for your bugfix/feature. Then, review +the changes using git diff (you might want to enable colors in the diff using +git config diff.color auto). When you are definitely done, use git commit +-a to commit all changes you’ve made.

    +

    Then, use the following command to generate a patchfile which we can directly +apply to the branch, preserving your commit message and name:

    +
    +
    +
    git format-patch origin
    +
    +

    Just send us the generated file via email.

    +
    +
    +
    +

    + + + diff --git a/docs/ipc.html b/docs/ipc.html new file mode 100644 index 0000000..d9b8b54 --- /dev/null +++ b/docs/ipc.html @@ -0,0 +1,530 @@ + + + + + +i3: IPC interface (interprocess communication) + + + + + + + +
    +

    i3 - improved tiling WM

    + +
    +
    + +
    +
    +

    This document describes how to interface with i3 from a separate process. This +is useful for example to remote-control i3 (to write test cases for example) or +to get various information like the current workspaces to implement an external +workspace bar.

    +

    The method of choice for IPC in our case is a unix socket because it has very +little overhead on both sides and is usually available without headaches in +most languages. In the default configuration file, no ipc-socket path is +specified and thus no socket is created. The standard path (which i3-msg and +i3-input use) is ~/.i3/ipc.sock.

    +
    +
    +
    +

    1. Establishing a connection

    +
    +

    To establish a connection, simply open the IPC socket. The following code +snippet illustrates this in Perl:

    +
    +
    +
    use IO::Socket::UNIX;
    +my $sock = IO::Socket::UNIX->new(Peer => '~/.i3/ipc.sock');
    +
    +
    +
    +
    +

    2. Sending messages to i3

    +
    +

    To send a message to i3, you have to format in the binary message format which +i3 expects. This format specifies a magic string in the beginning to ensure +the integrity of messages (to prevent follow-up errors). Following the magic +string comes the length of the payload of the message as 32-bit integer, and +the type of the message as 32-bit integer (the integers are not converted, so +they are in native byte order).

    +

    The magic string currently is "i3-ipc" and will only be changed when a change +in the IPC API is done which breaks compatibility (we hope that we don’t need +to do that).

    +

    Currently implemented message types are the following:

    +
    +
    +COMMAND (0) +
    +
    +

    + The payload of the message is a command for i3 (like the commands you + can bind to keys in the configuration file) and will be executed + directly after receiving it. There is no reply to this message. +

    +
    +
    +GET_WORKSPACES (1) +
    +
    +

    + Gets the current workspaces. The reply will be a JSON-encoded list of + workspaces (see the reply section). +

    +
    +
    +SUBSCRIBE (2) +
    +
    +

    + Subscribes your connection to certain events. See [events] for a + description of this message and the concept of events. +

    +
    +
    +GET_OUTPUTS (3) +
    +
    +

    + Gets the current outputs. The reply will be a JSON-encoded list of outputs + (see the reply section). +

    +
    +
    +

    So, a typical message could look like this:

    +
    +
    +
    "i3-ipc" <message length> <message type> <payload>
    +
    +

    Or, as a hexdump:

    +
    +
    +
    00000000  69 33 2d 69 70 63 04 00  00 00 00 00 00 00 65 78  |i3-ipc........ex|
    +00000010  69 74 0a                                          |it.|
    +
    +

    To generate and send such a message, you could use the following code in Perl:

    +
    +
    +
    sub format_ipc_command {
    +    my ($msg) = @_;
    +    my $len;
    +    # Get the real byte count (vs. amount of characters)
    +    { use bytes; $len = length($msg); }
    +    return "i3-ipc" . pack("LL", $len, 0) . $msg;
    +}
    +
    +$sock->write(format_ipc_command("exit"));
    +
    +
    +
    +
    +

    3. Receiving replies from i3

    +
    +

    Replies from i3 usually consist of a simple string (the length of the string +is the message_length, so you can consider them length-prefixed) which in turn +contain the JSON serialization of a data structure. For example, the +GET_WORKSPACES message returns an array of workspaces (each workspace is a map +with certain attributes).

    +
    +

    3.1. Reply format

    +

    The reply format is identical to the normal message format. There also is +the magic string, then the message length, then the message type and the +payload.

    +

    The following reply types are implemented:

    +
    +
    +COMMAND (0) +
    +
    +

    + Confirmation/Error code for the COMMAND message. +

    +
    +
    +GET_WORKSPACES (1) +
    +
    +

    + Reply to the GET_WORKSPACES message. +

    +
    +
    +SUBSCRIBE (2) +
    +
    +

    + Confirmation/Error code for the SUBSCRIBE message. +

    +
    +
    +GET_OUTPUTS (3) +
    +
    +

    + Reply to the GET_OUTPUTS message. +

    +
    +
    +
    +
    +

    3.2. COMMAND reply

    +

    The reply consists of a single serialized map. At the moment, the only +property is success (bool), but this will be expanded in future versions.

    +

    Example:

    +
    +
    +
    { "success": true }
    +
    +
    +
    +

    3.3. GET_WORKSPACES reply

    +

    The reply consists of a serialized list of workspaces. Each workspace has the +following properties:

    +
    +
    +num (integer) +
    +
    +

    + The logical number of the workspace. Corresponds to the command + to switch to this workspace. +

    +
    +
    +name (string) +
    +
    +

    + The name of this workspace (by default num+1), as changed by the + user. Encoded in UTF-8. +

    +
    +
    +visible (boolean) +
    +
    +

    + Whether this workspace is currently visible on an output (multiple + workspaces can be visible at the same time). +

    +
    +
    +focused (boolean) +
    +
    +

    + Whether this workspace currently has the focus (only one workspace + can have the focus at the same time). +

    +
    +
    +urgent (boolean) +
    +
    +

    + Whether a window on this workspace has the "urgent" flag set. +

    +
    +
    +rect (map) +
    +
    +

    + The rectangle of this workspace (equals the rect of the output it + is on), consists of x, y, width, height. +

    +
    +
    +output (string) +
    +
    +

    + The video output this workspace is on (LVDS1, VGA1, …). +

    +
    +
    +

    Example:

    +
    +
    +
    [
    + {
    +  "num": 0,
    +  "name": "1",
    +  "visible": true,
    +  "focused": true,
    +  "urgent": false,
    +  "rect": {
    +   "x": 0,
    +   "y": 0,
    +   "width": 1280,
    +   "height": 800
    +  },
    +  "output": "LVDS1"
    + },
    + {
    +  "num": 1,
    +  "name": "2",
    +  "visible": false,
    +  "focused": false,
    +  "urgent": false,
    +  "rect": {
    +   "x": 0,
    +   "y": 0,
    +   "width": 1280,
    +   "height": 800
    +  },
    +  "output": "LVDS1"
    + }
    +]
    +
    +
    +
    +

    3.4. SUBSCRIBE reply

    +

    The reply consists of a single serialized map. The only property is +success (bool), indicating whether the subscription was successful (the +default) or whether a JSON parse error occurred.

    +

    Example:

    +
    +
    +
    { "success": true }
    +
    +
    +
    +

    3.5. GET_OUTPUTS reply

    +

    The reply consists of a serialized list of outputs. Each output has the +following properties:

    +
    +
    +name (string) +
    +
    +

    + The name of this output (as seen in xrandr(1)). Encoded in UTF-8. +

    +
    +
    +active (boolean) +
    +
    +

    + Whether this output is currently active (has a valid mode). +

    +
    +
    +current_workspace (integer) +
    +
    +

    + The current workspace which is visible on this output. null if the + output is not active. +

    +
    +
    +rect (map) +
    +
    +

    + The rectangle of this output (equals the rect of the output it + is on), consists of x, y, width, height. +

    +
    +
    +

    Example:

    +
    +
    +
    [
    + {
    +  "name": "LVDS1",
    +  "active": true,
    +  "current_workspace": 4,
    +  "rect": {
    +   "x": 0,
    +   "y": 0,
    +   "width": 1280,
    +   "height": 800
    +  }
    + },
    + {
    +  "name": "VGA1",
    +  "active": true,
    +  "current_workspace": 1,
    +  "rect": {
    +   "x": 1280,
    +   "y": 0,
    +   "width": 1280,
    +   "height": 1024
    +  },
    + }
    +]
    +
    +
    +
    +
    +
    +

    4. Events

    +
    +

    To get informed when certain things happen in i3, clients can subscribe to +events. Events consist of a name (like "workspace") and an event reply type +(like I3_IPC_EVENT_WORKSPACE). The events sent by i3 are in the same format +as replies to specific commands. However, the highest bit of the message type +is set to 1 to indicate that this is an event reply instead of a normal reply.

    +

    Caveat: As soon as you subscribe to an event, it is not guaranteed any longer +that the requests to i3 are processed in order. This means, the following +situation can happen: You send a GET_WORKSPACES request but you receive a +"workspace" event before receiving the reply to GET_WORKSPACES. If your +program does not want to cope which such kinds of race conditions (an +event based library may not have a problem here), I suggest you create a +separate connection to receive events.

    +
    +

    4.1. Subscribing to events

    +

    By sending a message of type SUBSCRIBE with a JSON-encoded array as payload +you can register to an event.

    +

    Example:

    +
    +
    +
    type: SUBSCRIBE
    +payload: [ "workspace", "focus" ]
    +
    +
    +
    +

    4.2. Available events

    +

    The numbers in parenthesis is the event type (keep in mind that you need to +strip the highest bit first).

    +
    +
    +workspace (0) +
    +
    +

    + Sent when the user switches to a different workspace, when a new + workspace is initialized or when a workspace is removed (because the + last client vanished). +

    +
    +
    +output (1) +
    +
    +

    + Sent when RandR issues a change notification (of either screens, + outputs, CRTCs or output properties). +

    +
    +
    +

    Example:

    +
    +
    +
    # the appropriate 4 bytes read from the socket are stored in $input
    +
    +# unpack a 32-bit unsigned integer
    +my $message_type = unpack("L", $input);
    +
    +# check if the highest bit is 1
    +my $is_event = (($message_type >> 31) == 1);
    +
    +# use the other bits
    +my $event_type = ($message_type & 0x7F);
    +
    +if ($is_event) {
    +  say "Received event of type $event_type";
    +}
    +
    +
    +
    +

    4.3. workspace event

    +

    This event consists of a single serialized map containing a property +change (string) which indicates the type of the change ("focus", "init", +"empty", "urgent").

    +

    Example:

    +
    +
    +
    { "change": "focus" }
    +
    +
    +
    +

    4.4. output event

    +

    This event consists of a single serialized map containing a property +change (string) which indicates the type of the change (currently only +"unspecified").

    +

    Example:

    +
    +
    +
    { "change": "unspecified" }
    +
    +
    +
    +
    +
    +

    5. See also

    +
    +

    For some languages, libraries are available (so you don’t have to implement +all this on your own). This list names some (if you wrote one, please let me +know):

    +
    +
    +C +
    +
    +

    + i3 includes a headerfile i3/ipc.h which provides you all constants. + However, there is no library yet. +

    +
    +
    +Ruby +
    +
    +

    + http://github.com/badboy/i3-ipc +

    +
    +
    +Perl +
    +
    +

    + http://search.cpan.org/search?query=AnyEvent::I3 +

    +
    +
    +Python +
    +
    +

    + http://github.com/thepub/i3ipc +

    +
    +
    +
    +
    +
    +

    + + + diff --git a/docs/keyboard-layer1.png b/docs/keyboard-layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..88268f7b45974b6f0a07af641c1b028180a733ce GIT binary patch literal 43543 zcmaI82RxU3|2IsNrldktl#C=>Mnv}Bp^R)Yijb{NDzaDhCL@)dT`ICNBH5KqNF+1& z`#7)be?QObd0zK@Ugz~X8~7c^_xOH4pZEG4{;J9{`}ff9At52zFDEOhPC~NXmxP3r zoopBWBtFSA4FB0>tRN#vvPJwarTS?E3CSrEIZ1KNy9qxAU9T&xZoOXUInU;=DiNL- zc;4`u$+^ZS1w8el)cw>Z%}0A_-s!0C)3s1#e9%~>AJjP9o_DJO65rOJu^ ze2Tf*JNC&FBOPxACz9qolb^e{xhA(wEdFJoqoa!q4h|mO-Ct(^R5M5Y(MY$-_q)I2 zFB)u~4Zd3IKhkZF-}W!h_Oog~qYgSQ5G_n4zL!J4LXwo3nfWNY&M6o6^6$UKn!EC@ zs?fbiqHM?;ez!0!aJycEutqUcJ}QRSDtsW7Oz)+2H`~6^0}>QF#Q*be z=tEhuo&Wtc#V^({iaqyFk^TGcs0Jegm9K~Sk1qvuB6n5iIREo4z9K0;1EiCC#Kgqz z-@l*Xq@tp-=Lp*w6Un$I2?;F)CJh%|=IFx0!XzanjVvu6Wo9y!-0aDci#Xf$!q9Mz zv!uSc`SGJiWHz?8G+f3zNRC}FFkN4sB?+YF+IH>QHNh(zHga-uHUqE1D4FEjOKq=} zzwLe6InWaQ-MuWxFau3mrO=Xb-%=<@2XF-KORS=Yt!{k0pv_U7c|kldLcN^FWc z*Gw1XjL-i%Ki@XnU&h75lkWC=+GF!~kB*Mc2l}|r&kSpm949_@WUHOtb?^kc%f)i* zDO5)^TZ4ZQHhOoSdAm-@e`M=;&B}g>nbONlNk?2NFeG!})H0 zmYsQg^n7Q$@6XTq*Y4iE`|@TFhq1BoP^Eoq9AE6k+l-s*e`HcsN7a4%j?vIGzPddk ztE6OBA4t>bj5Xu8A5!$EWQyUj2o5~tRZ(U?TxiqF&2KmGA^%z#NsOT5+2-i;>7MJ$ zEiqjGSa;_((q)>nM9GU>y0q}~=hxmM3z9GW{UfupN=4?ag+FTThed_%OujxSw(VLGq3yd5WH`-ymXwic_9UYnnV-K@3vV0c8t*gmCn#?z;}!^IU86atQ(-}Acp z$%Uy;PY+sISvfq&R(q zZs#95B%hz@Ub%JaWy>L~$Vq=+&SZII+gF@= zd!)YDvg7{TU}e$W1!IXTS9FWa_e%v(eZy+Mdi9Fp*fHimsh01shCWM`C4AOhBws_s z{+{CJKk8HCx!!cNe?q6+fk`Hqjx^=+y=@+U23=xeV%lHbHhGqxPx>e*$gDj@T*&*7 z=fp?)qv!Q@T#n^7ixIFtaatxg17ClJnR#&}L@al9er)XhV5Lj!CHK;gWhwc3C3~}IZMBZOVZHjCE{K+ok(*n6T(-ml$EmABs9+`R4L($L?3 zTtGm8(Wvh{(rX}OPjc?p|(^qmcGo!ty z=jsJLafa$6s+kggd#G4ceHf(zvV)G`Am`JiS`EzCZUw97oZ;rC#7gJT0)m{pqS1AgG!zu@Tfm)b@MQ;~8#;A~(&e?D_;+s-{k=H_Qjc#|92+Cr4# z`EOWSe)zk&e%rx8-CgAD*#|FQaw;k+W*bzyMGwEYR>m>Y^Wv$(6OL!s%fs=MW;Dfv zS61#4MUv@Y?itdrU*G(bAm)AIvJmUJD0#Q#ALN(2bG2dx>N=69 zollDkAExw2Fm= zh0AVNy}I|ad*TU-u@-EtP9$4>$_gTmuyaOc<{@h8M`dLKsi~cQON4b@MVNm@jAi#L$b3U(i z*Q1Y#!Ww0E`p>VI->Waj5e*6Bt4x6-_QsVgWFY zuQM~vixX`Hg@x*QS*t4xCJ6}%WaQ+jcNf0zJI=pPR*XTw=1XYL3quoAQ%Mw~jA1;I z{a2q~|2Ey7SMEiZJc3*ISZo!z>{j@cExWVOOd*G91v~OxeZ6{?B2CG3>dO;{AK}XiZ@k@w%a&DE)~8Z*SE}>a!F)tAmBNnPX(!q58*gE))V#38RtXngElJ-D_(@gaxx}~7QxXzhX5;ac zBh%92soh+@R1_^Hf<_460s5pKhY(;^M;Ub2VRl6HG7s3&)*wD*x&F zpZVRdo0+$;rq_Qc#-I3oB8F)HO8JSg4jJJFa}B5W5CYDhL2P(hy?tXKqlv zOvvZ)u?r3h-=(zk_1=%S#ut>8J>gPs&AwjFO%%O9!`>6a-dpd#e4##e>{uMXZBx8} zJ-|9;roxlx00shSqV6A}r&j`~oa!%op&WAXvrAjjrF5ysM?0k)r2#X>01Z+Az6esZ|(Ma^1(-`->2XJ*co{Bm=1bNDqXhs`O6l4KUFD$K1N(0Z`(REqW& zB}2Bc@vDFT{#6&x2*fVhm2vDz<6KdH-qj0<$tIfEn^V=~sp!mynUy0yx3;w4sCS;4 zN2hSyTyyeTn|f;FZD@Gb?%`4aU37GG)!hXNi^Fx<*(_GyR~^QhJv7;Q<$u{f<%Z;ojm5=ipajsI?%oGP0j$Q<%AE84+qXA( z5Uam?47vFD%)Y+9r~Wv+Nkwc^(#Yu4@9FO5)=)pX>CgG`k^AD};tD~Hw4YyZEO(s1 z4KB?OC*vF_XylVzym;}$k>}FX)YP0-oo5KVdE_#iLDfY8yMgw{(VH%fcMt1nvB(XZ zRh8$qY50%s{xd&3G1-wm@3Haz@v&afA+!YB2bo&Qab#<2Ys3yeFTHHV-KPI+9-B2Q zBg4qrx`{yUp$u0t()J%ZbSUBC?fXCs1>ReK*+;^xd!D!c=q;M+E6H1Cd~z>8KVKQE zC-|F0{t3tV^TV%hZ}*XpVl%U%UjEXF+*Dg256HV9mUrmk>mpwU?pY~YbyQozCJAsjf zy%h~ZLk79;LpuOL$jQmy;K7&L_M5w2zuM6B;Nio?L6>1UfdMgTMa94_9fl7R)#NwO z1IwLf<9NTl2q-Dx!{TMy57*%G9KaL+vt{mW+nEh`<22nRo~mlecT4c1kWiW`OIL;F zH09pCd#wb8g!HW6Xa&7*e10uBcc1g-+VAf0_h1Bvj~`cL!{mc5BqLnl0(p z$48xvJErrYzpvCb-nOo%%-&E!LLytgl3!F*lv^^39zSJeW#ubqq>)hyZ~l`MVeH6K z>+b1)RE&&`@297qhCD&Lm+ggm)QcW1RFnFFfrQCP%ekTIb0w6y6(K`at`Xp_^4)s` z?1x%V$@XV3`?4uSv)>qNilU~aB@WfTefu0%Wkp-B8hSEC+5TBvj2Jf|j=Zw6G8ioZ z&pbRtZ2L>i(3Tt?toIt5m~`*?zBKhohHXcNdV#SND??Y*p9PadoC=)(UHhng{`qG+ zB!*5+x+@R%g;73;<+1pMy&n-1!%`Br*Oln_#R-v-lKAhPh+LqEyYB7^BfCfgs95U? z&6*u9DU0)P52bi)u9XCajV2MLO3>uO3Gw!wQEXbqy@h6hw0zU)lyAYc%=_cmMme}< zB@g856iCosGY6V>%Ix9;OE+%_rr)t^m;4c5K{XbB|JIt3&Q;jh*zj30)#waT)1WtXMJ=`kU4|f!`1qE1frGLtR9ID61%(k*!p@o-H*R37Z!?W; zQwcQ$+sYV=jHDuHXB^*6PA)D6Zf@>o>c}r&bb{#wC2GAk9fUQ-x947c!Ert>_smQs zn1oz&g~3kU54EEFT#PesupR4K9$x!9eU2bX?*ooxx-x53RaIr=HrD=KI|sNnj!PlgSQ!Zs5`JlzOhZHS zZDQi7_TAGQ9KpgabF!aupa;CXGo_w$+(SZQo1yn6ALx4FJ9ZBtVPWAC?d_f_Kho3F zyWQA}tv*TDTka5dlr+vh{;o3o3bv2&mzOty$QARurFwv9!4PC})H5%7tZ)JhM`Rhi zEGYO^yR~_NUfB6vQNT#rdfIfb4p2O%xvdFUR$`zT>t#_!0869YZ#lw(Gmfcvry zHdA9~rb3aX=`*doql7jy-n)ZEBWoYNudcuUTJSADI!i!HtgG>BA5v@o8&jQ`H2gNy zAQKJU-BEZ%Q|lFI3hGj(;$@~HJ=4>iK?!Rp8JTuYC_`y`6O$aAoy~FItA#st&OC69 zr@j(%1%SFc{@2)%bJ}NESjd3S0NZ6iOl~Bb_V?!nJ^jQiEsfL2b^p+5X_BeT*1>^+7;dwGmN2Uxv`uPZXPaoY zMmET#<3J5nu8R*)OO0;aNPW^B_FKts&yf`X7&W%2Dvwo46O$2k4PQuqGg>=qHy}r- zZEP&IojG&nrPGWyP!r4G>kfgMnwrkS=PI|)RP}=$IeC3wZHsaZOqJcYxGRieTmu`E zpcsKC#gfinE9G?kWeO^NKQWOW%p@HhEh8i2=fm~kPI&}x zgszw-@Q->bDk=TWdVI@^=%HC>DV9ROLx5D@|3}>gz_0h-S~o0z+xd#9uKR2fg`6Z^ z)EEp^nI7aah}^G|l!yt5V%H5P(EZ%pM=;oncYmG&r22|OYrTGi<2nI|EAC9yL8&ZM zG`KJs4W&vWRbprPTPW8nDFEq&zFTC`rc-sdz~HR!(9jT$QK~A7PK`&o!O%+uMMcec zq46t_H!{k@cW!3IO)G{zf!h7!#}6IIK-fEs{QS|(DoHkQRyzthD3*(Eq+xbG%~?*J2}#D6vWn{1ldr@}?V zKfIO9zxqEqzORS;8Q=fW@&BJ6NnFJ*R;~xC#4qr#uSz(YBsA;jS@acjYwIySlx{hB z`81<9_rVbH`(F_ub_~$}IrsQ&L#+oOD>)SLUx$E9h|p%R87)=|pd{qIsQC``L+h<{ z;lhO*ojTD{gI_JMe8Z039qz)Uye-4rDu8m`;4fR6a8tXP=UmHg1;wnz#UKlsw4mJ8TPA zX!SK0|A+!}LC^aB{rl(vrmOGXzduAv+XQAXc0h_k)IT+qVSIc%CO%%{)h#e>^;b?a zN5%fGoCbr45El7%NwlIlJ1p!F_+7)BH}|lw3LPhuD_rKE2YvaK0NrBb>sOM?C~-f3 z|Be!5Y{h}J`SOy~-rk-lR#V1rfs8<&2oBx!?Slv zh_PSC$E6{VnFgyaLMLj%w`4fM_&9pOfZas0ugI+V=(g?K#a<2Lgcg*PwE8_Np1=~d zBnU zObV|&Rtt;s!KVW01jA9jK%AN`kyWHZFNCBoI|JlVY(Jdj>$~IrKmX)t4UhNizrwb`n z9B`WpC)11h?AcwJ>i)5@u}f}14NvU`D|9O=rKO~9FODmH9~ps?lm>lDS2P(|e+)KQ zmD}$C;JaV%j~SZwGNTs)D~E=LUWNgdt)1WJ9&%2=qmxFvAr87+>t>YjKU96Sz?MzHKtEG&=E$C@cpodG5~2`eEy zysMNM-5Zi+@QF(SV95~KBUvR{_Z~bru|8kR%+Iggm!&dqWex#CU0ATX8Nk+&fp(VY z6=*%WZXBq$x3Gc#uFYIHa6&{DzK>aeDi3IGSo$B0Oq@i$KxS>x|F1)fCAJd&;!eYkk>P zI*9f?wo`AhRm2e8i_qFHU%sejt1?hhQf7#V=V*Q(AFoI4?s5|%R7>nEwG7!qB)}|h zpuiGF8wq+eAZL+fN19D-KbE~!VA$h|jSV}B8X@kB-2LgpaODB)1IAekE2~EA;@fxb z?C7+otFN!;b{LiAxA}6a+5kAB_vMZ4khMu(!_mP{4hs!Eb?GXgw{ET1C3L9WUm^PK zJ1Lp~uh1$PIJOYC3}w-0>81)?pPWP6UN<(9qtHx!8T;8-mYA!VQ-_0w)~r=|Ge@Pa zu8!y@pgFwuLkXy{jr8H#P@mM!)3C#lpclH6V%{3pS&HU_BhE4C+TjF&cptrxru;6j zmqvIWlW>F3e7AMh7N1p&d5s%13)C#~+E|b&F;yMDn{}K<~jm8VNnUxP;VkA$@yY_3Kwu=i39q~hgFnA!a~f$aq+g0G4nkRviH+qlZ=r@>A+zxPJw&O5rQVu5QgK{ z+5QBZE-)~V@D0vsKl|{j0-S0e-NjH41)}jn)bm-2uZA+?fphVyvhq`f(@jEsL5(Tm z-9=agz~1}1iPACtZRHe%P6{7M?_vf!KPhSdU7BmINVW*fIWp$LNv?EH_D#AET%bZ(%WWT4#fA*AsLAhYHpx%JS-3@dy% z;G%;=*Z1|&`T%*N%lj-no&_#kfF0IEeA$n$zwB#G`=2a;qh#Mx`SCoh zyyc-b2e3p3R>szAutD$qDS{Mv9fuXwavPAX1P&i585$cdR%npX#@;^Jb|$O|8bKyU z8X6ED7;BltrvR*gY%}B)^-3ecn){TcwA}~<7;>X^ew?8l+1|Y-Q0h9@Ru)DwpZ{QG zWnG%>e*$-FJ0})+ZFx3tG2fgf;tlws!`}^8z!ccI`|(@}Xh#AN0@$?c!;!30qhHXw zxjV;^<+qVV>yv}S32`Yw$SDBNY5Pm`JfcwRm9Pmr|9IWr9twr^ zrNfv!?Bk%kyu76W=tdbh_juBs*bYS7@)Q`Tay=|7*5Cs7eZFQr_+RvDGBmsry#s~)J+>vuMYkoEwq&t}_I3(rRPZXw zJyyA47LQ_wS9xv5L0?Ej*HEu?wngs@kVqxW*nPCT1P6oLd;Z$FRIfjaRHBnu2Wx*c z$i1B0+}k?iC!Q+C)@`gVW`5@eBj|bT3&fY#>3}1bVM_73ql3sA5Fqf>=3eEVYOhVb z3f1Qz8qc3U$8k^{N-1V%Vv?FJRjYP$s;+kZ4e460`JY|;!^6dW&g)D9Xz-a&RbDeC?Ei z>TG@f3useV^j<2K*TjYTa`N&|D zQPD{BJ9&YM2M6ezfZU3z#vxH`k2x3}LP(YxJ4w=Yd&syd*MleHimz`R%!#_y9bNS1lR#ao2#AAX5w3Z zB}bDR#u+Lu$!qx8R{f> zWWt#?>qwI-w(UR4!^1-Y&?$+E^#zg}x(;C>!{GfFK_K^`&927xZkuX+4<{sIXtf>X zjur&8DlR4@7%DbR+5CwxYel2_iAKe4B|hv}+lxNa(+;3ClQF1XV=LXK5r+%)6%LkX8MMu+y1#X;7VsB!_0cUK9|1 zUeLMYeAbcI8LSoSbG@-Iz`CVp)7bH0wzNmIoFw$43O?)%&14CMm<;67xzluf)30h4 zI8f{6*vA|klOm%x+s;d#Np7ir=Hclnr=VbhP5-LAoYa(c$l~TrLjLI%onTf@FoKjE z$)+Vgy-Yqeyb7X7gp?-Ql1IkI{LsVk;X8Kk*2vf6Bg8p?XEgmcV9~JMfd)UoAi8j= z4fTw$r;DGdKff->Z`&sc#gq_g08puEXv|pOW#{_1ZT|VzFLP1{M zc(Oee0xdw-(wyX?D9vGsZk>cc6ukH7Ns#3`diT`D<^^!*6|*#p;=#fK+m2KNG{A^! zsbg`tffBX?+%Kf457c4fcpg&vZ&{XhOZ{b#gUXOCE%Qpw11~wgF#} zX2|CpIB)<`8Kmo25m#=A9mc3+o%^S7j7KIXKOo3Mwr9_G_#tlrh~QEOp{o(ul;D$M z&%^$F(?AvYAd#b4h%^v3I-AxJJ^=v>{0Je#l6eyX%OF@MFXeov0~_^~=Q@9=mpGG! z+{i#Q7XvR$YKUG$o(N`Yk@5RIIY(?E<=mO=(_(I@H^0hNiraz*v$!;+0o^%6`-s+i z0neDEQ>XE?rqarxE2uLGd)@-6${AbK2a11-Hk|{Jl|w3%9vnq8S5t1fnh=VVlSJfj zb6|zs_^hk_Vk0}_IGVobQx(peM;CPSn#^QB7ry;{#|49`4~2uBo$3=$>(yvPJ?=)o zV`2tW$?~&wXsZlp;s5%}h!uF{_1FfAIdL`CUfYD${ zA)4ezI>okNgBKc@JoZ&pb(|l%wCey}Hot67Utb*LPa<+fbNUkp${@igae4`T7P8K^ zQ;6ok-Zbt172cy?>y-%aWLtZ+yNi&^9J`}rc^%Akv+KqR7g#!BN}%w~+_8UvOwdbYOZ3X@&Ig_Bt8}@5vft{wl_vFg z-25)>lhva5^2hAi%=aobhRpd*>i3o0+!qD1loNFNlNq$=PphMICh$bFOD30};fB3^8%l5D*do8vG!X?|nR!u5h#DYe zPwa~MZ2KayfeKyb4bbW>dkdL}#RwmUuc3xB2KMGtU402jq%&-60f>iw!V%Be9Ve0c z`qQVwz%)37$|y;M{0Ru#DdOjFh&=UFZ<+l`lx~fgrcTf{=pku~-Q;2jKuWSnEWm;M zHaW?{Hw`se&-fdoLPJ|4rL{K@P^G$6=-``Sj7+1XUS`cmog zLa*Z^+=A|k~3lillt7zuo6FdMhyZ_oEE z^_NECU^2{F{jJYXMs#V}5K_q1);-?&!i4AJ;2H-a5-6u%6E&)ekR11m-=zs7+Whox+et||0{Z0sGXLq>pVqOeQ- z$B)WxEnpr5uO`0%Z2{tI_f*D;XZLM*76@OYK-ns%4%^^1P&H3V(Y|V$B*wKELndpl ztFAV9s{I(wU|unbrbXgxUn0HMReM=)L#@UXc|i8A+|VIZjjJP{qJb0~pxPMJdbMI3 zadC2{;N(L=&N;HT^LIdeY~Iy}ettQg%*Z3k&MxLQJ7$`j+uAAtZxjwbzaXhbBi@6m z{S|VK$JXW_b#6;+Qm~xv@H3uh?L@Bf-qH@v#RBsaKVO6#G5_6*AV}97on3$Fc?EyB z?)8IPc?Ys?LX2in&v?We4M(|uV?u08t)JQC$PImat;R_Z;p??t`g(016WTpy2@2;R zih=&*Mx9ZSlT$nQENy0_@>6H$E60i8$gXR;x;Z63PhPxrS&yHaI}PBi{6zZM?i`JW z|E8Ok2xB?otWrh;&#@=%W32q#IF9iH3}p9_o_c^@T|FJW$$DpfAEV_vK>bYNFmOe{ z0*aF-+wiCgH%!_4Uo>+o+if;qsLgJ@_Zyxiq2=WFq+AFcx;O4np7+HBO(Dnf?^ zZm6cIB%K;0wmR4_6X=Xtb99c9o9EZpq=eLErGKp9poH6#xWGZ>@wVg_+Cl9IXr5>A zFcdhdAF+DB_stveEZO4ICf%(#QqWOPYZW1@YXa_XeZJp8$^02BG6bkYs^t!5C5`!{ zLp7dx+U7NATT~Yet_O4SWdS#!?J3M4suT6`3gSoBJ2|o5UG+xfuEPizmE*L_Y*pnM z1*BX;J7Z>HVNtjcxFKCkG42RFvt#E@xtWfRj`_rPS1@zvoT35}pK_5${XRc`FvF!A zqIWvZ1SmU^GQf>ycrq)-oVprQ$IOkUjC7a!F&^aP5&M%sk0OU62pH1&z9cH@h}g!@ ze-gfVMFZ9qc&XaH9FS|L13azYxxWv0+N+yB zt62S{BKB>5UIj%9P)zOSH+)DTuXi-Z41$12h#e0VEgMBt6vo{i@XOAGc)(aUp0-gu zT){h&6rn>>U4SAu+K#`cwMxqS3D|MBH4{>?N_X<`pp{vRcJ&irH(#R0fbC6 zGIH99#sj%wa7jXq5&B3dwctz^IX2nN+@&7oNmn#a0?iUmCO-%7nKQoV?b%HKAX2pP zcYWSkgK9Dt0YHVQWvH_dQ;pHNaq3J>iCA!E?){4A*z+*QRrErj*aD(jH-1H;W)h(( zx^M7fLMGd~#W~>QMpqo*x9*Z1x8zO74uR3h-mu=^*JsTYH^2vq1;OJTv}8fgHD0Xj zWjFCeKoTCeCCi$%>2tB^UBT#I5^lpz1!=m<&{7<*pS52Yw1RIE0hGv7Q5Ou8pz1?P z&HD8Iz9!-dm%$GaQ8<8wi>UCyL0y1q%IUdwr{p{L8srBxHbpf^PO<47!9bIaV@*du z+1??w;=1xPbx8*zX332Oj>Kq(Q zL}4q0^$S7Xb$$6f>N785mFO_-h`Ls@|2Rt~F~mq&7ec6U|4u(p({@AZ^SG+doeu4{ z6Y9i&$r`j?2qTl57D!93E!!(Og^ktxIUTH6DV<*)xlZCJ_~9Q*7UqUkKqrVDVhnmRRwD z2nbL8c5y)3FEf=|O-&7c&5TFbDRGKBk7116TjH|7esFlmU>WA`PYzGs;bE%N&OKD^ zdB0}swk91JV`A^!yEhcHx0PJ~LiA~}`*xINDgSZ1{x!e;zw<5s^H(39Qh_3?<3Z}r zU37SleFk8{Qtnv=GJBSfPb=T!t{p`~yzsk)@dLN3%CFGb&;7rD`*DPik1rEQrF^Xd zYl7;Rm_#doOvG)8ObXUrq4P zyDskXlMn|?9EB-IJdz-ALO4J$ARQhuT8bkyiG+W^z>QG?8*glGqDY^Z_?Q?WOvi8# z!#5`)LPK9;hZCYT{uqIW13o~m-@ksn3^kJℜydEyG6E>khdAn%e4DFZ^tvn-Fa7 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 aWtz0xFJgss1lTF~N9CC2(PV{-xBo9yFUpz# literal 0 HcmV?d00001 diff --git a/docs/keyboard-layer2.png b/docs/keyboard-layer2.png new file mode 100644 index 0000000000000000000000000000000000000000..85a7d2163579430f9008e663f7c09dcdb8c86bd6 GIT binary patch literal 42056 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 @f}f;lpwmO1|wxgJ#;YC3Pu(dRUjCg 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 literal 0 HcmV?d00001 diff --git a/docs/multi-monitor.html b/docs/multi-monitor.html new file mode 100644 index 0000000..671d2be --- /dev/null +++ b/docs/multi-monitor.html @@ -0,0 +1,109 @@ + + + + + +i3: The multi-monitor situation + + + + + + + +

    +

    i3 - improved tiling WM

    + +
    +
    + +
    +
    +

    …or: oh no, I have an nVidia graphics card!

    +
    +
    +
    +

    1. The quick fix

    +
    +

    If you are using the nVidia binary graphics driver (also known as blob) +you need to use the --force-xinerama flag (in your .xsession) when starting +i3, like so:

    +
    +
    Example:
    +
    +
    exec i3 --force-xinerama -V >>~/.i3/i3log 2>&1
    +
    +
    +
    +
    +

    2. The explanation

    +
    +

    Starting with version 3.ε, i3 uses the RandR (Rotate and Resize) API instead +of Xinerama. The reason for this, is that RandR provides more information +about your outputs and connected screens than Xinerama does. To be specific, +the code which handled on-the-fly screen reconfiguration (meaning without +restarting the X server) was a very messy heuristic and most of the time did +not work correctly — that is just not possible with the little information +Xinerama offers (just a list of screen resolutions, no identifiers for the +screens or any additional information). Xinerama simply was not designed +for dynamic configuration.

    +

    So RandR came along, as a more powerful alternative (RandR 1.2 to be specific). +It offers all of Xinerama’s possibilities and lots more. Using the RandR API +made our code much more robust and clean. Also, you can now reliably assign +workspaces to output names instead of some rather unreliable screen identifier +(position inside the list of screens, which could change, and so on…).

    +

    As RandR has been around for about three years as of this writing, it seemed +like a very good idea to us, and it still is a very good one. What we did not +expect, however, was the nVidia binary driver. It still does not support RandR +(as of March 2010), even though nVidia has announced that it will support RandR +eventually. What does this mean for you, if you are stuck with the binary +driver for some reason (say the free drivers don’t work with your card)? First +of all, you are stuck with TwinView and cannot use xrandr. While this ruins +the user experience, the more grave problem is that the nVidia driver not only +does not support dynamic configuration using RandR, it also does not expose +correct multi-monitor information via the RandR API. So, in some setups, i3 +will not find any screens; in others, it will find one large screen which +actually contains both of your physical screens (but it will not know that +these are two screens).

    +

    For this very reason, we decided to implement the following workaround: As +long as the nVidia driver does not support RandR, an option called +--force-xinerama is available in i3. This option gets the list of screens +once when starting, and never updates it. As the nVidia driver cannot do +dynamic configuration anyways, this is not a big deal.

    +
    +
    +
    +

    3. See also

    +
    +

    For more information on how to use multi-monitor setups, see the i3 User’s +Guide.

    +
    +
    +
    +

    + + + diff --git a/docs/refcard.pdf b/docs/refcard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f1bb36f1035e7dce582238104e20bdbca1dc3b37 GIT binary patch literal 61582 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 B=(_*_ literal 0 HcmV?d00001 diff --git a/docs/stacklimit.png b/docs/stacklimit.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5bed7a6c4a424bdf7f1ed5607d875f99668dcf GIT binary patch literal 4988 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 literal 0 HcmV?d00001 diff --git a/docs/tree-layout1.png b/docs/tree-layout1.png new file mode 100644 index 0000000000000000000000000000000000000000..ee69f1ab33f84ba594df749e45fabcaa97a4ce77 GIT binary patch literal 27856 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%0AAS)VcSGd^QdijL;;37`s8;(R8Kj}b^ko`vA$ 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 literal 0 HcmV?d00001 diff --git a/docs/tree-migrating.html b/docs/tree-migrating.html new file mode 100644 index 0000000..5ba6188 --- /dev/null +++ b/docs/tree-migrating.html @@ -0,0 +1,270 @@ + + + + + +i3: Tree branch: Migrating + + + + + + + +
    +

    i3 - improved tiling WM

    +
    +
    +
    + +
    +

    1. Introduction

    +
    +

    The tree branch (referring to a branch of i3 in the git repository) is the new +version of i3. Due to the very deep changes and heavy refactoring of the source +source, we decided to develop it in a seperate branch (instead of using the +next/master-branch system like before).

    +
    +
    +
    +

    2. Current status

    +
    +

    Currently, the code is mostly working. Some of the i3 core developers have been +using the tree branch version for a few weeks now. So, if you are eager to try +out the new features and help us find bugs, give it a try!

    +

    At the same time, a word of warning is appropriate: This version of i3 might +crash unexpectedly, so please be careful with important data (do not work for +two days without saving…).

    +
    +
    +
    +

    3. Getting the latest tree branch version

    +
    +

    Check out the latest version:

    +
    +
    +
    $ git clone -b tree git://code.stapelberg.de/i3
    +
    +

    Then build and install it (has the same dependencies as the latest stable i3 +version):

    +
    +
    +
    $ cd i3
    +$ make
    +$ sudo cp i3 /usr/bin/i3-tree
    +
    +

    …and execute i3-tree instead of i3 in your Xsession.

    +

    IMPORTANT: Please note that configuration file compatibility is not yet done. +So, make sure you use/customize the provided i3.config file.

    +
    +
    +
    +

    4. Tree

    +
    +

    The most important change and reason for the name is that i3 stores all +information about the X11 outputs, workspaces and layout of the windows on them +in a tree. The root node is the X11 root window, followed by the X11 outputs, +then workspaces and finally the windows themselve. In previous versions of i3 +we had multiple lists (of outputs, workspaces) and a table for each workspace. +That approach turned out to be complicated to use (snapping), understand and +implement.

    +
    +

    4.1. The tree consists of Containers

    +

    The building blocks of our tree are so called Containers. A Container can +host a window (meaning an X11 window, one that you can actually see and use, +like a browser). Alternatively, it could contain one or more Containers. A +simple example is the workspace: When you start i3 with a single monitor, a +single workspace and you open two terminal windows, you will end up with a tree +like this:

    +
    +
    +layout2 +
    +
    +
    +
    +shot4 +
    +
    Figure 1. Two terminals on standard workspace
    +
    +
    +
    +

    4.2. Orientation and Split Containers

    +

    It is only natural to use so-called Split Containers in order to build a +layout when using a tree as data structure. In i3, every Container has an +orientation (horizontal, vertical or unspecified). So, in our example with the +workspace, the default orientation of the workspace Container is horizontal +(most monitors are widescreen nowadays). If you change the orientation to +vertical (Alt+v in the default config) and then open two terminals, i3 will +configure your windows like this:

    +
    +
    +shot2 +
    +
    Figure 2. Vertical Workspace Orientation
    +
    +

    An interesting new feature of the tree branch is the ability to split anything: +Let’s assume you have two terminals on a workspace (with horizontal +orientation), focus is on the right terminal. Now you want to open another +terminal window below the current one. If you would just open a new terminal +window, it would show up to the right due to the horizontal workspace +orientation. Instead, press Alt+v to create a Vertical Split Container (to +open a Horizontal Split Container, use Alt+h). Now you can open a new +terminal and it will open below the current one:

    +
    +
    +Layout +
    +
    +
    +
    +shot +
    +
    Figure 3. Vertical Split Container
    +
    +
    +

    You probably guessed it already: There is no limit on how deep your hierarchy +of splits can be.

    +
    +
    +

    4.3. Level up

    +

    Let’s stay with our example from above. We have a terminal on the left and two +vertically split terminals on the right, focus is on the bottom right one. When +you open a new terminal, it will open below the current one.

    +

    So, how can you open a new terminal window to the right of the current one? +The solution is to use level up, which will focus the Parent Container of +the current Container. In this case, you would focus the Vertical Split +Container which is inside the horizontally oriented workspace. Thus, now new +windows will be opened to the right of the Vertical Split Container:

    +
    +
    +shot3 +
    +
    Figure 4. Level Up, then open new terminal
    +
    +
    +
    +
    +
    +

    5. Commands

    +
    +

    The authoritive reference for commands is src/cmdparse.y. You can also find +most commands in i3.config. Here comes a short overview over the important +commands:

    +
    +

    5.1. Manipulating layout

    +
    +
    +
    layout <default|stacked|tabbed>
    +
    +
    +
    +

    5.2. Changing Focus

    +
    +
    +
    next <horizontal|vertical>
    +prev <horizontal|vertical>
    +
    +
    +
    Examples:
    +
    +
    bindsym Mod1+Left prev h
    +bindsym Mod1+Right next h
    +bindsym Mod1+Down next v
    +bindsym Mod1+Up prev v
    +
    +
    +
    +

    5.3. Moving

    +
    +
    +
    move <before|after> <horizontal|vertical>
    +
    +
    +
    Examples:
    +
    +
    bindsym Mod1+Shift+Left move before h
    +bindsym Mod1+Shift+Right move after h
    +bindsym Mod1+Shift+Down move before v
    +bindsym Mod1+Shift+Up move after v
    +
    +
    +
    +

    5.4. Changing workspace

    +
    +
    +
    workspace <name>
    +
    +
    +
    Examples:
    +
    +
    bindsym Mod1+1 workspace 1
    +bindsym Mod1+2 workspace 2
    +…
    +
    +
    +
    +

    5.5. Moving Containers to workspaces

    +
    +
    +
    move workspace <name>
    +
    +
    +
    +
    bindsym Mod1+Shift+1 move workspace 1
    +bindsym Mod1+Shift+2 move workspace 2
    +…
    +
    +
    +
    +

    5.6. Changing border style

    +
    +
    +
    border <normal|none|1pixel>
    +
    +
    +
    +

    5.7. Changing container mode

    +
    +
    +
    mode <tiling|floating|toggle>
    +
    +
    +
    +
    +
    +

    6. The rest

    +
    +

    What is not mentioned here explicitly is either unchanged and can be read in +the i3 User’s Guide or it is not yet +implemented.

    +
    +
    +
    +

    + + + diff --git a/docs/tree-shot1.png b/docs/tree-shot1.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbeae1c583cbbf411c5c2fb0ef823db9c63fff7 GIT binary patch literal 3665 zcmeHKX*e6$8jehQC8(v8nOeuzTHD&HNQ>H4DUG$Gv{OqAT5CxVnIY5=ZBZ3k%UFX% z5w(l-Dp6ZBF-n70#9C|Y;->dL_y7HIfA-Hg=lRZezUMse_nz-PU#im$>yrX!1ONcQ zNn0BWX8?dNleg{#19_uuv_d0q`XSuh_7)fno|ti*1^|R1wiaf$9(k`!jyzOu66<+5 z5?LBuYI;D9qC9Ngs{7}p4$?tUwLy;y)IU;-yOIQ*F2tp z#@Q2HyKf3oX+_>pK|3ZhtI99G)ZgV2uJuQMg+hW~MR)q#gKd9zjZ&M?(E(hKx$=Pp zKxH8i?i##2;MC|pd;1CnqUTi+_`!{mrhg$(itHI^7e67MR8Jcya$R2nv#NWG)I4>4 zbgW2Y<@If1iLe(N6ZjA3FmMuiLwkQQUENrHIn9SPqI!1ZurBnBk}W%9e6)l!G7vx( z&X|4A_5^Lw8*LsxgS5pb!(xL}_zw~^3^*$8D9@T$>3+3!t#+qnH|0V?E!d@^M&y&Y z?A1fhSuOB9zNs+wk6eO$3tP_UGUbwNUJv^GP=M615Q+28_477;IpL6be0b{ml)~ED z?rv_58!dB+VNOIY+qEi+U{!igh$K6ZJ@02zw9}KRgHP{=AAO`VCWR?>IvhVS_B4WrUP@2w zOwI;|LiO}5R}L}MQj^kTFRtn&Zu8>y65g+X0~7C0eyHUxT{}>!Xf;6p^?E^Gr>n5T zz4JD`-gsE3mvi0WluJCcTnYiNjLoHXDyM}NfPMFn!2Ly}ALj2mt`J@>Z`V9{$Xmi9s?rH@y2h2T*is{@A9c>TbYwkq_Xjn6IsSf~arQg@{(4 zQ;P>HT*wEI&v*kN3MkVo0QvFL&lmuZ!rPot$^7p29gzPYLy##(8`q|hKr9x^4t@PY zqBftnt5o_4kZ5i?3KB$mJZXC+;ba^`GMekGKzd;$sey)oY5iptzP8#zH>f zMwikI{fWRMNMg40Urm-FVQ-Y>$K8tw%#i%N9meKOtzR1*g}o3VGX4uIym(FbG&cH2 zC++UW7C(?A6bDSSQazqrb9r9|cE$(yt~T2dna{Ro20b$@2jmaRE~3>0oh*`LM;1$P zBWUX1#z{vlAY^jnFE5L0AQA(feP)vAGOOxq5zN(bFFcH$xk~+y9v<)zI1;in#G&N5 z^-spvu6HRFSv~Rsdf=$}*}_3pu+gGG&4sz2R?y2h$cKm88Fw&unZ1V?AZRtLr!Z@=TU1adCOZV@m58G=G%CBDO z7`r)mS(FbQS$MaT4cojry)%_?ya^SFWXOu|ZekseleNe#Urx1tls&b(!LpCTW96?h zdRiNHg_gAY7oEYAXZge#aSV=X2xn!YDT_^^P^?H|uhLfn)vOI;hFvntBb?2Lrbd@w z-u?9K@R)-(4hx@9!^(=tp9$!j`#c6(x*K7@{70g4ie)`XXD~L)gqo(c3J+Fu#ECui z)Ut#h1V_FfISE>tm%XsY+P%L>GD$gMuEv+3xSn~3$L1V)miM*npBDeBg}vL!I*0YdC*nWGMf@)E3CrYL z4L?>?Y23;JJubdq=~+2M&1KFJ8lZ@f-=+}nVgulhKkkWS+sD|Mlk$n%bI9@o2%|u9 zyN3XKTM>;_cH9eM4eM>A|5$GHyB zW3g_1n;&jvQw-?pS}IS}#TjOJxi=(;1|YS+5u*97SVy~bCO}P3x}HYW^&gvLngpx{ z=XBqa(1HqS>*M!+9t-7v?yD}HvzavxZ#4o1;jr{}P)>`B_s-i2(xs;IeE3jV-9l7P zc3#V<-W6GSf$LArbB%7uL5zKJ#Y}y!09C8^;EGD1eUR{#!WYE-8s8IqAXOz(qN+wp zgs5quBg%&}?rsK1?BhMMJ^@8pkm$U)f_t2StEj1u4iFUd8g0YR$2$&oeU*NiS5f}t z)sJcg8t=pvJ~Z9`-uH0dvHRbN@~vYq^su8f^8=?6_SfZVXM~@LUGQ~q6$rKop*CPUKEpJ%Vn){&t1^&!pfdBvi literal 0 HcmV?d00001 diff --git a/docs/tree-shot2.png b/docs/tree-shot2.png new file mode 100644 index 0000000000000000000000000000000000000000..f00326487a6eaa249d50d2f3438e601585f21c8f GIT binary patch literal 3383 zcmeH~`#03<9>>ksU|d2&$R?6YLyWV#xSMa22#pb$T*BBTA)*jUOv18+3L|$lnD&gz zxD%Sei5Mkm*e+!p%@%{g9)}EbzWobl?eoJ~t6!eySv$f4Kupczxng2+UmfjEo{#lgp6-s+ zZQUnH9C-ylAu%a6;b9$i#0^n&Pvc%mPbx93H#vb}ma>NgNXsmRbgp!lqvY(@>(Bcf zRkODKYkZRVuF>dY!me;j3Ij(dwn>tbACA=Y1vtGkwIO1Y6Yhos#=CMu}Zd^-VCEuEwf;x?V z;w9jY?WdJaydT$qTwuAz3_`)Q>N6`Es(_flQ4g+q=EF~mvp%of)dFnzw1W|J z07nuCg~fMPR#swiz5iUwrDm_m82r+8WUZm3>FK!tD4+9^Tvn@}-&$9B9W#~R{6H;@ zQduw#H_>^g?0G4M4Afs9^Xo5m2)2)_H|zL*Z9l%lsG`X`^~3HIEfZ=CTfcG?V`G@0 z#r!?Th}`H=*q+!)Gst~)L8?9nr>e9zU?f`n9Gz9%4wskilp@4c`PfXS;6vDycfY<} z9GD%7U?{_5gr^#gyLo_N#L(xe9p}QAMA%TcHkH$ z5Rw>!3N zJ4$2sWyIK(r`sOWT(}_bjvn~- z-64}_U}o8{nKWrha~r+WIf!mK@Qc(EP8Kjb9P!uv=x^mw4B<{{vsT^vA$KaR^V$=_ z0!7)4cRxB=)YoIxL;_UU@M$SkFrIfV=d?hsxm8``ZJy=|2ST9pc_sge_zHKWuz17p5zk!p@ zsLGfvrib#VYqRNvx|d z(sA#L7y$l40!}b1!2)o5Sw!{7zrOF)eg|2^WLVmwm& zon8dfUr?5~Lpi(2A5KKqt#97YO;DC!sbdO{<;_d5Gro<+ck}eusq{>ao;{?y_M|SB zw}gY{VYak@8Wj0?&6L&?O+MN?Ek~C_YDaK@APlnhzoLoUDOd01L)*EmX4y^&g6-tz z4C%zFv}9w|GV$knsVxNh|C%S+m@Z-eF#YQ5>-@hHDd@zz=B<5qew4zFyPU}V_e`Q_ zU1#~Y9+(7XfV*?uN{I^ez=JojBr25}FI-)%KX4421X7Z|GSr`*Jp^*s0GvVf{QP{= zXh%m!$xh4A1PZUk+vjp3-s^LqRq&}gX4N=7!5HI^{5K7Vc%5wBjT<(=z)!U8qVe)EI2iA!mcxIVdGpVKxa_1xpfl$#k!D^9Z`)?LL zl?B`V^mwe-ooGd?iKu@ZEbCmWbMc#hUEs`p$hu9;3wpun_1&y!v6eBOt1i`eD<|bs zN74PTL7Comy3ri)+j2!mjnt?HS$;PDX!X8&E(bF6I@u=5igKElc0zL_BWLYu_WoPusrjv$eS922yN^GIVGIg_JC!pHp9KAvfw z6nP#MM5o+xupzBWd=d{Wu;K{_YMi-%xJkUtQ4Kk2Nu))<%Kc>Ya*>LPBkrvJUNwkn zk0Q8)X6R~;Nw`=eKUofw__si-Bx){rgnNHqhngNp#6mon#ntNp@ZVshpIbjO@ptzG xsY5IAdtgu41QL2*hQJJ}C;y3n0XZ^4nI4R-I#1$@2lNvXb3E;0SBoXy`wy4GwW0t3 literal 0 HcmV?d00001 diff --git a/docs/tree-shot3.png b/docs/tree-shot3.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4c11e156584f48ce8c74a11d7a3d41c6249594 GIT binary patch literal 4001 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 literal 0 HcmV?d00001 diff --git a/docs/two_columns.png b/docs/two_columns.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc8c40c9021a3cdf6a3728d8c48afe29db4f277 GIT binary patch literal 4624 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 xz{KSTCJj3}& literal 0 HcmV?d00001 diff --git a/docs/two_terminals.png b/docs/two_terminals.png new file mode 100644 index 0000000000000000000000000000000000000000..20b45acfa66534e8803b4cf454ba44b6d7aba9f0 GIT binary patch literal 4901 zcmeHL`8QkZ*N;fAs3NG+sG?|5TGvpm;Zk#?xP}rlRW*dDDTpbQYLS|$xs{e0>qd!+ z@v5n6o~2Q9YY1)3&Bgche%JdyylcJhFXudK@Ad4p&w2KkJp6^Rw)b~yz_v+8ET{3ndW z@*+}W+{Ko|mAt`&7!X8Mo;5l+>S%ZJOvH#dL=+S~c+A2I)dGQQVOlj0a?VC*gTO`2 z>k0?Q%&qaSUyGt9T>r8|sxHGRlHMkW=ZyO~lA)d%DC#Se(I7IQi`vBphBa_TKXZ0d zdEX+-UHPJ6WXK^|x6`$%v?7m|a1)3ez%#`#d@ikr^Bk8EzH$g7l6o9(2qL`iM_K+f zw6$i~yAnA~ZiB$Ayf?RMNOrc46T0)onHdQykI_|zX1z8z{aD2K=;MmtcT4sfh8=kH zp;~h&uzR~vaM>(<(`O4VPMi9~b23sYD|buLbU1rt+Lq+nn-bU4*YKCOAO}SBAt(6l zY==325BAz6$TIfw>`>v9Io>OXKG35v0CpHhUm1kaZLF(cSg6(u{TJIMVW$(<^{ToG zruAO!B_0&GxZHv@utZz?HYVPfj)g4_qTwXJgKd18Rc(mvAV@_dyt(ffIhn>SmcY8rBP%UTH z=+V;HqNwA;$IjZKfaNnDf6QN*?tHXI^;LOe#Qtjs724DNNSzl$G&l(YDqK|zWOPfqhO;?#69Xdq)52ZZScN^mh)78o8aNJ?xv)Y!8=}$IJEwP0yGxG}> z%kSndIBCxh5nf$ z1$9MRDUD%i8>!_QK~#^u`?IyhSnGT__E;>+Oj>%>skb<+BBPa}Sx)Dm8K5hV?aI4?84c~O-IutmVP73N3gDovCW#nHNo69`*c1v4L!z!;Q!J4r|gkJ1WKw%;4)8dOGe@pEgSdo=lx?|!5@LF*9DWA zDJXcSd2P|8=fzv&)A~O0EfS{IFT<6yE(fQo_8=#v*i}LtZ8ffnU9XMHhVKUgp8t|!A0h=s@0Ncg-PwJu*8Ve{r)1G|7yf_dCUcA>yV(?rCh&);)tL0sow zo7|_mk@cjF9J@NGv?THA1QX}^cGg)VI0^0Z+P!JjG>Fd;kL z?-WomO_>*(3D9Yb^Ab*=^{>LIq31O7II^HaW?q*vx6r&ALxae11+(Xpf7xq7{yWP~dIPntApvuY_I>X4#MZBBgPpIc39}9jF znRZttB*zDTEjiq6`#90ZDJyV~>Hp5!hY`31o1F3)nvGTdYPf6bP3r3}yXq72pmgD? zzlMWr6K+TmB^i(|cG>l(SCZoZMoYju5=#z`&#dak)CE#9ZWvg3z{6gDvPh%MV_r5t z)O#$EXk?zoU19T9WWw?8Cv{U=*gVE$@*p_6OY-Wq9K)xr=s@Xl^{VD!9XWen?OSi$ zp2Sb8Qxelg1mdou^1?e3yoYTYrWAe3=SfH2sMNkS4B=-9lUAJ)N6W|0cA4J_oA$YK z=JtjSb#;?!J4QvmGj~=; z2XtdakZngfP4tU5>whQRo->B__&Np6cHq(nq+}opq5hI*tYD}FEyJ1(-z#I^bi=*= zx;ME`6WUrRQkdf29r4@i3f)UBVvf|0aA_*SL>=$pmy7SCEt zo)RPX+%-26_fvHZPCALt_U=;xmCP7&w?*G|BpCJfKj}5OLRGc7RcrThrd~=gGEVQQ zZEx^wRwLNid{&O-`0Ljdk02HI=1Q}1dG9-_l0^`)yT&{Dv3MQPD2XwZH29X(^cPWM zY5G=pN%M2>Ztsu>-mz+&j`w9$j5qf_{$ZJAl;N48u34U!RYPfN__3@)qjRkn@6Mlz z?qpwz36kdGC)zrvT{--C!QNF4(c@TtSMH8dkBkW;DSmP!!Qs@vN>mk&ME)4LSW=K# z3&U$&N@Qh^P##`t)fwcRHrKk%%8=<(5{O+C1VAlG45L5-*5DW`Kt47G#i& zzGpc@`)*0u2_#h8QFg7}9cX@p!R5pcul4NhnI^7g7g!;pFo~gQms7QKSWfUi{;SGw z(gM7|(1{m|i#dKn?L!lJyi?2)X5I}`KcL0R0Uq1!2X(OLxu6*3-2;z{U^I_b%|xzB zMO@n$(2C2t4YpyZL{LoKM3apiq~tQ**;wO`-1s(Iz*)D_?J<&{|vQ9b-^?E-qY&JGu@kibD72jcYsq%4=+q7z(Y_ z1GU?tXDiQvE%>x*N-m1@>-^tNEjqrtySvWnlb0AM+LOJeBNrQ}#1*{@ZDM{6)~qIb zS)E~l-a*XKM4}>dNq)JHL68aYHt~6!qI)Ooc@}V#^lu&)!0S9AlMaln*6=@z-nKFk z$(y%7&hAzKp}RiJ^9I#X?Z)Qxfa{>6 zcSr+U?!8BNKMF{kRyydpP?3#Qg)h~VRZTJcXxIgyvzQ&;8#E1_kAy6$v``&{hEFF zE5dIuvZ-E1T=oE_sCsxsmU&&#HCijB&8B7}&dt}-cnL1(<5=F7H3}^zznqW*GM0hvxFm&a$;Dhz3$w2-X`wK z6x!k1=#GY>qh*OuUMBWvu`3a`uIf$>oNT41km`g#yJ4WK=hE_d7`8NezjD3MiY%m_ z2O41%l6Td-yvGNdmq1OSCpGque2lOl(r+HVz*ay@ipe&YR{$y(nB6z*=(Blh zO|?N^a{S2iEthn%v71eB`a3p0?&PrgtJu6&{gV% zkQ;m<2W!;P6XbJ;7zU|nVpk#4V)`yszT})xc8Dq(?RNKm=me_7zr$xnL4sIvzOvNc zgKR0Jl`~4WD9<>`K-SO4C?$?(*9UsOGo)o11=21{>f)-GE2IDBiiSqlI_ov5FdHU+ zu6Pqq&E#3&))N*zkZ*Qf*#t!Ht(@nstcw=@FPYm^6MdMvS<}(@=qYyt1cGjRIm8PQ zo#VS1VRW!8@DI&Q1ZD*=-G26OPVK7f6K_Q#L$(V&KwzMK67b>bQzsggw(0<5oqGrt z(TtQ0Xo)&$QL6TwW@u`@MI_wS0fBu@0D!>Za7Khb)YX+{2nR}kk4pCr$?fDXy)PIW z>e~;@-*p>&Fz}NhxwA9QB~U6`%K0_KA51E95m4+DWSeoRJN4s^#XIq46E@t1_<|+G zzvvSfd~6`#$LL(|(kM{iA651@D$~eGE&te{uN41_(!HMs2l-~oVD}B`B3@EF{Rswd zk(<{dYeahZhi}1FddmKX%`sn#L z9oHCVPrPT!=5~VN7K{L|c4!|q$v-vRd(Cn$*lA6AJ^c{r{9%-Hhl#D))Vb$*7TF)^ zSQ@%y=`K{)evqc_Fv?iIrk&)^SN^CekdXH9kvkEWrHI6+Rn{$C9?b8PS##DXS`7 z_gX6SJhyMKs|vo@qnFWm_2_(Fb>B>F(!ne9g}KH~0zK=x2GxT(V%hs;b{o?`xie`& zz!;KKVhwu89Ph`eoB=lsMFnJeUJ%E084b56MgsP2Lzu#|Yd)jR^yNl@6SWpLOzpcQ ztX5=G~eu6%P-KQ6xII#!9iZ}E2lw;uqd9LZbB8;S*8-5r!l<<^U+Y216qFW^>Aa--ie+zU%Ln;)u_qW__2?f;#rcALo) zHTg}UEYvoP!ZvA<^iw0Vntu%|Iez_gcD@a@T-5(hJInffSsAy9@A}9E@wIe9m&4oL z;RJ9MeQ+8cJ?ex$_!4#Eu-(QLjbxw7v$%&=_4iy+*(ZBtN?Q}jpK5tf#YoSs$BwLK z`)5zCy9n@b39*0v!CCL)NpPU*f2epIbdlY<^Y2Enp(_tlLrxVu!W^w^j=65-Z3ZXA zxdC!ioL8$xKmW7_u)M|s>FbQ)0mB4SfzH2R`HdY6dk7%#wR1@@eA^QMsCi1YO<{OE z64dVhmvbx#qA!7WCfwx50gBrm49!YB1!!&gO8``VC>!DfZaEO!URDsm9v&c!xJg_g zpxv@TG0XSbp)AlOLr^>1Pi6t~D#Os44!F;y9aa`71gfr~Q6|tG1Lk@-2N&FiLk;2AV0aK@HlwYh zHS*`+YtDau&c`ElzQ+Rtnwp|EO2$I6re-H!#9^oF=kun&G&~#cobf)ZOWJ8*+ya#2 zdSiGm7Yp=);R_j5>j`7NP2ttA;Z98v{yOT-cqHjQ5S{DF9MsCZ0w5-<-;E@Iq7_Ac&gSo?~ z{@#|IVE7V#e=b0)2_QtXPk?ArV?zBgBmk4*LCLYgTKRyzOAM%eMGn1n?;WJO`R_ZP|n`r*(b<=3XF#o{4U?wsXvX0E*r2I{*Lx literal 0 HcmV?d00001 diff --git a/docs/userguide.html b/docs/userguide.html new file mode 100644 index 0000000..5e8f025 --- /dev/null +++ b/docs/userguide.html @@ -0,0 +1,1129 @@ + + + + + +i3: i3 User’s Guide + + + + + + + +
    +

    i3 - improved tiling WM

    + +
    +
    + +
    +
    +

    This document contains all the information you need to configure and use the i3 +window manager. If it does not, please contact me on IRC, Jabber or E-Mail and +I’ll help you out.

    +
    +
    +
    +

    1. Default keybindings

    +
    +

    For the "too long; didn’t read" people, here is an overview of the default +keybindings (click to see the full size image):

    +

    Keys to use with Mod1 (alt):

    +

    + +Keys to use with Mod1 (alt) + +

    +

    Keys to use with Shift+Mod1:

    +

    + +Keys to use with Shift+Mod1 + +

    +

    As i3 uses keycodes in the default configuration, it does not matter which +keyboard layout you actually use. The key positions are what matters (of course +you can also use keysymbols, see [keybindings]).

    +

    The red keys are the modifiers you need to press (by default), the blue keys +are your homerow.

    +
    +
    +
    +

    2. Using i3

    +
    +
    +

    2.1. Opening terminals and moving around

    +

    One very basic operation is opening a new terminal. By default, the keybinding +for this is Mod1+Enter, that is Alt+Enter in the default configuration. By +pressing Mod1+Enter, a new terminal will be opened. It will fill the whole +space available on your screen.

    +

    +Single terminal +

    +

    It is important to keep in mind that i3 uses a table to manage your windows. At +the moment, you have exactly one column and one row which leaves you with one +cell. In this cell there is a container, which is where your new terminal is +opened.

    +

    If you now open another terminal, you still have only one cell. However, the +container in that cell holds both of your terminals. So, a container is just a +group of clients with a specific layout. Containers can be resized by adjusting +the size of the cell that holds them.

    +

    +Two terminals +

    +

    To move the focus between the two terminals, you use the direction keys which +you may know from the editor vi. However, in i3, your homerow is used for +these keys (in vi, the keys are shifted to the left by one for compatibility +with most keyboard layouts). Therefore, Mod1+J is left, Mod1+K is down, +Mod1+L is up and Mod1+; is right. So, to switch between the terminals, +use Mod1+K or Mod1+L.

    +

    To create a new row/column (and a new cell), you can simply move a terminal (or +any other window) in the direction you want to expand your table. So, let’s +expand the table to the right by pressing Mod1+Shift+;.

    +

    +Two columns +

    +
    +
    +

    2.2. Changing container modes

    +

    A container can have the following modes:

    +
    +
    +default +
    +
    +

    +Windows are sized so that every window gets an equal amount of space in the +container. +

    +
    +
    +stacking +
    +
    +

    +Only the focused window in the container is displayed. You get a list of +windows at the top of the container. +

    +
    +
    +tabbed +
    +
    +

    +The same principle as stacking, but the list of windows at the top is only +a single line which is vertically split. +

    +
    +
    +

    To switch modes, press Mod1+e for default, Mod1+h for stacking and +Mod1+w for tabbed.

    +

    +Container modes +

    +
    +
    +

    2.3. Toggling fullscreen mode for a window

    +

    To display a window fullscreen or to go out of fullscreen mode again, press +Mod1+f.

    +

    There is also a global fullscreen mode in i3 in which the client will use all +available outputs. To use it, or to get out of it again, press Mod1+Shift+f.

    +
    +
    +

    2.4. Opening other applications

    +

    Aside from opening applications from a terminal, you can also use the handy +dmenu which is opened by pressing Mod1+v by default. Just type the name +(or a part of it) of the application which you want to open. The application +typed has to be in your $PATH for this to work.

    +

    Additionally, if you have applications you open very frequently, you can +create a keybinding for starting the application directly. See the section +"Configuring i3" for details.

    +
    +
    +

    2.5. Closing windows

    +

    If an application does not provide a mechanism for closing (most applications +provide a menu, the escape key or a shortcut like Control+W to close), you +can press Mod1+Shift+q to kill a window. For applications which support +the WM_DELETE protocol, this will correctly close the application (saving +any modifications or doing other cleanup). If the application doesn’t support +the WM_DELETE protocol your X server will kill the window and the behaviour +depends on the application.

    +
    +
    +

    2.6. Using workspaces

    +

    Workspaces are an easy way to group a set of windows. By default, you are on +the first workspace, as the bar on the bottom left indicates. To switch to +another workspace, press Mod1+num where num is the number of the workspace +you want to use. If the workspace does not exist yet, it will be created.

    +

    A common paradigm is to put the web browser on one workspace, communication +applications (mutt, irssi, …) on another one, and the ones with which you +work, on the third one. Of course, there is no need to follow this approach.

    +

    If you have multiple screens, a workspace will be created on each screen at +startup. If you open a new workspace, it will be bound to the screen you +created it on. When you switch to a workspace on another screen, i3 will set +focus to that screen.

    +
    +
    +

    2.7. Moving windows to workspaces

    +

    To move a window to another workspace, simply press Mod1+Shift+num where +num is (like when switching workspaces) the number of the target workspace. +Similarly to switching workspaces, the target workspace will be created if +it does not yet exist.

    +
    +
    +

    2.8. Resizing columns/rows

    +

    To resize columns or rows, just grab the border between the two columns/rows +and move it to the wanted size. Please keep in mind that each cell of the table +holds a container and thus you cannot horizontally resize single windows. If +you need applications with different horizontal sizes, place them in seperate +cells one above the other.

    +

    See [resizingconfig] for how to configure i3 to be able to resize +columns/rows with your keyboard.

    +
    +
    +

    2.9. Restarting i3 inplace

    +

    To restart i3 inplace (and thus get into a clean state if there is a bug, or +to upgrade to a newer version of i3) you can use Mod1+Shift+r. Be aware, +though, that this kills your current layout and all the windows you have opened +will be put in a default container in only one cell. Saving layouts will be +implemented in a later version.

    +
    +
    +

    2.10. Exiting i3

    +

    To cleanly exit i3 without killing your X server, you can use Mod1+Shift+e.

    +
    +
    +

    2.11. Snapping

    +

    Snapping is a mechanism to increase/decrease the colspan/rowspan of a container. +Colspan/rowspan is the number of columns/rows a specific cell of the table +consumes. This is easier explained by giving an example, so take the following +layout:

    +

    +Snapping example +

    +

    To use the full size of your screen, you can now snap container 3 downwards +by pressing Mod1+Control+k (or snap container 2 rightwards).

    +
    +
    +

    2.12. Floating

    +

    Floating mode is the opposite of tiling mode. The position and size of a window +are not managed by i3, but by you. Using this mode violates the tiling +paradigm but can be useful for some corner cases like "Save as" dialog +windows, or toolbar windows (GIMP or similar).

    +

    You can enable floating mode for a window by pressing Mod1+Shift+Space. By +dragging the window’s titlebar with your mouse you can move the window +around. By grabbing the borders and moving them you can resize the window. You +can also do that by using the [floating_modifier].

    +

    For resizing floating windows with your keyboard, see [resizingconfig].

    +

    Floating windows are always on top of tiling windows.

    +
    +
    +
    +
    +

    3. Configuring i3

    +
    +

    This is where the real fun begins ;-). Most things are very dependant on your +ideal working environment so we can’t make reasonable defaults for them.

    +

    While not using a programming language for the configuration, i3 stays +quite flexible in regards to the things you usually want your window manager +to do.

    +

    For example, you can configure bindings to jump to specific windows, +you can set specific applications to start on specific workspaces, you can +automatically start applications, you can change the colors of i3, and you +can bind your keys to do useful things.

    +

    To change the configuration of i3, copy /etc/i3/config to ~/.i3/config +(or ~/.config/i3/config if you like the XDG directory scheme) and edit it +with a text editor.

    +
    +

    3.1. Comments

    +

    It is possible and recommended to use comments in your configuration file to +properly document your setup for later reference. Comments are started with +a # and can only be used at the beginning of a line:

    +

    Examples:

    +
    +
    +
    # This is a comment
    +
    +
    +
    +

    3.2. Fonts

    +

    i3 uses X core fonts (not Xft) for rendering window titles and the internal +workspace bar. You can use xfontsel(1) to generate such a font description. +To see special characters (Unicode), you need to use a font which supports +the ISO-10646 encoding.

    +

    Syntax:

    +
    +
    +
    font <X core font description>
    +
    +

    Examples:

    +
    +
    +
    font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
    +
    +
    +
    +

    3.3. Keyboard bindings

    +

    A keyboard binding makes i3 execute a command (see below) upon pressing a +specific key. i3 allows you to bind either on keycodes or on keysyms (you can +also mix your bindings, though i3 will not protect you from overlapping ones).

    +
      +
    • +

      +A keysym (key symbol) is a description for a specific symbol, like "a" + or "b", but also more strange ones like "underscore" instead of "_". These + are the ones you use in Xmodmap to remap your keys. To get the current + mapping of your keys, use xmodmap -pke. +

      +
    • +
    • +

      +Keycodes do not need to have a symbol assigned (handy for some hotkeys + on some notebooks) and they will not change their meaning as you switch to a + different keyboard layout (when using xmodmap). +

      +
    • +
    +

    My recommendation is: If you often switch keyboard layouts but you want to keep +your bindings in the same physical location on the keyboard, use keycodes. +If you don’t switch layouts, and want a clean and simple config file, use +keysyms.

    +

    Syntax:

    +
    +
    +
    bindsym [Modifiers+]keysym command
    +bind [Modifiers+]keycode command
    +
    +

    Examples:

    +
    +
    +
    # Fullscreen
    +bindsym Mod1+f f
    +
    +# Restart
    +bindsym Mod1+Shift+r restart
    +
    +# Notebook-specific hotkeys
    +bind 214 exec /home/michael/toggle_beamer.sh
    +
    +

    Available Modifiers:

    +
    +
    +Mod1-Mod5, Shift, Control +
    +
    +

    +Standard modifiers, see xmodmap(1) +

    +
    +
    +Mode_switch +
    +
    +

    +Unlike other window managers, i3 can use Mode_switch as a modifier. This allows +you to remap capslock (for example) to Mode_switch and use it for both: typing +umlauts or special characters and having some comfortably reachable key +bindings. For example, when typing, capslock+1 or capslock+2 for switching +workspaces is totally convenient. Try it :-). +

    +
    +
    +
    +
    +

    3.4. The floating modifier

    +

    To move floating windows with your mouse, you can either grab their titlebar +or configure the so called floating modifier which you can then press and +click anywhere in the window itself to move it. The most common setup is to +use the same key you use for managing windows (Mod1 for example). Then +you can press Mod1, click into a window using your left mouse button, and drag +it to the position you want.

    +

    When holding the floating modifier, you can resize a floating window by +pressing the right mouse button on it and moving around while holding it. If +you hold the shift button as well, the resize will be proportional.

    +

    Syntax:

    +
    +
    +
    floating_modifier <Modifiers>
    +
    +

    Examples:

    +
    +
    +
    floating_modifier Mod1
    +
    +
    +
    +

    3.5. Layout mode for new containers

    +

    This option determines in which mode new containers will start. See also +[stack-limit].

    +

    Syntax:

    +
    +
    +
    new_container <default|stacking|tabbed>
    +new_container stack-limit <cols|rows> <value>
    +
    +

    Examples:

    +
    +
    +
    new_container tabbed
    +
    +
    +
    +

    3.6. Border style for new windows

    +

    This option determines which border style new windows will have.

    +

    Syntax:

    +
    +
    +
    new_window <bp|bn|bb>
    +
    +

    Examples:

    +
    +
    +
    new_window bp
    +
    +
    +
    +

    3.7. Variables

    +

    As you learned in the section about keyboard bindings, you will have +to configure lots of bindings containing modifier keys. If you want to save +yourself some typing and be able to change the modifier you use later, +variables can be handy.

    +

    Syntax:

    +
    +
    +
    set name value
    +
    +

    Examples:

    +
    +
    +
    set $m Mod1
    +bindsym $m+Shift+r restart
    +
    +

    Variables are directly replaced in the file when parsing. There is no fancy +handling and there are absolutely no plans to change this. If you need a more +dynamic configuration you should create a little script which generates a +configuration file and run it before starting i3 (for example in your +.xsession file).

    +
    +
    +

    3.8. Automatically putting clients on specific workspaces

    +

    It is recommended that you match on window classes wherever possible because +some applications first create their window, and then worry about setting the +correct title. Firefox with Vimperator comes to mind. The window starts up +being named Firefox, and only when Vimperator is loaded does the title change. +As i3 will get the title as soon as the application maps the window (mapping +means actually displaying it on the screen), you’d need to have to match on +Firefox in this case.

    +

    You can prefix or suffix workspaces with a ~ to specify that matching clients +should be put into floating mode. If you specify only a ~, the client will +not be put onto any workspace, but will be set floating on the current one.

    +

    Syntax:

    +
    +
    +
    assign ["]window class[/window title]["] [→] [~ | workspace]
    +
    +

    Examples:

    +
    +
    +
    assign urxvt 2
    +assign urxvt → 2
    +assign "urxvt" → 2
    +assign "urxvt/VIM" → 3
    +assign "gecko" → ~4
    +assign "xv/MPlayer" → ~
    +
    +

    Note that the arrow is not required, it just looks good :-). If you decide to +use it, it has to be a UTF-8 encoded arrow, not "→" or something like that.

    +
    +
    +

    3.9. Automatically starting applications on i3 startup

    +

    By using the exec keyword outside a keybinding, you can configure which +commands will be performed by i3 on initial startup (not when restarting i3 +in-place however). These commands will be run in order.

    +

    Syntax:

    +
    +
    +
    exec command
    +
    +

    Examples:

    +
    +
    +
    exec sudo i3status | dzen2 -dock
    +
    +
    +
    +

    3.10. Automatically putting workspaces on specific screens

    +

    If you assign clients to workspaces, it might be handy to put the +workspaces on specific screens. Also, the assignment of workspaces to screens +will determine which workspace i3 uses for a new screen when adding screens +or when starting (e.g., by default it will use 1 for the first screen, 2 for +the second screen and so on).

    +

    Syntax:

    +
    +
    +
    workspace <number> output <output>
    +
    +

    The output is the name of the RandR output you attach your screen to. On a +laptop, you might have VGA1 and LVDS1 as output names. You can see the +available outputs by running xrandr --current.

    +

    Examples:

    +
    +
    +
    workspace 1 output LVDS1
    +workspace 5 output VGA1
    +
    +
    +
    +

    3.11. Named workspaces

    +

    If you always have a certain arrangement of workspaces, you might want to give +them names (of course UTF-8 is supported):

    +

    Syntax:

    +
    +
    +
    workspace <number> <name>
    +workspace <number> output <output> name
    +
    +

    For more details about the output part of this command, see above.

    +

    Examples:

    +
    +
    +
    workspace 1 www
    +workspace 2 work
    +workspace 3 i ♥ workspaces
    +
    +
    +
    +

    3.12. Changing colors

    +

    You can change all colors which i3 uses to draw the window decorations and the +bottom bar.

    +

    Syntax:

    +
    +
    +
    colorclass border background text
    +
    +

    Where colorclass can be one of:

    +
    +
    +client.focused +
    +
    +

    + A client which currently has the focus. +

    +
    +
    +client.focused_inactive +
    +
    +

    + A client which is the focused one of its container, but it does not have + the focus at the moment. +

    +
    +
    +client.unfocused +
    +
    +

    + A client which is not the focused one of its container. +

    +
    +
    +client.urgent +
    +
    +

    + A client which has its urgency hint activated. +

    +
    +
    +bar.focused +
    +
    +

    + The current workspace in the bottom bar. +

    +
    +
    +bar.unfocused +
    +
    +

    + All other workspaces in the bottom bar. +

    +
    +
    +bar.urgent +
    +
    +

    + A workspace which has at least one client with an activated urgency hint. +

    +
    +
    +

    You can also specify the color to be used to paint the background of the client +windows. This color will be used to paint the window on top of which the client +will be rendered.

    +

    Syntax:

    +
    +
    +
    client.background color
    +
    +

    Only clients that do not cover the whole area of this window expose the color +used to paint it. If you use a color other than black for your terminals, you +most likely want to set the client background color to the same color as your +terminal program’s background color to avoid black gaps between the rendered +area of the termianal and the i3 border.

    +

    Colors are in HTML hex format (#rrggbb), see the following example:

    +

    Examples:

    +
    +
    +
    # class        border  backgr. text
    +client.focused #2F343A #900000 #FFFFFF
    +
    +

    Note that for the window decorations, the color around the child window is the +background color, and the border color is only the two thin lines at the top of +the window.

    +
    +
    +

    3.13. Interprocess communication

    +

    i3 uses unix sockets to provide an IPC interface. This allows third-party +programs to get information from i3, such as the current workspaces +(to display a workspace bar), and to control i3.

    +

    To enable it, you have to configure a path where the unix socket will be +stored. The default path is ~/.i3/ipc.sock.

    +

    Examples:

    +
    +
    +
    ipc-socket ~/.i3/ipc.sock
    +
    +

    You can then use the i3-msg application to perform any command listed in +the next section.

    +
    +
    +

    3.14. Disable focus follows mouse

    +

    If you have a setup where your mouse usually is in your way (like a touchpad +on your laptop which you do not want to disable completely), you might want +to disable focus follows mouse and control focus only by using your keyboard. +The mouse will still be useful inside the currently active window (for example +to click on links in your browser window).

    +

    Syntax:

    +
    +
    +
    focus_follows_mouse <yes|no>
    +
    +

    Examples:

    +
    +
    +
    focus_follows_mouse no
    +
    +
    +
    +

    3.15. Internal workspace bar

    +

    The internal workspace bar (the thing at the bottom of your screen) is very +simple — it does not provide a way to display custom text and it does not +offer advanced customization features. This is intended because we do not +want to duplicate functionality of tools like dzen2, xmobar and so on +(they render bars, we manage windows). Instead, there is an option which will +turn off the internal bar completely, so that you can use a separate program to +display it (see i3-wsbar, a sample implementation of such a program):

    +

    Syntax:

    +
    +
    +
    workspace_bar <yes|no>
    +
    +

    Examples:

    +
    +
    +
    workspace_bar no
    +
    +
    +
    +
    +
    +

    4. List of commands

    +
    +
    +

    4.1. Manipulating layout

    +

    To change the layout of the current container to stacking, use s, for default +use d and for tabbed, use T. To make the current client (!) fullscreen, +use f, to make it span all outputs, use fg, to make it floating (or +tiling again) use t:

    +

    Examples:

    +
    +
    +
    bindsym Mod1+s s
    +bindsym Mod1+l d
    +bindsym Mod1+w T
    +
    +# Toggle fullscreen
    +bindsym Mod1+f f
    +
    +# Toggle global fullscreen
    +bindsym Mod1+Shift+f fg
    +
    +# Toggle floating/tiling
    +bindsym Mod1+t t
    +
    +
    +
    +

    4.2. Focusing/Moving/Snapping clients/containers/screens

    +

    To change the focus, use one of the h, j, k and l commands, meaning +left, down, up, right (respectively). To focus a container, prefix it with +wc. To focus a screen, prefix it with ws.

    +

    The same principle applies for moving and snapping: just prefix the command +with m when moving and with s when snapping:

    +

    Examples:

    +
    +
    +
    # Focus clients on the left, bottom, top, right:
    +bindsym Mod1+j h
    +bindsym Mod1+k j
    +bindsym Mod1+j k
    +bindsym Mod1+semicolon l
    +
    +# Move client to the left, bottom, top, right:
    +bindsym Mod1+j mh
    +bindsym Mod1+k mj
    +bindsym Mod1+j mk
    +bindsym Mod1+semicolon ml
    +
    +# Snap client to the left, bottom, top, right:
    +bindsym Mod1+j sh
    +bindsym Mod1+k sj
    +bindsym Mod1+j sk
    +bindsym Mod1+semicolon sl
    +
    +# Focus container on the left, bottom, top, right:
    +bindsym Mod3+j wch
    +…
    +
    +
    +
    +

    4.3. Changing workspaces/moving clients to workspaces

    +

    To change to a specific workspace, the command is just the number of the +workspace, e.g. 1 or 3. To move the current client to a specific workspace, +prefix the number with an m.

    +

    You can also switch to the next and previous workspace with the commands nw +and pw, which is handy, for example, if you have workspace 1, 3, 4 and 9 and +you want to cycle through them with a single key combination.

    +

    Examples:

    +
    +
    +
    bindsym Mod1+1 1
    +bindsym Mod1+2 2
    +...
    +
    +bindsym Mod1+Shift+1 m1
    +bindsym Mod1+Shift+2 m2
    +...
    +
    +bindsym Mod1+o nw
    +bindsym Mod1+p pw
    +
    +
    +
    +

    4.4. Resizing columns/rows

    +

    If you want to resize columns/rows using your keyboard, you can use the +resize command, I recommend using it inside a so called mode:

    +
    +
    Example: Configuration file, defining a mode for resizing
    +
    +
    mode "resize" {
    +        # These bindings trigger as soon as you enter the resize mode
    +
    +        # They resize the border in the direction you pressed, e.g.
    +        # when pressing left, the window is resized so that it has
    +        # more space on its left
    +
    +        bindsym n resize left -10
    +        bindsym Shift+n resize left +10
    +
    +        bindsym r resize bottom +10
    +        bindsym Shift+r resize bottom -10
    +
    +        bindsym t resize top -10
    +        bindsym Shift+t resize top +10
    +
    +        bindsym d resize right +10
    +        bindsym Shift+d resize right -10
    +
    +        bind 36 mode default
    +}
    +
    +# Enter resize mode
    +bindsym Mod1+r mode resize
    +
    +
    +
    +

    4.5. Jumping to specific windows

    +

    Often when in a multi-monitor environment, you want to quickly jump to a +specific window. For example, while working on workspace 3 you may want to +jump to your mail client to email your boss that you’ve achieved some +important goal. Instead of figuring out how to navigate to your mailclient, +it would be more convenient to have a shortcut.

    +

    Syntax:

    +
    +
    +
    jump ["]window class[/window title]["]
    +jump workspace [ column row ]
    +
    +

    You can either use the same matching algorithm as in the assign command +(see above) or you can specify the position of the client if you always use +the same layout.

    +

    Examples:

    +
    +
    +
    # Get me to the next open VIM instance
    +bindsym Mod1+a jump "urxvt/VIM"
    +
    +
    +
    +

    4.6. VIM-like marks (mark/goto)

    +

    This feature is like the jump feature: It allows you to directly jump to a +specific window (this means switching to the appropriate workspace and setting +focus to the windows). However, you can directly mark a specific window with +an arbitrary label and use it afterwards. You do not need to ensure that your +windows have unique classes or titles, and you do not need to change your +configuration file.

    +

    As the command needs to include the label with which you want to mark the +window, you cannot simply bind it to a key. i3-input is a tool created +for this purpose: It lets you input a command and sends the command to i3. It +can also prefix this command and display a custom prompt for the input dialog.

    +

    Syntax:

    +
    +
    +
    mark <identifier>
    +goto <identifier>
    +
    +

    Examples:

    +
    +
    +
    # Read 1 character and mark the current window with this character
    +bindsym Mod1+m exec i3-input -p 'mark ' -l 1 -P 'Mark: '
    +
    +# Read 1 character and go to the window with the character
    +bindsym Mod1+g exec i3-input -p 'goto ' -l 1 -P 'Goto: '
    +
    +

    Alternatively, if you do not want to mess with i3-input, you could create +seperate bindings for a specific set of labels and then only use those labels.

    +
    +
    +

    4.7. Traveling the focus stack

    +

    This mechanism can be thought of as the opposite of the jump command. +It travels the focus stack and jumps to the window which had focus previously.

    +

    Syntax:

    +
    +
    +
    focus [number] | floating | tiling | ft
    +
    +

    Where number by default is 1 meaning that the next client in the focus stack +will be selected.

    +

    The special values have the following meaning:

    +
    +
    +floating +
    +
    +

    + The next floating window is selected. +

    +
    +
    +tiling +
    +
    +

    + The next tiling window is selected. +

    +
    +
    +ft +
    +
    +

    + If the current window is floating, the next tiling window will be + selected; and vice-versa. +

    +
    +
    +
    +
    +

    4.8. Changing border style

    +

    To change the border of the current client, you can use bn to use the normal +border (including window title), bp to use a 1-pixel border (no window title) +and bb to make the client borderless. There is also bt which will toggle +the different border styles.

    +

    Examples:

    +
    +
    +
    bindsym Mod1+t bn
    +bindsym Mod1+y bp
    +bindsym Mod1+u bb
    +
    +
    +
    +

    4.9. Changing the stack-limit of a container

    +

    If you have a single container with a lot of windows inside it (say, more than +10), the default layout of a stacking container can get a little unhandy. +Depending on your screen’s size, you might end up seeing only half of the +titlebars for each window in the container.

    +

    Using the stack-limit command, you can limit the number of rows or columns +in a stacking container. i3 will create columns or rows (depending on what +you limited) automatically as needed.

    +

    Syntax:

    +
    +
    +
    stack-limit <cols|rows> <value>
    +
    +

    Examples:

    +
    +
    +
    # I always want to have two window titles in one line
    +stack-limit cols 2
    +
    +# Not more than 5 rows in this stacking container
    +stack-limit rows 5
    +
    +

    +Container limited to two columns +

    +
    +
    +

    4.10. Reloading/Restarting/Exiting

    +

    You can make i3 reload its configuration file with reload. You can also +restart i3 inplace with the restart command to get it out of some weird state +(if that should ever happen) or to perform an upgrade without having to restart +your X session. However, your layout is not preserved at the moment, meaning +that all open windows will end up in a single container in default layout +after the restart. To exit i3 properly, you can use the exit command, +however you don’t need to (simply killing your X session is fine as well).

    +

    Examples:

    +
    +
    +
    bindsym Mod1+Shift+r restart
    +bindsym Mod1+Shift+w reload
    +bindsym Mod1+Shift+e exit
    +
    +
    +
    +
    +
    +

    5. Multiple monitors

    +
    +

    As you can see in the goal list on the website, i3 was specifically developed +with support for multiple monitors in mind. This section will explain how to +handle multiple monitors.

    +

    When you have only one monitor, things are simple. You usually start with +workspace 1 on your monitor and open new ones as you need them.

    +

    When you have more than one monitor, each monitor will get an initial +workspace. The first monitor gets 1, the second gets 2 and a possible third +would get 3. When you switch to a workspace on a different monitor, i3 will +switch to that monitor and then switch to the workspace. This way, you don’t +need shortcuts to switch to a specific monitor, and you don’t need to remember +where you put which workspace. New workspaces will be opened on the currently +active monitor. It is not possible to have a monitor without a workspace.

    +

    The idea of making workspaces global is based on the observation that most +users have a very limited set of workspaces on their additional monitors. +They are often used for a specific task (browser, shell) or for monitoring +several things (mail, IRC, syslog, …). Thus, using one workspace on one monitor +and "the rest" on the other monitors often makes sense. However, as you can +create an unlimited number of workspaces in i3 and tie them to specific +screens, you can have the "traditional" approach of having X workspaces per +screen by changing your configuration (using modes, for example).

    +
    +

    5.1. Configuring your monitors

    +

    To help you get going if you have never used multiple monitors before, here is +a short overview of the xrandr options which will probably be of interest to +you. It is always useful to get an overview of the current screen configuration. +Just run "xrandr" and you will get an output like the following:

    +
    +
    +
    $ xrandr
    +Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
    +VGA1 disconnected (normal left inverted right x axis y axis)
    +LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
    +   1280x800       60.0*+   50.0
    +   1024x768       85.0     75.0     70.1     60.0
    +   832x624        74.6
    +   800x600        85.1     72.2     75.0     60.3     56.2
    +   640x480        85.0     72.8     75.0     59.9
    +   720x400        85.0
    +   640x400        85.1
    +   640x350        85.1
    +
    +

    Several things are important here: You can see that LVDS1 is connected (of +course, it is the internal flat panel) but VGA1 is not. If you have a monitor +connected to one of the ports but xrandr still says "disconnected", you should +check your cable, monitor or graphics driver.

    +

    The maximum resolution you can see at the end of the first line is the maximum +combined resolution of your monitors. By default, it is usually too low and has +to be increased by editing /etc/X11/xorg.conf.

    +

    So, say you connected VGA1 and want to use it as an additional screen:

    +
    +
    +
    xrandr --output VGA1 --auto --left-of LVDS1
    +
    +

    This command makes xrandr try to find the native resolution of the device +connected to VGA1 and configures it to the left of your internal flat panel. +When running "xrandr" again, the output looks like this:

    +
    +
    +
    $ xrandr
    +Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
    +VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
    +   1280x1024      60.0*+   75.0
    +   1280x960       60.0
    +   1152x864       75.0
    +   1024x768       75.1     70.1     60.0
    +   832x624        74.6
    +   800x600        72.2     75.0     60.3     56.2
    +   640x480        72.8     75.0     66.7     60.0
    +   720x400        70.1
    +LVDS1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 261mm x 163mm
    +   1280x800       60.0*+   50.0
    +   1024x768       85.0     75.0     70.1     60.0
    +   832x624        74.6
    +   800x600        85.1     72.2     75.0     60.3     56.2
    +   640x480        85.0     72.8     75.0     59.9
    +   720x400        85.0
    +   640x400        85.1
    +   640x350        85.1
    +
    +

    Please note that i3 uses exactly the same API as xrandr does, so it will see +only what you can see in xrandr.

    +

    See also [presentations] for more examples of multi-monitor setups.

    +
    +
    +

    5.2. Interesting configuration for multi-monitor environments

    +

    There are several things to configure in i3 which may be interesting if you +have more than one monitor:

    +
      +
    1. +

      +You can specify which workspace should be put on which screen. This + allows you to have a different set of workspaces when starting than just + 1 for the first monitor, 2 for the second and so on. See + [workspace_screen]. +

      +
    2. +
    3. +

      +If you want some applications to generally open on the bigger screen + (MPlayer, Firefox, …), you can assign them to a specific workspace, see + [assign_workspace]. +

      +
    4. +
    5. +

      +If you have many workspaces on many monitors, it might get hard to keep + track of which window you put where. Thus, you can use vim-like marks to + quickly switch between windows. See [vim_like_marks]. +

      +
    6. +
    +
    +
    +
    +
    +

    6. i3 and the rest of your software world

    +
    +
    +

    6.1. Displaying a status line

    +

    A very common thing amongst users of exotic window managers is a status line at +some corner of the screen. It is an often superior replacement to the widget +approach you have in the task bar of a traditional desktop environment.

    +

    If you don’t already have your favorite way of generating such a status line +(self-written scripts, conky, …), then i3status is the recommended tool for +this task. It was written in C with the goal of using as few syscalls as +possible to reduce the time your CPU is woken up from sleep states.

    +

    Regardless of which application you use to generate the status line, you +want to make sure that the application does one of the following things:

    +
      +
    1. +

      +Register as a dock window using EWMH hints. This will make i3 position the + window above the workspace bar but below every other client. This is the + recommended way, but in case of dzen2, for example, you need to check out + the source of dzen2 from subversion, as the -dock option is not present + in the released versions. +

      +
    2. +
    3. +

      +Overlay the internal workspace bar. This method will not waste any space + on the workspace bar, however, it is rather hackish. Just configure + the output window to be over the workspace bar (say -x 200 and -y 780 if + your screen is 800 px height). +

      +
    4. +
    +

    The planned solution for this problem is to make the workspace bar optional +and switch to a third party application completely (dzen2 for example) +which will then contain the workspace bar.

    +
    +
    +

    6.2. Giving presentations (multi-monitor)

    +

    When giving a presentation, you typically want the audience to see what you see +on your screen and then go through a series of slides (if the presentation is +simple). For more complex presentations, you might want to have some notes +which only you can see on your screen, while the audience can only see the +slides.

    +
    +

    6.2.1. Case 1: everybody gets the same output

    +

    This is the simple case. You connect your computer to the video projector, +turn on both (computer and video projector) and configure your X server to +clone the internal flat panel of your computer to the video output:

    +
    +
    +
    xrandr --output VGA1 --mode 1024x768 --same-as LVDS1
    +
    +

    i3 will then use the lowest common subset of screen resolutions, the rest of +your screen will be left untouched (it will show the X background). So, in +our example, this would be 1024x768 (my notebook has 1280x800).

    +
    +
    +

    6.2.2. Case 2: you can see more than your audience

    +

    This case is a bit harder. First of all, you should configure the VGA output +somewhere near your internal flat panel, say right of it:

    +
    +
    +
    xrandr --output VGA1 --mode 1024x768 --right-of LVDS1
    +
    +

    Now, i3 will put a new workspace (depending on your settings) on the new screen +and you are in multi-monitor mode (see [multi_monitor]).

    +

    Because i3 is not a compositing window manager, there is no ability to +display a window on two screens at the same time. Instead, your presentation +software needs to do this job (that is, open a window on each screen).

    +
    +
    +
    +
    +
    +

    + + + diff --git a/docs/wsbar.html b/docs/wsbar.html new file mode 100644 index 0000000..677dc46 --- /dev/null +++ b/docs/wsbar.html @@ -0,0 +1,148 @@ + + + + + +i3: External workspace bars + + + + + + + +
    +

    i3 - improved tiling WM

    + +
    +
    + +
    +
    +

    This document describes why the internal workspace bar is minimal and how an +external workspace bar can be used. It explains the concepts using i3-wsbar +as the reference implementation.

    +
    +
    +
    +

    1. Internal and external bars

    +
    +

    The internal workspace bar of i3 is meant to be a reasonable default so that +you can use i3 without having too much hassle when setting it up. It is quite +simple and intended to stay this way. So, there is no way to display your own +information in this bar (unlike dwm, wmii, awesome, …).

    +

    We chose not to implement such a mechanism because that would be duplicating +already existing functionality of tools such as dzen2, xmobar and similar. +Instead, you should disable the internal bar and use an external workspace bar +(which communicates with i3 through its IPC interface).

    +
    +
    +
    +

    2. dock mode

    +
    +

    You typically want to see the same workspace bar on every workspace on a +specific screen. Also, you don’t want to place the workspace bar somewhere +in your layout by hand. This is where dock mode comes in: When a program sets +the appropriate hint (_NET_WM_WINDOW_TYPE_DOCK), it will be managed in dock +mode by i3. That means it will be placed at the bottom of the screen (while +other edges of the screen are possible in the NetWM standard, this is not yet +implemented in i3), it will not overlap any other window and it will be on +every workspace for the specific screen it was placed on initially.

    +
    +
    +
    +

    3. The IPC interface

    +
    +

    In the context of using an external workspace bar, the IPC interface needs to +provide the bar program with the current workspaces and output (as in VGA-1, +LVDS-1, …) configuration. In the other direction, the program has to be able +to switch to specific workspaces.

    +

    By default, the IPC interface is enabled and places its UNIX socket in +~/.i3/ipc.sock.

    +

    To learn more about the protocol which is used for IPC, see docs/ipc.

    +
    +
    +
    +

    4. Output changes (on-the-fly)

    +
    +

    i3 implements the RandR API and can handle changing outputs quite well. So, an +external workspace bar implementation needs to make sure that when you change +the resolution of any of your screens (or enable/disable an output), the bars +will be adjusted properly.

    +
    +
    +
    +

    5. i3-wsbar, the reference implementation

    +
    +

    Please keep in mind that i3-wsbar is just a reference implementation. It is +shipped with i3 to have a reasonable default. Thus, i3-wsbar is designed to +work well with dzen2 and there are no plans to make it more generic.

    +
    +

    5.1. The big picture

    +

    The most common reason to use an external workspace bar is to integrate system +information such as what i3status provides into the workspace bar (to save +screen space). So, we have i3status or a similar program, which only provides +text output (formatted in some way). To display this text nicely on the screen, +there are programs such as dzen2, xmobar and similar. We will stick to dzen2 +from here on. So, we have the output of i3status, which needs to go into dzen2 +somehow. But we also want to display the list of workspaces. i3-wsbar takes +input on stdin, combines it with a formatted workspace list and pipes it to +dzen2.

    +

    Please note that i3-wsbar does not print its output to stdout. Instead, it +launches the dzen2 instances on its own. This is necessary to handle changes +in the available outputs (to place a new dzen2 on a new screen for example).

    +

    + +Overview + +

    +
    +
    +

    5.2. Running i3-wsbar

    +

    The most simple usage of i3-wsbar looks like this:

    +
    +
    +
    i3-wsbar -c "dzen2 -x %x -dock"
    +
    +

    The %x in the command name will be replaced by the X position of the output +for which this workspace bar is running. i3 will automatically place the +workspace bar on the correct output when dzen2 is started in dock mode. The +bar which you will see should look exactly like the internal bar of i3.

    +

    To actually get a benefit, you want to give i3-wsbar some input:

    +
    +
    +
    i3status | i3-wsbar -c "dzen2 -x %x -dock"
    +
    +

    It is recommended to place the above command in your i3 configuration file +to start it automatically with i3.

    +
    +
    +
    +
    +

    + + + diff --git a/docs/wsbar.png b/docs/wsbar.png new file mode 100644 index 0000000000000000000000000000000000000000..0789dec532bea9c358c782f14f6c95a0cece5319 GIT binary patch literal 14339 zcmdtJbyQnj_dkdgFBFGDpm-_83lz;miv@QmUbMJ|V8L68mte&y?i6<`1&X^{fa2~B zb9vr({+Qp){PkUHX4WjiO>%P2z58ta?0xnPQBjh4iu)WF1qJ0PL{?G_1qBU+f`Xcf zjR}mrCv}|#-Y`w%Wh7A^9{)0$^I}j?UZ6lEB{bYq_7*(6=b@>WN7_kM5YLlG(e-GbgA0X?o79VolRFx!d`3w%kY6@Ibo4e# zc4@IpA^JBa$ijQALi9~JEi&?4VGPI~H$NCWK`*-yzzjk#v5~U;zjXXiK=6;j-1zNn z(3a-s&p2Z{lf}!QEz_3w1eeSfW~+BOUu6~+hR!cGQ#t)6QUGti9Be#%H<%)l5FQ@R z{XT&S%3ZbsVnmDZRhjS{9dYzB?Sm zG#zah_1_#tse`^SZ9ThmmkQRjft{)6DR10{ajpc#D4G1qhMXQOr5_(Vi|f>cr{7Ka z9xXN=bWOq6dswfc^c=+I>E#gwBw@rNU!t^=oL)weyX{Z6Z*_wx(g%BcR{{e9f}mPu z`aK8x^})4E-Z80jwd$G%18ow4-@X4vr@XZ!*hupgkI7ZA5=dJgk8-(dfHqyuyEIjr z;Q*`uxDg4`h)w9;N$pSJ59<@Z`CyUi_%7@~EYXzt#G|@ONe@i;#Jh>%a|cPW>37#R zt15^{JH1-x^$^ysJXYn@UZZqhaq+uZ_OipAqEdi)g`Ia*r&){9bNV-HTrM30g0Ri< zS%hoV#)(Q>_Iuo5sPK5f_~fKolb0Zu_yvto%k_4U`4oJO9cS#szOiJ2Zkqemy%5r-QN0;iQNx-)JVxvKuU)nwOVQg}Ex@Et0!Op$VI2-;FM?U8{h&3SZ)4EzqI`R2B+KpsWA93oiA{k8v^~zt%S#FVh(^MqXkGPML?pSlxA*e2 z0=D=OnIRFL{x-T`ERPR*?b_nLR~<~#!RULVm*tU|n5dA<6F9d%ATKKnh;{c{)Rf^z zI4xq_P`q`Qa&qgFbOr3HWWx7P&%l~;lvvkkR%GZ<# zA1$Zr-56Q;koO;UvlYL3ZKnB=z7G#q=XAgE_CoA}sjA{77rW_Vluzu>fq~lj(fm%? z{&Tyz%f9r7esc=_Hg>L->HRtZGE&Ep50*}I7p+4p35F(mAL-ZD))ZN2P$niO_QbV# zt#zk;DFN|-aOukO)qDDTO*Vgi^xj>i+t^Ix6S6tqy{v%6zlP|*4u^k;9$v0CUF}NAZ5i-vsk@JNABXK+1HbrPeNowZ(oU)A<)3IX z3kx-MgMsjJ)4A${$?@@V6?OIZ78VxXivZP02H^0a_XvW|kYM4GFC~K3*49b-4(r7q z0F`DJZ(i;o6nZ!vTOBK+*7zB|*XUy<#YAjXQT=BpjDl6c_e5lgUPMIXUmdPG=0t$W z|FJ(`+!?B|`xz zfxPhe*4h48Fx{e)%)4LF#i;05&SM<4Z<2g910%bWTvlN%?^}KDk__&1FhTMB%rmB_ z`tSuPV4y8M=2TQv-g{ltF^k&jNjHEc;ai-6IuMZ-RT`t^_Gi{Erp zgQ*&tn$a=Iec$Ncf9Lk#WleW`PGR85hK}{ry6ONpW$m+N`r4l0qVZl5|L$yk%=WhR z_32i}G!97sOQyEbz_*VbN#T22t@m-@+jYTW!+Jy@7Qq|pjr9ODA0Y?YFeA^9l@*ig zi-VzX)5v8Pqgw{c!PI1pm}#@9CqMJ*z8l@{S~eZ-R+8>bOFT4*D!tuedbDO5*hVo;(Y`FOjn%MZ~Tv2m{|D?>Q9z`|baH_J2mQ zCp%vu;&a~MLgZWk{_dD4TCl4>|ICyl6hi<(kmCMd9Sfj$S-$dW|2?Y!N;T3N9V<-_ zu^P;N4-oo4dWuyl&$}Fn%JNWBLEt}`wxzJL>1dzyZ{Jd z`rLycD1au8v`%gTAShT>2UETA)XYfI@3&DzIbONs>zo{m4$aE`FE`K%2|MU-e~$D7MMXjPfcHL=_q%%jec zOFcv~eL7ErIC5G_8l_DkgqgXN)cTw=ef#Fh_j(j>Zzc$)-F!|DHfD)pm>}EP$Jn$V zcI`R@%DZV!{6;W1R2CWCNu8ZZcB-LssBMiHIb07)!%YHsl&IdAI{&5G=_N!){P4Ak z^l-}AsKunsP>m1Zj#$h-{@50Dhc1K6?u>h==}H>9XU`BJRb$ zjlN_mz~kQfrb|w}Tf&l~Dyv3;96nbA92)%&Xy5REs11m0&cAXm&~AAi^`YTW9{|0* zFdn6Ul8frGH*Ie#gT(+bh=T-^zC_hRTSB{LDZjUBTk;Phuv7sAY;#Q}aTkGo2z`;z z1r;7Ft{r4~A#%$Nh^v8G#^4K_PV96GPuhtvJ)1-tnO1R&1zxyt(!NVlarMG_zZYue1MpjEi7 zH75iiJgkrr-v#N;DZrNl6i6{D=DTAPx>@!cz=4f3r~YFy>h#gNBO18D3~oS>sd6ED zbhfKyCAh$R3atz!Ay4>O0ZB-0|ku! zW+x#>X90m$)O`iE5=Lik`#6x_ei^gM{EyIntS(U!?LQo&NGOUsNnJw-R0bW49xpRh zgffZViluaL`7P(1XX{(`AP3`h67DXl58ka_^V$X)9SQ~N5>^)q+P%l5sRtj>Ce}RW zuC+z-905#4tpf0IZ1C`?`vu}VFT>LVKDMt?)_jlW6JE6$jQBn6UC4=T)C9uY0_-+q{fH>l9KeX4>(ppXxYQLPR z2ndCX8(u{RRd2g>jn-@cYkJ++di^(8W^(kM(3*S%55ey{S+FhzGqTTxrB{|1gH zb1IHE-X*C(^4_yD1)UUbI3PmeT=}VZwOf6joA_9jn$p-_15L?7hSNWL66b$xuLn0f zzTti0-rSYo0KeJ!r65dN_(ZV(le3TJ2OLekc=ZZ%p=9!fpWD}mqz$)g6rl^ybyBkXQN zxHg_wO!na$@03xMbSpUJ@e%!Bcs976#HD9DUCPdb11lb6yt?;f*Qf#9vR|49<6HJ3 zA%Oi!jRY{JhRqqp;8oA4^qkq+x#?y&U*btb>)|-`>gXztdEjh&zQXd}ju)$Ds+v}G zH9mog_pIvj)MZID9{%J2mD_l}Jmqe+fnmge-Do}MAe|_EU&Mr%?&hExWp}PByjpp{ z^a2nqJ7;!HZs@Mh`%SPl=KI`qiThpoEpXvhx6IQ${Te^$&~3m9f0?RgL)5&)Rk-MK zj6(D2oY@66;^+STFHKvo4TxKrp+ZkQS?s}#oTB-MCffdto=Pg%BtO3R@n4pxiSdV? zFBJRc9RZCqMsja(v53S4 z5gizGMauklF&@hFRr|^7mOV7%Ni;ojxCoX}XS4W_g|L3Aw@SrlC?K zHE}EPVZJ{Qqic!#HZN&yGhKOK(g4+NM*OsUy`^*CHV{D^d2apPaa_B_lDcfciHASV z+-~t;yW6+FruJcW+w+Ws0Q;Vh34~cK5h8tr*I9f!+8ZR5)hb$;7||dgFC0t!H0*X~ zN5q+zkMn^(Yu!87;D(lWHOtK6A~!da)Nf^?>>U#t6%}b2ym{oh)5gg1Pt_Pb@elU_ zo1?45nPw{CyDXI52=T}ep|vhnDuEMyh6zoY>6Z9Zx~8^VsS8#zBP}<&$maC~nxkm> zKYupcCu?ap7L1H!pjW6U1h#s8U7uUcSGrs9+uCqgx!0?Pc-*%OPN~GB)9UXEN=nTh zCMSx0PFtssuRD(54(|JD8TC$hyk6_vC)b`^rs2or#i9BEqUPj^#*#qWYd>;P~}@8 z(=?4D1tbwVg?S=}tF7YUsO$~yut<@LN}D-?PikrYP9Q7u3N*Y69(MRkdfYY0f4|;$%%>&m3 zGZW}c-Y$vnjt^{nJ2S;XR+LQ;i(0?x@+Wm#jIP8Fu;OIdpuGc8sgdK)-lte)fLRv1 z?O6aCx&pz%I1|2(N+MF`ek6goz}%?a>qs)YUWOfoF;XmjpiG=H-B9R3OKY%|%x}Iu zi_+&*pC#>~44-nUj^V@mt4i>M`=Sh|qO9<_oi6zU4Dgaq@O=BuVd)kRlbRZ_q^jzg zw6TkCRO)?UMcs7Ju>JFX_1~+sbX7qh}hu&RIaAkKKYEq)hz)w`@rmcE>?jx{JA2M3q&bTyNp^Ll!(zpvg zrZ=mYU^e1*<>?qv*;K%A_0yysObJ5C8;S$!L z;VsK&1tlLB#w5Tm09#RhYuI{gbxJENAfB2km=d-4eAl$wYe=nP3x4ikpa@yUW#E@^ z8Ix7yXQ#dQDT2sIL5PIVrI`lj(x*k=YE7BU95~3zzGX>+iOCpVK6S>5V#tzViB7V< zcQzl&22=Qj(=L=z{3aL=%$Pd@%j7wrhpJNy(zB!cpxp{OGE2a=Ytat!c=Jmc82JJX zJ3M**-nO5LrG9Zh*>>oa8&6X2Ptj9*sjxJ$QqBtv%zK^{lb zna9#}Pum99xS0CE*M)OEyNM*}i-2P-p;ZPkpx0qsic2J{@_^+bZ$LY=0omxtF$~Cr zDMpXX*qvw5-g6Cz4M0lc&z|CUmB=qtuYC{ac6F{{axlBhn!*5CyQgF~ZYq~u-sDSe zKEJNfy9PzGSNRoaOvpHIqLL)ad;)v+!LdG95_FV$hF&i}E_@lVPj7W1FQU64YMg44 z>%2Dr{AfNWc=*yuo;YwEe%MVtQ?=<+*mtgO;Nv$CMu!Xp!`VNk-p(YTMUa$DL@h|K z`I}h3>U-&JDlYGHbfp!Q_a1?&kJ0qBpOt61j^vXOp?G7&3S7sRf(0PagBRg^`74zu#u%;3J@JzY|J;n8k5^@`C`1D$ygY4sOW# zXGg3&C(6s8+Mnla-5e$TYfBmnr9!DwvJ2{OELZu-&7Ix6_uHfu&eyyrcrf1MAZ40S zA5XJ0lWA4UN@$NM&PnjNyzmzVk<_!Hh18$k(<2+hjFon0Oemgb)cyTj{Wj2Ms|0xM z%x`)Thqo>*N1vL4$4$k3vA9a%Vus~aKiDXies6cvR5t|`eTc6F=2A_n>br)>)V^zO+l5yepX^aBp`B2Jo2GMV>o ztd`rXx1jjuW{544g;WSV3i*{pynS501-Q-6%Z57{y3QG}XK>t!Z(F4KkeaHRWZ5D* zCHJyBi_dOfxad7YOk`v=_FMjtvwNZIZF?3HCRS@?oux&&mjn;9L)^dcHuIHrk#$dh zPxi*Qw9~ZlWYoOBJf|x^PHCpklaoprWaW+*aGO5N*T~U&7aw&3i=z1eCHJT_cK13oM$aN#k(FD=fFmO6Ok>M7T&BW8x1`h0w_LQhV_2N{J%02EyNdA+3 z%mJ>3 zP1VYnUpYd{N~|FefnwgKT|Sco?6etT9x`VHy?{&;cxR%Y&tcUCH!!VJ8Jl74Y6BIY zAKpl-ZQ{V-&C5wv3UsNFyMt^~;^z=VtaJ;?F1;*fsNWDxmuUpk%dM}>f)9A7;^Eyu z6(_aL5$Uu|?AM)jLQsnz&;T+YSuI72BwVfo7WqV6aUmMwU^?CYcah^`X`ZkEqSvWRSgL!1C|HlhIXS4Np9Z;ZqeGO)(5 zCGHUHYSfWT5bG$>fEEFh9BMA&)6S6@e0s`CX7UX>zk9X_Sp*Za9jAmtCQ(Lg2AZX1 znV=I#`=@FmV{}Kke@hn}TUfV*P$;t@dT#EU%o-tL_m~&w)<~@v>^Ve0bwqmb1tpHa zJ8s_H2n^F7*~w{bzQjx*BIHwJH91D0Fog1#xC*0y{xaGJ>+P!?B53%SUj)X171&Wx zE-RX;AUXMIG1KM8QZ#$|mu#D_j{U%D+C8q~5+_DLWfEbFl)(s*#&AzBU1;2h!$?h( z@_UC&8UMlv)Q7mkUi5s`thptUARe8Fcw)%nzEs_&yhVGUhsYi_M_ppx6c$A*MqST- zlX(c}jrs*u6IQ>hl_XH7;oQzZ{JYG^!_|J)>p{HW=4ce$4PS3 zLZL&+Lo;HkdtZjJ$V_?5Zh>})AtC?S8EIv#69_ky8P24yxhuDu7N@ubBVS0=BA3GV z`B+Hmo=!uCe@q5q+!_8(p@Y-KjZof~pG7TyGbern=ZNZRNXxJ)&LDIogvKePV@dpJK&6b9S~+p>&WWp8weN2{!4O;^iIfNEHJBW zMR&)id=3|rSdqFAX{&5|84$JyZ!6p8;6f9ZQi(FgcXUuom%LHLG|VY=U9~6n#UQQw z-Vp5qBM#?}vHtgdM8wGg=k^wcns_&xiieD9zUhGkA8$A?V1Ya_vQ3-z7`fxgv`UUL zl$AJjX~<0Px8~18Ip0!7IN&)heiXN8poVZe+ZT_o`a#6v!Gwp99 zra?Y3c1DUOgsC5%)|3_28mP~u%R0j9@GhU#<%hTvOt>RIdv-sFaUXKi9btH88(;G zZ7?q4@%PwaOTG|X)wdAlX%rNS;>TV9FU|%E64E&>^d}f+&u5)S?Cfq9+vu>Z*AFsE zTZ6yTwkeKR6S$`%2YJ?U0~l^z1?b+=*)XKlG~m9B?5Y>>#D}K1_?KX$AJG1~@xHs4 zM-VG8e;WOc+kvA?{98_tmNg&0AW|?0NdP|o@ZgUec@InIJ!l0A<0sg!EFxdLl)L|c zYjXJpswjGaW+W?tzc5lgu30gUl7g6ZRLkV^eqb(`yA%wdyS>B6N;rRdG#!YY7S_FA zm(ILdDX}bs$Z!b5Za4j^hqKM)N>OkN5b(~K9ty=Hcy_8~Rl86yLUO4bkj;qJBr%M5 zkI1e9+;L>XXaoh$^@_@Nsom0-+%3R>sdeZ=FN+D!zRe0pe3Uq-FTV9@AUDc zgRJFKDnOmIS{%bv>-Y6n_tcCWKjAWVoL6Vk*uo>itkui1i17wKKPU#+a18@a@0u4H zx@G(NkQch(`w*Lv#Q{u?(+^nx%8vooJwTDkdBadG!vamUkn+3mqk42-3}UL)+?WbR27|SFPOSozsu3fgmIuVRm89(MjWKV# zfx+FH%$w<4?gqpDXbeWnF5AdKn_g*Sx#q29494m%TeMQvx|f3EqZRA@nf6R$)&X>} zDde>(4GrHLXw6`V`OQ{?yBjV@s$5XUA3>I|49Sf9<1dAJGr39Y?B-o^)Z4ArI~?F> zV~qg=j6f5E*uNEDD*O)AF8Y0+a_41kiz%d6#0{XD-v zkS#tL9+wiNxO}QY48LO$=E`MtWc^9~k|qC+ZVbIHzob&ww0um0YlQhp!(I-d9xm6rMF1~K?}36U-Lk%1SR zlvZ>Sw{!mT>d&J`d#c+|w-Hh5k72r?vX?c#j^d`>{VS3{%Q}qFU$9`Obxn)LO9r7a zq=`Xx!hjKXTKdTYS|BBc<4IV;a;elTVWO@BQ4@TF|6SQ&t1AX0^&bdm`Axti6Or+M zV{A@;9!?UUG_cP#QSem8K!f&BW}A5Kstp+{%>=<6co8u8%>;}#gq8)+(-6pxgP6mX z;L6&_7NCKQE}uJXUu(QYx#hE?F4Y$%HT6#@*!i@d$3y_*f^4H*li*K**cWsphYhMo zYZL-F`%KX>TmBPfvkCYTjJb=kRphvhwL6@6vwx;y7qeU%#uJ_T*c2o)N&2?yYLJdtp!0lg`xZ1`?$Hii9@6o*ZH;L^($COsyRy&Y zM(xf6_GZ)q3^5Fpw2Acd6VO?K&6=%Yny0TBFU7UdmVWgPA!42R{BtlUHl8EhUa$fn z2gHc=UB*Calfs{;0ACi-Q1lupf)OXl*!G-8THj!-ejNI#77L3pHd{pzD_&))Xw^Vx zS;=7T8B%roRpPyWMu!Mw^y4V{B_=d(R{+g2hxY}W*%Yzs5*@05@m3lWh@1qcfir4h zYatBgxt$h?vB>n6u+U$xobWlsT1&6NbMVC`?e&XxDK{YYE@R8dF^b{n+G>)dP&lB( zAm-hAmvQ9~!dW}A`-6bv6b%_F$D-}3%XW2n-fr53{gbYaCB*I?EnLK#9-_7pEi=4u z5~MZRh&e6e$g_Z|@A-WdF{=5f6NnQ)C&(v_ux`bJ>X_KpeBL>JOquIH_C`XsIWwYA zI)33O%Gqe6dEpEu11OATa!YEV9;)H~1EO}>r4DOv{1LLIjoLY~)>sZkD=6tg<5HhW zxy}2>t$9sG6-FRV<>?B*1Tb*sjcW5%2X<)CjuF1h7uwWuelz0mLKrBpg zswGjt$am&~KB2^h{S-zF9Bd4VcF>5&jch4HO73sz5=H^*4q((LGuM8i?iWk0wgTq*S>R`CpWp(vM@vy-sk z?3()6hDqb6Mh7IKi0JI9g!cwuw5LYQIv+HI=Pl5=hP_wlP+PtiBAE&p;bHMyZbSit zp@=<2RW;|_(bLt~TtjMz?HU8b%93(`VoTtx0iE(2LN=$=l=RSMTepnq=34hvKwNg@ z@iV)|O(|?o_U2b)?Q#ac@sX8n9Br?RMO5URH_`)N%CVVrcD?6AzsyK9=WnwxhM!jZ zXJB>4jcgfw#K`B|lM9Ha#x+9;^jmKGis`!(WqC?^D7iTT1^F`M({NRPz?4|$`aBSH zF-(SHss;*bNG)&6)xi338r%OeA0b>`ABe>#EGRhfF+c2PFP@`-K*Hc3(XF@Kwe{sa z*^y(g_5h9G;k9{wxNw$>vl{42L*0``xAOWX(TR^Q2hM;T4%jjE`hPy#{38cN0hJsC zJi!^mS|3zYWdf~sjH;3EE)Gz8T~w^Jp$a4eH5*?I5>SMoU*56nirrbhY+t5%8O7Ema9kJC65WXDivL=$F1%S1ID3RMfh~xM7@S2Mc{% z0(K@xX=1x2g(i}20u=b5-da{AGnJtV`Yo z^`aFd)qlg@6j)5@Xm0i@pK|;;I_Ir?g7{8Y?Qs%n54l zHdJQ@R04gQ181BlOX;FQ_XokX4wfICoVpWH@OR4xn?>~GHt@RRosPGo*9I>pt z0Q%B4PELecd><^9WZa@?=Xs#7(rLw00;{XN?bdpO@K%k&LV?M@wZtRZQlD} z?}`u)MYf`nwTc}152_C78~C*SO;%&XlX|*p2=2Si+gs_I>*;UwIAdk|Gh-{|U_KMc zU#>n%O21rPU|u{E(b$5;x}5_ylT7_|lSLE{Z#-SY=Hv>H_0)&+aig0@z4zPOL0j~S zqUfN}BJHA^f=J2BVDmnA_`%|3Q`YtQ+P!HceUXGz1^j8G$9z#)O~Zp7hiEM(tjJzwIzKn}wt@mQlM)`8@yxQWL5RjN*SL>--*436cZ(alK(1PT@&LcNF3wC<7 z@ss>jO7(crN0-#=DkeV0z~Csc_<9c4k=F(0X^jXIz%0>?Jpq>TSQ3C|e){Kyg-+|L zO0@PXSP)XSK}U|Lg)=QXt})MddyFDQA~#?M>+N=P?k-E>ZWPWrD~#{11EJ)z;6SQrDSmjb5Izd!2JbM>4NXPhIg6xD0xg1??4}l%pRl zN9oy^2`0x6`xKKe%NV1=hi=Z3_-|de$L$4C)_iF_n7~{wGm2{jCVt2UYwEIq7D3hh zjVw8VtZw^%|DvLQA8v$sFCL>~y{!%Wl4t~o`FDb0W>X^FF??d8-)E2iTuT%6XI2HG ztVFjnT-)#?(q)KeyOW~+Zz{~)VyaYnZn55p(PK!gJJs&(&^4#dGhhBU1uzGTjkTlk z!BohBvYd=nf~z}hT=*a^WG^-+@;SZ$6n*yZu~)6_ z^6w^5%+uYT$xz%u&lANj=i8l2k>Ipc%k+T?b){wbESVE(PS%hRAtdHDB)Eu{U zrsDIgEK`9yL4WGp3jek`qx7MMs_LM0F813q9LKg;3^?v$A<54&t z@06V^RNKsGen|YO2!Zl1={F})l{NkH+f1DxlTSD{adJ{S@|enYJ-3J8RAS+ORqk%- zJ8PXHF?5F!D;sQ*Jp3@&d?y2p8!6%&CKv)3nL#X3vpSdUhQ(ymXOH$ol#K} z?1q~BTY=mcT zyKy$f_L4o!;e@a+UX?85aQvvd@@BX4gXeLNx5ZyspDG`C(UCi_pxUg=faPY-&OFnl zjq9a7x?;WVno!($po{nb_)qTZtA{Q$1l_%6WBYitJG1Ms;{CS9*SBk9{n$Ma<92y( z4v0#=EK&}JX$#e1Lm($fHKzy96N^V|fl>+*O9B?GbPTGs)leb;V!W`Kk(yHTmI=x!RK$Hg(F`A_^cttwa{6d$`}62SI&Y|3>2%Bs9G_jW}AR zo@lNs%J3_j5;1~lYVj7gizmHOoLAB6nqy}6_WX^F!b!~&P%AGtt#e@UPVEFhOW3RX z`9eL5{QMgLNw15wNxeq>P#@*&usb)ke8$yeqh=|{Ad>v+_?UcZ=EH}cy7~Fb)4F+m zHvxAAAzqQjPI!ud;|qZHCK|Zy)%^a#qYO!ok5_i^_h%|ce3D-&Ho;CT0KCKd_iAIS z(HQl8ns1sxT-B zL<%v72d`D>7I7c%U&k(A@Ry?oM1>>R%1YLv=4#4s$JJMHdi?8Mu8`yE^}aik?pD@! z=62;~OX87b3D^(=)mdiH#|02SYhq*Wx@}p$v12oyg`pOCtwLHqLdfN%@Qp1kc>k@O zjrHYih4~Q_;FC7AefY<%d3PlF)YbS`B5#*7>(E#1Y=y;tm$XY(DmJqsYG{joW(Hu@ z*qLf;lDS|JD(T$sg^<)+0y<=K=P3{$rwV}JpSfQ)w&N7U0sP0hzQ$9tSp6hmr_br` zhOf0fLQzkw!4wOCpq{cf--H_h!}!%CVy$EYQyjQz{q=5;=1o4(q23k^zdi(%MW+eo z;N1dK+%6OsvZXBBTj;wU9krOcTFi#v_YJOZc7_Rg9+^n5|26({O{qEPVq!Y*=&rE!dixR^&2S#&W)(*6bg@1lN@UmUJhVQbFJi3`bMpX%Zru_U z-G}ub%MrhWb8?zmU|baZ`Al3;exQFiqr?OzlWxCk&*}y{1@l>;RNd_7=TO>zs4bmo z%)JI!sH3Ob`-sIyKqBt@ze!g62EBGTTHbiR$s?fogG>{f(Nb+sr51EH!D7OT0-g|J z?g*wk_Q~$ZfmyIjMNxGC$mkGR-i`J~uGGcr6sbLycT%)9mOL+`hd5%Fj(kLc$p+%W zta&r5C{3bXZk2tUl)_aLYN7EacRr{tkQE*`*N0&S1ps?|A#t3wmjjn^FQoWXx#;g!U^*M`Y`Z}zq`vXFOSSQ;M zR_55cM=1G-&|6FOd+xWbrOhl|&XMi6%im3BN%eM@%ENSbOSfue=oY@f*gqdoL*j|u zpyk=}+uK07#3EPIAq{3b-KKYQ?vW|58k!?7wpBj0mweJv=WkH-Izhh1yvh`E?~zin(!IWko&(hv;W^UtpBg$ zqZQPy5a|9~#b?#X=FE=Q!uz4FvMcB<5PFxk+V|Qh;SlJvZ8w@j#XSp1aBRyx2EN?m h0KsEtZP^3i&yhO~?`4Nw;Hf?oh?J6K={w_q{|!ju)j=8CX)aM9M zbs6{MbXWSz4^AV*xttJcDxNao@zM*P03jwd-WMl~DV;(Dq9X7?I=-);@K{;#-REtq z32C*Rz%$R6j2}~UqeIOvc<(wMT}rS(KZXv(_FCh0>ypQ(&%FJQUq|8f`&gg!*yM3z ze(SyJGeV*&`Ss&tW=;`*pfm7(7C!HqH0JT~vwrI3cK?m&kZjyezISaH|9=1B=SIr!H(nGy z>QcPa5K4j@zN0Q}yhw=fq5OW+4$-63bpHmtggrx+6AKwaM10dk5=kE3_!`C`Z-Fr3 zLs*V?)Z$B`56fEyzu7rb3_l}vI!VLS0;NJNp*Q`+gc~bikMtnB z$V+4y*+5>xH(ny^lzlsiA#SpO%*Epp`IS6@-*uz{-@8Vp;`uNVz@vsNCBcsn?#Nbx)Wacn?dR^SsCkgK2KxE%S*k%b3; zJ9ISFD`&%y(&ocPQb`StK@B;qd@se(xc?}|v1vYLMk142a0N%v4Og3UVHeUhJp&&GGS{>>(j zBYjh`wQ4d8pO{Yse0vv;N>KU;_CdfJhTyxm@D3k`=7Wz%b<-W(ufs9iKY(K>5!X&Z7TiwwlN>d^|UfEA>P?0_Cf`wV=ikf>4joLF}@URj8aM388tDjOv&8)*tB8ECK9 zh4$H`6Yf{Z0{9WW!aWsYAqPJvLnlZj|9eY8x)&ftTI{_Ad-yQtt^7VpMSJ9TZ$&au zvS2gnwv2k+fIQ$fBxogUxQ|tIq6dD@!f!3sFbj2M8FD#Cc{>fM=SN29dI-r?-sQSC zn*2Ru6QYdo2Z~nl;{n{maV(m3=@C+{)XHlsM(zZq ze+Z6yAwFlrXV!&|?M=6vF7iXMH$<_10`~e(tz3uwFI6OX!99K9R$y4@Xr^T&*@3iH zD#!gAoQ~2Fg>5$=kx~eZ)Qyo)fJtp=Daj`7Qs5dC;YE*8qxgsCizNq`W?n2#* zbx+n!C!{W-PFJU?m22eHi!=W4^;L4 zzm0&g!4o>||MeJC|6eMj--f z?8Y$*z+RNRH(@^Qu7o148Opy@Ed&;Zo%*LG5R>2L?_cJbSj-jOX+m_1bvdupfhP1eTvSa zPt)1-Z?v4wp>ydobRK<{&Zp1O1#}^;po{2Yx`ZyJ&(mdeIbA_tpeyMrx|*(`Yw0@r zB7F&N!yj}#-9TTa8|fxmNnfFx>8o@LeT{CV+vs-sI^98c(p~fox|{By0lJs&qi@pv z^Z>1*2Wd4uL~H0_l=7qW7(Gr;(3A8ndWybH-$A*5kG_wx|95(t{)2u<&(O2<96e7z zq8I4L^dkL)eu{c=iGEJMp#MZo{TIDLYiS+*l72GKr~}8Z}PKbWG2}m;rUq z#LUdXtjxyj%)!E01aq=T7R91j3)YgwFc)*PR;Zz^SuBfV@vIF?U~QR~wPWpB2bRb> zvQ8|C`B-O`%(}1?)|I8QZtMZpo%LWnSsL@RUaU9k!_rw_mccSv7VF2dS${TwJ;(;K zK`e(2W<%IeHjE8tBiKVMmyKk3Y!rK#<+IVOfEBVaY%Ckcir9Eo%qFlBHjzET9%YZQ z$Jr!GD6q+F3Y*HNu~IgjJwc;sXPQj&>1ZNRJ(qSM|0SAfj(jNje{aDz8F~>BEvgEU zga$pcj_64kqAnvwL1y&!R`fP@#OUFOESw|~eO5GSL0Y2caiKkLh5o5Ei6wF9quQWX zYKz{g9eTtL=%YKL_evr@(i#0(7sL=<(c5=J&)glocTe>8e$orELm%{rebMh{BKqxz zex^VAqX!Z13__nb82!ai^e)562=Wjjf{}>$Mj>{{M@&$FK5`7<9$^9cl*Q;f*P+jS z6*1%%^o_5PZRB;b6MgV5@&?(1F-d^zC2x`g7<*Kq2R?`%=rB1-j?pkOjTDjbWFj?^ zndB8Rg*-}KXfTgqpd5k=5y)JIN2HyTcgsg2r|(KL`Us-}8sCeM;3 zh?AF+MTm=*lNIE7vYM>H9eeu4flgiM8jFbHzUQ!o?;!vH>n{=Oq~hYuS% zWN^-)fe#MopWQDjGox>MpWeOvX+3*%f1q1x*OV^FojN9VXy2|)d|Yg6Pb+s!gw1R+ z8p3p1jans%0;53M_4Q;Fx&m>90U^$lmDQeKd&XeFnEMI}11>De`0FzPSE2Hl>#tAx z@yX(Ud(t0#(tqzsFuA&u?(N&T`g&Y}57RxaYRDU$i|0$zJtJL#8_M~E%DE7yT!i6; z+l_Cy`bLzby8=+?>Kn*-vSd-;!gQ=}uTI;?(`UT4eLJ#OtHVlf|yR z?M^IOQf(q*3%&XxPtll%a|3J)zPpI^U9@OH!0Zhqc+vw2PkkMMJs%%v=SlAy@bX&w z54qP)|390AfEa7?xEB3}5l5lt#`V9Jj0u%Uv8LY$Kg~e)E?Sh~ab+wjTr{S-Y0g-W z%j8+KSFc|*r7v=rz?`utPml1S@R$OITTyP$B8%CTnmAH< z)`e8{E1KvEh;hgkeCz%fP*V6Si%iOe;a2eLMie#>XSTRfJy;E|r?01PVd(G4k_fE8 z)xKRI%Nrc}VYvZ+I-dB)gvO}v-j0d*#+X7JqKWCs@C6b*QvxP8cJ*CUm>wj7*X0?Udx-d&YWH?_MZL*w=E!vZu%i#kRb1ai zxkbf+n8K(c)U;w(Zj?LVABh7z(vv%WBo{Q~P(m#>=T=$_&_2U*`w#W>ADoxlHAG18 z2Cq(t?fY-lcygnH)u6}))Uj$;E{$R%@j(+7xH9m>)4Mx<22`4NSKsmJq38JZUn&*3IQ7YDu1(^XSWlm)&qoYrgGTr1tb5x`G-kc`dSKz; zy?$6YG%xp%2}6^G!*cggpnVE^kKEfD@8uqHp|4O%DKF)P{KCaAcuhm_LajU>b;wW1 z9ObT{6e!o@s(~nF>gF;a)u}lb-`IR!h;V4CvAdk_0_jMKV@p*b=$)duM zT*iq5If8!($2~ofJD#3@^#eDO%GX|;ln|w{fulOzx|Cf&q4>X-?qSZ|&{3T5q za|XHWx;*7Fy9{jjKk@BPF8X3FeB_K-@Da#wIb)<6N6oi2w`v6AzL9(VDSs zFYFoWjM@E$GiFz|GiK)wXUyyP>c*FyF)=U0lnrw>EZ=Z$L+yt84U+LiSi26Yn{NBN zuG1JZTx;j7UB0${t?>GqLu+W)HBi4Aj;{vS>W-`ZtLLm&gGOw55S1H~CFTpY> zRW@(vk>Gt$>cFqy!`|S#{0(meA(9Qz^I)+GvGNmQmH6Rb;kJ;CNO~C|O?>|3zE9aE z+x{;R?*DaD6J-WuAL862h#W75ikBg_TuU~Q+2otQJYGZI!GmvG@b0qzS#5wELS)Lf z^@y*Rkr{}}|Jyc^OhWW}0xHNCh`obbF`10mdJQ>2E3N|z}2o>6kep-rr6_@0=Xeo)Xh-%2qan0fE^5!k_o!4BF2`B@bzTN8XwK7vul zE=YynU>mBx%A<{71u+s3OagcF?@gGLnG~S$Pe%sQ;GTE}hQe(Mlby(Y52U)jRf3mf+J!SjA zZnkf-Uv@Yh`Hn-5tKkoZKNo%?!W2;uu{z>QXD4Tg^JwHVk+-5AidqqMBU+3uj9!iV z@fOAwV_TeS`B2MQF+xnYn73RG*J#(Xt|jgScTe~0?#r#(v|7`uy44*|4^M$-gXe8e zL+kX`rLDKNz7Xq+?H@Zfwk&o}6<2FAe2nkUM`3V;izHdw0Mz-zJc39iT+TLi}xWInm|QE;m!elz}PRQ-16! zc8%)l>)NmD*sf1?J(t=qbxi7v)aO%or@otdIrZ0W+HUS{Dc!QW6?A*D+mddtc01JV zT(@r@==i|O2X;Jg;(^Z|__4dxJ-T~x_krCfbT9AzLie5B-|Bv;dwmb7M@)|{JqGj` z*Q2b*@*Z1zeA+XyXGzZuJ>Ts4LC@Nrx6<@!p0tP37N;FbyY27bf60HYm!?<0UXyyA z?DcuChTf6AyY?R3yQFt{?=`)5_I|VX;ojf%ncQbapYlEn`dsaEv(NA8lhbFUm!}^~ ze>eSy^k4c8>^q|G=)OPo{Uf6wN)DgQMVqpJUsQ`TlsVHtMgCfU(LUn|NH1RqdSgXK6>5ge-uDL--2}o z|19iWSXy{~jBm{IW44afj&+SK8#{Mw#n{bbcZ`c1H)Y(+anFz2GVWhRrlM{|Ly9IA z%_&+_w5RC(qS~V0$D78-jqg5w()cyw-x>c$v8#AoaiF+yLZ=B&P1rKwR>`4~lO-RN z$P?oxrcW%IxOw8wk4$*v@}oJAe*M^>$F+|?{`eD*pL$%LlsswDq-~S#On!Ru_9-wW zYD(6WeN(=h+H2~|Q-7G2GVRG}AD70I4lI49baUyc(yymGrjMCkHNEMH_D{U>#LfS` z&*(Gb#Eg$-d_Hr=%%94hDqB&ut?YQ&r)3RK4Snk6SLuT?Bx6uoHu;%AqPSQ@$Xi|5-vKlAxNmL)99TefJ~k>y1z z!d5JJ!SO=L3nx}~TzPWkudCu#&0ckJb+^@PSMOMTe2sHW!J7Bhde<&m`_sC#b&J-W zdC~sj@E4c7_{~e%Fa5TD$NFRI&u<9ZkhURn!^W3ezr1RrdgJ1aZ*L--GB>@j=~`t* z;}-j>)cQ?|VQn*Fu>*EYTO!`ALw|GDjN+n(FD zaohfFXSRL2?Z<7mwi~v$-adc(x7(Xu4}ZPW>)Edty*~T(k9Ty~(RatF9n*I#+40(r zV>{m6ac0NWon&X^PT$V#orOD}+WErHojXtM{O8VJcg5}+yz7x&&+Pj6jo3GOzLEFF z$Gh`)Z`i$Mk7iH#o?C&5fs1>4?%lJ`vae`g&70A0&V2Lae(nD9{R{Rl+rM`I8~ab~ z|9pS_0nGvTfd>u@JMj2{`3E*0s5VOVyF8D^*Pg?FYRF zdmqd_IQiiGgBuT49XxmNS~abXtnOSrp!)IZrPW)iYpTyxU#*r8*$#OR^*WSyXxgDA zhh95$?9eBNZq}%3yfyu6#@0Mhv$SS&O-;@Dnrk)kVf*2BhkGB+Jv{mF{KGFF-go%# zhiebtK4Lr)cO>;l&XEa6W*=F3WXF*cM?O7rcf9VzgC~xi z_~~Ty$xQB^`T7Pyi{6|O6^ZxT#X<~Bs74@c3Y()Oa8-CKEh*6liTOUW4?j9}w7Sji z6g*C{ehmjpXj$U|vFc8CiSR9-?vEJv<*X9vmSAI$^czV?`pLxn{QQ$xJM%C%9#osK zK7p>p53#DTo|^c9+`wQ(sKlD1NDQg=mqx2?nw?sU(V!Ew)*Uthh*O9VcSw$wEmVRO zzB3}muC@7T4y7ioO^Tp2Lb7R1(z(d`NLn7bDUwFk>g)AXuNL&X!=fQ9hM0Dnopy7Y zd62o>yv)4GET)AG3Zr4>FtZqLWm?ff($INXQd1L=V6)F>s!K`=ePJ)KEFACf4SAND zYN|7b|Mf%RAoJO=k5+zol6`o%tv<#NpB>y-yxm_f-x{)NnEbCH%LiWiwbwPELskxf z*kQ|uU2e32$1h)Iv*qdvc^K^CM+Ib6KtRsnM}=ICNRg4MrV7C(Sx7W#MdHba{^zW% zL1+zD4+tKxYCzHeQ(M)PG7H0~)S!~MfuIP zEPqr^6pcy{Mb{*vU#_pzpVJHa@Rp^~i?P5o*;H;~CX>;aXiPH}7zJZ% zbt#ju8Nx7nd{b-4VkFV)^Cg-&<4|N1IV&xkL7ay!2O|k-wt>nA&2+z!7)k z#nBteiHK{bfenj#QZFTULn%{Ec ziNH%K|CrErZQE^aS=;?l2i!=pjX1!;!|6zSM3&J8Ha~tlYz`YMiCY)99l5^W&2M+W zVt4xz!#cxu12gQ`9GGBPYuRRDmi??vRm+2|t0J7?l08CSMGl&(Bo#@k`?W4DjekO7 zUH-3i`KFJ(b@__Sdh@-=YGgZ>cIxPD4)a=ZHu{nrcAFHRl-$|V%5DQdG5K%ho_UoU zE9P!~dEw&4OIbx@{6>1o^UN!M7MYG#ZmFuN+;j(!@L2XneXJ-NXxDIs7Cq zJcHIE{c38AZ?nsajVz)%!ad%vt`{(783V&a}2P;nkp) z@IXtDT4p+3){a(s!glx4_}AOl7KO#z7F z`GgdmAxmjQ?ap!JY9Kcby2j_m(}Z|vV}>9Z4kL?UgD`*>7;^~i2J0MZJ2!`EiZKjN zRm4!yX)m5YqPGrBuP?Eg&HP?Le!ka)_S1_G`S?4i_|PTAC#kHSc*&!%Hsv0F#V#nX zah_HZ=R6l+UlPp&XQsP4dG`00=I#FR=%w;quO5GM`ysjLxpCtLKQsmtV=$ z@|Lm{-@h(j-dgj?;d!TuPi$GWYv=0Iy#~$5&VG30;3pf^uwvG}iAyoWgL<}=UREq~ zgg=Z_vRYP;P6Re`Lwtjq;h+Vkm+u)~{#Lwvgl)mMG~5G8qKHL0Rv)7-S1(gDwe$zM zjlAKC%b9@Eg_Zb-*#sW^pkJMo)8P1VIUR$(g^hO`f0viQ7#c}!yygU~d24gctlp%a zqMn0Qs&#lz5~bVZ52a>aDfex4-2L#HmFlk@gJZJ)1RRx*Kq=Ky31-M^8^3S-n$OV9 zr!#~s$wmyMwcq|Lx*k!Z60}SQVN|bEOAZTHPi)4W?8dIR?QXM&M#-~b-fEa9&t6RztbzIRtTlXz0YJ5U zg;{{F)=2X^ol=5yP5MI;q;>G(6k(2VPN)^?1yK=pqejn#UClPeNQoE)lf?WRinI3S zH*yV!aEW;=DU6y@E7lG0fD}|2#%r| z0dAKS?j*bI(1Nan^V_%Mn`fKqs0{7VySMNg>DrD`0GpQ78nQvyj&h_BkbeVTYlaEM z>(;G>_FHj7Ze2k2zpcn%v|rB%5fRX!ngP1jG&7(CVVj&)Xn@%5#-;mcDMv4S$tNW% z(Q2fk)zA<->EgG9O+Kdvb+~mhVJ7BcOvU|+Uyt^ZnMy^Kwv;%r8@wal(fM`gR8WA# zR@7{ACt1varLHkb#KXuUjJUfF0|4^HR-4}ep? zCZCeulE34lUWWwTLb9~P>vw2CttOKQm;l8P^g2PMkw^sg=)+Wn9izEdO=zC{ zMr)SYdC~EW<2MIG@9~{K9A&_vClCM%66iFg1{HNo2W-49DXk8%3JzmZk~iP3hZv7eZy23ed_7*$0|1#pZNBz+9$u0uhPHb zP!UsU33kG)i;O63q0*IVBq!Gog-ld$PHMi7kCTEreTj7zG@JQg7tA)nt+;#_4jzK0 zq<4I1x_tNN71i&-Sb5(3`IUi%)AntB`0yWRu5MveN|Z00zBXt_A-I9AT{pXU zM%nB&@4mLEhD%isiSLs>E2!Djiq%mgcRBV!lP`}BVML6WP+AQ29Md*xK7LofE z5rpX)$)M8ds7j)IsId!{RG*^lUZ2;@d*oHn3wm1cm_24>I|{ek+}Y|uehbAH1C0;U zbw@7Bv%)m3yU61qi-WgK?9+yhP!s@CJg~8nb9$G;=_-_`A^uKbek36*jEIvr+4k6| zEz)2#>NHv{Ase-e+D`7_L0x$rO)JiCLPy<-Xld%CKj-8{dCwOvMiGGiE<5SG%-l0O%+pW zbOz~E^Rtz`GTX3I!m|?TSFcbon;sHPG&)EomOA)@u|x{o&H>Iq~#^F zqP%?9=6U7I#On1C^0)Gt9Y3D=TK)qDLuZ!PpkJ|JbIH2P0nXuNC;<;3hb5Bf?^q^P zNHkM=NWy^)m*ORc&Vs5T0@?rrQBCMMT1)GxKt(#81+`qU@TN0K3S!OYVAah{y&Yg6 z^)(vUuEvX^Y3qtRU!c|7fPCtNHq1&|k_7U!KSmp)kDG-4kVa3^J0@B5xT}w&%z53D zxXvKU4kE|YpCUr!BG^iA%u?CHZ8SAzWX!~vvKXOl48&*&j+wL6sPdGGL8BLhDc*dA zm!>mF8X^-@of3pJMe*+1&%J(0IK z``=|`;2{Di4K_tg^e7+4Q9e8l3@kv;#l(u8)}xqcG)DFW*qkUMsy}5pC?Z@!l7b>4 zq8uk#P_qEZ%tWv^e3NOjG>2;+A14;LHa2gT}*9?Cc1j9Q0 ziy94G^Oxp~Cf&<1hD1XeMg*Zon_YkYjikgIit}%7n1g^WDfDq{^HYOwc16#)P}2*; z-;uv<`dz^=ZlxO5s@l_@f#!qs)pce7|+%>CezcG;Z!l4 zszkQ$;8L;sDG-s9~} zUkM)63n%JDw!f{DkmxloSC}f(;&FL^gh80fs3d5N_DGN-A##1o?RxECqkszGYtGUr zo*vyi*N<<4Fr3F2|KaH+$!=GLWCPAWT>8w=)z9vJr`P#QpWJ`I4+GM#$bUbIDs9D`q%oR?)wXeAx)>=7HBXz9oMm z?}dTjx(x|)rp+19rPIiQ@_7bWvHyJFOk<*47#E`oKsh*|yF5qUE59%A95{anY=mjB z6wb;sgVFXiGqYVnc~aWqOD~CWBZ85_2H(5@>qThnQ#j}gep^y|1W&yAp)cgUh5HIO&&z=iH6bou!a(Wz za@qdEG5G2fd?U}AA0KXuTn_KZ4~R$Zq|--W`_skahRN-Dq`v@rI~8TcfOxhgBA6uW zD4VLaimC*`5IsukGCK2!0f@n5s7FQ^R1t-nj8I|(qmeiZ4VLgi9-N{Oa1mD^;^_RT z92;msl3t=MU!Kx7(24aZulUyfXz(M7_n}xhnqt|KYj|>|nnzea~y)}_~zQ9{k z2uxeZhg1o3IBSqIojPKS8El=I6?C@%?M)9DBflVTn^s6|vK6E8=j1o!welP>{B8y9 zLp$?oFJXHgY)^-FH&(4ilkc}UvPhVu&8tTXi&j=sP{PGhD;7|uEr4Ld3TWfT2gl`% zHwihwgA66iRSv<^P{pzvr_hOwYw2>aYKz=`bK`An?^kTEhZ6rkjE4OtdlrWAoDSZ7g$QpxCqsdbXB3;*u@lByAu?ch z4eQr9mD7L}G&XF(_MgBJ&cG2y4Cjv}Do384Mp{M@6{sQ#5=jA$fZr66MTpH<5T+Gu z1%mY+O7$u|Ms6o5K?=Cde;sfo%1ps9zY?~ds*~@?mmnRYPrQ`%!gD7+fkk5`-e5wb zuRknnph6cY6xQ_#er*k?__EQ8{q z^yGtsar!R$3_a6x^jv}Cd0PvYwAZxseJvc)!geiGXhEyio3hF@kgEZw2DBQ~M+6*P z<<*F{ze6}~(mAp+@mo)DB#2ljP7&vbf{4~tcMhqgQe(^$2ybT3}SI7sUI9D+tmdu`B0ZVpksfpj+dh0fD>Mn;*2np)a=wRLV%Epz#uR zUyyq)si`T0cg{EdPHUz$R^xcaZpV0I9#V1*`_E%Wk#z9Kh+Ki)x=cle6rf7HW)Nkd|F%|2280)fANr)Oa1Jn1vcfV%R7t>`Tf|>flTB@vv427W3wE~J0Db(x1hMd)cGE2#Mi=ZjQTrckjH!;4Dir`;}*(MP@5FZMYJ@CX~7*Eym z6yBYk@%sA%#>W31w13cVA*C|HM-ad@irGPjQ|uo_ugPcpA#J z^ulQvz4X&_2LNinIqW~VP5xruhqqpne`u0_@3e13eaVyu`<>pr`<;PX2A(f|Iy3k1 z$`fB8WyQ$bBIK=#boaMLoRG)P0c-|Xi2(L_j6KHzIy3|r6pc!O5P}f*`?7a`dMh#L zJkgQ4>8Zo=XeP@AqGih#-t*bm^Bl1nQEj~65tdgA^;nfjlgA@N9pZ%G+;+2$1w~tt z7c{RZK~}Sn)9|a@q6RH_yeL*T43Hb->ol6}Zg^Op4f7dCC&4&@XP95~M@$f*8lABk z#X5mO1Op9&gXoTU%ebwa8*~v_7B#5R(W8fNp5xB<27`l8Y!D0$g4wNR+k`UY10EGP!n>rfZ{Cx`56jNC zAwD57re`o~-!P{9?21#NUsnmIu{TZ_=O32fOm$MVGr~#Z?O?ZqWCxzpinp;iQx_9W z(57l>8ws2es4*6zT_{!2a7wexCFbqsYO|1FPBl~WRnzY#`mX5{6WwnD6Yq)JXw4dC zg1&ee{w=_J@F~#O-~iAy05f0#juC%qiN=@(*Z4o&_>9mUsE71L0yD`%?uzgh3Hwfa zTT4ICUeeOTT3D#vuB8*TWm-B)3)!fP6Exd22Q@5C(?yek!K%@w)f$~niy9`10;L#rVlP#qCePZtqh%6`cTi=+ zlhVTZ9A2U?IB%4nghtzpn93X6J9S*3KA}Eg`j1caD=4=-oJAzH=7RjP{K8QTU-RCB z{xI;koJVIh&ZiBurtv&YY#b2M#T`l{cHj_EBjv5bOj#V)(Qq}Cz)YZd02m)8Kq}A( zfOv8cr3t(EChDe|cQuZv4k=KoFw71W{vMPw{I)9g#U&tmFbd$#Q<2<6Ur-kLG?S79cMC-glsOw3*u{pcto;h1eCvw4bNL+P2KflvrC4d7 z-z6yZYowpbF(^6?XWr_rHaq1LJcK}NSc}ZSw0lP7kBN#5Au;EyqBAWOUx^|v6nG^lej>5 zjx%3;!HCf)1!W?cv#C*;bB~Kp_Bq0tw`}VpUyR5VEfCAv#@4lOe}yf|dhC2T>MM1ZO4_m6U}qn8xRUW4uQS z%}1p0HVAE-tzv+J?qBw-?bhF zm{fhQ52+~JeWKAsohtRCllHy33Mt))l%`8I!dFCf^S6q~x@l-KP(w@fFV;-L0x00% z$T2(AkvTe(Kp3a;&#X>TQfknN$9hye0JEw1R8(;Km`^b%6KE0))5p%QQmY^R^n-7{ zegACf;&ot>e_a3E;>D6pUO0Hg7Wtz5tNgQkfj;onN!SV-k2KHjp;RCy_xcgcF2nG~ zE@lxU7};R3m^7-vdWVwc^@VV0ei9!}4wIA=!=H&JA-3n5C*`Fu@#QVgosyg6uMuym z_6eSisq#4ak)D-3P%!)$r=I7$I5SlF`h%d!EjWS$g* za-89BgT5&&+(t8*iY*gwqM;VKEb&D(0t{41Hlr!WpaW`GQW$Bz&{7aSw{5~m-Yc#!gOh7oObhSr%PXTEg?I z#j;H(MsBqx?MN3g$Di2QY^JR>(Lzjo1{4TagquPWB9pGV$jF$EX^ugT0ta(Aycu(1 zmd8}auo!OHT1c9#m}sF@>=2czL&6}$0)xZCTA7jtTB9fiRUF8s@kuw6GWVu{_~2rK zlh}uoC=5w_x)D$LRISRP%qqrnmF4P-s)5ixMLC-D^7mGg;fI^Uf1&v8UKfw0#1y@9 zcz1Q<>CeBaFPuNJ_~JVw{4ZUptAoBrz6B#JE)ue*Mh&0y%5kadgTr20CNFqp#mC(e zADxmDyK{WiJGRCn-`@QBD_Q^U?kl-HxNcSQl@uuDW{d*jS{pkXDaj0&PoS7vwNfTg znN%*-IhCMN2@EAjjkeIvJF95@=zBqFzT0f#$en9GSA0BWGk%mmtg2FLCtO4KaS8-^ zTH|}D@T#DbpwtbQT5rYM-eYAmwWg_BZBP?LC*sNiefhN0Vpw1``wjnAR<|bXwys`>ck( zJh8@YvTS1`uw4~eHwOYw1@$!9vND7b0@YB^07R+0ss~g|P*KJt(Z$zXh=p94 zOnRcpB-%nP)#`|#A}XpC?bOJ%35C$?OA8ujjtBU9QXdc1i2{0fXu{KE(3~@4P`&^b z|4X(|?L~RS-2MA8%2)>#a%|%YxIIM9lWdJ$aqlHH=V0iaHaWW#(cHJjI(blg#C=O4kY3IhSB`fvc6xl<7C;px{Q@%z{2AI^1M2 znl*~JCUM)66pXAxd9dJINpK1l-Kse_qmO(rg}!~^+<}GrLjLu9a?ghby)t`P*5>jk zZJ*~}O_ByIn=_rBdSTkuQ;nOsd~dqh_@0oxYI{}Hq0hK{hja`3Vj^AqZd5DN2@^G0 z{;F0wmJ?=D8~?jn{i#*q_bb)PsJ|!`Z&Xn!N=nf$y zCVdWZ{99HlWa^c?mXfzYe?9gy`5G9%{Tv+fkG0T6eqTOqLqQQh1s&zTqtpCdKC>3K zK&4zLKg@9hTGw=Jll#e@{y1lr(GY{UA;tzmCJ}i;{+uYNL=w)iLlj~M$tXnKhaGr# zxerpXgX2%uhp>bFe(-=UGDCvtCdGa!K z)XFNoKIqOlbwN+gs#g8+cet1^_nt>@+;Gp81E~3Yk|HCW{87s}ytn97nTcvp%#aEJ zju8WHl>)Z-tV(bWDYWQN6?dPo@?}Y$PP4|py0>bTLp@-3`IADYt?du(X$%P2AIvDm zs!xZoXbke9mB}P#M7ix5N*XFhSE#Gk2}&|52U zFk5m63j!NuF+3;;P_fnbkVI&{(ad3lHMqVM;WBG@<|%oN{2S;VoCsBN_KEy8i(HUP zXOHd#G4dA`jq^@%Jx1!<3)$!+JNl!c83tO>?kej#jVdGPa)f)h-FFZE1@U?)r4^cz zVJ}5#Cw?QBRb78&RTaX#74*Z#9&*E>k7>8NJhmc3P$J5(H61DScg27qfk29Gg6^vB zcby>V90=>Wk`nSAxlM#%%1RVLqvo?hCap``QOmU2FeT?@$1<7-X&9_zh$GNhXuzn@ z=u6G#BkEOxL~m$9JCq=CD`^oQ&x-*3EEgWBA8wRXqi-IS3x({)=~qX$11DXgP}T)r7-q@RIGm0I2TQO+y!jzBl>k3Lz`x86GgWd>y~851 z;!P>2XeK;sW9(|AZ49{vsxdeXv`rYqX+hFBG;taxnXu0767UsgFG{S9lqKa#C6XZW zYP7sP5#mrT_+?vcQY8XWULl-s#Dqm^0+OgR8L5-lR_V6r_Uo9Ad)SUTL)LoRPTOG{ zv$^nGM{PE$W2$gd1VpG+Hr*%+!w{M3q;MQzf?kcMp}1Gg4`!i|d7%tc@J9o_;2&~P zNgjLuoL$KeT`OO1#yl*TY(hS#Snqu^)_z{P)N8@fE1So*3YTJH=btS1Mo2L&iZ|BL zVUR8F0iAMj{C1bt=1n;-zHj!WDzzQ>+xfQdZiKAVa`g5K29Ta!a7( znPhp!S&YRzXXPj01x2JrL}FP9^8_G?G^_ah$aKa!9s@&2&}cQs!+eqc6^8=@lZn>xy@tl11UNLm-PAT|=_M@~wTaq2+T&V5t7WF&jJMfu z!XNimGvtRBBlC3xNx{Wc3dj@D5!hRs&7IxJu4Jq^qTqfzVl&HjhxH|^~|*VEiva~)hSkss_ObWTaeU>==dvS2pb+;*4U zY!Z{ZbV-Jd%_uAJ2l^w3A;a!6cSPrC zw$f!tv{RKutYB4i(H@ay6?2H)?ogREgAE2F_t=R%Ym?}!YhHq@NK%l)j_~^uI4Zj* zxiv~tvX5Tfydjjtd2#zwdn@FDu&+XlXI(d@%46k6du)1uy?>@Jdf??U=!puUX| zKj8ll)!#|dPIg$-7PXOtwXpI0k;e9flxQ!om)n=w_t=lyuh>;~yPlOoq{^h9ZVdiH zAh_f@l$cPmjj4%=K^hh0!@&fy2tSj%Bqw{4eP)h|g!tY|=Uss^dBGBTy}|wdyYF5) za6&9wo^?yURB_?$fm>hd^uxspNZ~tl6ue? zvmzs7cAn6~Abo*;vYzP^qIVN(z*=i%3UBTBgw@(=cMQU%LE>cbxOh{PM56pqkgvi~ zBA!t072;FEx!9zH^DKlaT*ZHC6|ait*#}7ab7?aq&K+Ame%iEgbH~l?)2DpQ+;P*M z98+Fc-V0_HEnhZ%+>)hi``oc})6?e`&K*B(W&z&nosJ&`Pfn9JE-4zn?D^s%o<$`C zaRg?gRyxShL&SkLPNNOW0yTaR{^N}9C>O=#NkT0Ki$U)=Ylp>ln9irX^oRmAKK4<-~XeRzb*SPiQE2CYG|;EBJ5l@aSE19UX_4b*6jv2L<5gVkUK zoy7rCa7G}w9y0iQ)L@1w7@!6h=A?3)%AYYSOI3rvVpUuhc$N79pPi3&FdM~ppE6sJ zcU&&7mp_6I@<;pR3(#J^@Vz|$1fM%-Bo!Mg;J=)%AzMIWGBmp7@vxX26vnnPFVptGS10m5WH!nd^6fFfrh)5L_MMWzS zDYZy7#TXE(;JwzLidAZ<7odvPJGE6QWGC-AXJ$8>Kz)Dj|MLfu?1rZO%U3IMZ$XFN#QMFzaR^UC!n)?JZRU>**=}3v~Oo~ zYildKN56^tX3U&9gMBfNqC}>pp!4rS8)O1;kcFOi)i9E4)~@JNh%@VqDWmRmh&|$ z#Shb2=A@W`*IdP7KRyT%pA4nekC&nP`ft9u-h7>|U-k80e@$QEA@FdcxzXI%2oFa4 zUS{edNgfi>N!!R~7AR(>%^xS$Uv+|KsJxEn(Vdl>EYr*c`xVZL?Y!c7e|X*^P#mEqQ#J3oL|g1b{OT@ zoczEb81!0hIJe@pg2VaHmcJ-}RX%a$=jG$#TxczrTd=r*-~w*}&d)6<$jv7MxR;mr zH>b;gS=Ko-mijoDrAZhEW0vr({Rw9Fl@L}E7Ay4lOSu#&Dfww$p8xgMx28Y*1)O8H zB{omK_?-U@FXJRNI9kmPve5kTQSTk&MlrkgE6Fb$lsf1>*PjMN7=#sbnx#X82ah?0 z?fF}Jvi=sW#! zRsq;c2#Ew9M@peGTv@GjD4kRnmlbV0;JC(;`wH!v7Rni2ET@;AcKG*vz2D8`*fQx= zk+!U=f_Bx?sUv(@M>?LdWao}smTrIMmI>F+Yn*V+T=DgtOO|YZX7Q4prZl&4;VIYF!--i3i<^wAp1>?7DuZg|n)5t+1}`jnAswW#uH<)w||G@?c*DuX&VL zm%udKLE6NZQ2?D6j|BqK0o^DtCKxToB4d@Y-jEH$?{p$)g}Ja81Quj6JmG}u_{8-Q z_J0B&+Vz_iRsm-vwb`tMDLNBg(~(`$As3Oh)Ym)PMz>8ozw!E|^KYqN(hgVPjv24c zzr1$d_$f1QoORZ1OKzjHnu1r6Mmno}bZdM9GJFR@d61Wf4MWxr=(qq+z%6(YUWM0V z8DlvdMslk>S0?n>Ids&3&kcCYfHni1M%17mQbTOcp};3OAE}?PRHCQpTZg!xE?>n# zYx34^IcRy=co8@Ko&A&P!P!S?39IbPzBBxA=e@sNI{E76d)FlDZ@#3V>8!RzS1lGs zm#?{Qan;YyT(NN0qPF@e%~wrdd0a$Wl9%IlLKJ+rF14gfquE)=YqCbv#HiX`0vo0$ z-=EvDK=}8v#{$1wPGwdXwZS9Qf(@Y2aYGdwR3)y-#@77iq6aQC zcS|Ga9L_R(gc=?>Id7Y=u2notPZxISQg1L(ELMqF5dADVqQW|4sBu+KsH*O8AUx5{ z@G2^+xDCrCs#OidToXKw?_qy=661(ikx;YX%>|<`Fq`*%j$>wzwBSGOB<6+hf%LM~ z{0t}XA;Rpb;<$f6`I$qZ78R;IQK>gIqsVk-LNOX!Og~{gX>@erFy8Ys`vmR#HryAB?Wze>fWfW zvkgJMqb$catIEdX+V56|6xELvyL!HYx6fI6QXqB_(*Yt>2k5dDU;Fga-Ne}O=!WgjJo4-9 z95v(kvm6UwkuU3{RnmItNlB1&#raiS{c^pF*M|MXS>Ak*zGN)PxgN@Wqy|Lmhaj1+ zv%?&!&DrLkuKW7y>tFzhrMvX3yZz5$P0!Syy!530|+`1Bzd_Y@^EobZU3l7b=B3BI<+2z z*KF$dSk!k>>gYOXN?n4+#D`%cj1L=dz<@ml>}Cb#farI4(gmyN3fPy)z6QI5eVJx< z8G4lf>lh`zOs{gixy!mrwRI1T^d3gW2N7Jx?x740l)>UMFsMBN|1N@0is0QMc&P|F zi=Zg`2CVtB`aSaoYT>fIQiP_)Yl<8WX)VVc!dPEVtvy!7r#Gz60h9wddZ>^k1R}q8 z;_wiJa#(UESRRUl&CQH!yqRjggU!5hx3c+A6))&Zdo1iaK33gY6H23r&{LrrZ=f5n z{NnjbCf|GO)6bsq{_FdWT(RngGi|R%=?(WzzT~>go3CkFJ?F(omv6fA!Yi75bY*y^ zsXPytp+W4aqO*ISf=MXQg>|uvp65?>d38Z9g^FrK|D9m`d^CfO_r;w!KtC`;_x{vq zIG296MlWR%)y$tgQ%863>Hr^F9-k~ZobH4{ ze8OwKeZJ4>Mx*D3q`I5H!>Uv#Knt({&$rOaiu;^Skcj9&0YM}!hO0$gZ@gvTSt=N+ zp}Kuai$vTl0$5d$RhcqKW;JnNjiruWV`q~zbI_>@tM-bNK&JkR2{>U#YM!~jbqh=) zv&<3}4uTJRZs?iAi}vh_EO-S!MptJEJp&&SU#F{6##RU2ltjqc4TFQll9Mky9m6Zd z_%j`BbIdmWlt2^9V0&*zm#zWIdP)Pw&qs9@4}h0`pj^{`YBc4T5_>cw@ARICc14Ev z92B9WLva@dgYpa@Z_pZ_dH%fKiPJyHp8Y-9vtK)K_5;VyM>k~6{>A~bA27O)-#K~k zo``luhV~qK+GNij_n*DZaX0hYrVtt%KgmFWsY=A{Z4z+0aLR*Q+_MN&lJ(>*dNL8O zt5qc4be*6TI^-U|S7N;2gqbRoN2;^R1{vd6rGxF+#e?v3^HyF!h}UeuOZsXE&HN3f zi_fKyK1W%5fegC{#g|AkX{Vble_Pd|&_b0kSek}jQ`1z>G zmL@s$0~h;4KQ-EZ78&ZjT{$PBUY!{~2{~-)>;qCD{{*8eGIPm1JA%VZ_@Eqny#4F| zJqN=Cw{SDnBc?q=jo8Ca>A?iA`wgq^1TyG57PDeHjMsx ziYDVU{j6Fnrmdb4A7o7Z*3nBX_JAh#6=P|w$k!@TgFytl8q1qT2(hxN`YN(wf!M&B ztQ~*rSCd5<=tZ%+r>`gr&_;TXi=+ZH6kQuX*9d~MzEE$7<{{7#OekzA#Ce6F(|^%| z=&tBn(fv^o6-J|lhy=ujvXlG`D9{n;4A6IlIth~`3<-LYVF*|_Y_Wq@9F}Emc>6hJ zjDyT`Tbk{gt>M-(Pk$<6I=H1dr4u?}|ElGCr(SyVWlNTP{9QLZ_QJkplTSJArq$E` zxUKt?O;etjIAe62S|Ydj<0 zIv9oyEvE4Boixm#44;gVam~c`hzj|1MbfEBXAub&1NurVxN7O$&8H_~og5@enYNCVX z@-Qz=9kml#HXsl1+46?rNZL_19`eh07g(6c8weByGZ98R^Src(dz6T5BMVhyb>$Va zYM0*ihtnE2tk_~2Wby2_o32>?(e&9b&AS5sIrh zA6&D0+xQJ*4;}j5I+mAy$Hs@uZ)DG&^ILv>H(fDm8?(G`x?=T~mURl(vMT+BI!bF< zJQJEf`Gmz+?{dBhalU%DD<|a4mMQ~B&!1#H_dGhhBLqeWPzWZ4a`=a`p8J5$!MO(F zCmy?uk#~Y?a2~O)F~@5^=O}y5p1dMwf4OC4!7|$a%Gw#AdMrK5rOIL!^?{@3UxO^Y zfexRlx_)Xblem49zw9zjK$*|mqD-v>Y9nB9(|e@jzvwdj*7%H;#W=cNDnU8aMwt5y za?+FVOx>T53UyxsiW7$0NhF8pVt<3*8odTK%JLE@cp!K97C27Z z-iyZWn>FT~RWm;x_W}$vdk^k4kNop5@9Z@H4u$L5A0(57zyJDyYnL{Z-CW;z`!&~_ zADY9c+shPGGcozvPqLos zUpZg;IbZIh8XHl5V)Xo^#a}se_(Xr`r^dp$$FeB*P;Kq_(R|LV9-YhzVPGMu88VAFqkCtPxOEw^vHCj1on`TMDEW zX}v@w?MYPl4m1C*LwFK7ey2P|mF^D?8h^Aaoq5h4^X6tjG%=5|n0BFE zHgDdw<|gu>c?x|YY*|SEq~2e<_Fnda&T3xoX5k{?Av&WdDnVC29WazYB9Cc_^e0CM z8$sDL*I?fQd43_MIN?&6!lvn^ISI^yFnRvmfDkH3sxE>A2Y7>_q|;&iU)43pXly7p zKxMOlOD(J|STKI+01e)g^De-38C3<`up3_D05&EH{yJ!$lUKJ;nF9m+$eXx&mIw$a=y9 zM>F}yIG8?RnB)!o)L4F|a(j-Bb%akqmvfFqcMe9Dt`=m%1H!r1=#0$cd0d?KG;1E? zE!tEL!+D_`q-1GoJil1-b2PY7@j*F>Z^d4!P!~EqzJTCvKzgT+bpyGhYB=c#qTD1l z>|`k`PbidD(=s{5<#w8}NA_iB7pL=zHLbhb;Yeo}lkQAj@p_hM>_Fy-d(3s24CD0O z@VmF}W{$(Y`zX76M_v(9j?+}PNY7{dH|M1-E{|<-=|(^Qjiq(8Wi*HLezf-RAWA-5 zT+&Z-vivsj4DH6=lttUiX{WmU`Uz-%lcC-Cy+yl}(hipQ*UE~_TH!hI4;k7Mf%S9= z#|>PVK08q;gwkgxqfS3DiJ#zO>`#=?PYjAj@ZzB`cPO+Dg~Fj=3us9dy=0Y+TZp;nxOWCf{6J3w)kIB~6{A@4f_)l=Pn#|QEppEvOP>URX zo*O>?PQ*hQ$`dAM?b4j!Pu|CPv@VPCwfVuHSR)C>PwS)Hl-qyK99fA|F1IN6{+R6- z_^>N%pltnNLhn~%3Eihwi)5@QUv46~`*zv+}=gH?KBt*p%_R@tr={-s!4kQMk57H zhF^m}LF*cg|Kis;jbGzmU8kSu8a0_~Oh8xJ^UtH#m|qY*e*XL!TC^wh@|7W@C~-8p zwm)Ta6hj2FDNDGv){-Gne>t2P$^EHy!KV$g=+;uY!%pizV~*#=SG?i`K4Ik5#O%>r z7ne8F(dXKu-LS&aPjDHy!(KU~pV{xej+z$ zDspr>u*0iP(49_~pCnPp2o*BeYZr1@)nom|9i3dr1_-t)$*fYLlImEsmBuKiYuj%4 zYQq{T*tWw4bDFAN`OWTU@j4K8zLPpE>}67I`|8Jb{W&!)5$!T+0d6F$Fu}zx^OFTeQTD03Tw9m6_TaDBHqDyriPn++! zlk6Rr?R$g)veKgcO@?-(B`3f|i4z@>ew58xmRoOAmSCd8l4nXkdG<1udojsPM~$~e zMG%)}B;qsNnNij(YcjK(keQ{yqas;ym+}jrC9fnH5)bey%qc9|t~v#!QD!BWdUgrs zaTS<(eKoRVN2WNI?iGfS*k!u()BC@qU5LnYDNMsL0z2)M=b z72dYsP*t6s#%fQe($1%>vWvkorNc$(7c2s3rB8Uu?MhxKXT`+$6ZSo|w!0fDE}F6N zJ-B1@eK*@>#r&Ij`mt`aW?lJvR&8(h^NcT;7V{jJX2UG`1X>n1BfndAWXnF&PhMei z63+EAIay{%r|0(o+hInR>b8ky(M->m z$&&9<_i&o;YK{RkYx-!y1elQ;$>s`+3`+LmE<@vFnX=CKBVi-`xzNJ+2o)$R$O3VY z1&$St2OLCop$b7sUuf;^f0bGiyQjT1@>})~|l8BPv6$_f4KtQ=e!1PeVNF+`h zX3=Z=`M}CMHyBbWhfC$bi-qmNOD`GiFTGUck;`i+f0TwqPf-Be3&*~)6Dk_bc6>8@ z)wpmW$xmJM?80x%dXCSSu2}b=JL19FPMAT!NiPo$LT^9~yMhVKYZ2%RSDU(s@~!I7 z8azZah$qg`>rc=xMHR%nhY zD(F2}x4^RJ*-bE+ToaPhmGO5pzR!x|H=g%Tt3Dnlr!828R|IZKwOqMied>=~PG@4s z^U^V7%DY59~m zufNqbkTM-TjO*$XtkID_b3RXns~n45YF+q8Y+ylE zhaK*4LgwB_297CTAYU$%Q)LLqr81Ue@cG2BLp$cmkwG|y!~^1Ck%++- zzeht72|IXWHCBLH8OuZ;tx%2)H&@Xg1k=-(H3~y4Fih3^#2G*rGuWq47DJPPLG$k-Qa6jt#;5Ikt3i6tA~mwscTUon3N5yLmCDs z)(28)p&R$178phLMEIh@lr(^W`QgMQeV*;>W==@t5A^eOTX_lb4CTgj4pqp`p^ErVK>M2v z?MBoW0YVY~3266aRGiOkM;-&pVL1wUKk!b*$iVeDM7WzYhkAO0Nk0{ecD*_HK?vvRR-f3veKk9 z;i4i7^^~AmI@h(7pIDS=2)Z&pL`6e94Mtu(FPS$tZ*g8{-tN3Td5*k1v9vyz329ao zH}H(!us56#J;@fCA+h=}%;2Lwq_zh#{7r{E%{N|tEc^muS6!R_iG&yQ1fBx0BWX`jAD{6br0%4rR zFBS#_fBF|#vUyscY#!$EJF?~B4k~TeaM@gKN!yea@AQ{b%FhmVHhI5hM zrd&uV`^yS{iZYyQd9a|6QVtCmdk2+{b=>J(|Ui*3_~ZJ>3CFN&vX!-X~E#1p6Phin&}`qQ+2@D8T8p-#yO?N;*^gp>zkkA z`@0;@es=6iI@*dcTxgB9W1B(BC#C+7?8>IhP!Rc?YizFQ&GrHqj{cPCoDHsFUTABr zr)0F&iCzA%O`2<$X?#T;T^x@oic=J+-l)0V812zug9d9fAa`mY{7eJU(2^R~RClYa z>%{4ma0?+k@RRX?WI)$ns;xBsS+%>8A5383)q2u(oY-OE)1)&CqlD zJyKYGRF&nV=8z?#CoVW9NP8z=kO9O{<^_&x4qc7@ue$tL5hS^0X zc=HBc!K`H{%k~u{m>9MEPti<1T{YLyYlX{%aW+*Jhojq#Wk`XYz>RWp?BJU%mpB$N zpZRIF1WkM6SX>Dg=6JLG7Zwr>pLLTZK`l>T4ww6>uEHESJRnAym8l2kX5@#$O2gqY+$5ZAW_-4xkZ^dU=_RVo)2h2H3{&L@vSN*9u zXDld2*_AyO0bE8Ewxd!3weC-j=gJKe94(Gr4we}yIvnmoDhzd!qzaI1p*1qe#TChH zC@NOPLyiuaebWuowspO|Q0!Ti+j;}b3ViPO+`nY{$qyV4eNudAFh7`Igxs=QF3dx1 zF1On#aDmHJSmZ+28+mz3WM0TGEAwQA7iMEoF^QS>Xfo#jx41oap+58(JtL|;CDk?k z03%}o{LlkW#p*|moL2Y33lBVX$z_!j&YV{FJsHze_uTLG2fQ<`AupagX2o;AFTEpo z#x-}X$i&kfc4Y=CgCt(axg>!n(K{F}bPk5r!C+3}MUitIXx zx^&c=N8}yIikY)3+I%@3_M=4n6yb0jzKz5FIJ^~y);JWzAx`k&VmMF?dy1jhQzqoc zPcN;Y7c0u-6tV}*uj1*8uJfu4&PBJ`SJ<1CCH|2=)X$5^vk^HLJ%+OK&UpA~?x{6} z*)~4Uk>-@w_1{xuFg1Uwi%W5KOqyrwaLPMSR_+rSN-0kqR4!&yzJqEhS=tw_wdH#; zRcg>ceUWK2eL7g$FHvm!C9+3T&W{TF$X2O{Y91BwfaWAbl^L;r>c;N%e@D5jC-3C`7g{xZoGd8gGmguPlAObmb^v-^g2TtBU58 zJvd>)gJ&Oi9Z}FURk_!#>mJRm+^vf(B4)51l>UJ0NHV=lSvdz8rk5gHBgJ==JYRCh zs2e9Ox#{8sl9X5W@c8i$pB){sY%!~0hI)FPWmIb+=*)Py0QU2G8Ua9@ix%6>O+@aA z^C%kg>A@-;vwGuj0wY$YX;qusICHEwP(7|oJukMcrL=1)?KR>z$ce_sz0y((T8%!h9UhhW#arg7kn>`s7q#uZo05f3rEPFB;nl-_AVYNvM^M0Y&BQSDMO z>s}sLG(EA=(Pg)73Db9v3p**d6|z@&C&rk)(m5)bFPzYq+U<9V-=J^(OO>$Zpev;P zQkPg;;ziP1k|=rDa3}q>=a(6dJ6Q1n{Q~17>qSSxYKeks&*PB{>G3f+su!))&zc{HJd;Sf-cy8(DMQ54MUlY1& z`syneUen4XzDd{c4e?{-L9uu~x&^^%=!D&j7nNI7)n}|y$UX8Zq+1wA8HA%WB1ehW z#yE;$3*!i8%!=$dZRU*PWX|m9_S(xX8$3za2ab^=uQiXtrGhQ|$5(c`p-5k@U`}mp1>rDUusGO!c=bgM0+xATE$K=$L^r}U17w7~EIY?4+Zk<`Z;yV^8lA^R-`|y!kM+!G^v~X}$PuZFj$Y1n!3$nN$h(y=>!qnHT3|&2 zdA)J^nM&-L+J5_Mc$QWv$6EV=zOUrnvufjp)dNo^O-TV**HL-`JVoUgZ@{j)jD&z& zL_&B28K|tNU@iFG&|a&XR8;pRwo|&i$)f;6 z1PBYD2(XRAr5uSDvW}1(2r|Ulwt#BT5Bx)b&*=XPk^~BqtdsrW#DxkpC{U_!cuB0Z z(j!7;aFG|OkWgW$3W^$`B7QM+uqbyWOn^3O#!r=i#X-kPL}J(mdGyQ?2qH=gW)9Wb z+PWBzTUOdlNGdArpB!0}<7%dR!B_~8r2*FGnx5#Sh?EKK$DV~3cDBSyP5ea9sS6h_ z6Hj?#|J5lKAAT^M;l$T{Fv{ru{Qc<6bE)U=DJRp@KD)D32wf77Ul+JFfGY!a0erK6 zr5_jihx>8BAMoRgsH#0xj$G)4bnB~7>w5oNemu($e!tqU4;FV$a0fpFplMFyXf>a> zF&68ReS+p#OW;BC^8el;3vYfToddz|=OliAc9%N({$$Q~eI0+Edj`pA-cUf{yrIAl z1;Q*10=B83GTta)yrD8k(U1y~3YhbT0-v##QG&n&GGiEP$j~4|sSK8MbpYoJ-mzpT zJ*prA7%I^s^cK}-1SBv<;4qqblrI(Hu)Ec)48rIFrM(AM;Ljy(Zi|){B-WGTw zK9X{fc|E>#A@s(LnMenfJ`$5`Sv?tLR2mOJ6H-_oKr50(S~5NT`T(fy&WlA>*F~~R z^d9|&ew}Cx0gYC<|o_H8{kQ zPydSlfsbGzf`?%2z~I0bNgUWxb;*P%h<7LmOVRF1mh7qcdTWj>i2nuBa31VkcdEmDitkYnn2IN`|#JHB! zS~YU229lqcG^B)Wg+cUxOPW08!B$sNJ)jybEVSasB_)B9>XKs2 zN^oL6OC7BsR`>ZB_HU}(`$OuJ$foe8$G+cNxk-L-%fqXRHWjXVc*}#5_ zFCIJyXMFi3jOaOk@6Ii6zrAHA&+M>!D$!LN#d)FD?y(d_*T)+JVw3l`R3ZnxV^>Oa zQ6vzPRGq-5N@JK3D>)-gItPDkqo#<6^4v|UogL2I&OHq7`UY>i7kgU;Sr&7A8WDLG zQ;d5Vnlsqnp3I$B*r8{&LNQ;LZ zP%I75!fCP){F*IKbHyvoRu3e08WokLao|M;V>!r%g3mLDfoekd=uwFDBGAkV5X?^V z_iNT{{1P_9NSJ1BH2-Lx|BsDpK7*a`Z&Rb1-~V&H{{JVx-2%FE*71y~UvN!kvccnE zC-W+(ue!>H2D5z(uhG#CKKd4GbgShz80;y7=E6blZ0{tGfAg`oT4ODL1VosR&lAYb zW`HeRpDN1eQbjKtEd!dmimRNttcR_ow877IC;?$y8$CoQxWDuTi4U|n2pI~tkw3#@{Np~F?% z4H^qQ_#IgI{a<%n-~G*=SH5~A^;!EmD1C1I^!hs=Sx${aGFlpL-uK3#y42^=sek|e z&)aV6PAy16#ofQYf9)^k-)dSY>^9Q0j;@H8;siaq$QX69dYyW!+NFxBD!CbUvzr-T z!*!zT9^S}}p-;<9_)^JZxFub+aNo3qio^hpa_Lf0$5A!2@Yf>@RXE0yB}=iV7P^B?BdZ&3yKj8x|nchA~|XZO`%7El>dj3&fSsjzz) zy6RC5#^Iub{H?c_ijP6L2^2mMJ{%@t1LY90AQ=d%$u#7rUDC#jB$&vntz~^(`k{OB znsE96P)YHiYNJ%}@Zzac@i4Qy|0n`GlTc+LGh&e2( z`vH~~kwl024n$wty!>D9eEapE4m|tU-_$+w;J?6++aGwQYf8ttkKOnDxz4k;wLdg| zO=8_9I@=9q8_y=oMJwVLs{S1RP(QKp>Yb5jq#{Bh7#oJ-P8jv>)lP8c=ZbW{b_8+o z0UzA#Tj|4B`CzOMM)_cv4_NLTzQO@x9WcrP!yMpqAlG)Fq9QlRp$Az=v$nbK55GtL zoGMu3Nq!JhZ4Dt$8h*88gk9Nhpi-%%Xg{epuQOlXbm;N>7HnQH^Myli!&z|Sdn?S3 zCI21f0dsyYdSFR;{^f1=ZrX5Z?U{Kc`(Fcq9Y1Q>`9Q2gMILHk)tlJxI$0N!PAZDh z4NL-vH}y!j1Iu*u{4WhmW_&?4Ccp4xb_KO@FME$KJM`5jUw`&Z%7inRx|OXHL2>xBZ-mH0XTu-@>SlSqbef zPy0JPL)a0Kybw10<)+)WrT&oNB8D1xTD(LR8&*3y9M}=!uz{WQiF%_*RCQqhW?;zb zrS^Y;44m>!#~Q{{m;BG~&b1)}cf8XdGLWqwUC(iJ1}=16yxwJ~M#ABOYV92D0*wsP zAfSPr?(Di(`?ZFbYw$B|o`yvYG}hqeI)PB*$r=Leux_2YN6-c)afXa~- zRm?(WmcQi$NE;3nzL?KTH-VR$6j&}9{p|j$ozkx!-uBwTox-?Ox4HkEjj#@`HP@Iy zR&;>2*fQoMbYHw>NPTfm0a`x@T5@4Mf?PCc5XvP%PyK2-xsye%3*797tNbw552O4r z%+Gpf`mvumnHMN}-JXVJCh(9X?$ zrfPFq4bFgw(EsNs!~yF>=qGXp(PP;Xur*XirdCo(vA_%fvhTIG_Kjcp)CMMie)b1* z+Gb@uTCrqdNViMmMZkB0JpQ|4&h*zKMoa(&7Nlv4x9ZS#vCw*X(bvQ?d5jvFX zAn1M_>j;Sr9;C#Tq|&Mg9_FSBd4mbXqj&;A&5+fkOIHHEOtwZH!v<&m$XeFxgQM5l zp@W#^1!0LA#U8unr-t4&+u%aSsTcg+ysG=7+l8_}H=Vq8bq+}Qxt=8H9G6^|YFub* zOQX1KjiTy!K`^1kSy&*?!+R%nidgg@Us4Z7l8V8bCb5E!s&x8iMPJJ#Tcj};c`%~} z!DLD5PW|o8BR{_P*fnz>U%mL2)#hjQPh4VtDEN3cr#H+VR@Z#&vUlEo`z`ajG~W&3 z{VHe1&(cUetfssb@g!I~q6Z|nSz0OKt0WjJ!6*q%V$Fxc5?N&Mti_uMH4iw!_yNXaXg24tyh9H8&$NtypKRH*;MPaY$+%|Y!)H8vt$EjjyJ3de z_UO+}AC=nxPvfRh57(NBoy$wk+HnWdf|l?+!*NKXr$$vgABPfPb@n4d4xK+Wcd?4y zNlo`BW$T2<6onq-YC;iZW5m_sqL9Vf9Lz^pYkt4g>^<dZIP)lcFp!4H-syoMx-J~H!w`trTN{rT^l6#h^ ztqv^V+^={O&?1BE)v+sS=rR@5Rx8VcRkb`Z$i|0dy#$*rk7?i0QB++c)S9JlUom;| zZRT3@h2?ZwsSWS>+e_dgJa1eQ*}aQK@!mzTr__2y+1|S+9x}oSMQ+f1xB+=OJ=h~q z7E|mlhPH1eR$&}EWw*xmW+V;Bcx=;UQo%Pmy_9lLfa*un;->|t1ZD(qLjVF}of19Y!}YocJo(DlBw0;5I8v8bN$LnD zQclt>if$w5O!^_n)d|ZFVOT9V(#Cj<8nWyt2M^_$nvf&~43SOKOJ^v1*e|JGhc)wz zw{E;-3=~3SOl0{9t}rJ{jx3*#DZJ1Uw*l z$~>=l(heL}E%S;%a+m{g2)qWwpD*b7dPMOVhzMTRn|$}v^w7qb_p7Pk{b~w5UN4G3 zBvRnlwO}$|P{L6i`G_Ha#~W4Tq!z_itDS>Zw;f(plZJ$CwmSD#uz&Rb(g%Dd+L^9C zFxnk2IqdHY_%sH-VAh!rB|!SL0lW}uwwf(FPEN*88g$mFGuj*0m=C`Q?{|%voL5{u ze&W?Na1hoxe!EL#h`=#+ntBHAS7uny{}vZX`KY$ZlhgAypc6RPB^JIs}rcE9kU( zC0Gn%F$dc$#v$H+GmAk^B{47Kj}lKA<`rn72XBU9bzADp@`pcvXA2mT_vpM_xc?}G z%&&e-y_RE^!QULzv@OR4sc+3DLtMr7Q4`%q*VBDefHudCDZWpAKln(44@R(-{JF7(0(Z#^}&0+GHubU5;ju{v|W2Z}C6pQHaEl0Z;PX#yDZLl*(m!dSpS#tzSq z=O^=5=Xd1q&fk+SSLQ>$LQOfhm<;6xz3CoBJn5g`GwW^6AFaJJ=xx_}GQVWo7iap8 zF=^&8=xXqEeBPDJc=6Y>R-S$CuO`&3oV{tbx&P@ZXVuf@eqo$>)ZAmX-T4csGT*%A zcDM_wsG4q?|C9Rb)~$FjoZQvcU zXywiw=?drC?vMYL6F)g&W!&e|PbB=|ei`?cZ>1>XTbW$mhx}0B4O*1#vHVH$v1_fd zu|8kWDTRab1IJau|F3Z~=`#&c>UVJ8vGiCs47JJG%MzRpI1f8< zy>p5a*HGhyDeO)JPHI2oicO(Br6um|@OFClcn^3FdnK>eOzZ~jrkSHbS5Xaxb-UvQ7Ys1mYF5G$UaNuu9^l3Ik2$;Rx!4S@0G{-SS}A-V(0Q)m6hvznxqKXHK`npf_DQN6EBzJ z{&0exZQ$}o5SfZxhh5l3T4u3mgcxY?8G_g%tG+Dz-7X<{lgA+{ti%&r=}@u=|#m?|#>O-P{f{V8jQHHmntklmu*FM`}1~>Tqi{_3TTsWwtIx>X7 zcjfThCx3lw(=gC(f6y;_Qy-*WeA#=KyM8;llXdChyU z7V(PDBJNA)$b;qfL~*J4!mob~XKX5e|Km^oI>eeEtDYCTQ}^Rpsr%o1ea{CSd|q@1 z(plWW=QaCj!?T#4+iU}lVtF+lma5Vv25*+Y|nzV+t_wvj9SIj@T~0yJ#1s`$ZRvR) z^BPtkS`v>ahBusWQnjwoNqRN~X57J@{P7P=ALh6wW-*P^lL zV#@l0Fw+gZAE(>xQD;&C2;7$qFwQ7tl2_RWd(z~ z)jf2D3{}%5q7(4ARj({?C=I)dCfnvvIkGuMchbmMGy9@1s+#Re2&TfY{>&V;+fq<@ zJ1SNhPM3>*zuvrWD>Od{Q?}AWY~C~Gh6l|DyYYAUrPS%^uap}fN=4ZhvMV_%>FHF$ zA`=o-MKSUOrxq0n9*^RlDwO6T1r+3Io#ln~tOvOkjkM+qTB|DCQa9G;WR6*z!^5K! z+%jWc5W%W+WZ{%dID&y`a!^%j{BPZ5eqtW`?yl{x!q3e4&vkaa_RIM@9&3I9#J9hE zii+z{_o~-FpRl=21yr)RKM z#v>V1HCJ(-2a(R%-+cUf4CYQmxIyUo7V2=`!aM~b^~1-enQc;384*f z#o-E5(E@(|_TB?e(Pd&k;}=tVNA}Bp_dh}~Hgs_aj|{<(5afhF2?0I0BcJI|uTRl& zjSgkh)YC!IK`(GmaJRVI+=AO3zT6KZ{Ga-9sUIkDg47m==yP*kw!PcU&6XK#*}I-t zrTvPEoY9rx$_i>6aaRhsai)tau->l0P^<=oPIL138@K*q*0>9ruU;@B_09jlBF*7Y za5;<=yN?~+_V}gw&kUP+lTg?5UL+XtUq!<9+1$leh9NSXAY*}@#yj{~cv`%e9HZub z(;~Er%Afv+Fyf~$uk>cM4fZMg0gq@=l|Ghr2&q|^XdoQ--)L*!93iM zdi$2kllT>Or3Hv})@1iIEgrwz0aF}M<7jaF=pZ+XD@E*RVtuKbc2h-)L4UA&6`Bwj zFdX8Lgw@bNEdy1;#6gt+uhnQX-8nmL%re1W#PvbzuP~*jWYhPXe%NH)Z~C4`)75>0 z@5x2+i!aw;iUu`WgZ86FZdO(*SZh)g5s_mStam3qfDdB{(_?QJPfTZFbF>~kNu`Cy z(X^U%s;d;+#6|Rxxal*|20RpdnslBYHd|T3JX~%2fzyvDJ>lrq&YnU#;U6|-Jtu44 znA(U)xSn?@@S{=jBGJ{v(&c%t7i>&bf*1$Mp-s(-8K>=uHsr7sz zxE7b08vRY{rb@2Gjca5&TqS;f6Vv50S{zgDkB-a2X=n30J#M(BvVe?~dm< z-3dYppk)@l9ZB`I7`{l0DhPz74Ao^)1MM|z=FtXzBE`~evgmSpGf@XDR*mo&%r^HJ zL0GeL)27wlC%5h1w*C3%o`P%Uw6xB?a(Z*xVuNNVHrJcinDeOOHtPP*;c}Su$=Bv1 z=Em>neX;B=uWdJ66EAQIQ2{%pD3uh3=1EZP+NUFwnt4(WZ^Kxh znr@-!^92*4NKc4XuNPdcGEspWa(n|-+4sdXPoCb!P!M>ZZ>Ci{VSn zt?$D^^DrEN>vsIX{L{vDU3gk*BVKhWjDS@~$Kh#sCslv$Nmp<2=+qc)Ypmj)sS>Je z7N9fYrO^a9*@JNwiJ=7Y?C~7%9QFvFkeHWrI8Y?%W+}7W56>iERXUblQN^K21WDqc zZOqfn0u`rv&%nS_wdleNMv*!1jYSUax({~jJ^JDMN6(mb`=87gp%m1^Ex(saI?g_G z-=8;||2bs#m>P{Adx^<+ zm}i)ebxlhkVA!&Po6cTj)r+{HfV7cCWEBzkQA=3cRvD6ljyX7}9nQ15k6B5m?$qnu z_)F5+lcYrGvnw)}3bXiXc+homWw6z6p7|3FKc$Bg9;VS$(|zQTbtS1RR6ar%S?QEyaqk5ft#pnEJZ&^m0+G7p>C&Z@AO(KZcH+A<`I<9{Cba#7a~ zh?=jh#qAR=T$flg{@!2isCAzC)_q&f*)*l=nFm-*kYOtEe3e^yeZ^DWa6)0soTLvz zR00YWwe(k{kiJz(4#6uOFx#=ffp5hy1JB3UaT}pF1`w&9t4pG*U4a?YcE+e4IXmgO z=pasA!fL>NQnrQ3!xU9KG-IU>H&ffDq5?cJw=;c|-C;bnnm*s6rp(WUajDCC$o9CAtcGkFce?k^jOk|SD1+fs!Se*XNsw$R0&fvZ(vSQ#=2Bw)W<{@`|l=>$g@sHGp zU0w9X|CxH3aT$H}CB1k-?{|X1a}nQ+JGH{J8<|^|ZS*jCT7*p^+$+Ll@iGxtiDy~; zF9%V(w@{;xR)`2gScCBg2;4|+Be<4~C9?@3U%HOD@Sj|NbKwVEzjZz1BDd4c$8v}w zt|6{k7je+HyWM--_z^c4?n3u)H{r%>gj#XTcx_n4S_wKx(ycouC{hpwvh3GpOI_eK zG5oe;+!|}HNN>T46PUC{x4ETsYu6e1f!wzCL3k7CG<{~Jwp4=m;otOP)VdOy=t_jq z&UiHJNH}mvZjkX8j-w9jaCrO)2Xh}_o{L#S-^yOE>u;eiLPtX+WOxFJX`w4aKM#@9 zLgPX>5*iYsVsmUK@3(_;_Uec9?{&h9Hiy%(=j%Vy=jnudSeOe1>)Kf4GF)+2(lyt$ z*d@8B{ugrVUI(~1qccvou?_j{aYM#>$t!^>m|S9a&nzug{Zm59SRyOS_GAUbzL?N- zpCb}&$^ExTw23wZEGlwYBi-v2OU> z4DmfUF#jffeHjgjhsB1~LI+iVlr&bDoW#0l!P91SDo)pZz?5!s2fd0g?pQbBSo$38 zpHn}dThbh{oWHL}X{&P*zuM{XQf9SLQv^4V0}Ohl&&5p*HiyCr0qny*4H;ks$ePn9 zesz&B$!yzZwvm18)F++m(s&a*?`|5e(O~%uOC&#XQB6C9n&YGVXo@&P#0~V4W8F?k zQi5Yy?R3O5Hp$yJ?^gCGVx>~2U`0bdJ&Bx#-<=fXpqNQ%;LUIcW;C!TAb5DJnrfh> zo*1E;p~15pa5ubeR{zR81>XAAugrb$5|ju{RjJ<8zlNHF;Dce9KIb8@XLY3r9;qFrm29X zs2uN!fQ%o4nz#>j_H5~fBi$WL6A{L-W$a0^>(J|#@=Tb@ctlhhR#R=jORq+b!ixo4PZiWy2+yTKm@fMd=d!X@+$A8=1{q!F@c2IVl@x(mX%NTOelPiJc<1Vy$ z!ik#Vb@gZpnn54iSZegwz>ky#$L<#P2v`^DC||lpI*w3LF_zV=4;SNNQe4ez){!GA z22=@Kx`mY)WNqMP?uy{1eJpL-Ud92&IXF89o=*n*Aa{8+HSb3}@ z37N^bT#7vzmXU;aQ!R$i$1_qpqG4^Up$zBgXpDbYOjS!NvaAH$sy!pi^gi-F#nOBDUTf4u#P>9)aU63!?fB8x>`&5S?EP)$A=)Tp;Ou|?U9Hi zIrOo_|CVFF<68&$Kb(CDV3ft#|IEC{-uHc9$!-pkO?H!PLPD}6A=v~-HXPv$3HKp4 zau)-lU_?bk5fBg&`KVf@Gz7$c1q4y5X#Lb$KZ`)ET3Zk5=VvXDm;cPXyCJCUzh4uw z=gT`Y&&)jYoWDn^NS>f|howoGMw#Sq%JbCic+>g-skvLULFmLn?Wl1F+$&5Jx`pk? z(fJ9Ke0KZ@vac4Uc)1j>5F?lxuWnF{Q_WT}s)i0`A+wfYc)S!D zKBoVh9_brObx>yprSk9aN^gkqkXR@XFBAJ{kZ9ydJ?UapbT3{OE5lO8MvKEzOGLV- z(R4o{i5}H&fRE$8e)z<_q@yqG+b4DwvstmPf?m`Hh@Yi4)!)jvURC!MbAv&Q9?0tf ze+74jqA8I2N2y+sPKjg_dvwzl0eyWP5fvV|8JZ}?%6cH%N3XsvP(ughgCu^Yrv$<> zC8UN`td(hr*-3=sSc^ z1GP`M@kb0yp5S2@4_6R9M5e{sv6%!yY8X>L8wEYYa&MX_ZnaSOh=IcA%}n`XDB$1W zNA~S|GysP^b3%Af_&FRovu)y>Sy(!wCmcTQJ`jEkLVc^fN{|tWIBYXs1 z!uxN33D4Jjx9wTX7!U1)GoC%(SMlIqtwlz>8#MRH2>f75e4yEbmyrse=$^eE6s?)B>m0>2)&rQLEAeA`Mlg(eep?FJ5S0(EKw?+Ayf2 zs!bXb^v8hdMc7bucgdhm5uLsVt`_c=%IEwMZWJ!G2zdl2wDx-_^}>SdzY-4LxFK2s zXpGN!5mRQC7~@0W;Y)ZK)8AA6Y~Rjmiw_jHmcr;TB8AqWMG}b~kn-79PMQFCXGvSa z+zAeKac~8ZIOJqMY2__S%`IsteSs`(X?#|S^&1R$nIA;7u$h(H779Xxy1ZIy^tcm z4iJxcUmy!{lBZ9Zb5X)G-#YFqn%Gh4HaoHl^8)b8Sikc|2nri-!|KB*cn9q5J9`kJ z2>UFRO{}05ODCoJ@5mv81$vFCL28Gk>hIJ@-Jqe7;aK(4XiPd)k~={*Gteg$X(2jY zII$|lfl|>dZGFOYY6MiGP9Hi-n7dExx$y2jw1D(i6taauq}L)FN_7^`O{y*go}14= zUtS1}i@PeW?eRA;?lk?;-21T8ENSdCR3g8b%P4pD!%m|a8tYSfL~T5mXt!F)A!@JT zup|Oga=i-6^|C{l%}KD#l$4o7`2-&&(Qv^Umj*Fz;HQBq8y zNCfzguryy8*MMsb!I5BO+;|fDlmd~U$Epe|r99g%fl!i4(hX}xD2dBr7(7fh#w7P2N4!~U~}3icyknK6#+}(SFsj^ z`_G)ZUd1-Tsvkke>#N92LvfDXc)r{9Px0|U%>(`L@gBfe--3_#{kty%Bl@A2jAlmuj-Z#$vb%od&bfVeoLs(ndyUv$08e0T0!pO( zZsw<;Dvg#y#oSPdA<9eOc}>ac-IYP+l=%&)yYcO<_bZKOk#wie_`j3;!5x4lm=Pqr z;z6t}U1G1W1RO)k?B;LYy_epd0Ho_C?;Jcp_zGD#h65qWh zUidHFea~Aw^iZ?{hJY`%^=~LM)zCM%p{{z@mlo1a#(&*1imbTR41(Yj%t%{o6?Y zGB~sjjv-*+ia93AWHJ|o?$Y;T!Z{d=y`ssF9$T; z_=xSqG6g|Rvw-&apdvlY)I(lx#-hw#D<2C^s2!Jps14BS}d|6F5h-#xKTAJ4lTv``$g}QC#2mO2fXo0`ezuC`h zHa~8D-u$MS^_%@>W>B}L6qeRotX4+Vt&w`9NNVV224?iw<2gOW9=q9QwJfx)wVkwG zvR$!p&s$DdzOvk~ur`a$!WGzU@*be=;UxHIc;|AuG8pySY2S$ug@?eVyn{s{;^q6W ztuI7h7bTx+-=X3KnF!+3(T4izrW_2xfAGzZehS&ecYL#`^Xsad@WAqLF7o!)WuxQ5 zH;dQ&Prpx-OV)g|u=B4~*#jyn!ULFzPd*Gwo_It!ciXgCw~rpTaMrZd!sRK@cRiW@ zV$O8&i|KR7C;J|zpDZ3TcG0ZqSi8Ey96%Rnbd#J&q|n72U=Gpu9I-IMEno>#&b)#- zMpZn>`~`f@euZuzbP~bG@zO*K5o|{7co9kCJohF1(hHccfUPQO|Kf`%v|Gt?CC<8D zLL_Km3|Q*h0!wcH;)~mbU!!cer%Bi^>~DgP-O^HKT!+}taby4Jrk4qlAA}(T6N5~- z@Y>QZzg!B7ky@DE1Si6YO~Mo`i`=;J5%W48NeHjBPpS06-mu~^dE+Jq{l*MWn&BZc zjGJMB8G6mooQ6{^#$4iQyf%FliOCz+FaU56;5~>~hKE+ngG37pUJaWR{@SAZT%6ItL=SYL(ron9fiq?LN51=6*t9ezbBl`5D|)E~-zF9A1* z5|U22PXQ+Cic$(S&ABIW>F9drw8X<}bkf>Q^E(+A+`Vnia^X3&W7f($R|qsqa9yhJ zI?xdxh*+(bqt(6?1~p*k%Oq>5EF%L;8J^MIt`4i))nBP^s9AMfYf3O`M$M{jmoqHQ zP0^>5WU20tJ9d^9$s+~4MTe${yN?bjdbYw^`A0D_mfOE-U^o%o6CA7`3+>tYYxl%|x1;g~DhVy=b~f z22GR~&ku?nVd{fpmk`vPl46R~PW}kK1RJWpfBi+cl5lZh<9+D!>%Ldd;-B}Aoa9zM znE3W&*PbrJnWh6f3;$xmFE1QCN4W3^tlJ-;@lINh0anF_^5a!@t9hZ%<@3e0hJ;sD zfRA6F%7;829SQ8w1?6x&!EdWV3<@mO8EqEtQk&h$xLjbVM(!cCjF7g2;gMCG9tx0Q ziS{em@~K7FD9M-dC`gHR{4Q55Zy>xHe;r7uw;py6AgvuMzg|AhX(m$2y05 z4TQj)xDgBU62C6nVKys)WW38}vdS#SprqTZG&2tTBJOemr^e}VhMn!s$DJ3QyxD1X zsx#ZYth(KhhNWJ~;7U^Qsm1yu=*n(x`2fMst_2W8l7WB<~8Y z=z>_@nfOrSD|p!g>5cE$SGZFYk1qgn!TuM3pIB~H2`{nSy73FA7eCm^!;GA5IR|o> zoNmVvpUG@7nu+#11gpVD5;bHtnvI&-!5zV$2AN>DFAtESx1!U4lg;3^aR)et>(*rT zxQ}M^SZx*_6H(HmJj(Pyy@VL3zPTJFhSP6I)JfYJYOoN&{76(RCfPSc49mqo;sQ^@ z1&M$u9Ohbvez3El2#HKE8IjRDqW0`dGaDM`?mE=HZz^i(4edtn`|f)Bz#X^v_t%{OHE#%%^xY*sumU zCthhc&*zoAOvXDG8o)wWMNIy%%J8`1dBX_<>xGavKxp6@e?TTNEmO+vcB^}tmbWe? zek+^kx1!5EEr+Dx3uyKQ=ELbqfKlYbgDU1F#U-&6sF0Q;iyM}Rtdv>0STB6DX=m$g ziIrV<&%Z->cFTjp#W!abN8vDG@6n%q>anjhWWg`*d;F<;gx$x5w=bYgE1~O`Ew|y> zw^50O#HQK-shD~tZZg_3Y{+QIupoyq*N7bYTs@+B*;#s1;&$0xGSn)YAww})y$rzu z{Ml-_38HauHbkW`0Z}O97-W87P(U?)j$1VgC{f-tTr_Y7jX@*HAxkC4jlb-+4v;ZC zxvEg&=+XLmOd736i?k-KNj(%zz(;Ugrc59yb9WYO&6<(5EQ`sS93nVJB_@hrAJhF1hqQ&#(FIsrJuypHI>Jt8#-9>Q-ZQ!33LMpD>th$q;tcvK^9Tws^83Cv0CSVpiLCBSKi9#vRX zrD9ZYx!ulMmTNWaavt-QBY5t3IoSufH%+Zk8jM0sTO`EW!sERSiYfA&DWoH*Dmr%g z^)suV6CS9a{K2DFgb!i#;-_%HpH_B1^An^OcCG$%_O8{i_OFnGg~G3|wLsJIrNU>V zulgI`vOQFCS}i5g1 zI7$U;RZxX>I(P}dLjWcLjFa#ZQNZf|M9|TyM3h4}l-+Z{IlJI}Uip0lOXWVFz>oJjUMucrrD>f7qh4 zuf;0iXJU)bf4@a7ZBYvkY2jKe)M_EXkMJ3a`Z7TVhst1)3}%qbrXLLP`z@w0=SFZZ z10(Q&vbdY)wI*1n@HrCXt|nk@G8km8q}t50Nf|35Rp|Qp?=OoE4;U*+fd_brlf$bk z!fVVx0-X^#RP@X)B)faZ`pylH;6wI#;Sa(#X#D0_wYhWH-j`pz_XB29){(DAJy+R# zSyr)uPuO3knNLK{`IBLLJ8{fT@i1xf<+noy2aq8ufZDQ!xmY-bh_D}q`lI@Z zC{qD>g&9l5Nzg$vsjxQ6DB3x_RI9TlCP-nnv`pF{Wn5AyrHO8Y1rmH~BNy~mC-zZ8u8 z^}n-{ecw$Yh?MxgTWI|Cs`!Y17il#GvKp7G61Re^I=%<8nk#~=ejj7i&<|s^5!Lse zW4`TGBVF&i%y7ZDgn5X`UA(_nc6~S14z{C>Y?N_f>DeAvB91U|$bz52U*NW=+NFI% zvkKzh-;*y+8``<0dRx@Diz1&LKSO&#|lqj|~9K*(uwMP(Y1nsuTl< z&$D8m0Uu`5?iN1phFPB=utm+tH}}rwo+T1|9o)j+&8jh%c45i3{RN;E{q$-g?L`P% z_TmSYJh=X3fhv>9E*GCc*wCn78X`5=Y`>SVE$ zr3AG;@ywDE%L0BTn1-*3rNMywXv(sk%O81U`GL8&KegC|$z;u}KepaB zI5{dl6U}?~x%)R9`QY7WH?MyIRv){qxn=s{7v?oJ&&1UFTre`1c_Zcu*_c}V(@HJj zG$u3i95ev+b4ppdKugNXMg=Pq5h44Pp(GeB%;nO7&mP{}6ssuhhK*x+wAKFE)%Tt| zV%Tc^j0?djcyDiqtJx@+zyeaa(KwskhnTQ>R8XV2jhWs^osA*v!Ku4>kA_K$FX< zI!~YbMv>M*u@pidh`51Qq7VOBBvF%(_?DRv-268eN{NM8XgzGx-NKp z8)P4Wj`B;72-mj>e=Z}GCVpb}93Xa_>G7(W{BnLH&!ob*mvI}g&QHLtffCC>3IsWh z;qke3ksi!dWJ>Tq*2|n^kVY&LL2B}d#v47>wP<8E={T0Y%fuwhOsoo;WC(9XHhO(J z^H^^&dW}3^fTw4`(|d)d@$Y)PL2vEb)Oh7Av;y6On3-a1#Y)(P^)g<@Dy4|$6}XqU z`Aa;!$iq0FQWba}{b<*sH@hYhHHDuDN!Or>a0&G5-Vy?O%{&Izz*gA0R~R%y7<7U5 zi^Q5GxzqUMk%8K{2SJ&PBT+0oP)JGa93#iPgpo=iUI#J=!nEWyK>(-0=GOE~l24*y zX%`xKE@RlFP(Dnkgf9()D&Y;`O<0I7_j)h~_+zgd0Ri+1n70%HQpeas@uK};L_F8! zttU|$jMbB2MD>h>!IR_|`MepL%?cJa`y@tYEF09a@fGK226>~u~@X_mO3L}+U>ILQG+_zPj9=u$*4Ztj{pBhLOJ^E z#(I1jI^rs+6t7~*LmK1}2Y&M=efRjN(tNn1W~$J7-xEgj>m$e=*!R(AyidFXgEs)Z zL;LsdK#C<5;oG3ks*Jyw&@hGPcRXy;of`)bEJJ0?R_+y=>F1B@m6r;z93|CWV$`2- zAId)g7paK{_DulMBS~JpRxIVJ)1qk)?1s6I>=fSGwd+w-_UDW6<99j}%sWDXgU$&lnj zbdkn35jf&#w7*j+w~a7t3TJ1+T)7zH4UdN!<1ugO9JN{Kf-CPI^%0+ywTo$e?zt&Q zA+U!=jBgnDKBip~ZDGVJ(G%lkYK=yrjBBk4xl*nK+$D|CV{A6I8#|4gjgK28M&p|R zF2svRE|W<<*69??AED)<`j3j=r|>;VQm>xkrS+A0p)yuF-ijuZ5Nv-*pS%E*GiL8Q zP}ETAf%glSbb&$3wr<<<6Le}_?be5MA-HD#DgMrRoe%WQ(Yq9{ur%&w%$Km_qPtW; zDlTXk!yhT%1-4I=7a{ntFF=MG;%H|?9%Er8(Z0sW&?Ok{;K?Ua%Q$1&UU`wJm-Ah$vUafXZ=|7q4#4>T-16?3LQ~IFBVO5)J#=Y zrWFe=!8EmsVtp1kNr`BHv(O4m#YG`>{J{2~+_QDl;s+Nlxc~Z`xwlPRwtnMAwtDoc znQNBKy0fu)@r3zv+io`$j_T-Wd7^6k(xu}D_RZ?Kl+Nej?3bXTfK<9ST~ctCKN2`L zsT!{{!$sF8>JR(Y8J$qJ;=QkMB0w@nRhAN>}Ev>&})xCSyKk!pw zYNhIthRNfG*N#SsH5OPt<&it?e)|0J-oK%#`^S_fS5E>!4`RYPb{qF4o`X#4>l+GM zz!=a5CWGlBv=ybHx@g;CKHLdK*YONhCt@hoaH+ z=R{#7--z`o#9xB>mr94j(hLDM$VbIRl_(lHcB_+*K zn=RU0Qqojp>*^XiHZ!32Skz;NK6Mew6Jv*Xa+S)E)fJi~%q=d(T(zvUSa=tPPcB$+ z5&>8+@AT<;*R=~4z%r=mJ+=VmHiDfVC2Zgp(95QT@MQuocjA|7=CFU zFDwv#bL#JC-b=z;OdiytQwtVcJqXnZ;kIW%ZSQRH_0{ru^O!BG{2rS(>99GhSTbXU zQ|xQ_1ZF@sUZ+j*Ae)_?vnT?Sk&Xz8L~<;a&K#JNgWMVoisfZz=jAaDy`BMBskDmv zC7y8D_pXh+4U6ys#0E!;Cz^Vmu8n|`iMmk~#^I-|KWXf-R&K~A-ff6)>ws=fhS5spL<@LiwaB*#m zrseq-6s>#E4(*lA%}t=m-;@oqwb`gCyD7VrYf8Y0J&*!GQQH&>vQbQCG6Y?2) zxVRBV0D2HHd5U{OT^j`Bo&*Q?E=a$6U*9^&O8#mON=hMhLb#`Z@HY?EDHaRb+vBU!-u)tDj zL_=5XY^hl|B7fAbi<`QL%;=&1gwwza?tcMzZ+u6fRlLOBRj1M>g5DA@vUs8QdCv_G z8s~u?FiHipRZ!&^{~I^l=Z0I|ka@rj*{N>GY28VzHtXc_atADT!w@)%XNKHLsnR8Y z+rhXzjEnemG2fwyd^EW&T~wQ7ww0YHP&#cSSs7L`czF`6P*af7Rn19A&}$S;vkh%( zu$uEr;@SROozkatRtA*efz?%|h8G3fuh9oX5AN+6kTob|lu5TRT)4tCa{jt|HdOR} zgu={5vRd>6T?I?gUJwWE@d~%AwRA=)sxO754Y3&KYtWj!CS)>I4`@gy^qk~=!|`D( z%g17cAuWM(u5cG7?F1PWGOr&V*$Wc1j@7d5E`H z$cOhET_<=26-Q0t#)GSy=MVA7%>mo~4XpDqYrrD+44L0NX@Ol~UjVe2@7Th!}5%fpAoQSVpLL)4b zVuWa?7$F+c1>qgO44tQc1?Ap%`_=N}(FByr7;qay41zXIs&;K(1wUVklh zeW3+k?;PMyRiI5>FT8r=b56;f2O$svTPRA@#NNj+Psk$?7P$hhb(I`ThsoYu7QcY`f_P)y`u+Cz@dt!K8o2sm-!SBMv5=hL!_!Ikjxr?l68$RY; z_lc!S7vlB7aTWrOZn+PuW~m~Z;dG5nXuS0Vl@tYU3aE)d<*35Qh;pyDd_<&RRAt7} zsz_l~Su9c|JQr;#b-7BLqtRyk9BVErt{??BD@bqi*jdabtlj8v{|e%E;@XHSm3m?Y z)UUN#+!l8;t&57g^LiU$X)tU*pBupsBytO@OeUUkG4bH$@NSEm)C^X|@>Z;>DDz}^ zBKhUDuvlTUnx${*3rZ_JBiK)ymUxDl^Q{KG*6z#<)n&SeHn(ILy~C3&nIMJWn2j~^ z5GVpu<1ur#(-{h(Y(B^^JTJdUqE||?BoY;n<1HlLD?daEpGcSyS*oBW>}@jGNIrBb z$D6|Uh;9H;ED2NDrVk2-sO&zfvg`U3cS2pWc#>fSo*rx_lg}3=GOqZJ&EEgoljrwO zo0c_vVWM!1KRBbRXhLSTYe;4=mZ5_SdVS}u#ykr-;+WU27mI&`D@V+^e^kJ%aycyO z^$MN2XiR+8j3rIHl)U=hxF^R;1{kyLc2_nVgjjBqUL?h8O0qak0i-0dZm;wZseaAD z5m}0$M#4Bvc<4F{Et(P$)7$^yu=QnqhKe7K*+K-T^r)l#N6jQ2_}-uk^4ITIyVPXR z4+!X=k6H2e&$;^<<_DuDXkXuA3B`*?9gRCJ6KuH?+Xt(G!Y_Of9 z!4%Oq()j3+$mQRXlTn$oCoz*COg|+!PIoJ1OG_Rf5wzeq{XzIkz$qaPir^27l&YgP}TAqFyn$Fxd zzSU4v)sST_nmVS@IpMRet`By!wCwnx>)!u~`` zH#9Ze^}>S5&r}C>xj)yB;6P@Ux%53JCt zf-uP27;h@95fa@2Ty>lxK-zvIdz=U7$`ujCDj}6&)5dJ+y zIEWI{hM2=GE+>g35F&CqmBb~*bfYjnM_z?rzDS)}o?|g)L|o1ytu~T<_ubsvp@G?U z>4HPN*6Ooby#@)x%w@OBFwBxp7p?!%)&ZjJ@3&CG3wcE21|pNuxL7>yL=n z>*)2}-Nt_Cjp^J%DpiQNg*ETc3Tzfyf$g1cyG7Ce?jmxBFOA#*YJNepJd`xc;}^Iu z6tW|o7 zEgXWO^77IgWq!WApk158f`J2FsI=YcrwE={lh$E|{nyA#Vd9gZ$vylBgi)b!pWhL>4Szf~4eznHrvvxb=1UI z6h1gRU1iO*06Rd$zv6$Y>1Sc)NjL+})LXW@gwKU9?*DlIxLo*qlG{SEbGoo(oC8+H z^Cei$52}5pUO#-%5B+|JrlFl6GC@a!(g~dda)^2C0O$ee;S_S3MWMlShZrfc@1nXXMc^R_eWYHQ*%HO4fq{t{+zft+^uV!^)PO|R@JUEi@Qy%&p@kb5=$Wgc28Nb zqUQ*ii6H}1*3A$IPE%@Mg;JT@qB4oaLS{?t;?Xe~d|Sw7@sc;To=DjM?UaH06BLksrZdG6jsz_L$cQA?&BgUsV1?A+$R{Kv!rIlH|1 z>AEPZ*-3bGqvK(Zzd@8wFzKCek70*&0T4H;^JeshIenW91i-ejY`i+?9naT2`-9!hOO-HY46PD6ymV z(T_#gM{e69J+PE%*KFj@;2#|%pXj1(I{K;jAt^u-U;;2o9(4i67ZRBU(k}e+Fp|EA z#^KGgCW%_R~X$9-Tq4d!aTItF9!ZK16y$`#8d2H&wS;vmT zBbNgKmsBZr`~9lx1XPD46Q^(uCXR1wb-Tv2P4H9nNKC2gc$FA{6SDDp&#K^26+EDV z%kd#%yT=5_nP!`i)nYbjH8zdeVr6WaR^trg1|ws4IPp5MA*aL6px-IsIVD`7Jg7XT zWRy0Wnjy95t{LF#26)5(4;bKh!yLoC28J_0gF&L98R3{{5e8;6&`KTV{56SA3pXfD8d4Pq4C#d!O)tdv!Uqo?x&aOxfT4ZQ!8He;&D$^S(VMfB${;O7 zkb<^+7|l(s%EnQXcMKi6V*;V|Y5+Kb9YHJ=uf|vDR1NAG1gr~k4J>cuNu^@;8y>#K z!(a07DIU(@;W!=+;bD}A4hq310!Ql=a)aC;wYp`D&5gh`H*~v^?4%rO zk8ZLctv0Jwp-k#^I%v>nWJsM}iqUYmDw?9980}BQpi|+tMT<`9NGa0j#*-)UKNzK@ zf=C_gKBD5EMVD!%iCfm9A&?@Q88h@~J`)Nsd*IxIj}3fc;GU>!`bF?0%di&7X&26E)dGpkcyHzxkMthIY)?NO-eO*tfpJWD*B81oJ*gHOKPlv6z|DZIxV5&kPVt$KiY`H^MDjBs_7-Oom=3o?w$;lXbO z8yq!g`tU*-oHl#5uuEDvY(}NtP-lHL*T^hG#MhYw1hk z@ocTz#K~6%Wu{2Q1Bsxf> zTUJ933)$xhedK%t0cSuG%;mWxrHx9eA;d9>#1VPqUr&Zpl>$lBDUF&4r*TG8%VH6! zvG8LwV*UY*mNY2rx_9x0UiS&3_;OHF)T?gT-=H)&vwgBBWWH>NQ8^4|pAy!*KXk>RVcdj~h3)Y{JZ$ z112oi>ld$R0>k0(;Wf3j{z!xy?;qb5Z*6T_TT?lC%G}80Xtbrib_yHn0D6tQ-D+^T zFsH4Gh>0JhmPwR|&m{K1{yH(Jie77Ck4Od9g|&n%5hAtdh#JrN)4m|lDr6#pTYp1Q zO1vf|9&Vbvh@u$7%&$0VCWfRwR|x(_^dg83ST#bf`Uyowb;h9Z;K`#}BCV5bQg3ln zabbPq#JX7%noqIyCWt$&p}fds%F9Yjbd7`G3r?#!4c_mC-3B z_JK7+b39?S!lyGA7UUa8t{I&hov>!;*sk`%>bp)G_11^-mFv+^V)~$xkpta&Po85qIu3K@w6)f0SXQGcEVM6-&zv!1Vq4qb=H`rs!IBXG%v?KhTvLas zIhjn(X_I$o>zX`;`Ps=>q@u!Orl7e$oYV7>@a29p8nu%d#j}rRH6;OvwE(n4EQdE8 zRJTq_;9r^ZVBeIdU5EW9oLOV`=+tI){=}T}DMNzJNPTX2b` zycy#&5>0A(MsB{zKXLBziuP4Q?19l+=C`aFowxJxhgX&_Xf0m1vU%&ss>)?`rf@-? zab?N$QsEEM2bvE~OT+ zRJA_*{t=3Sn5q1X2SP3#v1u&nv)mXgomG$x7FUG8H4zay6*{tO1v7=YDXgb2yc~?Vz#c*sieSGU`yIMY^+TtwS&nvGb?3O z5U;L4|*E&(I(b$j)YSxH6)6ZnK&6@hCV*Tb_a@cGW5cGZwZ55hH`tJPMu?a zz*{kF=FmW`-BQBkWhQ1;U&9CW^?7YCG&lWnG6IWsO~EJ2qcT$0bOfo@!j8bQOEMny zS^YEo%lydVkNNBUWBjb&8psNiVo^}0m4UDoT45X{@yX|x1x(InlSV9oEg}JbuiFKM zhN!{KiRPnQ*(MB(_~j+3$!axf8D3&@dz3TW#e+vy*axT;UcEib>(U6{e#$oX?lV`_ zHP)2r-EA|cXTo^f(i*FT*@$(Htik!$FXQ!0DNbygXf3gAGRtmUf+Hx7jfJl^B&zLA&>wI;LyDdA6tzvsI7sP}P8>7XjNtukI=Mw73pn^ug> zRq$Il$(X745IPd>bDr*77pMe}#;1*~oK=a+DjO zjCt(gDym07?hI0S$R~8{rJ&G9xlJ$TKV51Cvq50Jp}8 zxqv0j1*&K|QyIyQZ4+yHh{_KoG*K0`G+$O!7{A9OI9g$ooDBbr%1eUvGvb4$B|=#Z z(<{oRHRKAb%gdHll-&*=yGdJK+K;woV}VH9(7_9L78Tuj;o!j!)MVJbpiHUwfH$xVpCG9jMt1%>A zrpC;_VDi?f>c*0R_3D`qO&Ty@(nB-V^#e;9)l;`lF1WtO93EPttBDp2(Zz-rn9T*l zW7@icqFP;XW7v!?JoL9;-C?gRF0QoS@vHB)KJ@K>uCY}XM#}AX{O8}c&h2?%x-%~` zlxLr|`PlsVM>kKk7i0zV9ndBTZMkP^Y4PNHN6814Ida@awq?__vg_}iP?Sas%9N+4b|}jVqA}$O6k7Vr`zIPo z1`H@MPQ3q@w=a3|{t1SXESV|8X_#>Ti%W!K^+A^>SPvVYdO48e@?_PgaRydP2Vs>V z1ZIHl_-)0SlB$yClJ=6$lFcQ2NlC%AimW=9*>6)Q>-^BKRQe&4te7U@S<>1%(v@kqH{0563-C@HnVE?sTCD;!lR$#9k?f2axs%)L z1`jo)uwlYgQ~(#%^RV`8TO=$7KoX+_^*cnUd@dS|$yX8Wh4b`lG1A&ZwjYiA573BH z%T@G2ObkM0%>Rxn2hS68L7m*Vcv3JocK5QGC36<8Y5ddjRTZVFNQ*TYsK zM~@>fJIf?_ZCyrAMqaTtaNBhJ;t#_~fJUB84A2PH{ryj6)j#SBk{NwgtIsI=QD2bG zoA1OkIu_695{VR)gBCCa?22b=!Y9Hv!b~`>&?Um*>;@mBh)t_&7(1e^ZS?3tgAxj0 zIApkDU<}0MmWMAg7;FuSu^p|WJ310I!zu<1(j;IaF*<+10He7j5;kbHL7%gQ0lYai zgH+V<@OsBq4C|Z_$r?7VHorX(Ev#&)ozZU3&+==ufvm7|()8NK zfstrnQeNG>p`qybJ7!Ch>*jal=f*ZHn^ie??()Vztyp<`YMzY&uQyO}_j`}+{-CSU zXxrjG_s-j=)mFDw>$a*-zx~cR_ZFM6vg?E0+urS};-9`VBR3+4mN<}L5{Y8dH5M@(&r2mT zxm=-;FpN?IJrF_PFrd^bk#g|0;)aIOI(tQhwX(g`QC?oE;$#v=;Vxy>iG;SUJvUg8 z-fYC3_hBS*A#(oa4ijCVm(R3mKRnZhcbP8Dw+PG$h1Ok^LQE%{O%ezNQh&wp-}H|% z7e)jMHx~v9A1n+s!`J@}XQ_mBJUbKrJnQ&-&%f(8MWWx7+mGj=6ucg{nK2mx1+E6Z z)Le?prNPp=($>=7mU5*e|96JYm?$->r3G+%!Lfqh75u4ywH0I+G!%?0m|eg*iVB!) zwI<71>O^uUbUHQJ4L>q%5atX7$|NcK+n@;)n2H<@jarsEMk7ToUmbx^8=JbxrxQL(5!wS(&C6wfnE^9yaFbzweuSrn#x=VJ_6N z{lB~J|6p4aD^tmOr@-G~mD2pv1JHPOexHxj04D2D%MXq|cn^UV)K4XF;iMbqV zU5iStb=q2pL+~c3f4@$0w=lS1Dh`>*fw;%$_}YTU|MDeeBd!d0Vl`O@xk~|UM5$uYEI1n zgO*rTP!-KAeIBw9>UAb%fg-L*D)uT^ybxKAlS))trA}^8=oLzyA^G9}N~OxU$(~S> zQ$VIvYScQto}|#9?7^QR#IZDaA(tG}LO82lbpLubA4QTMuT;o~~!IV=3J9=duud!VOL_!u5KuzJ7nN+T@a zzj{9$zkkhsSk@q%!EXo!zGgQw?{mkn>|%+_Sh*G$H21R-5Wdj+I?;-$*u@8YyqJoD z>F*PxaNf@?6RP+D1*KUsOV9~Va`^?NIb5dZ9D@(Ls3{Xb?daPQ;$d*W)N z{4SCJV=@}m+*&yZ+h32QBAEzR6s<+{M4~!tAW#fJ)7{G#4xIOsy9egyOkcTWw3eHJ zkA>-T1G=Jo{9+w|@G|=zdYdmMInHsthC0?2JWw#|`!t5KQl zCnV91;pN)$aKw}8DXUnug6k=(3kDr_t=?eEHx2VFx#j-B!%7JSR9E9h7$9LfHBiIe zhnu)e^l;on?)meSV7JOm=ofpDo5b)PY~ezz{GJOeK-Y z#Ksm7ZES&(62mR;GH-e3yX77H|9vO=&wub8>KI(j58*QHPA`){HPyGggAZ2LF%7KG z=5#ZSOik~93?9NK@V5>RQ^!`K5B}M=OroluX@p9hS>bXr4b0%{?+hM-FAv!4^m4X% zc%@gT@mCGIzJ93qs&QX)rC+BFR5hiaQCYM2Ra5#|_*2thol(JP1J%Qu29v9*hZB0< z_!QG~3Vvmv5sf8SUuy)TL1o;Xo1p?Sw#4pftSt^3ly;vnb9ALd)9h(R%>(iNJbR|? zw`b436FDCVpFeZv>=_tNzbh!rTzFL0+_K zTFBXe|O@pO23$(Y3f z)LpQ⒦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 WriDNHYc}_WX~<(tsWuMt?mqzj7lX9` literal 0 HcmV?d00001 diff --git a/js/asciidoc-xhtml11.js b/js/asciidoc-xhtml11.js new file mode 100644 index 0000000..30d738a --- /dev/null +++ b/js/asciidoc-xhtml11.js @@ -0,0 +1,128 @@ +var asciidoc = { // Namespace. + +///////////////////////////////////////////////////////////////////// +// Table Of Contents generator +///////////////////////////////////////////////////////////////////// + +/* Author: Mihai Bazon, September 2002 + * http://students.infoiasi.ro/~mishoo + * + * Table Of Content generator + * Version: 0.4 + * + * Feel free to use this script under the terms of the GNU General Public + * License, as long as you do not remove or alter this notice. + */ + + /* modified by Troy D. Hanson, September 2006. License: GPL */ + /* modified by Stuart Rackham, 2006, 2009. License: GPL */ + +// toclevels = 1..4. +toc: function (toclevels) { + + function getText(el) { + var text = ""; + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants. + text += i.data; + else if (i.firstChild != null) + text += getText(i); + } + return text; + } + + function TocEntry(el, text, toclevel) { + this.element = el; + this.text = text; + this.toclevel = toclevel; + } + + function tocEntries(el, toclevels) { + var result = new Array; + var re = new RegExp('[hH]([2-'+(toclevels+1)+'])'); + // Function that scans the DOM tree for header elements (the DOM2 + // nodeIterator API would be a better technique but not supported by all + // browsers). + var iterate = function (el) { + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { + var mo = re.exec(i.tagName); + if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") { + result[result.length] = new TocEntry(i, getText(i), mo[1]-1); + } + iterate(i); + } + } + } + iterate(el); + return result; + } + + var toc = document.getElementById("toc"); + var entries = tocEntries(document.getElementById("content"), toclevels); + for (var i = 0; i < entries.length; ++i) { + var entry = entries[i]; + if (entry.element.id == "") + entry.element.id = "_toc_" + i; + var a = document.createElement("a"); + a.href = "#" + entry.element.id; + a.appendChild(document.createTextNode(entry.text)); + var div = document.createElement("div"); + div.appendChild(a); + div.className = "toclevel" + entry.toclevel; + toc.appendChild(div); + } + if (entries.length == 0) + toc.parentNode.removeChild(toc); +}, + + +///////////////////////////////////////////////////////////////////// +// Footnotes generator +///////////////////////////////////////////////////////////////////// + +/* Based on footnote generation code from: + * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html + */ + +footnotes: function () { + var cont = document.getElementById("content"); + var noteholder = document.getElementById("footnotes"); + var spans = cont.getElementsByTagName("span"); + var refs = {}; + var n = 0; + for (i=0; i" + + "" + + n + ". " + note + "
    "; + spans[i].innerHTML = + "[" + n + "]"; + var id =spans[i].getAttribute("id"); + if (id != null) refs["#"+id] = n; + } + } + if (n == 0) + noteholder.parentNode.removeChild(noteholder); + else { + // Process footnoterefs. + for (i=0; i" + n + "]"; + } + } + } +} + +} -- 2.39.5