From 2432814759f5b1409999c7ff458d0c876e633044 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 1 Aug 2011 01:25:23 +0200 Subject: [PATCH] add (versioned) docs for 4.0 --- _docs/Makefile | 7 +- _docs/debugging | 29 +- _docs/hacking-howto | 340 ++++++- _docs/i3-config-wizard.man | 41 + _docs/i3-input.man | 40 + _docs/i3-migrate-config-to-v4.man | 34 + _docs/i3-msg.man | 41 + _docs/i3-nagbar.man | 34 + _docs/i3.man | 192 ++-- _docs/ipc | 201 ++++- _docs/tree-migrating | 192 ---- _docs/userguide | 684 ++++++++------ css/style.css | 21 + docs/3.e/bigpicture.png | Bin 0 -> 9179 bytes docs/3.e/debugging.html | 147 +++ docs/3.e/hacking-howto.html | 890 ++++++++++++++++++ docs/3.e/i3.html | 529 +++++++++++ docs/3.e/i3status.html | 372 ++++++++ docs/3.e/ipc.html | 529 +++++++++++ docs/3.e/keyboard-layer1.png | Bin 0 -> 43543 bytes docs/3.e/keyboard-layer2.png | Bin 0 -> 42056 bytes docs/3.e/manpage.html | 528 +++++++++++ docs/3.e/modes.png | Bin 0 -> 5826 bytes docs/3.e/multi-monitor.html | 108 +++ docs/3.e/refcard.pdf | Bin 0 -> 61582 bytes docs/3.e/repositories.html | 120 +++ docs/3.e/single_terminal.png | Bin 0 -> 3382 bytes docs/3.e/snapping.png | Bin 0 -> 4880 bytes docs/3.e/stacklimit.png | Bin 0 -> 4988 bytes docs/3.e/tree-layout1.png | Bin 0 -> 27856 bytes docs/3.e/tree-layout2.png | Bin 0 -> 20101 bytes docs/3.e/tree-migrating.html | 269 ++++++ docs/3.e/tree-shot1.png | Bin 0 -> 3665 bytes docs/3.e/tree-shot2.png | Bin 0 -> 3383 bytes docs/3.e/tree-shot3.png | Bin 0 -> 4001 bytes docs/3.e/tree-shot4.png | Bin 0 -> 3050 bytes docs/3.e/two_columns.png | Bin 0 -> 4624 bytes docs/3.e/two_terminals.png | Bin 0 -> 4901 bytes docs/3.e/userguide.html | 1128 +++++++++++++++++++++++ docs/3.e/wsbar.html | 147 +++ docs/3.e/wsbar.png | Bin 0 -> 14339 bytes docs/4.0/bigpicture.png | Bin 0 -> 9179 bytes docs/4.0/debugging.html | 153 ++++ docs/4.0/hacking-howto.html | 1046 +++++++++++++++++++++ docs/4.0/i3-config-wizard.html | 96 ++ docs/4.0/i3-migrate-config-to-v4.html | 87 ++ docs/4.0/i3-msg.html | 100 ++ docs/4.0/i3-nagbar.html | 90 ++ docs/4.0/i3.html | 527 +++++++++++ docs/4.0/i3status.html | 372 ++++++++ docs/4.0/ipc.html | 844 +++++++++++++++++ docs/4.0/keyboard-layer1.png | Bin 0 -> 55821 bytes docs/4.0/keyboard-layer1.svg | 969 ++++++++++++++++++++ docs/4.0/keyboard-layer2.png | Bin 0 -> 49858 bytes docs/4.0/keyboard-layer2.svg | 896 ++++++++++++++++++ docs/4.0/modes.png | Bin 0 -> 5826 bytes docs/4.0/multi-monitor.html | 108 +++ docs/4.0/refcard.pdf | Bin 0 -> 61582 bytes docs/4.0/repositories.html | 120 +++ docs/4.0/single_terminal.png | Bin 0 -> 3382 bytes docs/4.0/snapping.png | Bin 0 -> 4880 bytes docs/4.0/stacklimit.png | Bin 0 -> 4988 bytes docs/4.0/tree-layout1.png | Bin 0 -> 27856 bytes docs/4.0/tree-layout2.png | Bin 0 -> 20101 bytes docs/4.0/tree-shot1.png | Bin 0 -> 3665 bytes docs/4.0/tree-shot2.png | Bin 0 -> 3383 bytes docs/4.0/tree-shot3.png | Bin 0 -> 4001 bytes docs/4.0/tree-shot4.png | Bin 0 -> 3050 bytes docs/4.0/two_columns.png | Bin 0 -> 4624 bytes docs/4.0/two_terminals.png | Bin 0 -> 4901 bytes docs/4.0/userguide.html | 1206 +++++++++++++++++++++++++ docs/4.0/wsbar.html | 147 +++ docs/4.0/wsbar.png | Bin 0 -> 14339 bytes docs/4.0/wsbar.svg | 274 ++++++ docs/index.html.mako | 40 +- 75 files changed, 13051 insertions(+), 647 deletions(-) create mode 100644 _docs/i3-config-wizard.man create mode 100644 _docs/i3-input.man create mode 100644 _docs/i3-migrate-config-to-v4.man create mode 100644 _docs/i3-msg.man create mode 100644 _docs/i3-nagbar.man delete mode 100644 _docs/tree-migrating create mode 100644 docs/3.e/bigpicture.png create mode 100644 docs/3.e/debugging.html create mode 100644 docs/3.e/hacking-howto.html create mode 100644 docs/3.e/i3.html create mode 100644 docs/3.e/i3status.html create mode 100644 docs/3.e/ipc.html create mode 100644 docs/3.e/keyboard-layer1.png create mode 100644 docs/3.e/keyboard-layer2.png create mode 100644 docs/3.e/manpage.html create mode 100644 docs/3.e/modes.png create mode 100644 docs/3.e/multi-monitor.html create mode 100644 docs/3.e/refcard.pdf create mode 100644 docs/3.e/repositories.html create mode 100644 docs/3.e/single_terminal.png create mode 100644 docs/3.e/snapping.png create mode 100644 docs/3.e/stacklimit.png create mode 100644 docs/3.e/tree-layout1.png create mode 100644 docs/3.e/tree-layout2.png create mode 100644 docs/3.e/tree-migrating.html create mode 100644 docs/3.e/tree-shot1.png create mode 100644 docs/3.e/tree-shot2.png create mode 100644 docs/3.e/tree-shot3.png create mode 100644 docs/3.e/tree-shot4.png create mode 100644 docs/3.e/two_columns.png create mode 100644 docs/3.e/two_terminals.png create mode 100644 docs/3.e/userguide.html create mode 100644 docs/3.e/wsbar.html create mode 100644 docs/3.e/wsbar.png create mode 100644 docs/4.0/bigpicture.png create mode 100644 docs/4.0/debugging.html create mode 100644 docs/4.0/hacking-howto.html create mode 100644 docs/4.0/i3-config-wizard.html create mode 100644 docs/4.0/i3-migrate-config-to-v4.html create mode 100644 docs/4.0/i3-msg.html create mode 100644 docs/4.0/i3-nagbar.html create mode 100644 docs/4.0/i3.html create mode 100644 docs/4.0/i3status.html create mode 100644 docs/4.0/ipc.html create mode 100644 docs/4.0/keyboard-layer1.png create mode 100644 docs/4.0/keyboard-layer1.svg create mode 100644 docs/4.0/keyboard-layer2.png create mode 100644 docs/4.0/keyboard-layer2.svg create mode 100644 docs/4.0/modes.png create mode 100644 docs/4.0/multi-monitor.html create mode 100644 docs/4.0/refcard.pdf create mode 100644 docs/4.0/repositories.html create mode 100644 docs/4.0/single_terminal.png create mode 100644 docs/4.0/snapping.png create mode 100644 docs/4.0/stacklimit.png create mode 100644 docs/4.0/tree-layout1.png create mode 100644 docs/4.0/tree-layout2.png create mode 100644 docs/4.0/tree-shot1.png create mode 100644 docs/4.0/tree-shot2.png create mode 100644 docs/4.0/tree-shot3.png create mode 100644 docs/4.0/tree-shot4.png create mode 100644 docs/4.0/two_columns.png create mode 100644 docs/4.0/two_terminals.png create mode 100644 docs/4.0/userguide.html create mode 100644 docs/4.0/wsbar.html create mode 100644 docs/4.0/wsbar.png create mode 100644 docs/4.0/wsbar.svg diff --git a/_docs/Makefile b/_docs/Makefile index b94e0eb..7def7e4 100644 --- a/_docs/Makefile +++ b/_docs/Makefile @@ -1,5 +1,5 @@ -all: hacking-howto.html debugging.html repositories.html userguide.html ipc.html multi-monitor.html wsbar.html tree-migrating.html i3status.html i3.html +all: hacking-howto.html debugging.html repositories.html userguide.html ipc.html multi-monitor.html wsbar.html i3status.html i3.html i3-config-wizard.html i3-nagbar.html i3-migrate-config-to-v4.html i3-msg.html hacking-howto.html: hacking-howto asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< @@ -13,9 +13,6 @@ repositories.html: repositories 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 $< @@ -28,7 +25,7 @@ wsbar.html: wsbar i3status.html: i3status.man asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< -i3.html: i3.man +%.html: %.man asciidoc -a linkcss -a stylesdir=/css -a scriptsdir=/js --backend=xhtml11 -f conf/i3html.conf -a toc -n $< clean: diff --git a/_docs/debugging b/_docs/debugging index d52edea..5e71ecf 100644 --- a/_docs/debugging +++ b/_docs/debugging @@ -1,7 +1,7 @@ Debugging i3: How To ==================== Michael Stapelberg -March 2010 +July 2011 This document describes how to debug i3 suitably for sending us useful bug reports, even if you have no clue of C programming. @@ -12,14 +12,21 @@ 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. +i3 logs useful information to stdout. To have a clearly defined place where log +files will be saved, you should redirect stdout and stderr in your ++~/.xsession+. While you’re at it, putting each run of i3 in a separate log +file with date/time in its filename 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 +exec /usr/bin/i3 >~/i3log-$(date +'%F-%k-%M-%S') 2>&1 +-------------------------------------------------------------------- + +To enable verbose output and all levels of debug output (required when +attaching logfiles to bugreports), add the parameters +-V -d all+, like this: + +-------------------------------------------------------------------- +exec /usr/bin/i3 -V -d all >~/i3log-$(date +'%F-%k-%M-%S') 2>&1 -------------------------------------------------------------------- == Enabling core dumps @@ -29,7 +36,7 @@ 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): +use the following command (in your +~/.xsession+, before starting i3): ------------------- ulimit -c unlimited @@ -50,9 +57,9 @@ process id (%p) in it. You can save this setting across reboots using == 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: +is compiled with debug symbols, that is, that the symbols are not stripped +during the build process. You can check whether your executable contains +symbols by issuing the following command: ---------------- file $(which i3) diff --git a/_docs/hacking-howto b/_docs/hacking-howto index dff074c..9a7ec9d 100644 --- a/_docs/hacking-howto +++ b/_docs/hacking-howto @@ -1,7 +1,7 @@ Hacking i3: How To ================== Michael Stapelberg -December 2009 +July 2011 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 @@ -65,6 +65,13 @@ the layout you need at the moment. === The layout table +********************************************************************************* +This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff *NOW* :). +********************************************************************************* + +///////////////////////////////////////////////////////////////////////////////// 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 @@ -106,9 +113,15 @@ window). |======== Furthermore, you can freely resize table cells. +///////////////////////////////////////////////////////////////////////////////// == Files +include/atoms.xmacro:: +A file containing all X11 atoms which i3 uses. This file will be included +various times (for defining, requesting and receiving the atoms), each time +with a different definition of xmacro(). + include/data.h:: Contains data definitions used by nearly all files. You really need to read this first. @@ -128,19 +141,27 @@ 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/cmdparse.l:: +Contains the lexer for i3 commands, written for +flex(1)+. + +src/cmdparse.y:: +Contains the parser for i3 commands, written for +bison(1)+. -src/commands.c:: -Parsing commands and actually executing them (focusing, moving, …). +src/con.c:: +Contains all functions which deal with containers directly (creating +containers, searching containers, getting specific properties from containers, +…). src/config.c:: -Parses the configuration file. +Contains all functions handling the configuration file (calling the parser +(src/cfgparse.y) with the correct path, switching key bindings mode). src/debug.c:: Contains debugging functions to print unhandled X events. +src/ewmh.c:: +iFunctions to get/set certain EWMH properties easily. + src/floating.c:: Contains functions for floating mode (mostly resizing/dragging). @@ -151,69 +172,123 @@ unmapping, key presses, button presses, …). src/ipc.c:: Contains code for the IPC interface. -src/layout.c:: -Renders your layout (screens, workspaces, containers). +src/load_layout.c:: +Contains code for loading layouts from JSON files. + +src/log.c:: +Handles the setting of loglevels, contains the logging functions. -src/mainx.c:: +src/main.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/match.c:: +A "match" is a data structure which acts like a mask or expression to match +certain windows or not. For example, when using commands, you can specify a +command like this: [title="*Firefox*"] kill. The title member of the match +data structure will then be filled and i3 will check each window using +match_matches_window() to find the windows affected by this command. + +src/move.c:: +Contains code to move a container in a specific direction. + +src/output.c:: +Functions to handle CT_OUTPUT cons. + +src/randr.c:: +The RandR API is used to get (and re-query) the configured outputs (monitors, +…). + +src/render.c:: +Renders the tree data structure by assigning coordinates to every node. These +values will later be pushed to X11 in +src/x.c+. + src/resize.c:: -Contains the functions to resize columns/rows in the table. +Contains the functions to resize containers. + +src/sighandler.c:: +Handles +SIGSEGV+, +SIGABRT+ and +SIGFPE+ by showing a dialog that i3 crashed. +You can chose to let it dump core, to restart it in-place or to restart it +in-place but forget about the layout. -src/table.c:: -Manages the most important internal data structure, the design table. +src/tree.c:: +Contains functions which open or close containers in the tree, change focus or +cleanup ("flatten") the tree. See also +src/move.c+ for another similar +function, which was moved into its own file because it is so long. src/util.c:: Contains useful functions which are not really dependant on anything. +src/window.c:: +Handlers to update X11 window properties like +WM_CLASS+, +_NET_WM_NAME+, ++CLIENT_LEADER+, etc. + src/workspace.c:: Contains all functions related to workspaces (displaying, hiding, renaming…) +src/x.c:: +Transfers our in-memory tree (see +src/render.c+) to X11. + src/xcb.c:: Contains wrappers to use xcb more easily. +src/xcursor.c:: +XCursor functions (for cursor themes). + src/xinerama.c:: -(Re-)initializes the available screens and converts them to virtual screens -(see below). +Legacy support for Xinerama. See +src/randr.c+ for the preferred API. == Data structures +********************************************************************************* +This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff *NOW* :). +********************************************************************************* + +///////////////////////////////////////////////////////////////////////////////// + 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: +. *X11 root window*, the root container . *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) +. *Content container* (there are also containers for dock windows) +. *Workspaces* (Workspace 1 in this example, with horizontal orientation) +. *Split container* (vertically split) +. *X11 window containers* + +The data type is +Con+, in all cases. === 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 +A virtual screen (type `i3Screen`) is generated from the connected outputs +obtained through RandR. The difference to the raw RandR outputs as seen when using +xrandr(1)+ is that it falls back to the lowest common resolution of -the logical screens. +the actual enabled outputs. -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. +For example, if your notebook has a screen resolution of 1280x800 px and you +connect a video projector with a resolution of 1024x768 px, set it up in clone +mode (+xrandr \--output VGA1 \--mode 1024x768 \--same-as LVDS1+), 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 +However, if you configure it using +xrandr \--output VGA1 \--mode 1024x768 +\--right-of LVDS1+, 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 +A workspace is identified by its name. 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 @@ -221,18 +296,38 @@ desktops''. === The layout table +********************************************************************************* +This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff *NOW* :). +********************************************************************************* + +///////////////////////////////////////////////////////////////////////////////// + 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 +********************************************************************************* +This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff *NOW* :). +********************************************************************************* + +///////////////////////////////////////////////////////////////////////////////// + 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. @@ -244,11 +339,11 @@ 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, +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 +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 @@ -258,14 +353,14 @@ 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+ + * ``con'' names a container + * ``current'' is a loop variable when using +TAILQ_FOREACH+ etc. == Startup (src/mainx.c, main()) * Establish the xcb connection - * Check for XKB extension on the separate X connection - * Check for Xinerama screens + * Check for XKB extension on the separate X connection, load Xcursor + * Check for RandR screens (with a fall-back to Xinerama) * Grab the keycodes for which bindings exist * Manage all existing windows * Enter the event loop @@ -303,9 +398,10 @@ 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. +The bound command is parsed by the cmdparse lexer/parser, see +parse_cmd+ in ++src/cmdparse.y+. -== Manage windows (src/mainx.c, manage_window() and reparent_window()) +== Manage windows (src/main.c, manage_window() and reparent_window()) `manage_window()` does some checks to decide whether the window should be managed at all: @@ -325,7 +421,7 @@ 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, +of the screen. To get the height which needs 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 @@ -339,7 +435,7 @@ 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 +After reparenting the window, `render_tree()` 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) @@ -388,6 +484,15 @@ src/layout.c, function resize_client(). == Rendering (src/layout.c, render_layout() and render_container()) +********************************************************************************* +This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff *NOW* :). +********************************************************************************* + +///////////////////////////////////////////////////////////////////////////////// + + 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 @@ -460,7 +565,18 @@ floating windows: * The new width_factor for each involved column (respectively row) will be calculated. -== User commands / commandmode (src/commands.c) +///////////////////////////////////////////////////////////////////////////////// + +== User commands / commandmode (src/cmdparse.{l,y}) + +********************************************************************************* +This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff *NOW* :). +********************************************************************************* + +///////////////////////////////////////////////////////////////////////////////// + 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 @@ -485,6 +601,148 @@ 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. +///////////////////////////////////////////////////////////////////////////////// + +== Moving containers + +The movement code is pretty delicate. You need to consider all cases before +making any changes or before being able to fully understand how it works. + +=== Case 1: Moving inside the same container + +The reference layout for this case is a single workspace in horizontal +orientation with two containers on it. Focus is on the left container (1). + + +[width="15%",cols="^,^"] +|======== +| 1 | 2 +|======== + +When moving the left window to the right (command +move right+), tree_move will +look for a container with horizontal orientation and finds the parent of the +left container, that is, the workspace. Afterwards, it runs the code branch +commented with "the easy case": it calls TAILQ_NEXT to get the container right +of the current one and swaps both containers. + +=== Case 2: Move a container into a split container + +The reference layout for this case is a horizontal workspace with two +containers. The right container is a v-split with two containers. Focus is on +the left container (1). + +[width="15%",cols="^,^"] +|======== +1.2+^.^| 1 | 2 +| 3 +|======== + +When moving to the right (command +move right+), i3 will work like in case 1 +("the easy case"). However, as the right container is not a leaf container, but +a v-split, the left container (1) will be inserted at the right position (below +2, assuming that 2 is focused inside the v-split) by calling +insert_con_into+. + ++insert_con_into+ detaches the container from its parent and inserts it +before/after the given target container. Afterwards, the on_remove_child +callback is called on the old parent container which will then be closed, if +empty. + +Afterwards, +con_focus+ will be called to fix the focus stack and the tree will +be flattened. + +=== Case 3: Moving to non-existant top/bottom + +Like in case 1, the reference layout for this case is a single workspace in +horizontal orientation with two containers on it. Focus is on the left +container: + +[width="15%",cols="^,^"] +|======== +| 1 | 2 +|======== + +This time however, the command is +move up+ or +move down+. tree_move will look +for a container with vertical orientation. As it will not find any, ++same_orientation+ is NULL and therefore i3 will perform a forced orientation +change on the workspace by creating a new h-split container, moving the +workspace contents into it and then changing the workspace orientation to +vertical. Now it will again search for parent containers with vertical +orientation and it will find the workspace. + +This time, the easy case code path will not be run as we are not moving inside +the same container. Instead, +insert_con_into+ will be called with the focused +container and the container above/below the current one (on the level of ++same_orientation+). + +Now, +con_focus+ will be called to fix the focus stack and the tree will be +flattened. + +=== Case 4: Moving to existant top/bottom + +The reference layout for this case is a vertical workspace with two containers. +The bottom one is a h-split containing two containers (1 and 2). Focus is on +the bottom left container (1). + +[width="15%",cols="^,^"] +|======== +2+| 3 +| 1 | 2 +|======== + +This case is very much like case 3, only this time the forced workspace +orientation change does not need to be performed because the workspace already +is in vertical orientation. + +=== Case 5: Moving in one-child h-split + +The reference layout for this case is a horizontal workspace with two +containers having a v-split on the left side with a one-child h-split on the +bottom. Focus is on the bottom left container (2(h)): + +[width="15%",cols="^,^"] +|======== +| 1 1.2+^.^| 3 +| 2(h) +|======== + +In this case, +same_orientation+ will be set to the h-split container around +the focused container. However, when trying the easy case, the next/previous +container +swap+ will be NULL. Therefore, i3 will search again for a ++same_orientation+ container, this time starting from the parent of the h-split +container. + +After determining a new +same_orientation+ container (if it is NULL, the +orientation will be force-changed), this case is equivalent to case 2 or case +4. + + +=== Case 6: Floating containers + +The reference layout for this case is a horizontal workspace with two +containers plus one floating h-split container. Focus is on the floating +container. + +TODO: nice illustration. table not possible? + +When moving up/down, the container needs to leave the floating container and it +needs to be placed on the workspace (at workspace level). This is accomplished +by calling the function +attach_to_workspace+. + +== Click handling + +Without much ado, here is the list of cases which need to be considered: + +* click to focus (tiling + floating) and raise (floating) +* click to focus/raise when in stacked/tabbed mode +* floating_modifier + left mouse button to drag a floating con +* floating_modifier + right mouse button to resize a floating con +* click on decoration in a floating con to either initiate a resize (if there + is more than one child in the floating con) or to drag the + floating con (if it’s the one at the top). +* click on border in a floating con to resize the floating con +* floating_modifier + right mouse button to resize a tiling con +* click on border/decoration to resize a tiling con + == Gotchas * Forgetting to call `xcb_flush(conn);` after sending a request. This usually diff --git a/_docs/i3-config-wizard.man b/_docs/i3-config-wizard.man new file mode 100644 index 0000000..5a9ca39 --- /dev/null +++ b/_docs/i3-config-wizard.man @@ -0,0 +1,41 @@ +i3-config-wizard(1) +=================== +Michael Stapelberg +v4.0, July 2011 + +== NAME + +i3-config-wizard - creates a keysym based config based on your layout + +== SYNOPSIS + +i3-config-wizard + +== FILES + +=== /etc/i3/config.keycodes + +This file contains the default configuration with keycodes. All the bindcode +lines will be transformed to bindsym and the user-specified modifier will be +used. + +== DESCRIPTION + +i3-config-wizard is started by i3 in its default config, unless ~/.i3/config +exists. i3-config-wizard creates a keysym based i3 config file (based on +/etc/i3/config.keycodes) in ~/.i3/config. + +The advantage of using keysyms is that the config file is easy to read, +understand and modify. However, if we shipped with a keysym based default +config file, the key positions would not be consistent across different +keyboard layouts (take for example the homerow for movement). Therefore, we +ship with a keycode based default config and let the wizard transform it +according to your current keyboard layout. + +== SEE ALSO + +i3(1) + +== AUTHOR + +Michael Stapelberg and contributors diff --git a/_docs/i3-input.man b/_docs/i3-input.man new file mode 100644 index 0000000..cd85c92 --- /dev/null +++ b/_docs/i3-input.man @@ -0,0 +1,40 @@ +i3-input(1) +========= +Michael Stapelberg +v3.delta, November 2009 + +== NAME + +i3-input - interactively take a command for i3 window manager + +== SYNOPSIS + +i3-input [-s ] [-p ] [-l ] [-P ] [-f ] [-v] + +== DESCRIPTION + +i3-input is a tool to take commands (or parts of a command) composed by +the user, and send it/them to i3. This is useful, for example, for the +mark/goto command. + +== EXAMPLE + +------------------------------------------------ +i3-input -p 'mark ' -l 1 -P 'Mark: ' +------------------------------------------------ + +== ENVIRONMENT + +=== I3SOCK + +If no ipc-socket is specified on the commandline, this variable is used +to determine the path, at wich the unix domain socket is expected, on which +to connect to i3. + +== SEE ALSO + +i3(1) + +== AUTHOR + +Michael Stapelberg and contributors diff --git a/_docs/i3-migrate-config-to-v4.man b/_docs/i3-migrate-config-to-v4.man new file mode 100644 index 0000000..1d2b13f --- /dev/null +++ b/_docs/i3-migrate-config-to-v4.man @@ -0,0 +1,34 @@ +i3-migrate-config-to-v4(1) +========================== +Michael Stapelberg +v4.0, July 2011 + +== NAME + +i3-migrate-config-to-v4 - migrates your i3 config file + +== SYNOPSIS + +------------------------------------------------------- +mv ~/.i3/config ~/.i3/old.config +i3-migrate-config-to-v4 ~/.i3/old.config > ~/.i3/config +------------------------------------------------------- + +== DESCRIPTION + +i3-migrate-config-to-v4 is a Perl script which migrates your old (< version 4) +configuration files to a version 4 config file. The most significant changes +are the new commands (see the release notes). + +This script will automatically be run by i3 when it detects an old config file. +Please migrate your config file as soon as possible. We plan to include this +script in all i3 release until 2012-08-01. Afterwards, old config files will no +longer be supported. + +== SEE ALSO + +i3(1) + +== AUTHOR + +Michael Stapelberg and contributors diff --git a/_docs/i3-msg.man b/_docs/i3-msg.man new file mode 100644 index 0000000..116195b --- /dev/null +++ b/_docs/i3-msg.man @@ -0,0 +1,41 @@ +i3-msg(1) +========= +Michael Stapelberg +v3.delta, November 2009 + +== NAME + +i3-msg - send messages to i3 window manager + +== SYNOPSIS + +i3-msg "message" + +== DESCRIPTION + +i3-msg is a sample implementation for a client using the unix socket IPC +interface to i3. At the moment, it can only be used for sending commands +(like in configuration file for key bindings), but this may change in the +future (staying backwards-compatible, of course). + +== EXAMPLE + +------------------------------------------------ +i3-msg "bp" # Use 1-px border for current client +------------------------------------------------ + +== ENVIRONMENT + +=== I3SOCK + +If no ipc-socket is specified on the commandline, this variable is used +to determine the path, at wich the unix domain socket is expected, on which +to connect to i3. + +== SEE ALSO + +i3(1) + +== AUTHOR + +Michael Stapelberg and contributors diff --git a/_docs/i3-nagbar.man b/_docs/i3-nagbar.man new file mode 100644 index 0000000..3dd37bb --- /dev/null +++ b/_docs/i3-nagbar.man @@ -0,0 +1,34 @@ +i3-nagbar(1) +============ +Michael Stapelberg +v4.0, July 2011 + +== NAME + +i3-nagbar - displays an error bar on top of your screen + +== SYNOPSIS + +i3-nagbar -m 'message' -b 'label' 'action' + +== DESCRIPTION + +i3-nagbar is used by i3 to tell you about errors in your configuration file +(for example). While these errors are logged to the logfile (if any), the past +has proven that users are either not aware of their logfile or do not check it +after modifying the configuration file. + +== EXAMPLE + +------------------------------------------------ +i3-nagbar -m 'You have an error in your i3 config file!' \ +-b 'edit config' 'xterm $EDITOR ~/.i3/config' +------------------------------------------------ + +== SEE ALSO + +i3(1) + +== AUTHOR + +Michael Stapelberg and contributors diff --git a/_docs/i3.man b/_docs/i3.man index 109248e..868ff8c 100644 --- a/_docs/i3.man +++ b/_docs/i3.man @@ -1,7 +1,7 @@ i3(1) ===== Michael Stapelberg -v3.epsilon, March 2010 +v4.0, July 2011 == NAME @@ -47,7 +47,7 @@ Please be aware that i3 is primarily targeted at advanced users and developers. === IMPORTANT NOTE TO nVidia BINARY DRIVER USERS 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 +you need to use the +--force-xinerama+ flag (in your ~/.xsession) when starting i3, like so: ---------------------------------------------- @@ -58,26 +58,21 @@ See also docs/multi-monitor for the full explanation. === TERMINOLOGY -Client:: -A client is X11-speak for a window. +Tree:: +i3 keeps your layout in a tree data structure. -Table:: -Your workspace is managed using a table. You can move windows around and create -new columns (move a client to the right) or rows (move it to the bottom) -implicitly. -+ -By "snapping" a client in a specific direction, you increase its colspan/rowspan. +Window:: +An X11 window, like the Firefox browser window or a terminal emulator. -Container:: -A container contains a variable number of clients. Each cell of the table is a -container. +Split container:: +A split container contains multiple other split containers or windows. + -Containers can be used in various modes. The default mode is called "default" +Containers can be used in various layouts. The default mode is called "default" and just resizes each client equally so that it fits. Workspace:: -A workspace is a set of clients (technically speaking, it’s just a table). -Other window managers call this "Virtual Desktops". +A workspace is a set of containers. Other window managers call this "Virtual +Desktops". + In i3, each workspace is assigned to a specific virtual screen. By default, screen 1 has workspace 1, screen 2 has workspace 2 and so on… However, when you @@ -103,18 +98,9 @@ on your "j" key). Alternatively, you can use the cursor keys. Mod1+:: Focus window in . -Mod3+:: -Focus container in . - Mod1+Shift+:: Move window to . -Mod3+Shift+:: -Move container to . - -Mod1+Control+:: -Snap container to . - Mod1+:: Switch to workspace . @@ -124,17 +110,21 @@ Move window to workspace . Mod1+f:: Toggle fullscreen mode. -Mod1+h:: +Mod1+s:: Enable stacking layout for the current container. Mod1+e:: Enable default layout for the current container. +Mod1+w:: +Enable tabbed layout for the current container. + Mod1+Shift+Space:: -Toggle tiling/floating for the current window. +Toggle tiling/floating for the current container. -Mod1+t:: -Select the first tiling window if the current window is floating and vice-versa. +Mod1+Space:: +Select the first tiling container if the current container is floating and +vice-versa. Mod1+Shift+q:: Kills the current window. This is equivalent to "clicking on the close button", @@ -144,8 +134,7 @@ support that, the window will be killed and it depends on the application what happens. Mod1+Shift+r:: -Restarts i3 in place (without losing any windows, but at this time, the layout -and placement of windows is not retained). +Restarts i3 in place. Your layout will be preserved. Mod1+Shift+e:: Exits i3. @@ -165,88 +154,93 @@ You can specify a custom path using the -c option. .Sample configuration ------------------------------------------------------------- +# i3 config file (v4) + +# font for window titles. ISO 10646 = Unicode font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 -# Start terminal (Mod1+Enter) -bind Mod1+36 exec /usr/bin/urxvt +# use Mouse+Mod1 to drag floating windows to their wanted position +floating_modifier Mod1 -# Start dmenu (Mod1+v) -bind Mod1+55 exec /usr/bin/dmenu_run +# start a terminal +bindsym Mod1+Return exec /usr/bin/urxvt -# Kill current client (Mod1+Shift+q) -bind Mod1+Shift+24 kill +# kill focused window +bindsym Mod1+Shift+q kill -# Beamer on/off -bind Mod1+73 exec /home/michael/toggle_beamer.sh +# start dmenu (a program launcher) +bindsym Mod1+d exec /usr/bin/dmenu_run -# Screen locking -bind Mod1+68 exec /usr/bin/i3lock +# change focus +bindsym Mod1+j focus left +bindsym Mod1+k focus down +bindsym Mod1+l focus up +bindsym Mod1+semicolon focus right -# Restart i3 inplace (Mod1+Shift+r) -bind Mod1+Shift+27 restart +# alternatively, you can use the cursor keys: +bindsym Mod1+Left focus left +bindsym Mod1+Down focus down +bindsym Mod1+Up focus up +bindsym Mod1+Right focus right -# Exit i3 (Mod1+Shift+e) -bind Mod1+Shift+26 exit +# move focused window +bindsym Mod1+Shift+j move left +bindsym Mod1+Shift+k move down +bindsym Mod1+Shift+l move up +bindsym Mod1+Shift+semicolon move right -# Brightness -bind Mod1+97 exec sudo sh -c "echo up > /proc/acpi/ibm/brightness" -bind Mod1+103 exec sudo sh -c "echo down > /proc/acpi/ibm/brightness" +# alternatively, you can use the cursor keys: +bindsym Mod1+Shift+Left move left +bindsym Mod1+Shift+Down move down +bindsym Mod1+Shift+Up move up +bindsym Mod1+Shift+Right move right -# Fullscreen (Mod1+f) -bind Mod1+41 f +# split in horizontal orientation +bindsym Mod1+h split h -# Stacking (Mod1+h) -bind Mod1+43 s +# split in vertical orientation +bindsym Mod1+v split v -# Default (Mod1+e) -bind Mod1+26 d +# enter fullscreen mode for the focused container +bindsym Mod1+f fullscreen -# Toggle tiling/floating of the current window (Mod1+Shift+Space) -bind Mod1+Shift+65 t +# change container layout (stacked, tabbed, default) +bindsym Mod1+s layout stacking +bindsym Mod1+w layout tabbed +bindsym Mod1+e layout default -# Go into the tiling layer / floating layer, depending on whether -# the current window is tiling / floating (Mod1+t) -bind Mod1+28 focus ft +# toggle tiling / floating +bindsym Mod1+Shift+space floating toggle -# Focus (Mod1+j/k/l/;) -bind Mod1+44 h -bind Mod1+45 j -bind Mod1+46 k -bind Mod1+47 l +# change focus between tiling / floating windows +bindsym Mod1+space focus mode_toggle -# Focus Container (Mod3+j/k/l/;) -bind Mod3+44 wch -bind Mod3+45 wcj -bind Mod3+46 wck -bind Mod3+47 wcl +# focus the parent container +bindsym Mod1+a focus parent -# Snap (Mod1+Control+j/k/l/;) -bind Mod1+Control+44 sh -bind Mod1+Control+45 sj -bind Mod1+Control+46 sk -bind Mod1+Control+47 sl +# focus the child container +#bindsym Mod1+d focus child -# Move (Mod1+Shift+j/k/l/;) -bind Mod1+Shift+44 mh -bind Mod1+Shift+45 mj -bind Mod1+Shift+46 mk -bind Mod1+Shift+47 ml +# switch to workspace +bindsym Mod1+1 workspace 1 +bindsym Mod1+2 workspace 2 +# .. -# Move Container (Mod3+Shift+j/k/l/;) -bind Mod3+Shift+44 wcmh -bind Mod3+Shift+45 wcmj -bind Mod3+Shift+46 wcmk -bind Mod3+Shift+47 wcml +# move focused container to workspace +bindsym Mod1+Shift+1 move workspace 1 +bindsym Mod1+Shift+2 move workspace 2 +# ... -# Workspaces -bind Mod1+10 1 -bind Mod1+11 2 -... +# reload the configuration file +bindsym Mod1+Shift+c reload +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym Mod1+Shift+r restart +# exit i3 (logs you out of your X session) +bindsym Mod1+Shift+e exit -# Move to Workspace -bind Mod1+Shift+10 1 -bind Mod1+Shift+11 2 -... +# Start i3bar to display a workspace bar (plus the system information i3status +# finds out, if available) +exec i3status | i3bar -d ------------------------------------------------------------- === ~/.xsession @@ -257,7 +251,7 @@ your login manager (xdm, slim, gdm, …) as soon as you login. .Sample xsession ------------------------------------------------------------- # Disable DPMS turning off the screen -xset dpms force on +xset -dpms xset s off # Disable bell @@ -294,6 +288,15 @@ echo "Starting at $(date)" >> ~/.i3/logfile exec /usr/bin/i3 -V -d all >> ~/.i3/logfile ------------------------------------------------------------- +== ENVIRONMENT + +=== I3SOCK + +This variable overwrites the IPC socket path (placed in +/tmp/i3-%u/ipc-socket.%p by default, where %u is replaced with your UNIX +username and %p is replaced with i3’s PID). The IPC socket is used by external +programs like i3-msg(1) or i3bar(1). + == TODO There is still lot of work to do. Please check our bugtracker for up-to-date @@ -308,7 +311,8 @@ and the "how to hack" guide. If you are building from source, run: You can also access these documents online at http://i3.zekjur.net/ -i3-input(1), i3-msg(1), i3-wsbar(1) +i3-input(1), i3-msg(1), i3-wsbar(1), i3-nagbar(1), i3-config-wizard(1), +i3-migrate-config-to-v4(1) == AUTHOR diff --git a/_docs/ipc b/_docs/ipc index 5db6f00..7e71326 100644 --- a/_docs/ipc +++ b/_docs/ipc @@ -10,9 +10,12 @@ 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+. +most languages. In the default configuration file, the ipc-socket gets created +in +/tmp/i3-%u/ipc-socket.%p+ where +%u+ is your UNIX username and +%p+ is the +PID of i3. + +All i3 utilities, like +i3-msg+ and +i3-input+ will read the +I3_SOCKET_PATH+ +X11 property, stored on the X11 root window. == Establishing a connection @@ -21,7 +24,7 @@ snippet illustrates this in Perl: ------------------------------------------------------------- use IO::Socket::UNIX; -my $sock = IO::Socket::UNIX->new(Peer => '~/.i3/ipc.sock'); +my $sock = IO::Socket::UNIX->new(Peer => '/tmp/i3-ipc.sock'); ------------------------------------------------------------- == Sending messages to i3 @@ -52,6 +55,10 @@ SUBSCRIBE (2):: GET_OUTPUTS (3):: Gets the current outputs. The reply will be a JSON-encoded list of outputs (see the reply section). +GET_TREE (4):: + Gets the layout tree. i3 uses a tree as data structure which includes + every container. The reply will be the JSON-encoded tree (see the reply + section). So, a typical message could look like this: -------------------------------------------------- @@ -101,6 +108,8 @@ SUBSCRIBE (2):: Confirmation/Error code for the SUBSCRIBE message. GET_OUTPUTS (3):: Reply to the GET_OUTPUTS message. +GET_TREE (4):: + Reply to the GET_TREE message. === COMMAND reply @@ -226,6 +235,190 @@ rect (map):: ] ------------------- +=== GET_TREE reply + +The reply consists of a serialized tree. Each node in the tree (representing +one container) has at least the properties listed below. While the nodes might +have more properties, please do not use any properties which are not documented +here. They are not yet finalized and will probably change! + +id (integer):: + The internal ID (actually a C pointer value) of this container. Do not + make any assumptions about it. You can use it to (re-)identify and + address containers when talking to i3. +name (string):: + The internal name of this container. For all containers which are part + of the tree structure down to the workspace contents, this is set to a + nice human-readable name of the container. + For all other containers, the content is not defined (yet). +border (string):: + Can be either "normal", "none" or "1pixel", dependending on the + container’s border style. +layout (string):: + Can be either "default", "stacked", "tabbed", "dockarea" or "output". + Other values might be possible in the future, should we add new + layouts. +orientation (string):: + Can be either "none" (for non-split containers), "horizontal" or + "vertical". +percent (float):: + The percentage which this container takes in its parent. A value of + +null+ means that the percent property does not make sense for this + container, for example for the root container. +rect (map):: + The absolute display coordinates for this container. Display + coordinates means that when you have two 1600x1200 monitors on a single + X11 Display (the standard way), the coordinates of the first window on + the second monitor are +{ "x": 1600, "y": 0, "width": 1600, "height": + 1200 }+. +window_rect (map):: + The coordinates of the *actual client window* inside its container. + These coordinates are relative to the container and do not include the + window decoration (which is actually rendered on the parent container). + So, when using the +default+ layout, you will have a 2 pixel border on + each side, making the window_rect +{ "x": 2, "y": 0, "width": 632, + "height": 366 }+ (for example). +geometry (map):: + The original geometry the window specified when i3 mapped it. Used when + switching a window to floating mode, for example. +urgent (bool):: + Whether this container (window or workspace) has the urgency hint set. +focused (bool):: + Whether this container is currently focused. + +Please note that in the following example, I have left out some keys/values +which are not relevant for the type of the node. Otherwise, the example would +be by far too long (it already is quite long, despite showing only 1 window and +one dock window). + +It is useful to have an overview of the structure before taking a look at the +JSON dump: + +* root +** LVDS1 +*** topdock +*** content +**** workspace 1 +***** window 1 +*** bottomdock +**** dock window 1 +** VGA1 + +*Example:* +----------------------- +{ + "id": 6875648, + "name": "root", + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 800 + }, + "nodes": [ + + { + "id": 6878320, + "name": "LVDS1", + "layout": "output", + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 800 + }, + "nodes": [ + + { + "id": 6878784, + "name": "topdock", + "layout": "dockarea", + "orientation": "vertical", + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 0 + }, + }, + + { + "id": 6879344, + "name": "content", + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 782 + }, + "nodes": [ + + { + "id": 6880464, + "name": "1", + "orientation": "horizontal", + "rect": { + "x": 0, + "y": 0, + "width": 1280, + "height": 782 + }, + "floating_nodes": [], + "nodes": [ + + { + "id": 6929968, + "name": "#aa0000", + "border": "normal", + "percent": 1, + "rect": { + "x": 0, + "y": 18, + "width": 1280, + "height": 782 + } + } + + ] + } + + ] + }, + + { + "id": 6880208, + "name": "bottomdock", + "layout": "dockarea", + "orientation": "vertical", + "rect": { + "x": 0, + "y": 782, + "width": 1280, + "height": 18 + }, + "nodes": [ + + { + "id": 6931312, + "name": "#00aa00", + "percent": 1, + "rect": { + "x": 0, + "y": 782, + "width": 1280, + "height": 18 + } + } + + ] + } + ] + } + ] +} +------------------------ + + == Events [[events]] diff --git a/_docs/tree-migrating b/_docs/tree-migrating deleted file mode 100644 index 15ea54e..0000000 --- a/_docs/tree-migrating +++ /dev/null @@ -1,192 +0,0 @@ -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 index 42599ca..6941af9 100644 --- a/_docs/userguide +++ b/_docs/userguide @@ -1,71 +1,72 @@ i3 User’s Guide =============== Michael Stapelberg -March 2010 +July 2011 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. +window manager. If it does not, please contact us on IRC (preferred) or post your +question(s) on the mailing list. == 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 mod (alt):* -image:keyboard-layer1.png["Keys to use with Mod1 (alt)",width=600,link="keyboard-layer1.png"] +image:keyboard-layer1.png["Keys to use with mod (alt)",width=600,link="keyboard-layer1.png"] -*Keys to use with Shift+Mod1:* +*Keys to use with Shift+mod:* -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 <>). +image:keyboard-layer2.png["Keys to use with Shift+mod",width=600,link="keyboard-layer2.png"] The red keys are the modifiers you need to press (by default), the blue keys are your homerow. == Using i3 +Throughout this guide, the keyword +mod+ will be used to refer to the +configured modifier. This is the alt key (Mod1) by default, with windows (Mod4) +being a popular alternative. + === 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 +for this is mod+Enter, that is Alt+Enter in the default configuration. By +pressing mod+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. +If you now open another terminal, i3 will place it next to the current one, +splitting the screen size in half. Depending on your monitor, i3 will put the +created window beside the existing window (on wide displays) or below the +existing window (rotated displays). 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 move the focus between the two terminals, you can 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, +mod+J+ is left, +mod+K+ +is down, +mod+L+ is up and `mod+;` is right. So, to switch between the +terminals, use +mod+K+ or +mod+L+. Of course, you can also use the arrow keys. + +At the moment, your workspace is split (it contains two terminals) in a +specific direction (horizontal by default). Every window can be split +horizontally or vertically again, just like the workspace. The terminology is +"window" for a container that actually contains an X11 window (like a terminal +or browser) and "split container" for containers that consist of one or more +windows. -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+;`. +TODO: picture of the tree -image:two_columns.png[Two columns] +To split a window vertically, press +mod+v+. To split it horizontally, press ++mod+h+. -=== Changing container modes +=== Changing the container layout -A container can have the following modes: +A split container can have one of the following layouts: default:: Windows are sized so that every window gets an equal amount of space in the @@ -77,35 +78,35 @@ 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. +To switch modes, press +mod+e+ for default, +mod+h+ for stacking and ++mod+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+. +To display a window in fullscreen mode or to go out of fullscreen mode again, +press +mod+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+. +There is also a global fullscreen mode in i3 in which the client will span all +available outputs. === 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. ++dmenu+ which is opened by pressing +mod+d+ by default. Just type the name +(or a part of it) of the application which you want to open. The corresponding +application 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. +<> 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 +can press +mod+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 @@ -115,7 +116,7 @@ depends on the application. 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 +another workspace, press +mod+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 @@ -129,18 +130,15 @@ focus to that screen. === Moving windows to workspaces -To move a window to another workspace, simply press +Mod1+Shift+num+ where +To move a window to another workspace, simply press +mod+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 +=== Resizing -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. +The easiest way to resize a container is by using the mouse: Grab the border +and move it to the wanted size. See <> for how to configure i3 to be able to resize columns/rows with your keyboard. @@ -148,35 +146,21 @@ 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. +to upgrade to a newer version of i3) you can use +mod+Shift+r+. === 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). +To cleanly exit i3 without killing your X server, you can use +mod+Shift+e+. === 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). +windows, or toolbar windows (GIMP or similar). Those windows usually set the +appropriate hint and are opened in floating mode by default. -You can enable floating mode for a window by pressing +Mod1+Shift+Space+. By +You can enable floating mode for a window by pressing +mod+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 <>. @@ -185,6 +169,73 @@ For resizing floating windows with your keyboard, see <>. Floating windows are always on top of tiling windows. +== Tree + +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 dock areas and a content container, 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 (+mod+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 +mod+v+ to create a +Vertical Split Container+ (to +open a +Horizontal Split Container+, use +mod+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. + +=== Focus parent + +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 +focus parent+, 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="Focus parent, then open new terminal"] + +[[configuring]] == Configuring i3 This is where the real fun begins ;-). Most things are very dependant on your @@ -203,6 +254,14 @@ 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. +On first start (and on all following starts, unless you have a configuration +file), i3 will offer you to create a configuration file. You can tell the +wizard to use either Alt (Mod1) or Windows (Mod4) as modifier in the config +file. Also, the created config file will use the key symbols of your current +keyboard layout. To start the wizard, use the command +i3-config-wizard+. +Please note that you must not have +~/.i3/config+, otherwise the wizard will +exit. + === Comments It is possible and recommended to use comments in your configuration file to @@ -216,10 +275,12 @@ a # and can only be used at the beginning of a line: === 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. +i3 uses X core fonts (not Xft) for rendering window titles. 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. + +If i3 cannot open the configured font, it will output an error in the logfile +and fall back to a working font. *Syntax*: ------------------------------ @@ -244,9 +305,9 @@ also mix your bindings, though i3 will not protect you from overlapping ones). 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+). +* Keycodes do not need to have a symbol assigned (handy for custom vendor + 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. @@ -256,19 +317,19 @@ keysyms. *Syntax*: ---------------------------------- bindsym [Modifiers+]keysym command -bind [Modifiers+]keycode command +bindcode [Modifiers+]keycode command ---------------------------------- *Examples*: -------------------------------- # Fullscreen -bindsym Mod1+f f +bindsym mod+f f # Restart -bindsym Mod1+Shift+r restart +bindsym mod+Shift+r restart # Notebook-specific hotkeys -bind 214 exec /home/michael/toggle_beamer.sh +bindcode 214 exec /home/michael/toggle_beamer.sh -------------------------------- Available Modifiers: @@ -303,25 +364,49 @@ you hold the shift button as well, the resize will be proportional. floating_modifier -------------------------------- -*Examples*: +*Example*: -------------------------------- floating_modifier Mod1 -------------------------------- +=== Orientation for new workspaces + +New workspaces get a reasonable default orientation: Wide-screen monitors +(anything wider than high) get horizontal orientation, rotated monitors +(anything higher than wide) get vertical orientation. + +With the +default_orientation+ configuration directive, you can override that +behaviour. + +*Syntax*: +---------------------------------------------- +default_orientation +---------------------------------------------- + +*Example*: +---------------------------- +default_orientation vertical +---------------------------- + === Layout mode for new containers -This option determines in which mode new containers will start. See also -<>. +This option determines in which mode new containers on workspace level will +start. +/////////////////////////////// +See also <>. +////////////////////////////// *Syntax*: --------------------------------------------- -new_container -new_container stack-limit +workspace_layout --------------------------------------------- +///////////////////////////////////////////// +new_container stack-limit +///////////////////////////////////////////// -*Examples*: +*Example*: --------------------- -new_container tabbed +workspace_layout tabbed --------------------- === Border style for new windows @@ -330,14 +415,39 @@ This option determines which border style new windows will have. *Syntax*: --------------------------------------------- -new_window +new_window --------------------------------------------- -*Examples*: +*Example*: --------------------- -new_window bp +new_window 1pixel --------------------- +=== Arbitrary commands for specific windows (for_window) + +With the +for_window+ command, you can let i3 execute any command when it +encounters a specific window. This can be used to set windows to floating or to +change their border style, for example. + +*Syntax*: +----------------------------- +for_window [criteria] command +----------------------------- + +*Examples*: +------------------------------------------------ +# enable floating mode for all XTerm windows +for_window [class="XTerm"] mode floating + +# Make all urxvts use a 1-pixel border: +for_window [class="urxvt"] border 1pixel + +# A less useful, but rather funny example: +# makes the window floating as soon as I change +# directory to ~/work +for_window [title="x200: ~/work"] mode floating +------------------------------------------------ + === Variables As you learned in the section about keyboard bindings, you will have @@ -347,10 +457,10 @@ variables can be handy. *Syntax*: -------------- -set name value +set $name value -------------- -*Examples*: +*Example*: ------------------------ set $m Mod1 bindsym $m+Shift+r restart @@ -360,19 +470,20 @@ 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). ++~/.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. +Specific windows can be matched by window class and/or window title. It is +recommended that you match on window classes instead of window titles whenever +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 @@ -380,36 +491,40 @@ not be put onto any workspace, but will be set floating on the current one. *Syntax*: ------------------------------------------------------------ -assign ["]window class[/window title]["] [→] [~ | workspace] +assign ["]window class[/window title]["] [→] [workspace] ------------------------------------------------------------ *Examples*: ---------------------- assign urxvt 2 assign urxvt → 2 +assign urxvt → work assign "urxvt" → 2 assign "urxvt/VIM" → 3 -assign "gecko" → ~4 -assign "xv/MPlayer" → ~ +assign "gecko" → 4 ---------------------- 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. +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. +By using the +exec+ keyword outside a keybinding, you can configure +which commands will be performed by i3 on initial startup. +exec+ +commands will not run when restarting i3, if you need a command to run +also when restarting i3 you should use the +exec_always+ +keyword. These commands will be run in order. *Syntax*: ------------- +------------------- exec command ------------- +exec_always command +------------------- *Examples*: -------------------------------- -exec sudo i3status | dzen2 -dock +exec i3status | dzen2 -dock +exec_always ~/my_script.sh -------------------------------- [[workspace_screen]] @@ -437,30 +552,9 @@ 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. +You can change all colors which i3 uses to draw the window decorations. *Syntax*: -------------------------------------------- @@ -518,18 +612,22 @@ 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+. +The IPC socket is enabled by default and will be created in ++/tmp/i3-%u/ipc-socket.%p+ where +%u+ is your UNIX username and +%p+ is the PID +of i3. + +You can override the default path through the environment-variable +I3SOCK+ or +by specifying the +ipc-socket+ directive. *Examples*: ---------------------------- -ipc-socket ~/.i3/ipc.sock +ipc-socket /tmp/i3-ipc.sock ---------------------------- You can then use the +i3-msg+ application to perform any command listed in the next section. -=== Disable focus follows mouse +=== 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 @@ -542,119 +640,146 @@ to click on links in your browser window). focus_follows_mouse ---------------------------- -*Examples*: +*Example*: ---------------------- focus_follows_mouse no ---------------------- -=== Internal workspace bar +=== Popups during fullscreen mode -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): +When you are in fullscreen mode, some applications still open popup windows +(take Xpdf for example). This is because these applications may not be aware +that they are in fullscreen mode (they do not check the corresponding hint). +There are two things which are possible to do in this situation: + +1. Just ignore the popup (don’t map it). This won’t interrupt you while you are + in fullscreen. However, some apps might react badly to this (deadlock until + you go out of fullscreen). +2. Leave fullscreen mode. This is the default. *Syntax*: ----------------------- -workspace_bar ----------------------- +------------------------------------------------- +popup_during_fullscreen +------------------------------------------------- -*Examples*: ----------------- -workspace_bar no ----------------- +*Example*: +------------------------------ +popup_during_fullscreen ignore +------------------------------ == List of commands +=== Splitting containers + +The split command makes the current window a split container. Split containers +can contain multiple windows. Every split container has an orientation, it is +either split horizontally (a new window gets placed to the right of the current +one) or vertically (a new window gets placed below the current one). + +If you apply this command to a split container with the same orientation, +nothing will happen. If you use a different orientation, the split container’s +orientation will be changed (if it does not have more than one window). + +*Syntax*: +--------------------------- +split +--------------------------- + +*Example*: +-------------- +split vertical +-------------- + === 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+: +Use +layout default+, +layout stacking+ or +layout tabbed+ to change the +current container layout to default, stacking or tabbed layout, respectively. + +To make the current window (!) fullscreen, use +fullscreen+, to make +it floating (or tiling again) use +floating enable+ respectively +floating disable+ +(or +floating toggle+): *Examples*: -------------- -bindsym Mod1+s s -bindsym Mod1+l d -bindsym Mod1+w T +bindsym mod+s layout stacking +bindsym mod+l layout default +bindsym mod+w layout tabbed # Toggle fullscreen -bindsym Mod1+f f - -# Toggle global fullscreen -bindsym Mod1+Shift+f fg +bindsym mod+f fullscreen # Toggle floating/tiling -bindsym Mod1+t t +bindsym mod+t floating toggle -------------- -=== Focusing/Moving/Snapping clients/containers/screens +=== Focusing/Moving containers + +To change the focus, use the focus command: +focus left+, +focus right+, +focus down+ and +focus up+. + +There are a few special parameters you can use for the focus command: -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+. +parent:: + Sets focus to the +Parent Container+ of the current +Container+. +child:: + The opposite of +focus parent+, sets the focus to the last focused + child container. +floating:: + Sets focus to the last focused floating container. +tiling:: + Sets focus to the last focused tiling container. +mode_toggle:: + Toggles between floating/tiling containers. -The same principle applies for moving and snapping: just prefix the command -with +m+ when moving and with +s+ when snapping: +For moving, use +move left+, +move right+, +move down+ and +move up+. *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 +bindsym mod+j focus left +bindsym mod+k focus down +bindsym mod+l focus up +bindsym mod+semicolon focus right + +# Focus parent container +bindsym mod+u focus parent + +# Focus last floating/tiling container +bindsym mod+g focus mode_toggle # 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 -… +bindsym mod+j move left +bindsym mod+k move down +bindsym mod+l move up +bindsym mod+semicolon move right ---------------------- -=== Changing workspaces/moving clients to workspaces +=== Changing workspaces/moving containers 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+. +To change to a specific workspace, use the +workspace+ command, followed by the +number or name of the workspace. To move containers to specific workspaces, use ++move workspace+. -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. +You can also switch to the next and previous workspace with the commands ++workspace next+ and +workspace prev+, 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 mod+1 workspace 1 +bindsym mod+2 workspace 2 ... -bindsym Mod1+Shift+1 m1 -bindsym Mod1+Shift+2 m2 +bindsym mod+Shift+1 move workspace 1 +bindsym mod+Shift+2 move workspace 2 ... - -bindsym Mod1+o nw -bindsym Mod1+p pw ------------------------- [[resizingconfig]] -=== Resizing columns/rows +=== Resizing containers/windows -If you want to resize columns/rows using your keyboard, you can use the +If you want to resize containers/windows 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 @@ -666,23 +791,23 @@ mode "resize" { # 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 j resize shrink left + bindsym Shift+j resize grow left - bindsym r resize bottom +10 - bindsym Shift+r resize bottom -10 + bindsym k resize grow bottom + bindsym Shift+k resize shrink bottom - bindsym t resize top -10 - bindsym Shift+t resize top +10 + bindsym l resize shrink top + bindsym Shift+l resize grow top - bindsym d resize right +10 - bindsym Shift+d resize right -10 + bindsym semicolon resize grow right + bindsym Shift+semicolon resize shrink right - bind 36 mode default + bindcode 36 mode default } # Enter resize mode -bindsym Mod1+r mode resize +bindsym mod+r mode "resize" ---------------------------------------------------------------------- === Jumping to specific windows @@ -691,23 +816,20 @@ 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. +it would be more convenient to have a shortcut. You can use the +focus+ command +with criteria for that. *Syntax*: ---------------------------------------------------- -jump ["]window class[/window title]["] -jump workspace [ column row ] +[class="class"] focus +[title="title"] focus ---------------------------------------------------- -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" --------------------------------------- +bindsym mod+a [class="urxvt" title="VIM"] focus +------------------------------------------------ === VIM-like marks (mark/goto) @@ -726,68 +848,57 @@ 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 ------------------ +------------------------------ +mark identifier +[con_mark="identifier"] focus +------------------------------ +*Example (in a terminal)*: +------------------------------ +$ i3-msg mark irssi +$ i3-msg '[con_mark="irssi"] focus' +------------------------------ + +/////////////////////////////////////////////////////////////////// +TODO: make i3-input replace %s *Examples*: --------------------------------------- # Read 1 character and mark the current window with this character -bindsym Mod1+m exec i3-input -p 'mark ' -l 1 -P 'Mark: ' +bindsym mod+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: ' +bindsym mod+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. +To change the border of the current client, you can use +border normal+ to use the normal +border (including window title), +border 1pixel+ to use a 1-pixel border (no window title) +and +border none+ to make the client borderless. + +There is also +border toggle+ which will toggle the different border styles. *Examples*: ------------------- -bindsym Mod1+t bn -bindsym Mod1+y bp -bindsym Mod1+u bb ------------------- +---------------------------- +bindsym mod+t border normal +bindsym mod+y border 1pixel +bindsym mod+u border none +---------------------------- [[stack-limit]] +/////////////////////////////////////////////////////////////////////////////// +TODO: not yet implemented === 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. +Depending on your screen’s size, you might end up with only half of the title +lines being actually used, wasting a lot of screen space. 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 @@ -808,22 +919,21 @@ 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, +your X session. 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 +bindsym mod+Shift+r restart +bindsym mod+Shift+w reload +bindsym mod+Shift+e exit ---------------------------- [[multi_monitor]] @@ -945,24 +1055,16 @@ 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. +possible to reduce the time your CPU is woken up from sleep states. Because +i3status only spits out text, you need to combine it with some other tool, like +i3bar. Use a pipe to connect them: +i3status | i3bar -d+. + +Regardless of which application you use to display the status line, you +want to make sure that it registers as a dock window using EWMH hints. i3 will +position the window either at the top or at the bottom of the screen, depending +on which hint the application sets. With i3bar, you can use +-d+ or +-dbottom+ +for positioning it at the bottom and +-dtop+ to position it at the top of the +screen. === Giving presentations (multi-monitor) diff --git a/css/style.css b/css/style.css index 30d413d..95ff56a 100644 --- a/css/style.css +++ b/css/style.css @@ -343,6 +343,27 @@ img { padding-left: 1em; } +.docs strong { + margin-right: 1em; +} + +.docversion { + margin: 0.25em; + margin-top: 0.9em; + padding: 0.1em; + padding-left: 0.25em; + padding-right: 0.25em; + background-color: #333; + border: 2px solid #555; + border-radius: 4px; + float: right; +} + +.docversion a, .docversion a:visited { + color: white; + text-decoration: none; +} + /* clearfix */ .clearfix:after { content: "."; diff --git a/docs/3.e/bigpicture.png b/docs/3.e/bigpicture.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3c8db751232c1cdb2b7132a19de8bef39f7a39 GIT binary patch literal 9179 zcmaKS2UJtr7HvQTv7w@(G(iIh2&e>*UIimnq*og~0i-EitQS#`(0f1>=~AQ@6$R;? z5CTL*YA7lMr2iGY<-Pyz|3l7*ImzB<@3mK%bFKvI>1gcP$-WbTK)p+UJ>w4BRYiyDOXKvf#Ig zYzPDo0nrzHN=}$?ggh(i239`W7t&0-4vXlUnZ+liHO*uxkSsJQ10Qx}8D^Ww3GxZ**9@^b ztc6U@u{p*u`z1;BdIFZsn0M5=$!C-t==LK*Y3AEiNw3t=t0snp#?V z3T>JVtgVl^-3$&64sRIk6e%4%UP{Uh+Q#Jg{mVyXw#1U9TMeOH@iLxS`j;<{xs{^= z)^E=ayvhC;V!BXURK3e8 z>XrQ)QQ1P4+1%xEN|J)VPbH;Hprq1ujl52VJrpgpD=Ma2z0^+dGNS63zsODFnh-YJ zxA|4@)F~7?Iy&0+0dqMa+7p8wmsJuF+!F&bU+3(!`y+ zcFmGpY9&(I?QCppq9Y=%+uCm5zMa1jPRWi#${7{baGg7>K@!t{B{MUVzcE_WlD&{+ zwEk&PnBr!?qodP`CKk@$sN7Y$)k^sxRlD*OU6`u+$jsZje8o>eSWK*xSM_0{VKvRF zJg9adRKrsaI~-y>&z{x7VF!u@ZDU9d9j}JdM8}y4T3H z+(O24I#P~13|!Of)ToDyp|P<*K0&yY#8uovp$bV$o9bkUzuwYb>*(mfmz9+nEsG3p zCM)=x2^;0;!9s~-nMl$5PpDtOl{gQvm$ZBv zspCWQ@$vCCTLr9);i-w(u*${?PYM#9Ac@sCG>l^B;80a(T1xks&lRotc@5nK-ou5e zU8$}7@hc8^P^8F|6ftyDTU(!ayWH~=8lkUJQ(=d?5cEQ)PWAl!K1#CCh129i`!3Bm z5SUT7<_6y`5%Mgv=WEt<0&1<-mS($K;>7vT?&B@t$RSUH6=8<;%|}l6^&A zleKMRgus+Co)^28!%X|TK*jzhFMnX^b(4j+F`T54@&p()}S(_`e zlEOxnJeK@sR!XI#(>^iY6Ph1(vIT#?s;X))%V_O%R`vjAec)J>@k5b_sHj7zv$|YI z(hoWZ+O;JfJsUXPlbO3W-M$_FbS`W8g7d9hk*!rq{%nKd=FR@=`;Q$XPx)lzb{V~! zBo@`&o*gXj{_*1nrUS1$?s~3e%EQdZr($ek!ra^2J0WH3N3)oSloVlgdEVvBnKQF8 z4(kE6BIYG6;KirToar2NE`?Ae_T`#yvzeZr&cWk(^y*;_b@hjk@zPuKMT#XA2RFH8 zy;^Kr<84G^njx8ChpW6H+`uV&7$FA%@RM{0MYYW8)=L(>RD^NMMEr2I)-P zx0P^_2??6p>4xqn^Y055aE>M4=aTm+Zfa_ZeD+L`&R5>X|Ef;T_&e?o8;UNuhBF}c z#Usjs=yzx%5WlZQh7s zQo6J;i)ZOnpo*)o4&7ajv(M#1@Sy05S>dx(<~vsWO7`>!CHpUlOQ&xmnFi?Kt^LGP z)()e})LD4)q|MSv2M348!NHxC^EDi(t=!V#oeaiWT2B<94&leZMf0v*yXMiz7o!(E z^!0g|g1)kHkZA3?+sFF)5(@v_4u(62cq%n#gJBhPL zc8R7$oeb$D9S#Y{ND<45p7nsh5P|^|f?I<(A5rJYos6?ksfoTdOBM(O0fPyjp z{r1c|renp$#VGf4oPDJ()|IQ%*-)vmycB8gAL&Crlw8_f&5IWc6B9YtW{TSH_F0>m zITDG)XdLdEPDXcL*_WN9a(BB6NxcLDsVPbryExf7?p4`3FFlmUVDz7{c!k{$rVFG!=yI6Wb^)5EiEkuyXA_-E=_G5troSkfPZS?Y;0}g zJ;YHBLTv**u(+&A&HG2-6cB8Sbzsc!R}H6%Zcwq@wXUS_8*CP?L0pOfRlQEtbtA7IKYpxqw3h5buyEJTCSfs{VrlpB z`yvs^$e72D8VKm z9jMd2S$TQUP%NO1LS8sj7|NpXQwbdG$BN%TsY^;%SC_})4Lq39p5RR1JSnM8nef1v9 zWdJM5$`V@H2!QNh5Ab63^F5Zu{_A0$?eEev8b5qc(=GC?{`P(sf8$G?Bu86Yf|YMB zdZ(PTAEa0<9IPuYj`-xLxE2l|BvW5_c=%Nuru(HfFGWm9Xypr3rJVx|9@SHumdH@nTn1auNl zqrFBRurZE$F!-8*KN`EUyXJad`K1W?++p=6 zM^eF|@!kMO34of;{c*{4oisqU@2m|Bgsom=V&OIbhpn>8uYYp%IfN%#-_5Ns;73G? zJ=9!)f?dI^0w}K;lNT>vCR0l+MUAtYIXE~B&CRp(YgUDB5F-UI)BI$%zd+S@d9F8F z#C)+)AZ47XD<0vxm+W--;6aA!c1+iz)dEZ4 zPt{LrEiV(a(L#cP%%;oDVzr!Q=-F2SDSrA?Dz)N!JqP$s&$Y?6*fXlSa^KZ>PO@;z z9XVj(QnO;)QA@r(x(7|(D!YfwH80h{6+3kELzrh46kLM15*fDF?1B8iS1)%Hiaf2gGPyhvTO();D!<}1wQwR9Wv3?#oNnGMfW;C=>K@HP zr0*uSHyjHbM4AGD$Tcmh4?U*ntdP>a`8_PqL`NqyE{=8+N&Nio9(Jh0bLk_SwTZuf zHEjYo>6y%oxm{#ux7Mv!cft?;4p(_H*-UGCY`%^Eu@+9 z3#7dL6TU$0u(@%gAIGP8m%d0m)xoyJZ{^3^b;XS--4ehT&8@9(=(aJ^7X0GH3*wiL zA@}I3GyOb0-?XMEl4-2Nxs(KK;%Z93ssnzo;Cch5FUNG;t^AaPMDKWOf*tsP$lN1f zQxG}ZH+3K_KtknJbbjqVq0`*lT%>%DF|KapbVj!WB=_i)6caz}SCEEaMcLJSEg=--kv6FVS3o6RV< z9iJCuucFI}k734_E~DrWgT!!}yqBtA5F{)Z-|+ zJFX0=!EK|?xa%zM_XA?t7s`WDZl^Ea{^z?vt^ELW_T7cAF(dAu0NldEsSMa;WCwtk z9U6c|l+FQ~K>Yc28hF7YY2V;E!u&s<0>ZiDs%8-KVkg4G?&QN=>h!FC@qYM-27vzc z`i-GzIO<=ne-PMTNbL9PZvaIDQU7}Z=%N9yf4^W$G;sI#rB-n}3-1K}c)vwlT!;}d z>F|3(gi6s`@uL0Vzn}1X#v*}H3P0RSJIY8$_iM#}udww(9S;xeuygmlJ2aH|ABu-< z`qh2=;F0zZm6d)?NSo|VTX0wp*Zfr2d2h@v1mMplM+d*K_tmS~2LJcLsI&hvSFkN@@P9kPi9LUt%XZ?l+dl^XJ%c*CdK*1J?Em*j zHF4Tw|MN`u#fQ@j4M+Ivl>R;;8k+xoN{CbB5cRDb?2g3=89?(7HVXYgb zQHcOU+U-xL&1vlDq8skYKr<;XZHAy-zjib!`6PLk|4HI@girka;iI=vyAbzn4W>dr zKaYXX`lWyQsIwdb!>AwPZiOwOzjZd#W)VVw?J$>(mydYU#_(61v8RKfJ*j_=<3Y&| zU;o;93buGDQ+V4mjUvQ8uH&m)Ze3jRwQV^O+$Vq0ng7_!J?uGk#5dKDS3ydao|pDY zxe5%f%9?S*9>j&toTXWK>6w)nJay&}?*%bd#J=8C^uAIlY zC@qd0V)`c@eg%}0ZoLU3*t+B0XQbS(Oc88#GFb@G5%Io=*&0nJuZ_SjGXup^nr8)< zzB4S)(ZiVgXt3huaYX0yslx6<6Y|x%YBu(pdZ~lS5it=5CRe1|5;M-RrL88}`s$q3 zQR6x5lTx+Dkm?;ecf}jEd$A>fShPp)J?nj27D_NZ%nq?L=}+IPwqdLTR#vmRldS#i z`laC zQf5@${l?N`h}FKOd6jcAKuWClK2l|~_A7uAkx@zxke!}>Kd~?suEE{O7h{p8;J-SF z(-iGI5hi!MmaMC)T)8bWNOgzI%c^dJ{PGiiQ!ip7V`4Huvb0*0@=|kl&a?9S{_*ex z@T7&rjmag-&Iw-m)>jVw;gcheju~CQ{v2?^OBTg-JpeMR;|VT{gYNAPUFqmchHL<% zvS9Ri>MY5a_J5runHR>^{)YZ*OTD|qs_#NLnG-xs-Ce9QmE5yvhzIvUJf2Rwl3rc zL=JGFzN2Fnh?LI(FF208e*lbNFVWVwSrSVa{XQ9O?i@~)LtV?%b}4%J7=lC)J;-O2q;al zNZjiS|y`r86NQFL5t4pXPEYmLsz8@>km@|Jv%mGwFeS#h{jbprBs z38+rH{zLb3pfwE_P2rj2618~xNn{6#ET5BKyZ5va6%5H-rKfhfa@>^*2St8o;p+#df zGjx)04Wr;5`U#$p9LJYa3ibzT;jT?Cb~G*w_jcv0SBJ zzuo{03xBYRx9joo?7(;gL9GG#C zO@r#P)x(R69_X&M`PyS1%JvGL#TerwvR*mJsVHMB=6Ler{F&?Zu1lj#EPDImf6_hW zkkSdO z?b${ z0q|Tvq^k=lTc^+!Q!f+jPfuQ|*7ZpX=XE4IEY&|G4v@JxII>$4q=coUj6ru)$7-NArNUb8R#qY|Dcyv?qH~Gf8wlB`9{}jG$?Ex0qa`|Qx5b>A@4d+ zv}O&E>z=L`n!Ww~{n%7hp7Zv;XDX}_X>zDK(=yl8=u@U{eH7=Zv!rnA($!ST!&rO< zGeSAuYPP4R$9}5o1uk8}sZZ|=fDj(enC2J2iFI*bsXnUFYyaNNxx2aSWw&&t-EW=L zR~U*JZD}_)Hg*D~6U4<%aE5K~0%!Wq4BZ}m3SF5lxIwKXZ{*dUR4Ss z{xHMMv}j%h-Cch3=O}+;VNub&rav1u+fp19w3FqCAd7YQBqEJmj`=T! zLtkP5$gc~nn^XRAg+{Yv4Wv{b?k=EF(iJ}%CDqi_goNZe@?MEpRV63u`uPqtT4de6 z{?VE&PeKxBh(+cW6ExNdB0OZ&!J3{@lI z2K3$R4#g)8)hlkTw7;za#{RN*1&u~?WhH>nBVxa~G)vOPJ>`@>J7f1x-{mGvTiH*v zIwHS|CrjcO?*J4yU4<33+KpKkYL}+iRIosD2kb@+?Ix21!gB29WZMpy6`57G9l8&7q*t`ZKfydPvyl z)vH$*px6faN2K4s&#>ZG^USlar{~j{+j%QrUKHKF_*7oE^`AHQaGukn>3gA^(p{sf z-2*F%nEB8Szt2HT#n(PQ?yGO}a9oqWG{Z7vk`SozSZtks5*^AVd-&%(P<%}sxS>i@ z_45B9uwVwg*yVKk-SjOV#&>NI?*HamCIVC)8@I^Jd|Mgw0;j&D?G+8>BVq{ z?WKv#pb(fqW`p$A{OQwcKF#R+e*RxTA1WRkw4jh{Yk?FpSh|>*_l08QpLX_k5 zl{+G4#h;+#MXIVqiPJP6&^XPYSq_<(LMqL-^r!ZgU`djBrxE);R@f|JK&=6>GYfEs zk%s=8o9|GG2*fra+HV0Ck5{e8iFZSY=j`E-EH2A~QV8yt=|ZkiPHBf`%gviN^@zRM z#uP&Brl($c^wR7@4(AR~-v&6hGa~*F9Xh+u9@0Pb256B0ZCfgwToY8ZoE$A_X=yGq z0+=Kh<~|7y2EAX{4URld>wfWT#o}pFaG3m($)|};sBe>_VTwlJMWF5^3z(b-7{T8EJ4 zT_CDTc+K?V+XGj|Vk#ilp)mcYK>}s;--M(BjrmBV|3a(OYG+sg5_+SH+ge5*`dNE) zo?rbEA{LpHlnWw{5m2u@9~r zc}AXRS@rV`*nYyo-kDruDK+E~p_6!Sf2@?pq@FxvdUgrNgSm__N%GNnZHl9&(>z+1 zJ-%zX_BK3e@9a>eF@#ZP=W`7S+m<8MP>ze)5r60p{irIKA_zer)TfW)xO(k74X7;6 z6|D4R%04tw=^k@)07=#7ORxaFvNv=O80kTUAif!IOA+ z>exQ&>s{P+&O>czHyB5nj6f7Qm}^|bpd#jPR3=x>#zr7Xi#P>Er8x@ z02Bxsl*bN6R^FO7f;Wu2kKiFM077zr-%_luk+*b0Xiq{QJ~IJC_*-=NjUoO;0s3#1 m;2#x;cAq9@e4bfXw0gpE`3zHJ4*bjpfj+OJmZx&%?*9P?e!C(7 literal 0 HcmV?d00001 diff --git a/docs/3.e/debugging.html b/docs/3.e/debugging.html new file mode 100644 index 0000000..9ff561e --- /dev/null +++ b/docs/3.e/debugging.html @@ -0,0 +1,147 @@ + + + + + + +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/3.e/hacking-howto.html b/docs/3.e/hacking-howto.html new file mode 100644 index 0000000..90029de --- /dev/null +++ b/docs/3.e/hacking-howto.html @@ -0,0 +1,890 @@ + + + + + + +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/3.e/i3.html b/docs/3.e/i3.html new file mode 100644 index 0000000..4a3a4e6 --- /dev/null +++ b/docs/3.e/i3.html @@ -0,0 +1,529 @@ + + + + + + +i3: i3(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3 - an improved dynamic, tiling window manager

+
+
+
+

2. SYNOPSIS

+
+

i3 [-a] [-c configfile] [-C] [-d <loglevel>] [-v] [-V]

+
+
+
+

3. OPTIONS

+
+
+
+-a +
+
+

+Disables autostart. +

+
+
+-c +
+
+

+Specifies an alternate configuration file path. +

+
+
+-C +
+
+

+Check the configuration file for validity and exit. +

+
+
+-d +
+
+

+Specifies the debug loglevel. To see the most output, use -d all. +

+
+
+-v +
+
+

+Display version number (and date of the last commit). +

+
+
+-V +
+
+

+Be verbose. +

+
+
+
+
+
+

4. DESCRIPTION

+
+
+

4.1. INTRODUCTION

+

i3 was created because wmii, our favorite window manager at the time, didn’t +provide some features we wanted (multi-monitor done right, for example), had +some bugs, didn’t progress since quite some time and wasn’t easy to hack at all +(source code comments/documentation completely lacking). Still, we think the +wmii developers and contributors did a great job. Thank you for inspiring us to +create i3.

+

Please be aware that i3 is primarily targeted at advanced users and developers.

+
+
+

4.2. IMPORTANT NOTE TO nVidia BINARY DRIVER USERS

+

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:

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

See also docs/multi-monitor for the full explanation.

+
+
+

4.3. TERMINOLOGY

+
+
+Client +
+
+

+A client is X11-speak for a window. +

+
+
+Table +
+
+

+Your workspace is managed using a table. You can move windows around and create +new columns (move a client to the right) or rows (move it to the bottom) +implicitly. +

+

By "snapping" a client in a specific direction, you increase its colspan/rowspan.

+
+
+Container +
+
+

+A container contains a variable number of clients. Each cell of the table is a +container. +

+

Containers can be used in various modes. The default mode is called "default" +and just resizes each client equally so that it fits.

+
+
+Workspace +
+
+

+A workspace is a set of clients (technically speaking, it’s just a table). +Other window managers call this "Virtual Desktops". +

+

In i3, each workspace is assigned to a specific virtual screen. By default, +screen 1 has workspace 1, screen 2 has workspace 2 and so on… However, when you +create a new workspace (by simply switching to it), it’ll be assigned the +screen you are currently on.

+
+
+Output +
+
+

+Using XRandR, you can have an X11 screen spanning multiple real monitors. +Furthermore, you can set them up in cloning mode or with positions (monitor 1 +is left of monitor 2). +

+

i3 uses the RandR API to query which outputs are available and which screens +are connected to these outputs.

+
+
+
+
+
+
+

5. KEYBINDINGS

+
+

Here is a short overview of the default keybindings:

+
+
+j/k/l/; +
+
+

+Direction keys (left, down, up, right). They are on your homerow (see the mark +on your "j" key). Alternatively, you can use the cursor keys. +

+
+
+Mod1+<direction> +
+
+

+Focus window in <direction>. +

+
+
+Mod3+<direction> +
+
+

+Focus container in <direction>. +

+
+
+Mod1+Shift+<direction> +
+
+

+Move window to <direction>. +

+
+
+Mod3+Shift+<direction> +
+
+

+Move container to <direction>. +

+
+
+Mod1+Control+<direction> +
+
+

+Snap container to <direction>. +

+
+
+Mod1+<number> +
+
+

+Switch to workspace <number>. +

+
+
+Mod1+Shift+<number> +
+
+

+Move window to workspace <number>. +

+
+
+Mod1+f +
+
+

+Toggle fullscreen mode. +

+
+
+Mod1+h +
+
+

+Enable stacking layout for the current container. +

+
+
+Mod1+e +
+
+

+Enable default layout for the current container. +

+
+
+Mod1+Shift+Space +
+
+

+Toggle tiling/floating for the current window. +

+
+
+Mod1+t +
+
+

+Select the first tiling window if the current window is floating and vice-versa. +

+
+
+Mod1+Shift+q +
+
+

+Kills the current window. This is equivalent to "clicking on the close button", +meaning a polite request to the application to close this window. For example, +Firefox will save its session upon such a request. If the application does not +support that, the window will be killed and it depends on the application what +happens. +

+
+
+Mod1+Shift+r +
+
+

+Restarts i3 in place (without losing any windows, but at this time, the layout +and placement of windows is not retained). +

+
+
+Mod1+Shift+e +
+
+

+Exits i3. +

+
+
+
+
+
+

6. FILES

+
+
+

6.1. ~/.i3/config (or ~/.config/i3/config)

+

When starting, i3 looks for configuration files in the following order:

+
    +
  1. +

    +~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set) +

    +
  2. +
  3. +

    +/etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set) +

    +
  4. +
  5. +

    +~/.i3/config +

    +
  6. +
  7. +

    +/etc/i3/config +

    +
  8. +
+

You can specify a custom path using the -c option.

+
+
Sample configuration
+
+
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# Start terminal (Mod1+Enter)
+bind Mod1+36 exec /usr/bin/urxvt
+
+# Start dmenu (Mod1+v)
+bind Mod1+55 exec /usr/bin/dmenu_run
+
+# Kill current client (Mod1+Shift+q)
+bind Mod1+Shift+24 kill
+
+# Beamer on/off
+bind Mod1+73 exec /home/michael/toggle_beamer.sh
+
+# Screen locking
+bind Mod1+68 exec /usr/bin/i3lock
+
+# Restart i3 inplace (Mod1+Shift+r)
+bind Mod1+Shift+27 restart
+
+# Exit i3 (Mod1+Shift+e)
+bind Mod1+Shift+26 exit
+
+# Brightness
+bind Mod1+97 exec sudo sh -c "echo up > /proc/acpi/ibm/brightness"
+bind Mod1+103 exec sudo sh -c "echo down > /proc/acpi/ibm/brightness"
+
+# Fullscreen (Mod1+f)
+bind Mod1+41 f
+
+# Stacking (Mod1+h)
+bind Mod1+43 s
+
+# Default (Mod1+e)
+bind Mod1+26 d
+
+# Toggle tiling/floating of the current window (Mod1+Shift+Space)
+bind Mod1+Shift+65 t
+
+# Go into the tiling layer / floating layer, depending on whether
+# the current window is tiling / floating (Mod1+t)
+bind Mod1+28 focus ft
+
+# Focus (Mod1+j/k/l/;)
+bind Mod1+44 h
+bind Mod1+45 j
+bind Mod1+46 k
+bind Mod1+47 l
+
+# Focus Container (Mod3+j/k/l/;)
+bind Mod3+44 wch
+bind Mod3+45 wcj
+bind Mod3+46 wck
+bind Mod3+47 wcl
+
+# Snap (Mod1+Control+j/k/l/;)
+bind Mod1+Control+44 sh
+bind Mod1+Control+45 sj
+bind Mod1+Control+46 sk
+bind Mod1+Control+47 sl
+
+# Move (Mod1+Shift+j/k/l/;)
+bind Mod1+Shift+44 mh
+bind Mod1+Shift+45 mj
+bind Mod1+Shift+46 mk
+bind Mod1+Shift+47 ml
+
+# Move Container (Mod3+Shift+j/k/l/;)
+bind Mod3+Shift+44 wcmh
+bind Mod3+Shift+45 wcmj
+bind Mod3+Shift+46 wcmk
+bind Mod3+Shift+47 wcml
+
+# Workspaces
+bind Mod1+10 1
+bind Mod1+11 2
+...
+
+# Move to Workspace
+bind Mod1+Shift+10 1
+bind Mod1+Shift+11 2
+...
+
+
+
+

6.2. ~/.xsession

+

This file is where you should configure your locales and start i3. It is run by +your login manager (xdm, slim, gdm, …) as soon as you login.

+
+
Sample xsession
+
+
# Disable DPMS turning off the screen
+xset dpms force on
+xset s off
+
+# Disable bell
+xset -b
+
+# Enable zapping (C-A-<Bksp> kills X)
+setxkbmap -option terminate:ctrl_alt_bksp
+
+# Enforce correct locales from the beginning
+unset LC_COLLATE
+export LC_CTYPE=de_DE.UTF-8
+export LC_TIME=de_DE.UTF-8
+export LC_NUMERIC=de_DE.UTF-8
+export LC_MONETARY=de_DE.UTF-8
+export LC_MESSAGES=C
+export LC_PAPER=de_DE.UTF-8
+export LC_NAME=de_DE.UTF-8
+export LC_ADDRESS=de_DE.UTF-8
+export LC_TELEPHONE=de_DE.UTF-8
+export LC_MEASUREMENT=de_DE.UTF-8
+export LC_IDENTIFICATION=de_DE.UTF-8
+
+# Use XToolkit in java applications
+export AWT_TOOLKIT=XToolkit
+
+# Set background color
+xsetroot -solid "#333333"
+
+# Enable core dumps in case something goes wrong
+ulimit -c unlimited
+
+# Start i3 and log to ~/.i3/logfile
+echo "Starting at $(date)" >> ~/.i3/logfile
+exec /usr/bin/i3 -V -d all >> ~/.i3/logfile
+
+
+
+
+
+

7. TODO

+
+

There is still lot of work to do. Please check our bugtracker for up-to-date +information about tasks which are still not finished.

+
+
+
+

8. SEE ALSO

+
+

You should have a copy of the userguide (featuring nice screenshots/graphics +which is why this is not integrated into this manpage), the debugging guide, +and the "how to hack" guide. If you are building from source, run: + make -C docs

+

You can also access these documents online at http://i3.zekjur.net/

+

i3-input(1), i3-msg(1), i3-wsbar(1)

+
+
+
+

9. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/3.e/i3status.html b/docs/3.e/i3status.html new file mode 100644 index 0000000..0860168 --- /dev/null +++ b/docs/3.e/i3status.html @@ -0,0 +1,372 @@ + + + + + + +i3: i3status(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3status - Generates a status line for dzen2 or xmobar

+
+
+
+

2. SYNOPSIS

+
+

i3status [-c configfile] [-h] [-v]

+
+
+
+

3. OPTIONS

+
+
+
+-c +
+
+

+Specifies an alternate configuration file path. By default, i3status looks for +configuration files in the following order: +

+
    +
  1. +

    +~/.i3status.conf +

    +
  2. +
  3. +

    +~/.config/i3status/config (or $XDG_CONFIG_HOME/i3status/config if set) +

    +
  4. +
  5. +

    +/etc/i3status.conf +

    +
  6. +
  7. +

    +/etc/xdg/i3status/config (or $XDG_CONFIG_DIRS/i3status/config if set) +

    +
  8. +
+
+
+
+
+
+

4. DESCRIPTION

+
+

i3status is a small program (about 1500 SLOC) for generating a status bar for +i3bar, dzen2, xmobar or similar programs. It is designed to be very +efficient by issuing a very small number of system calls, as one generally +wants to update such a status line every second. This ensures that even under +high load, your status bar is updated correctly. Also, it saves a bit of energy +by not hogging your CPU as much as spawning the corresponding amount of shell +commands would.

+
+
+
+

5. CONFIGURATION

+
+

Since version 2, the configuration file for i3status will be parsed using +libconfuse. This makes configuration easier in the programmer’s point of +view and more flexible for the user at the same time.

+

The basic idea of i3status is that you can specify which "modules" should +be used (the order directive). You can then configure each module with its +own section. For every module, you can specify the output format. See below +for a complete reference.

+
+
Sample configuration
+
+
general {
+        output_format = "dzen2"
+        colors = true
+        interval = 5
+}
+
+order  = "ipv6"
+order += "disk /"
+order += "run_watch DHCP"
+order += "run_watch VPN"
+order += "wireless wlan0"
+order += "ethernet eth0"
+order += "battery 0"
+order += "cpu_temperature 0"
+order += "load"
+order += "time"
+
+wireless wlan0 {
+        format_up = "W: (%quality at %essid, %bitrate) %ip"
+        format_down = "W: down"
+}
+
+ethernet eth0 {
+        # if you use %speed, i3status requires the cap_net_admin capability
+        format_up = "E: %ip (%speed)"
+        format_down = "E: down"
+}
+
+battery 0 {
+        format = "%status %percentage %remaining"
+}
+
+run_watch DHCP {
+        pidfile = "/var/run/dhclient*.pid"
+}
+
+run_watch VPN {
+        pidfile = "/var/run/vpnc/pid"
+}
+
+time {
+        format = "%Y-%m-%d %H:%M:%S"
+}
+
+load {
+        format = "%5min"
+}
+
+cpu_temperature 0 {
+        format = "T: %degrees °C"
+        path = "/sys/devices/platform/coretemp.0/temp1_input"
+}
+
+disk "/" {
+        format = "%free"
+}
+
+
+

5.1. General

+

The colors directive will disable all colors if you set it to false. You can +also specify the colors that will be used to display "good", "degraded" or "bad" +values using the color_good, color_degraded or color_bad directives, +respectively. Those directives are only used if color support is not disabled by +the colors directive. The input format for color values is the canonical RGB +hexadecimal triplet (with no separators between the colors), prefixed by a hash +character ("#").

+

Example configuration:

+
+
+
color_good = "#00FF00"
+
+

Likewise, you can use the color_separator directive to specify the color that +will be used to paint the separator bar. The separator is always output in +color, even when colors are disabled by the colors directive.

+

The interval directive specifies the time in seconds for which i3status will +sleep before printing the next status line.

+

Using output_format you can chose which format strings i3status should +use in its output. Currently available are:

+
+
+dzen2 +
+
+

+Dzen is a general purpose messaging, notification and menuing program for X11. +It was designed to be scriptable in any language and integrate well with window +managers like dwm, wmii and xmonad though it will work with any windowmanger +

+
+
+xmobar +
+
+

+xmobar is a minimalistic, text based, status bar. It was designed to work +with the xmonad Window Manager. +

+
+
+none +
+
+

+Does not use any color codes. Separates values by the pipe symbol. This should +be used with i3bar and can be used for custom scripts. +

+
+
+
+
+

5.2. IPv6

+

This module gets the IPv6 address used for outgoing connections (that is, the +best available public IPv6 address on your computer).

+

Example format_up: %ip

+

Example format_down no IPv6

+
+
+

5.3. Disk

+

Gets used, free, available and total amount of bytes on the given mounted filesystem.

+

Example order: disk /mnt/usbstick

+

Example format: %free (%avail)/ %total

+
+
+

5.4. Run-watch

+

Expands the given path to a pidfile and checks if the process ID found inside +is valid (that is, if the process is running). You can use this to check if +a specific application, such as a VPN client or your DHCP client is running.

+

Example order: run_watch DHCP

+
+
+

5.5. Wireless

+

Gets the link quality and ESSID of the given wireless network interface. You +can specify different format strings for the network being connected or not +connected.

+

Example order: wireless wlan0

+

Example format: W: (%quality at %essid, %bitrate) %ip

+
+
+

5.6. Ethernet

+

Gets the IP address and (if possible) the link speed of the given ethernet +interface. Getting the link speed requires the cap_net_admin capability. Set +it using setcap cap_net_admin=ep $(which i3status).

+

Example order: ethernet eth0

+

Example format: E: %ip (%speed)

+
+
+

5.7. Battery

+

Gets the status (charging, discharging, running), percentage and remaining +time of the given battery. If you want to use the last full capacity instead +of the design capacity (when using the design capacity, it may happen that +your battery is at 23% when fully charged because it’s old. In general, I +want to see it this way, because it tells me how worn off my battery is.), +just specify last_full_capacity = true.

+

Example order: battery 0

+

Example format: %status %remaining

+
+
+

5.8. CPU-Temperature

+

Gets the temperature of the given thermal zone.

+

Example order: cpu_temperature 0

+

Example format: T: %degrees °C

+
+
+

5.9. CPU Usage

+

Gets the percentual CPU usage from /proc/stat.

+

Example order: cpu_usage

+

Example format: %usage

+
+
+

5.10. Load

+

Gets the system load (number of processes waiting for CPU time in the last +5, 10 and 15 minutes).

+

Example order: load

+

Example format: %5min %10min %15min

+
+
+

5.11. Time

+

Formats the current system time. See strftime(3) for the format.

+

Example order: time

+

Example format: %Y-%m-%d %H:%M:%S

+
+
+

5.12. DDate

+

Outputs the current discordian date in user-specified format. See ddate(1) for +details on the format string. +Note: Neither %. nor %X are implemented yet.

+

Example order: ddate

+

Example format: %{%a, %b %d%}, %Y%N - %H

+
+
+

5.13. Volume

+

Outputs the volume of the specified mixer on the specified device. Works only +on Linux because it uses ALSA.

+

Example order: volume master

+

Example format: ♪: %volume

+

Example configuration:

+
+
+
volume master {
+        format = "♪: %volume"
+        device = "default"
+        mixer = "Master"
+        mixer_idx = 0
+}
+
+
+
+
+
+

6. Using i3status with dzen2

+
+

After installing dzen2, you can directly use it with i3status. Just ensure that +output_format is set to dzen2.

+

Example for usage of i3status with dzen2:

+
+
+
i3status | dzen2 -fg white -ta r -w 1280 \
+-fn "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso8859-1"
+
+
+
+
+

7. Using i3status with xmobar

+
+

To get xmobar to start, you might need to copy the default configuration +file to ~/.xmobarrc. Also, ensure that the output_format option for i3status +is set to xmobar.

+

Example for usage of i3status with xmobar:

+
+
+
i3status | xmobar -o -t "%StdinReader%" -c "[Run StdinReader]"
+
+
+
+
+

8. SEE ALSO

+
+

strftime(3), date(1), glob(3), dzen2(1), xmobar(1)

+
+
+
+

9. AUTHORS

+
+

Michael Stapelberg and contributors

+

Thorsten Toepper

+

Baptiste Daroussin

+

Axel Wagner

+

Fernando Tarlá Cardoso Lemos

+
+
+
+

+ + + diff --git a/docs/3.e/ipc.html b/docs/3.e/ipc.html new file mode 100644 index 0000000..88b13b7 --- /dev/null +++ b/docs/3.e/ipc.html @@ -0,0 +1,529 @@ + + + + + + +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/3.e/keyboard-layer1.png b/docs/3.e/keyboard-layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..88268f7b45974b6f0a07af641c1b028180a733ce GIT binary patch literal 43543 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ℜydEyG6E>khdAn%e4DFZ^tvn-Fa7 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 aWtz0xFJgss1lTF~N9CC2(PV{-xBo9yFUpz# literal 0 HcmV?d00001 diff --git a/docs/3.e/keyboard-layer2.png b/docs/3.e/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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 nSye<>*p8U^^|na + + + + +i3: i3(1) + + + + + + + +

+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3 - an improved dynamic, tiling window manager

+
+
+
+

2. SYNOPSIS

+
+

i3 [-a] [-c configfile] [-C] [-d <loglevel>] [-v] [-V]

+
+
+
+

3. OPTIONS

+
+
+
+-a +
+
+

+Disables autostart. +

+
+
+-c +
+
+

+Specifies an alternate configuration file path. +

+
+
+-C +
+
+

+Check the configuration file for validity and exit. +

+
+
+-d +
+
+

+Specifies the debug loglevel. To see the most output, use -d all. +

+
+
+-v +
+
+

+Display version number (and date of the last commit). +

+
+
+-V +
+
+

+Be verbose. +

+
+
+
+
+
+

4. DESCRIPTION

+
+
+

4.1. INTRODUCTION

+

i3 was created because wmii, our favorite window manager at the time, didn’t +provide some features we wanted (multi-monitor done right, for example), had +some bugs, didn’t progress since quite some time and wasn’t easy to hack at all +(source code comments/documentation completely lacking). Still, we think the +wmii developers and contributors did a great job. Thank you for inspiring us to +create i3.

+

Please be aware that i3 is primarily targeted at advanced users and developers.

+
+
+

4.2. IMPORTANT NOTE TO nVidia BINARY DRIVER USERS

+

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:

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

See also docs/multi-monitor for the full explanation.

+
+
+

4.3. TERMINOLOGY

+
+
+Client +
+
+

+A client is X11-speak for a window. +

+
+
+Table +
+
+

+Your workspace is managed using a table. You can move windows around and create +new columns (move a client to the right) or rows (move it to the bottom) +implicitly. +

+

By "snapping" a client in a specific direction, you increase its colspan/rowspan.

+
+
+Container +
+
+

+A container contains a variable number of clients. Each cell of the table is a +container. +

+

Containers can be used in various modes. The default mode is called "default" +and just resizes each client equally so that it fits.

+
+
+Workspace +
+
+

+A workspace is a set of clients (technically speaking, it’s just a table). +Other window managers call this "Virtual Desktops". +

+

In i3, each workspace is assigned to a specific virtual screen. By default, +screen 1 has workspace 1, screen 2 has workspace 2 and so on… However, when you +create a new workspace (by simply switching to it), it’ll be assigned the +screen you are currently on.

+
+
+Output +
+
+

+Using XRandR, you can have an X11 screen spanning multiple real monitors. +Furthermore, you can set them up in cloning mode or with positions (monitor 1 +is left of monitor 2). +

+

i3 uses the RandR API to query which outputs are available and which screens +are connected to these outputs.

+
+
+
+
+
+
+

5. KEYBINDINGS

+
+

Here is a short overview of the default keybindings:

+
+
+j/k/l/; +
+
+

+Direction keys (left, down, up, right). They are on your homerow (see the mark +on your "j" key). Alternatively, you can use the cursor keys. +

+
+
+Mod1+<direction> +
+
+

+Focus window in <direction>. +

+
+
+Mod3+<direction> +
+
+

+Focus container in <direction>. +

+
+
+Mod1+Shift+<direction> +
+
+

+Move window to <direction>. +

+
+
+Mod3+Shift+<direction> +
+
+

+Move container to <direction>. +

+
+
+Mod1+Control+<direction> +
+
+

+Snap container to <direction>. +

+
+
+Mod1+<number> +
+
+

+Switch to workspace <number>. +

+
+
+Mod1+Shift+<number> +
+
+

+Move window to workspace <number>. +

+
+
+Mod1+f +
+
+

+Toggle fullscreen mode. +

+
+
+Mod1+h +
+
+

+Enable stacking layout for the current container. +

+
+
+Mod1+e +
+
+

+Enable default layout for the current container. +

+
+
+Mod1+Shift+Space +
+
+

+Toggle tiling/floating for the current window. +

+
+
+Mod1+t +
+
+

+Select the first tiling window if the current window is floating and vice-versa. +

+
+
+Mod1+Shift+q +
+
+

+Kills the current window. This is equivalent to "clicking on the close button", +meaning a polite request to the application to close this window. For example, +Firefox will save its session upon such a request. If the application does not +support that, the window will be killed and it depends on the application what +happens. +

+
+
+Mod1+Shift+r +
+
+

+Restarts i3 in place (without losing any windows, but at this time, the layout +and placement of windows is not retained). +

+
+
+Mod1+Shift+e +
+
+

+Exits i3. +

+
+
+
+
+
+

6. FILES

+
+
+

6.1. ~/.i3/config (or ~/.config/i3/config)

+

When starting, i3 looks for configuration files in the following order:

+
    +
  1. +

    +~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set) +

    +
  2. +
  3. +

    +/etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set) +

    +
  4. +
  5. +

    +~/.i3/config +

    +
  6. +
  7. +

    +/etc/i3/config +

    +
  8. +
+

You can specify a custom path using the -c option.

+
+
Sample configuration
+
+
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# Start terminal (Mod1+Enter)
+bind Mod1+36 exec /usr/bin/urxvt
+
+# Start dmenu (Mod1+v)
+bind Mod1+55 exec /usr/bin/dmenu_run
+
+# Kill current client (Mod1+Shift+q)
+bind Mod1+Shift+24 kill
+
+# Beamer on/off
+bind Mod1+73 exec /home/michael/toggle_beamer.sh
+
+# Screen locking
+bind Mod1+68 exec /usr/bin/i3lock
+
+# Restart i3 inplace (Mod1+Shift+r)
+bind Mod1+Shift+27 restart
+
+# Exit i3 (Mod1+Shift+e)
+bind Mod1+Shift+26 exit
+
+# Brightness
+bind Mod1+97 exec sudo sh -c "echo up > /proc/acpi/ibm/brightness"
+bind Mod1+103 exec sudo sh -c "echo down > /proc/acpi/ibm/brightness"
+
+# Fullscreen (Mod1+f)
+bind Mod1+41 f
+
+# Stacking (Mod1+h)
+bind Mod1+43 s
+
+# Default (Mod1+e)
+bind Mod1+26 d
+
+# Toggle tiling/floating of the current window (Mod1+Shift+Space)
+bind Mod1+Shift+65 t
+
+# Go into the tiling layer / floating layer, depending on whether
+# the current window is tiling / floating (Mod1+t)
+bind Mod1+28 focus ft
+
+# Focus (Mod1+j/k/l/;)
+bind Mod1+44 h
+bind Mod1+45 j
+bind Mod1+46 k
+bind Mod1+47 l
+
+# Focus Container (Mod3+j/k/l/;)
+bind Mod3+44 wch
+bind Mod3+45 wcj
+bind Mod3+46 wck
+bind Mod3+47 wcl
+
+# Snap (Mod1+Control+j/k/l/;)
+bind Mod1+Control+44 sh
+bind Mod1+Control+45 sj
+bind Mod1+Control+46 sk
+bind Mod1+Control+47 sl
+
+# Move (Mod1+Shift+j/k/l/;)
+bind Mod1+Shift+44 mh
+bind Mod1+Shift+45 mj
+bind Mod1+Shift+46 mk
+bind Mod1+Shift+47 ml
+
+# Move Container (Mod3+Shift+j/k/l/;)
+bind Mod3+Shift+44 wcmh
+bind Mod3+Shift+45 wcmj
+bind Mod3+Shift+46 wcmk
+bind Mod3+Shift+47 wcml
+
+# Workspaces
+bind Mod1+10 1
+bind Mod1+11 2
+...
+
+# Move to Workspace
+bind Mod1+Shift+10 1
+bind Mod1+Shift+11 2
+...
+
+
+
+

6.2. ~/.xsession

+

This file is where you should configure your locales and start i3. It is run by +your login manager (xdm, slim, gdm, …) as soon as you login.

+
+
Sample xsession
+
+
# Disable DPMS turning off the screen
+xset dpms force on
+xset s off
+
+# Disable bell
+xset -b
+
+# Enable zapping (C-A-<Bksp> kills X)
+setxkbmap -option terminate:ctrl_alt_bksp
+
+# Enforce correct locales from the beginning
+unset LC_COLLATE
+export LC_CTYPE=de_DE.UTF-8
+export LC_TIME=de_DE.UTF-8
+export LC_NUMERIC=de_DE.UTF-8
+export LC_MONETARY=de_DE.UTF-8
+export LC_MESSAGES=C
+export LC_PAPER=de_DE.UTF-8
+export LC_NAME=de_DE.UTF-8
+export LC_ADDRESS=de_DE.UTF-8
+export LC_TELEPHONE=de_DE.UTF-8
+export LC_MEASUREMENT=de_DE.UTF-8
+export LC_IDENTIFICATION=de_DE.UTF-8
+
+# Use XToolkit in java applications
+export AWT_TOOLKIT=XToolkit
+
+# Set background color
+xsetroot -solid "#333333"
+
+# Enable core dumps in case something goes wrong
+ulimit -c unlimited
+
+# Start i3 and log to ~/.i3/logfile
+echo "Starting at $(date)" >> ~/.i3/logfile
+exec /usr/bin/i3 -V -d all >> ~/.i3/logfile
+
+
+
+
+
+

7. TODO

+
+

There is still lot of work to do. Please check our bugtracker for up-to-date +information about tasks which are still not finished.

+
+
+
+

8. SEE ALSO

+
+

You should have a copy of the userguide (featuring nice screenshots/graphics +which is why this is not integrated into this manpage), the debugging guide, +and the "how to hack" guide. If you are building from source, run: + make -C docs

+

You can also access these documents online at http://i3.zekjur.net/

+

i3-input(1), i3-msg(1), i3-wsbar(1)

+
+
+
+

9. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/3.e/modes.png b/docs/3.e/modes.png new file mode 100644 index 0000000000000000000000000000000000000000..656a6dbb91d284b849aedf214a7c494baf031d16 GIT binary patch literal 5826 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 literal 0 HcmV?d00001 diff --git a/docs/3.e/multi-monitor.html b/docs/3.e/multi-monitor.html new file mode 100644 index 0000000..ee42703 --- /dev/null +++ b/docs/3.e/multi-monitor.html @@ -0,0 +1,108 @@ + + + + + + +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/3.e/refcard.pdf b/docs/3.e/refcard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f1bb36f1035e7dce582238104e20bdbca1dc3b37 GIT binary patch literal 61582 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 + + + + + +i3: Debian and Ubuntu repositories + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. When should you use our repositories?

+
+

In general, you should use the repositories of your distribution. Adding +third-party repositories to your /etc/sources.list has security implications +and makes your apt-get update take longer. However, in some cases, using our +repositories makes sense:

+
+
+You are using Debian stable +
+
+

+ The latest version of i3 will be in Debian testing quite soon. The version + in Debian stable can be old, however (we cannot update it after stable has + been released). The best way is to add Debian testing and tell apt to + prefer Debian stable. You should not use our repository. +

+
+
+You are using Ubuntu +
+
+

+ Only a handful of packages are maintained by Ubuntu developers. The rest is + synchronized periodically from Debian, every 6 months. Therefore, Ubuntu + often includes old versions of i3. You should use our Ubuntu repository. +

+
+
+You want the latest i3 development version +
+
+

+ If you are using Debian (Debian-derived systems might work, too) and want + the latest development version of i3, you should use our Debian repository. +

+
+
+
+
+
+

2. Ubuntu repository

+
+

The Ubuntu repository is provided by sur5r and contains the latest stable release +of i3. To use it, run the following commands:

+
+
+
# echo 'deb http://debian.sur5r.net/i3/ natty universe' >> /etc/apt/sources.list
+# apt-get update
+# apt-get install i3
+
+

The following Ubuntu versions are currently available: lucid, maverick, natty.

+
+
+
+

3. Debian repository

+
+

Our Debian repository contains packages which are automatically built a few +minutes after every commit. To use it, run the following commands:

+
+
+
# echo 'deb http://build.i3wm.org/debian/i3-wm sid main' >> /etc/apt/sources.list
+# apt-get update
+# apt-get install i3-wm
+
+

To ensure that the autobuilt i3 packages will be preferred to the packages of +your distribution, put the following entry at the beginning of your +/etc/apt/preferences:

+
+
+
Package: *
+Pin: origin "build.i3wm.org"
+Pin-Priority: 1001
+
+

Then, install i3-wm.

+
+
+
+

+ + + diff --git a/docs/3.e/single_terminal.png b/docs/3.e/single_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe918cd2089f16a3b72b9291f655b57b0adefbf GIT binary patch literal 3382 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 B=(_*_ literal 0 HcmV?d00001 diff --git a/docs/3.e/stacklimit.png b/docs/3.e/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/3.e/tree-layout1.png b/docs/3.e/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/3.e/tree-migrating.html b/docs/3.e/tree-migrating.html new file mode 100644 index 0000000..9949384 --- /dev/null +++ b/docs/3.e/tree-migrating.html @@ -0,0 +1,269 @@ + + + + + + +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/3.e/tree-shot1.png b/docs/3.e/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/3.e/tree-shot2.png b/docs/3.e/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/3.e/tree-shot3.png b/docs/3.e/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/3.e/two_columns.png b/docs/3.e/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/3.e/two_terminals.png b/docs/3.e/two_terminals.png new file mode 100644 index 0000000000000000000000000000000000000000..20b45acfa66534e8803b4cf454ba44b6d7aba9f0 GIT binary patch literal 4901 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 literal 0 HcmV?d00001 diff --git a/docs/3.e/userguide.html b/docs/3.e/userguide.html new file mode 100644 index 0000000..bfb4d63 --- /dev/null +++ b/docs/3.e/userguide.html @@ -0,0 +1,1128 @@ + + + + + + +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/3.e/wsbar.html b/docs/3.e/wsbar.html new file mode 100644 index 0000000..7a3b822 --- /dev/null +++ b/docs/3.e/wsbar.html @@ -0,0 +1,147 @@ + + + + + + +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/3.e/wsbar.png b/docs/3.e/wsbar.png new file mode 100644 index 0000000000000000000000000000000000000000..0789dec532bea9c358c782f14f6c95a0cece5319 GIT binary patch literal 14339 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 literal 0 HcmV?d00001 diff --git a/docs/4.0/debugging.html b/docs/4.0/debugging.html new file mode 100644 index 0000000..4101fc0 --- /dev/null +++ b/docs/4.0/debugging.html @@ -0,0 +1,153 @@ + + + + + + +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 logs useful information to stdout. To have a clearly defined place where log +files will be saved, you should redirect stdout and stderr in your +~/.xsession. While you’re at it, putting each run of i3 in a separate log +file with date/time in its filename is a good idea to not get confused about +the different log files later on.

+
+
+
exec /usr/bin/i3 >~/i3log-$(date +'%F-%k-%M-%S') 2>&1
+
+

To enable verbose output and all levels of debug output (required when +attaching logfiles to bugreports), add the parameters -V -d all, like this:

+
+
+
exec /usr/bin/i3 -V -d all >~/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 the symbols 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/4.0/hacking-howto.html b/docs/4.0/hacking-howto.html new file mode 100644 index 0000000..382b5c3 --- /dev/null +++ b/docs/4.0/hacking-howto.html @@ -0,0 +1,1046 @@ + + + + + + +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

+
+
+

This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff NOW :).

+
+
+
+
+
+

2. Files

+
+
+
+include/atoms.xmacro +
+
+

+A file containing all X11 atoms which i3 uses. This file will be included +various times (for defining, requesting and receiving the atoms), each time +with a different definition of xmacro(). +

+
+
+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/cmdparse.l +
+
+

+Contains the lexer for i3 commands, written for flex(1). +

+
+
+src/cmdparse.y +
+
+

+Contains the parser for i3 commands, written for bison(1). +

+
+
+src/con.c +
+
+

+Contains all functions which deal with containers directly (creating +containers, searching containers, getting specific properties from containers, +…). +

+
+
+src/config.c +
+
+

+Contains all functions handling the configuration file (calling the parser +(src/cfgparse.y) with the correct path, switching key bindings mode). +

+
+
+src/debug.c +
+
+

+Contains debugging functions to print unhandled X events. +

+
+
+src/ewmh.c +
+
+

+iFunctions to get/set certain EWMH properties easily. +

+
+
+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/load_layout.c +
+
+

+Contains code for loading layouts from JSON files. +

+
+
+src/log.c +
+
+

+Handles the setting of loglevels, contains the logging functions. +

+
+
+src/main.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/match.c +
+
+

+A "match" is a data structure which acts like a mask or expression to match +certain windows or not. For example, when using commands, you can specify a +command like this: [title="Firefox"] kill. The title member of the match +data structure will then be filled and i3 will check each window using +match_matches_window() to find the windows affected by this command. +

+
+
+src/move.c +
+
+

+Contains code to move a container in a specific direction. +

+
+
+src/output.c +
+
+

+Functions to handle CT_OUTPUT cons. +

+
+
+src/randr.c +
+
+

+The RandR API is used to get (and re-query) the configured outputs (monitors, +…). +

+
+
+src/render.c +
+
+

+Renders the tree data structure by assigning coordinates to every node. These +values will later be pushed to X11 in src/x.c. +

+
+
+src/resize.c +
+
+

+Contains the functions to resize containers. +

+
+
+src/sighandler.c +
+
+

+Handles SIGSEGV, SIGABRT and SIGFPE by showing a dialog that i3 crashed. +You can chose to let it dump core, to restart it in-place or to restart it +in-place but forget about the layout. +

+
+
+src/tree.c +
+
+

+Contains functions which open or close containers in the tree, change focus or +cleanup ("flatten") the tree. See also src/move.c for another similar +function, which was moved into its own file because it is so long. +

+
+
+src/util.c +
+
+

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

+
+
+src/window.c +
+
+

+Handlers to update X11 window properties like WM_CLASS, _NET_WM_NAME, +CLIENT_LEADER, etc. +

+
+
+src/workspace.c +
+
+

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

+
+
+src/x.c +
+
+

+Transfers our in-memory tree (see src/render.c) to X11. +

+
+
+src/xcb.c +
+
+

+Contains wrappers to use xcb more easily. +

+
+
+src/xcursor.c +
+
+

+XCursor functions (for cursor themes). +

+
+
+src/xinerama.c +
+
+

+Legacy support for Xinerama. See src/randr.c for the preferred API. +

+
+
+
+
+
+

3. Data structures

+
+
+
+

This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff NOW :).

+
+

So, the hierarchy is:

+
    +
  1. +

    +X11 root window, the root container +

    +
  2. +
  3. +

    +Virtual screens (Screen 0 in this example) +

    +
  4. +
  5. +

    +Content container (there are also containers for dock windows) +

    +
  6. +
  7. +

    +Workspaces (Workspace 1 in this example, with horizontal orientation) +

    +
  8. +
  9. +

    +Split container (vertically split) +

    +
  10. +
  11. +

    +X11 window containers +

    +
  12. +
+

The data type is Con, in all cases.

+
+

3.1. Virtual screens

+

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

+

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

+

However, if you configure it using xrandr --output VGA1 --mode 1024x768 +--right-of LVDS1, 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 name. 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

+
+
+

This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff NOW :).

+
+
+
+

3.4. Container

+
+
+

This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff NOW :).

+
+
+
+

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 +

    +
  • +
  • +

    +“con” names a container +

    +
  • +
  • +

    +“current” is a loop variable when using TAILQ_FOREACH etc. +

    +
  • +
+
+
+
+

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

+
+
    +
  • +

    +Establish the xcb connection +

    +
  • +
  • +

    +Check for XKB extension on the separate X connection, load Xcursor +

    +
  • +
  • +

    +Check for RandR screens (with a fall-back to Xinerama) +

    +
  • +
  • +

    +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 by the cmdparse lexer/parser, see parse_cmd in +src/cmdparse.y.

+
+
+
+
+

8. Manage windows (src/main.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 needs 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_tree() 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())

+
+
+
+

This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff NOW :).

+
+
+
+
+

15. User commands / commandmode (src/cmdparse.{l,y})

+
+
+
+

This section has not been updated for v4.0 yet, sorry! We wanted to release on +time, but we will update this soon. Please talk to us on IRC if you need to +know stuff NOW :).

+
+
+
+
+

16. Moving containers

+
+

The movement code is pretty delicate. You need to consider all cases before +making any changes or before being able to fully understand how it works.

+
+

16.1. Case 1: Moving inside the same container

+

The reference layout for this case is a single workspace in horizontal +orientation with two containers on it. Focus is on the left container (1).

+
+ +++ + + + + + +

1

2

+
+

When moving the left window to the right (command move right), tree_move will +look for a container with horizontal orientation and finds the parent of the +left container, that is, the workspace. Afterwards, it runs the code branch +commented with "the easy case": it calls TAILQ_NEXT to get the container right +of the current one and swaps both containers.

+
+
+

16.2. Case 2: Move a container into a split container

+

The reference layout for this case is a horizontal workspace with two +containers. The right container is a v-split with two containers. Focus is on +the left container (1).

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

1

2

3

+
+

When moving to the right (command move right), i3 will work like in case 1 +("the easy case"). However, as the right container is not a leaf container, but +a v-split, the left container (1) will be inserted at the right position (below +2, assuming that 2 is focused inside the v-split) by calling insert_con_into.

+

insert_con_into detaches the container from its parent and inserts it +before/after the given target container. Afterwards, the on_remove_child +callback is called on the old parent container which will then be closed, if +empty.

+

Afterwards, con_focus will be called to fix the focus stack and the tree will +be flattened.

+
+
+

16.3. Case 3: Moving to non-existant top/bottom

+

Like in case 1, the reference layout for this case is a single workspace in +horizontal orientation with two containers on it. Focus is on the left +container:

+
+ +++ + + + + + +

1

2

+
+

This time however, the command is move up or move down. tree_move will look +for a container with vertical orientation. As it will not find any, +same_orientation is NULL and therefore i3 will perform a forced orientation +change on the workspace by creating a new h-split container, moving the +workspace contents into it and then changing the workspace orientation to +vertical. Now it will again search for parent containers with vertical +orientation and it will find the workspace.

+

This time, the easy case code path will not be run as we are not moving inside +the same container. Instead, insert_con_into will be called with the focused +container and the container above/below the current one (on the level of +same_orientation).

+

Now, con_focus will be called to fix the focus stack and the tree will be +flattened.

+
+
+

16.4. Case 4: Moving to existant top/bottom

+

The reference layout for this case is a vertical workspace with two containers. +The bottom one is a h-split containing two containers (1 and 2). Focus is on +the bottom left container (1).

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

3

1

2

+
+

This case is very much like case 3, only this time the forced workspace +orientation change does not need to be performed because the workspace already +is in vertical orientation.

+
+
+

16.5. Case 5: Moving in one-child h-split

+

The reference layout for this case is a horizontal workspace with two +containers having a v-split on the left side with a one-child h-split on the +bottom. Focus is on the bottom left container (2(h)):

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

1

3

2(h)

+
+

In this case, same_orientation will be set to the h-split container around +the focused container. However, when trying the easy case, the next/previous +container swap will be NULL. Therefore, i3 will search again for a +same_orientation container, this time starting from the parent of the h-split +container.

+

After determining a new same_orientation container (if it is NULL, the +orientation will be force-changed), this case is equivalent to case 2 or case +4.

+
+
+

16.6. Case 6: Floating containers

+

The reference layout for this case is a horizontal workspace with two +containers plus one floating h-split container. Focus is on the floating +container.

+

TODO: nice illustration. table not possible?

+

When moving up/down, the container needs to leave the floating container and it +needs to be placed on the workspace (at workspace level). This is accomplished +by calling the function attach_to_workspace.

+
+
+
+
+

17. Click handling

+
+

Without much ado, here is the list of cases which need to be considered:

+
    +
  • +

    +click to focus (tiling + floating) and raise (floating) +

    +
  • +
  • +

    +click to focus/raise when in stacked/tabbed mode +

    +
  • +
  • +

    +floating_modifier + left mouse button to drag a floating con +

    +
  • +
  • +

    +floating_modifier + right mouse button to resize a floating con +

    +
  • +
  • +

    +click on decoration in a floating con to either initiate a resize (if there + is more than one child in the floating con) or to drag the + floating con (if it’s the one at the top). +

    +
  • +
  • +

    +click on border in a floating con to resize the floating con +

    +
  • +
  • +

    +floating_modifier + right mouse button to resize a tiling con +

    +
  • +
  • +

    +click on border/decoration to resize a tiling con +

    +
  • +
+
+
+
+

18. 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. +

    +
  • +
+
+
+
+

19. 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/4.0/i3-config-wizard.html b/docs/4.0/i3-config-wizard.html new file mode 100644 index 0000000..1389d2f --- /dev/null +++ b/docs/4.0/i3-config-wizard.html @@ -0,0 +1,96 @@ + + + + + + +i3: i3-config-wizard(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3-config-wizard - creates a keysym based config based on your layout

+
+
+
+

2. SYNOPSIS

+
+

i3-config-wizard

+
+
+
+

3. FILES

+
+
+

3.1. /etc/i3/config.keycodes

+

This file contains the default configuration with keycodes. All the bindcode +lines will be transformed to bindsym and the user-specified modifier will be +used.

+
+
+
+
+

4. DESCRIPTION

+
+

i3-config-wizard is started by i3 in its default config, unless /.i3/config +exists. i3-config-wizard creates a keysym based i3 config file (based on +/etc/i3/config.keycodes) in /.i3/config.

+

The advantage of using keysyms is that the config file is easy to read, +understand and modify. However, if we shipped with a keysym based default +config file, the key positions would not be consistent across different +keyboard layouts (take for example the homerow for movement). Therefore, we +ship with a keycode based default config and let the wizard transform it +according to your current keyboard layout.

+
+
+
+

5. SEE ALSO

+
+

i3(1)

+
+
+
+

6. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/4.0/i3-migrate-config-to-v4.html b/docs/4.0/i3-migrate-config-to-v4.html new file mode 100644 index 0000000..e2c31b2 --- /dev/null +++ b/docs/4.0/i3-migrate-config-to-v4.html @@ -0,0 +1,87 @@ + + + + + + +i3: i3-migrate-config-to-v4(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3-migrate-config-to-v4 - migrates your i3 config file

+
+
+
+

2. SYNOPSIS

+
+
+
+
mv ~/.i3/config ~/.i3/old.config
+i3-migrate-config-to-v4 ~/.i3/old.config > ~/.i3/config
+
+
+
+
+

3. DESCRIPTION

+
+

i3-migrate-config-to-v4 is a Perl script which migrates your old (< version 4) +configuration files to a version 4 config file. The most significant changes +are the new commands (see the release notes).

+

This script will automatically be run by i3 when it detects an old config file. +Please migrate your config file as soon as possible. We plan to include this +script in all i3 release until 2012-08-01. Afterwards, old config files will no +longer be supported.

+
+
+
+

4. SEE ALSO

+
+

i3(1)

+
+
+
+

5. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/4.0/i3-msg.html b/docs/4.0/i3-msg.html new file mode 100644 index 0000000..2324fab --- /dev/null +++ b/docs/4.0/i3-msg.html @@ -0,0 +1,100 @@ + + + + + + +i3: i3-msg(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3-msg - send messages to i3 window manager

+
+
+
+

2. SYNOPSIS

+
+

i3-msg "message"

+
+
+
+

3. DESCRIPTION

+
+

i3-msg is a sample implementation for a client using the unix socket IPC +interface to i3. At the moment, it can only be used for sending commands +(like in configuration file for key bindings), but this may change in the +future (staying backwards-compatible, of course).

+
+
+
+

4. EXAMPLE

+
+
+
+
i3-msg "bp" # Use 1-px border for current client
+
+
+
+
+

5. ENVIRONMENT

+
+
+

5.1. I3SOCK

+

If no ipc-socket is specified on the commandline, this variable is used +to determine the path, at wich the unix domain socket is expected, on which +to connect to i3.

+
+
+
+
+

6. SEE ALSO

+
+

i3(1)

+
+
+
+

7. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/4.0/i3-nagbar.html b/docs/4.0/i3-nagbar.html new file mode 100644 index 0000000..64ee27e --- /dev/null +++ b/docs/4.0/i3-nagbar.html @@ -0,0 +1,90 @@ + + + + + + +i3: i3-nagbar(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3-nagbar - displays an error bar on top of your screen

+
+
+
+

2. SYNOPSIS

+
+

i3-nagbar -m message -b label action

+
+
+
+

3. DESCRIPTION

+
+

i3-nagbar is used by i3 to tell you about errors in your configuration file +(for example). While these errors are logged to the logfile (if any), the past +has proven that users are either not aware of their logfile or do not check it +after modifying the configuration file.

+
+
+
+

4. EXAMPLE

+
+
+
+
i3-nagbar -m 'You have an error in your i3 config file!' \
+-b 'edit config' 'xterm $EDITOR ~/.i3/config'
+
+
+
+
+

5. SEE ALSO

+
+

i3(1)

+
+
+
+

6. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/4.0/i3.html b/docs/4.0/i3.html new file mode 100644 index 0000000..1edda79 --- /dev/null +++ b/docs/4.0/i3.html @@ -0,0 +1,527 @@ + + + + + + +i3: i3(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3 - an improved dynamic, tiling window manager

+
+
+
+

2. SYNOPSIS

+
+

i3 [-a] [-c configfile] [-C] [-d <loglevel>] [-v] [-V]

+
+
+
+

3. OPTIONS

+
+
+
+-a +
+
+

+Disables autostart. +

+
+
+-c +
+
+

+Specifies an alternate configuration file path. +

+
+
+-C +
+
+

+Check the configuration file for validity and exit. +

+
+
+-d +
+
+

+Specifies the debug loglevel. To see the most output, use -d all. +

+
+
+-v +
+
+

+Display version number (and date of the last commit). +

+
+
+-V +
+
+

+Be verbose. +

+
+
+
+
+
+

4. DESCRIPTION

+
+
+

4.1. INTRODUCTION

+

i3 was created because wmii, our favorite window manager at the time, didn’t +provide some features we wanted (multi-monitor done right, for example), had +some bugs, didn’t progress since quite some time and wasn’t easy to hack at all +(source code comments/documentation completely lacking). Still, we think the +wmii developers and contributors did a great job. Thank you for inspiring us to +create i3.

+

Please be aware that i3 is primarily targeted at advanced users and developers.

+
+
+

4.2. IMPORTANT NOTE TO nVidia BINARY DRIVER USERS

+

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:

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

See also docs/multi-monitor for the full explanation.

+
+
+

4.3. TERMINOLOGY

+
+
+Tree +
+
+

+i3 keeps your layout in a tree data structure. +

+
+
+Window +
+
+

+An X11 window, like the Firefox browser window or a terminal emulator. +

+
+
+Split container +
+
+

+A split container contains multiple other split containers or windows. +

+

Containers can be used in various layouts. The default mode is called "default" +and just resizes each client equally so that it fits.

+
+
+Workspace +
+
+

+A workspace is a set of containers. Other window managers call this "Virtual +Desktops". +

+

In i3, each workspace is assigned to a specific virtual screen. By default, +screen 1 has workspace 1, screen 2 has workspace 2 and so on… However, when you +create a new workspace (by simply switching to it), it’ll be assigned the +screen you are currently on.

+
+
+Output +
+
+

+Using XRandR, you can have an X11 screen spanning multiple real monitors. +Furthermore, you can set them up in cloning mode or with positions (monitor 1 +is left of monitor 2). +

+

i3 uses the RandR API to query which outputs are available and which screens +are connected to these outputs.

+
+
+
+
+
+
+

5. KEYBINDINGS

+
+

Here is a short overview of the default keybindings:

+
+
+j/k/l/; +
+
+

+Direction keys (left, down, up, right). They are on your homerow (see the mark +on your "j" key). Alternatively, you can use the cursor keys. +

+
+
+Mod1+<direction> +
+
+

+Focus window in <direction>. +

+
+
+Mod1+Shift+<direction> +
+
+

+Move window to <direction>. +

+
+
+Mod1+<number> +
+
+

+Switch to workspace <number>. +

+
+
+Mod1+Shift+<number> +
+
+

+Move window to workspace <number>. +

+
+
+Mod1+f +
+
+

+Toggle fullscreen mode. +

+
+
+Mod1+s +
+
+

+Enable stacking layout for the current container. +

+
+
+Mod1+e +
+
+

+Enable default layout for the current container. +

+
+
+Mod1+w +
+
+

+Enable tabbed layout for the current container. +

+
+
+Mod1+Shift+Space +
+
+

+Toggle tiling/floating for the current container. +

+
+
+Mod1+Space +
+
+

+Select the first tiling container if the current container is floating and +vice-versa. +

+
+
+Mod1+Shift+q +
+
+

+Kills the current window. This is equivalent to "clicking on the close button", +meaning a polite request to the application to close this window. For example, +Firefox will save its session upon such a request. If the application does not +support that, the window will be killed and it depends on the application what +happens. +

+
+
+Mod1+Shift+r +
+
+

+Restarts i3 in place. Your layout will be preserved. +

+
+
+Mod1+Shift+e +
+
+

+Exits i3. +

+
+
+
+
+
+

6. FILES

+
+
+

6.1. ~/.i3/config (or ~/.config/i3/config)

+

When starting, i3 looks for configuration files in the following order:

+
    +
  1. +

    +~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set) +

    +
  2. +
  3. +

    +/etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set) +

    +
  4. +
  5. +

    +~/.i3/config +

    +
  6. +
  7. +

    +/etc/i3/config +

    +
  8. +
+

You can specify a custom path using the -c option.

+
+
Sample configuration
+
+
# i3 config file (v4)
+
+# font for window titles. ISO 10646 = Unicode
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+# use Mouse+Mod1 to drag floating windows to their wanted position
+floating_modifier Mod1
+
+# start a terminal
+bindsym Mod1+Return exec /usr/bin/urxvt
+
+# kill focused window
+bindsym Mod1+Shift+q kill
+
+# start dmenu (a program launcher)
+bindsym Mod1+d exec /usr/bin/dmenu_run
+
+# change focus
+bindsym Mod1+j focus left
+bindsym Mod1+k focus down
+bindsym Mod1+l focus up
+bindsym Mod1+semicolon focus right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Left focus left
+bindsym Mod1+Down focus down
+bindsym Mod1+Up focus up
+bindsym Mod1+Right focus right
+
+# move focused window
+bindsym Mod1+Shift+j move left
+bindsym Mod1+Shift+k move down
+bindsym Mod1+Shift+l move up
+bindsym Mod1+Shift+semicolon move right
+
+# alternatively, you can use the cursor keys:
+bindsym Mod1+Shift+Left move left
+bindsym Mod1+Shift+Down move down
+bindsym Mod1+Shift+Up move up
+bindsym Mod1+Shift+Right move right
+
+# split in horizontal orientation
+bindsym Mod1+h split h
+
+# split in vertical orientation
+bindsym Mod1+v split v
+
+# enter fullscreen mode for the focused container
+bindsym Mod1+f fullscreen
+
+# change container layout (stacked, tabbed, default)
+bindsym Mod1+s layout stacking
+bindsym Mod1+w layout tabbed
+bindsym Mod1+e layout default
+
+# toggle tiling / floating
+bindsym Mod1+Shift+space floating toggle
+
+# change focus between tiling / floating windows
+bindsym Mod1+space focus mode_toggle
+
+# focus the parent container
+bindsym Mod1+a focus parent
+
+# focus the child container
+#bindsym Mod1+d focus child
+
+# switch to workspace
+bindsym Mod1+1 workspace 1
+bindsym Mod1+2 workspace 2
+# ..
+
+# move focused container to workspace
+bindsym Mod1+Shift+1 move workspace 1
+bindsym Mod1+Shift+2 move workspace 2
+# ...
+
+# reload the configuration file
+bindsym Mod1+Shift+c reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindsym Mod1+Shift+r restart
+# exit i3 (logs you out of your X session)
+bindsym Mod1+Shift+e exit
+
+# Start i3bar to display a workspace bar (plus the system information i3status
+# finds out, if available)
+exec i3status | i3bar -d
+
+
+
+

6.2. ~/.xsession

+

This file is where you should configure your locales and start i3. It is run by +your login manager (xdm, slim, gdm, …) as soon as you login.

+
+
Sample xsession
+
+
# Disable DPMS turning off the screen
+xset -dpms
+xset s off
+
+# Disable bell
+xset -b
+
+# Enable zapping (C-A-<Bksp> kills X)
+setxkbmap -option terminate:ctrl_alt_bksp
+
+# Enforce correct locales from the beginning
+unset LC_COLLATE
+export LC_CTYPE=de_DE.UTF-8
+export LC_TIME=de_DE.UTF-8
+export LC_NUMERIC=de_DE.UTF-8
+export LC_MONETARY=de_DE.UTF-8
+export LC_MESSAGES=C
+export LC_PAPER=de_DE.UTF-8
+export LC_NAME=de_DE.UTF-8
+export LC_ADDRESS=de_DE.UTF-8
+export LC_TELEPHONE=de_DE.UTF-8
+export LC_MEASUREMENT=de_DE.UTF-8
+export LC_IDENTIFICATION=de_DE.UTF-8
+
+# Use XToolkit in java applications
+export AWT_TOOLKIT=XToolkit
+
+# Set background color
+xsetroot -solid "#333333"
+
+# Enable core dumps in case something goes wrong
+ulimit -c unlimited
+
+# Start i3 and log to ~/.i3/logfile
+echo "Starting at $(date)" >> ~/.i3/logfile
+exec /usr/bin/i3 -V -d all >> ~/.i3/logfile
+
+
+
+
+
+

7. ENVIRONMENT

+
+
+

7.1. I3SOCK

+

This variable overwrites the IPC socket path (placed in +/tmp/i3-%u/ipc-socket.%p by default, where %u is replaced with your UNIX +username and %p is replaced with i3’s PID). The IPC socket is used by external +programs like i3-msg(1) or i3bar(1).

+
+
+
+
+

8. TODO

+
+

There is still lot of work to do. Please check our bugtracker for up-to-date +information about tasks which are still not finished.

+
+
+
+

9. SEE ALSO

+
+

You should have a copy of the userguide (featuring nice screenshots/graphics +which is why this is not integrated into this manpage), the debugging guide, +and the "how to hack" guide. If you are building from source, run: + make -C docs

+

You can also access these documents online at http://i3.zekjur.net/

+

i3-input(1), i3-msg(1), i3-wsbar(1), i3-nagbar(1), i3-config-wizard(1), +i3-migrate-config-to-v4(1)

+
+
+
+

10. AUTHOR

+
+

Michael Stapelberg and contributors

+
+
+
+

+ + + diff --git a/docs/4.0/i3status.html b/docs/4.0/i3status.html new file mode 100644 index 0000000..0860168 --- /dev/null +++ b/docs/4.0/i3status.html @@ -0,0 +1,372 @@ + + + + + + +i3: i3status(1) + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. NAME

+
+

i3status - Generates a status line for dzen2 or xmobar

+
+
+
+

2. SYNOPSIS

+
+

i3status [-c configfile] [-h] [-v]

+
+
+
+

3. OPTIONS

+
+
+
+-c +
+
+

+Specifies an alternate configuration file path. By default, i3status looks for +configuration files in the following order: +

+
    +
  1. +

    +~/.i3status.conf +

    +
  2. +
  3. +

    +~/.config/i3status/config (or $XDG_CONFIG_HOME/i3status/config if set) +

    +
  4. +
  5. +

    +/etc/i3status.conf +

    +
  6. +
  7. +

    +/etc/xdg/i3status/config (or $XDG_CONFIG_DIRS/i3status/config if set) +

    +
  8. +
+
+
+
+
+
+

4. DESCRIPTION

+
+

i3status is a small program (about 1500 SLOC) for generating a status bar for +i3bar, dzen2, xmobar or similar programs. It is designed to be very +efficient by issuing a very small number of system calls, as one generally +wants to update such a status line every second. This ensures that even under +high load, your status bar is updated correctly. Also, it saves a bit of energy +by not hogging your CPU as much as spawning the corresponding amount of shell +commands would.

+
+
+
+

5. CONFIGURATION

+
+

Since version 2, the configuration file for i3status will be parsed using +libconfuse. This makes configuration easier in the programmer’s point of +view and more flexible for the user at the same time.

+

The basic idea of i3status is that you can specify which "modules" should +be used (the order directive). You can then configure each module with its +own section. For every module, you can specify the output format. See below +for a complete reference.

+
+
Sample configuration
+
+
general {
+        output_format = "dzen2"
+        colors = true
+        interval = 5
+}
+
+order  = "ipv6"
+order += "disk /"
+order += "run_watch DHCP"
+order += "run_watch VPN"
+order += "wireless wlan0"
+order += "ethernet eth0"
+order += "battery 0"
+order += "cpu_temperature 0"
+order += "load"
+order += "time"
+
+wireless wlan0 {
+        format_up = "W: (%quality at %essid, %bitrate) %ip"
+        format_down = "W: down"
+}
+
+ethernet eth0 {
+        # if you use %speed, i3status requires the cap_net_admin capability
+        format_up = "E: %ip (%speed)"
+        format_down = "E: down"
+}
+
+battery 0 {
+        format = "%status %percentage %remaining"
+}
+
+run_watch DHCP {
+        pidfile = "/var/run/dhclient*.pid"
+}
+
+run_watch VPN {
+        pidfile = "/var/run/vpnc/pid"
+}
+
+time {
+        format = "%Y-%m-%d %H:%M:%S"
+}
+
+load {
+        format = "%5min"
+}
+
+cpu_temperature 0 {
+        format = "T: %degrees °C"
+        path = "/sys/devices/platform/coretemp.0/temp1_input"
+}
+
+disk "/" {
+        format = "%free"
+}
+
+
+

5.1. General

+

The colors directive will disable all colors if you set it to false. You can +also specify the colors that will be used to display "good", "degraded" or "bad" +values using the color_good, color_degraded or color_bad directives, +respectively. Those directives are only used if color support is not disabled by +the colors directive. The input format for color values is the canonical RGB +hexadecimal triplet (with no separators between the colors), prefixed by a hash +character ("#").

+

Example configuration:

+
+
+
color_good = "#00FF00"
+
+

Likewise, you can use the color_separator directive to specify the color that +will be used to paint the separator bar. The separator is always output in +color, even when colors are disabled by the colors directive.

+

The interval directive specifies the time in seconds for which i3status will +sleep before printing the next status line.

+

Using output_format you can chose which format strings i3status should +use in its output. Currently available are:

+
+
+dzen2 +
+
+

+Dzen is a general purpose messaging, notification and menuing program for X11. +It was designed to be scriptable in any language and integrate well with window +managers like dwm, wmii and xmonad though it will work with any windowmanger +

+
+
+xmobar +
+
+

+xmobar is a minimalistic, text based, status bar. It was designed to work +with the xmonad Window Manager. +

+
+
+none +
+
+

+Does not use any color codes. Separates values by the pipe symbol. This should +be used with i3bar and can be used for custom scripts. +

+
+
+
+
+

5.2. IPv6

+

This module gets the IPv6 address used for outgoing connections (that is, the +best available public IPv6 address on your computer).

+

Example format_up: %ip

+

Example format_down no IPv6

+
+
+

5.3. Disk

+

Gets used, free, available and total amount of bytes on the given mounted filesystem.

+

Example order: disk /mnt/usbstick

+

Example format: %free (%avail)/ %total

+
+
+

5.4. Run-watch

+

Expands the given path to a pidfile and checks if the process ID found inside +is valid (that is, if the process is running). You can use this to check if +a specific application, such as a VPN client or your DHCP client is running.

+

Example order: run_watch DHCP

+
+
+

5.5. Wireless

+

Gets the link quality and ESSID of the given wireless network interface. You +can specify different format strings for the network being connected or not +connected.

+

Example order: wireless wlan0

+

Example format: W: (%quality at %essid, %bitrate) %ip

+
+
+

5.6. Ethernet

+

Gets the IP address and (if possible) the link speed of the given ethernet +interface. Getting the link speed requires the cap_net_admin capability. Set +it using setcap cap_net_admin=ep $(which i3status).

+

Example order: ethernet eth0

+

Example format: E: %ip (%speed)

+
+
+

5.7. Battery

+

Gets the status (charging, discharging, running), percentage and remaining +time of the given battery. If you want to use the last full capacity instead +of the design capacity (when using the design capacity, it may happen that +your battery is at 23% when fully charged because it’s old. In general, I +want to see it this way, because it tells me how worn off my battery is.), +just specify last_full_capacity = true.

+

Example order: battery 0

+

Example format: %status %remaining

+
+
+

5.8. CPU-Temperature

+

Gets the temperature of the given thermal zone.

+

Example order: cpu_temperature 0

+

Example format: T: %degrees °C

+
+
+

5.9. CPU Usage

+

Gets the percentual CPU usage from /proc/stat.

+

Example order: cpu_usage

+

Example format: %usage

+
+
+

5.10. Load

+

Gets the system load (number of processes waiting for CPU time in the last +5, 10 and 15 minutes).

+

Example order: load

+

Example format: %5min %10min %15min

+
+
+

5.11. Time

+

Formats the current system time. See strftime(3) for the format.

+

Example order: time

+

Example format: %Y-%m-%d %H:%M:%S

+
+
+

5.12. DDate

+

Outputs the current discordian date in user-specified format. See ddate(1) for +details on the format string. +Note: Neither %. nor %X are implemented yet.

+

Example order: ddate

+

Example format: %{%a, %b %d%}, %Y%N - %H

+
+
+

5.13. Volume

+

Outputs the volume of the specified mixer on the specified device. Works only +on Linux because it uses ALSA.

+

Example order: volume master

+

Example format: ♪: %volume

+

Example configuration:

+
+
+
volume master {
+        format = "♪: %volume"
+        device = "default"
+        mixer = "Master"
+        mixer_idx = 0
+}
+
+
+
+
+
+

6. Using i3status with dzen2

+
+

After installing dzen2, you can directly use it with i3status. Just ensure that +output_format is set to dzen2.

+

Example for usage of i3status with dzen2:

+
+
+
i3status | dzen2 -fg white -ta r -w 1280 \
+-fn "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso8859-1"
+
+
+
+
+

7. Using i3status with xmobar

+
+

To get xmobar to start, you might need to copy the default configuration +file to ~/.xmobarrc. Also, ensure that the output_format option for i3status +is set to xmobar.

+

Example for usage of i3status with xmobar:

+
+
+
i3status | xmobar -o -t "%StdinReader%" -c "[Run StdinReader]"
+
+
+
+
+

8. SEE ALSO

+
+

strftime(3), date(1), glob(3), dzen2(1), xmobar(1)

+
+
+
+

9. AUTHORS

+
+

Michael Stapelberg and contributors

+

Thorsten Toepper

+

Baptiste Daroussin

+

Axel Wagner

+

Fernando Tarlá Cardoso Lemos

+
+
+
+

+ + + diff --git a/docs/4.0/ipc.html b/docs/4.0/ipc.html new file mode 100644 index 0000000..3a3cb87 --- /dev/null +++ b/docs/4.0/ipc.html @@ -0,0 +1,844 @@ + + + + + + +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, the ipc-socket gets created +in /tmp/i3-%u/ipc-socket.%p where %u is your UNIX username and %p is the +PID of i3.

+

All i3 utilities, like i3-msg and i3-input will read the I3_SOCKET_PATH +X11 property, stored on the X11 root window.

+
+
+
+

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 => '/tmp/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). +

+
+
+GET_TREE (4) +
+
+

+ Gets the layout tree. i3 uses a tree as data structure which includes + every container. The reply will be the JSON-encoded tree (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. +

+
+
+GET_TREE (4) +
+
+

+ Reply to the GET_TREE 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
+  },
+ }
+]
+
+
+
+

3.6. GET_TREE reply

+

The reply consists of a serialized tree. Each node in the tree (representing +one container) has at least the properties listed below. While the nodes might +have more properties, please do not use any properties which are not documented +here. They are not yet finalized and will probably change!

+
+
+id (integer) +
+
+

+ The internal ID (actually a C pointer value) of this container. Do not + make any assumptions about it. You can use it to (re-)identify and + address containers when talking to i3. +

+
+
+name (string) +
+
+

+ The internal name of this container. For all containers which are part + of the tree structure down to the workspace contents, this is set to a + nice human-readable name of the container. + For all other containers, the content is not defined (yet). +

+
+
+border (string) +
+
+

+ Can be either "normal", "none" or "1pixel", dependending on the + container’s border style. +

+
+
+layout (string) +
+
+

+ Can be either "default", "stacked", "tabbed", "dockarea" or "output". + Other values might be possible in the future, should we add new + layouts. +

+
+
+orientation (string) +
+
+

+ Can be either "none" (for non-split containers), "horizontal" or + "vertical". +

+
+
+percent (float) +
+
+

+ The percentage which this container takes in its parent. A value of + null means that the percent property does not make sense for this + container, for example for the root container. +

+
+
+rect (map) +
+
+

+ The absolute display coordinates for this container. Display + coordinates means that when you have two 1600x1200 monitors on a single + X11 Display (the standard way), the coordinates of the first window on + the second monitor are { "x": 1600, "y": 0, "width": 1600, "height": + 1200 }. +

+
+
+window_rect (map) +
+
+

+ The coordinates of the actual client window inside its container. + These coordinates are relative to the container and do not include the + window decoration (which is actually rendered on the parent container). + So, when using the default layout, you will have a 2 pixel border on + each side, making the window_rect { "x": 2, "y": 0, "width": 632, + "height": 366 } (for example). +

+
+
+geometry (map) +
+
+

+ The original geometry the window specified when i3 mapped it. Used when + switching a window to floating mode, for example. +

+
+
+urgent (bool) +
+
+

+ Whether this container (window or workspace) has the urgency hint set. +

+
+
+focused (bool) +
+
+

+ Whether this container is currently focused. +

+
+
+

Please note that in the following example, I have left out some keys/values +which are not relevant for the type of the node. Otherwise, the example would +be by far too long (it already is quite long, despite showing only 1 window and +one dock window).

+

It is useful to have an overview of the structure before taking a look at the +JSON dump:

+
    +
  • +

    +root +

    +
      +
    • +

      +LVDS1 +

      +
        +
      • +

        +topdock +

        +
      • +
      • +

        +content +

        +
          +
        • +

          +workspace 1 +

          +
            +
          • +

            +window 1 +

            +
          • +
          +
        • +
        +
      • +
      • +

        +bottomdock +

        +
          +
        • +

          +dock window 1 +

          +
        • +
        +
      • +
      +
    • +
    • +

      +VGA1 +

      +
    • +
    +
  • +
+

Example:

+
+
+
{
+ "id": 6875648,
+ "name": "root",
+ "rect": {
+   "x": 0,
+   "y": 0,
+   "width": 1280,
+   "height": 800
+ },
+ "nodes": [
+
+   {
+    "id": 6878320,
+    "name": "LVDS1",
+    "layout": "output",
+    "rect": {
+      "x": 0,
+      "y": 0,
+      "width": 1280,
+      "height": 800
+    },
+    "nodes": [
+
+      {
+       "id": 6878784,
+       "name": "topdock",
+       "layout": "dockarea",
+       "orientation": "vertical",
+       "rect": {
+         "x": 0,
+         "y": 0,
+         "width": 1280,
+         "height": 0
+       },
+      },
+
+      {
+       "id": 6879344,
+       "name": "content",
+       "rect": {
+         "x": 0,
+         "y": 0,
+         "width": 1280,
+         "height": 782
+       },
+       "nodes": [
+
+         {
+          "id": 6880464,
+          "name": "1",
+          "orientation": "horizontal",
+          "rect": {
+            "x": 0,
+            "y": 0,
+            "width": 1280,
+            "height": 782
+          },
+          "floating_nodes": [],
+          "nodes": [
+
+            {
+             "id": 6929968,
+             "name": "#aa0000",
+             "border": "normal",
+             "percent": 1,
+             "rect": {
+               "x": 0,
+               "y": 18,
+               "width": 1280,
+               "height": 782
+             }
+            }
+
+          ]
+         }
+
+       ]
+      },
+
+      {
+       "id": 6880208,
+       "name": "bottomdock",
+       "layout": "dockarea",
+       "orientation": "vertical",
+       "rect": {
+         "x": 0,
+         "y": 782,
+         "width": 1280,
+         "height": 18
+       },
+       "nodes": [
+
+         {
+          "id": 6931312,
+          "name": "#00aa00",
+          "percent": 1,
+          "rect": {
+            "x": 0,
+            "y": 782,
+            "width": 1280,
+            "height": 18
+          }
+         }
+
+       ]
+      }
+    ]
+   }
+ ]
+}
+
+
+
+
+
+

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/4.0/keyboard-layer1.png b/docs/4.0/keyboard-layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..52ffae0da423a9b5f0403c77dba9cb9cd2dbc4d1 GIT binary patch literal 55821 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 ouB|LYgM)2LlmuVT56(O`atum) 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�SuqACU3O)y)6GJ13y)PD?6Z9JpDij5#mv||>Mdn})uW`M-y-!FZg{ergTXYZpai!|emaaF+}0}IFi zaBkWD*stN~kE7TBaUAg$m;lob(@?XY=eEf125A6M$e|sx(kP%q#7`(nDi0n{#Ob4G zMooEr2;jU678Xf|VzA=pZ~HRn?tT6J7-xiul_j_B2k!*atVblz!u}7XVchKbj^la^ z@3(C>87VsM2`v30bdC7lTTe7XvJ68MvXTTMinv!OAKN@zE&6W%QCK^Bi(zxlDam6` zV;XErL^kav$!%wiLJb;)X#c0oC(W~<*)3%6f89o1Z`m+qrE;oFcOH(Kd* z04Q8vN8dzJg2LB;6`Nq@qh{*@m4%}w(>I5kKMdCx+t9nws#|~OOx60S3o9p1ow3)J zer3COJn(gggo#k(S0QORH5;yqk&!LGGrU<0E89KUGIrnP-*@53{^rXFsoX*T!Pjr z*u0cg25^lD0o_oq5)S6WXxd02XuiWjI3!dZYxeZ)+7QW7&*^iwdGUVK!XyO~P5O-v zst{YB&z%V@x@KNWdy10pRQu!QNs*H-eNzrP$q!;@QxCtEaw`9W&{qwS2e}5|0$#+_ z4CEtlcr@tW-6=QRK}ngRK5)5Np%vO1O#i~>P~DY7g#!Q{TaF_%A1_dB{diy1H>v%Q z?V7v$?dioXpY>U8d3;yXR2`+}g4o<6wO$-k-^||4FmY=?BgRnYKA+F%4`!UVH59A7 zP^+Y@cRPQ%&qVrfu*i_jUqSjxs-vQx&*YXkemgpS)P&Sy{6|^C;pMUb$W|fyJ=$bJMNlDySnnr^Bt>4Px?6=-1P0w z?aAg!g$)ye$BH*Q%&YE~e$%*@zltM1^sS>SjZdp$$MSLuv$|CL{$G>dtlAye8h33- z=Ne|apU?dPR765@BLgs~VW3SUt6uOzUtTC%4TdCHstQ(GIkb4l@=(W0UHTY)91aX& z-=P5a*|e(`_Zb^Sl;_V8Q3^-7?-R-G3&nVV#Qf#3tlB?BSO_<-qbdP5OtgJK#z}m^ zRxQMTvLg}lyW^nBf^xCEyl4wqdGhy&7WMN!+}qc$-%`JqP((log=F?Xkc^Io;}z2F zJof?J2;OYWFjTPrf{DpawEX5@^mat3|K3KS_Aj-9`@kjZ{fup|xm&Z@-YBxTmX!L7 zRL}B7)xI;a-cO%Cu+%hgFHB=t*wB*a?T&b7zR&KC9$pa+F zbm$e^xehw7?yoA86Eq2XxF0-eUO0Jh)8vqk2A@il{(6l@gxctxO~CX@x6H z7fA9qaw>U&C>8r9G2+ukI>y#aPpYYo&+%+j(MZ?f{ueEY>t5~*~`KLqBulba2J?q z;Wh#>k~lfRngL!<8-T=OT1IEaH)Y65?nW+{m5R5P(0*Wljd?+b!~!K-w%6lAJ!8y; zn=@wq)p0jB^fro#Fm@l;-k|wxxZ%mi`w2m*l4Hi4{=*0V$T!o`mGBo?N85h;v~QGK zXV3RolkeQYpNIaGb)+U+M{oxEy_oY>^feb{G0>%aw6bepbMSF6-Y^wxT)Jg+hl85t zc+PbOc5dr9EmNJ2L%yX?Tyq~Au5m8exNk}UVAK*Dka&V0!rSW)eEo85vqTV7pF10fT!1;cmq z4G7TwxyQ!F24`t-@sE$KIRnfy?ti?+7JvJ{rd`>4p{2ic2k%Or-oM5h61 z?%+@kEhptYh^;MRX%v_7+*Zf&TzVhp=Q^wJv4u@JM}v@?h!%GwFCoFa;6_(h7i22> zuhY}gnxdfRPPIS1t#~PKIb0tR5<|I@i1W>E?|g4r^RGkEui?}~u}`(3M`w35fUDphh7a9x9J4aIYi!UqG zKiafguE8MT?S$bjt2~`c5^m0}W{WYkXUbkNCoDdWc^JPGmSsLr9VHmJhUP= zP%TKiQB0Z9@utV0jErr1BA3#$FaPX+SSvdyrOwEx!5C)yF7)T!dE2tlbk2hYPU(eu zX97wZUcGLLn$^7XQEEXb&pTB332XYp>vH=$Zz0^ev^D5CStlzk?A6OGUsn^M% z=(Ou?F!x1O__+5E1x$J#QBlowr*1TbKHsHY=xDm1g3UlZDzePhAYEF{XgxSxwT7gKh$rjw1}pl;gl&z^UB_@LuYb@MjgUw=L=IM3G! z#e8W}y|h6p{+Z|6&y0VX0V5m#_ocQm*SETM~Wh{rs zRzqC1_@z0f|Gv~jq{&?8zb~2QSEBX)_q%gF3!!NI|NGn6Og?xz-ikvuN6KWJzbQ4I$F~999`T+B^o&D&&*nX?+YDtxc0tdaN~vz z@5(qmWG383|IV!(E?ru#of%lQ;9AE7@dCU^_n5mAACU|b7*y^Ff`4s{>6XlJ06^La z%3I;}vT>JkG+w|uc!W$B@hV5RzN(pda?r`>^P}C*TCsVZ-z7j_0rI9taG8LRu(si) zuf7U?jXFjpN~)zH=7%37-XCV3h~Urg)?aD=;iPKl?%ECgv0|HHkr=3rf~Nob2uuGz z9$~OGp=`&Tz|#({Pe@FJC5q{ZyPTB990_}>a>sq=-aNn@=F%uw{I!#Ft;T~|^7-(% z_XHl2(t)3js2bkgfDecI<;%$hT_EbB1dAFK9Y}<^J-io4mjsR<*7QCGVN46lv>_3y zM)id~oCPuOnCtmDId6mMDe~b4HlV10tCgak$qu1;ZQOgiY9RbrkrG*O9*>PzJvy>C zA4&q~9d){X&CJAMRFuzds#Y^}qYVNWTsRBIW#S8`sOZ~Wg0wybc6Gl&pj=TP%4#tf ztH7`i%P|;XO@h@gtN@$|EpqUKBCQD>Hz)J{F%S#ktR`&O3P+AEKBjW$QAA)jCTvth z`xgB7Kq%~xxIQ15fbR}GHGLp_AzQDp_0lA|`l&YL01;S_47gEMf5Rd?t+1|-$he3> z6u<;?&~L(FfWT)kRYbN4mzJ*FcsB9#XC1z^3P^KyqAxm$)BH~-C?X?G6jV{gbmyZ& zJ@A4e5?9|3rydoia_EHYfE*ONfoKxK;IH3=R-VY&$VSQTWx$~~FcKoZ`|x5?Mq9Fx zIfkK1sUVPUY9|QhXNw$P7DPc9(i_@HbWjhEdxCTgUxBB4MF(Et^AKV!KHal6p1oMf z4z(R&PxouubM5!0P$r>Ce-IgYbx6bRBWwZV=L@ZB!6C+a5&4282(pGlj&mC6qQk|W zUyc2&uV5StH>xhUeh{}p;LhC)oOC9yjFP>HKNC(cQJsMzOk5Zcm6~7Z20#m$JV;Ur zFnvw3f?~~@oT5R%84Fm-xhh=NO$tT4?tN=G5E4M_-^I-Gs2t9Mtr$QNw$lI;2cCSN zrX#TsCk*c*r33KE$MGz?AiO^87cm35f{L)qQ6x-%F|=Kkh5Zf~C#6Ooh0_OcI(o({ zYG+M>q_w@$A3DP#DsY}~xRY$q zSwqZL4xI80WR_I;K0A-x48(idA@FhMR(AF}SSZ7lJ}~A)%>kT6D|7gDaNt6<9LZQL zPIIwwzm6pyaZ74q17D4s!Del#-$Qhb^!WbR(@VCKwuqTQvP0%t0B(Hf=Dg$M1Z3;T+1qnAk_Q&G8%$aFd_fk+Kk>x(D?$^nxMHuTiEW*D8-phmeR$=(OZ&2TR z8oXIcXygzf>%4}CP;z&s$I9|ftbvxvgo#<3+s-LQ=h>m-ct>I~CDFt|NLf^@xjr*H3saGyx)=-L_s>Cz$~%MJ!H9 zU5t#3gme35I4zk%drgJaiDcBLL>olzESw*dUVFg$2V<)W{TwjgA$Y}Dk(ughSxyGDTJ_IPM$i2i>4lLM#s z*+RXM(%+AzH5T2AK$^)q3B2yn@!eRz3Ys$YTWG_e>4)np_Ft_X#k91>y1ndZY=RIti`N$+*Tzgr(%cPcZp~;FL|^+rqK$2;@>dZ1ov&#Hz-6PrIl6hW6mEP_PaxJ>vKiBNARA(q6PA)R+c6_V4c;} zz}fE)_7?-%LkL#B0xM?=I=Sn6YU5?{?^M9biCFohzHi+Z=zrRr>#NvynZE7nX_?XVr%m6MwbzIYf;`l|RHroUf2m9PwX zLJyCkQH%m{Z7UG*VD9IU;zC{!ZVp*>vf&i+FDxKf5q?=;i3_NdjORW&ejIBDmwRZ^+`;l%5^ZoRO&Cb1UgT6 z;5SfN)j@aw_mphstC&SY$!!8gAaoGfGiSK&Dx5k+?8|cpuzA@B!9@$6`fE--631Za zB)}$O^>VDBJqMgw7Pm?Tk{533F{z-?AhN7UFlMQWr*@VfLjJac^qXMR4$qKjfD?&c z&^bKlwORH8XcpvF!2QyPo>dMPW#cZrjLGTgi{MY=65qwlEVU;S6Dd7IR&=fAA>aAY zcelZk25*8}L_{O~`C9W>ZoK_9C+F=*p^JP@?mF@i5nsUOYZF}lAj+@muq_QrNU;30 z<2O#Lx$_tRF=sy&Z!S+M{t7(4v$l45@IoG1>TzpF1Xw`RPrS7bST(~c zng$A$IY)TqVBHX`DCsq7VFW#)=kf<1GaE^aL|EMqF^h9Lq1tFA>9Je6WWkd82t#E!n3V_#!_LVvak5%e8kO${sVSEXafKmaBL z1DE;#hYJt{bUf8tW&8jY$QS0Ijyq2f3dS+kLGJZ2y_j?pH(CftGJaxFKt#>fJS?{% z96vk~popo90nGg6C`fGIzPIzac~I9A7fCjUx2vvBZDNBW%j5ZO7qWHB;mF~`XER4j zu-FajN;EbwS7jihxZ-xfVSBeH97C_ccJE=@N6?_c+E=q7Ht|vlx)k6aGgozVMMQg3Eg zfk7qxE}IM~s2-5fczJl%Y1H1Xk~p0KTjvk05W^D>I`j)Kx;&#IBgKjj9y%0`H?B4= zPzYljBx&;MT5fC;KKC9SJa&_aL8u`Mt6-}L)=-L;;j(*yYkHK@&d`ZfO0=r_d6!tN zv7B#Upq2+NyopHZ#H1Idx!6k2TTIc^M|MNtLSJQQJ>UUj(QX5ERxAkYM+K_?+69OW zamv7MA|x8JNn_+Ch(g5iA}(V}{3ctF51jRf)63>z8$n!|Sw&uSYGM;DG%e9KE8C4- zkD~_I$e>x*q)O}HQBSeN4vue_=#1RA5uF?8Y?lpsyuBcMH40EF0LmPL39*clG@Bcf!BQ>S)lfnFO+Ylt3{ z%)1O zM{QYKOxUu+7=VWDKrSu5or36c5w{?aUFHd-FvGb+!_$C0kwb|?GH&?lp`iR)qStET zp`c)lMN}ouCgvcuNdmHZ69HJO2aohAlqifI&{v zl7Y`=U5-8(gVv_E!RGs*72mx1zR(8Vs;aWG+t7L^cR*FHSE%uX5j(t4Ra2R(xMR@} zR&7|l&H{ZTwK^!`?p>Pypxt<^B6)snRkz2A8+7a+0W^Y67v9YxpskH)PGEST;jn_M z>gd>k6bk$GHUv@p;mUXK-ZhvEB*Vakm^I=BQYA=!fQwL2_Oum9BFS%X z(*3;koti%COA-m;QVrphtj4^BZix*>zXg~cIV)ocMffz z{9-LitT4L68v;p*jWhNVL}81J!&YO_x6<PN2b$%=HCL6FRJQj#R09U@i!_v&_wfJ4fVVaJTbD zI_OU|+Jr!ZD@e@2;gK<0YgQ%ESUUsxzlL$?RMid`HMDv*{-FQY(7u8=ZX&`pvpe7~ z)HalJ7~Z5AoSo~)iUI?izIxP#)hNltWRl>4vVT|eOjA?^SDZ0(@FIMccVp)K;^tOT z@{$F9jp~C@VbEleHTDiJFfDcdAcQ7t@{?o_3)iciGqbCqM60ix?L;T}t-oIZa4I54 zYJo&h3O;lkQYEv{83w#TD=b+B0!l^7FC3#cZ{B19cd^R1hWCXO_? zDFg5*T@%U*bm0iibIIju4VZTVd2MYThfo>a@5XKFHpIjmUDn!AGvgy2(fp07e~=yK z1gupOyva5t6uTm5vm9h{f#VXZ&lh^>wb)3Zl6^Ys3+hkua*hy|;^z!N z!~iWU4!#-0%5Q0PZdTTFMB{wM%O~v(Md7V^0`@d>1^fIv9k8mm+j(@~-03gSz(a6f znM{4dq7_GGu1Z1b$dT0bF*ftVXy->&KVH0w*r5h7W%D?`*-P{|^z~6FGrOOtCu+TI z-iqlh?hElQS{RDEPqvuhomx#lg25^&bI=_S8%fl(ylApfR5qaQQkmGXeS0mde(-L_C>x3dYJ>IIELnC8LXNLpz@EjGKf`&&5Vj@)UUHZ6l*RGa|WsGn~ zE;ggv2D;JqAf`VVdla(Z&xxreP=k8~ygjIV7kXBf$H@ac$|J>52;aFc0dbOXR@6{u&_(6-W|bi$8#KK05;$P~%&7L!73 zg_W#NR5QlJf`A6U5c&=wos+mT%JuZ|R(GcqU{z#@felBUK<~&}4P2rmNv|}1y>8Fx z!zh3FU?8o8;t}Px8G;km4WZ*^Bkq#wUJhDp9CMPGy6t*x}(Gmc} z2X?ZX-@lR9ewL>-#WUd0se;H*P^n2EKRdhZ z?q$htM=$u%Q2ps@A$vRUIGV<3_&{_6jp_&R5O_B~Z@k=8$zfNIh&7j2A9*;g6}&OP zKa%YfP;FF+d+o?gwED9JDfZ*-VW^=}zNeu`FT+E(X%P0xh)~7Nhp|bVv;-2 zm@)NaD~JqeVZvw{S$ux26xv+8s*Io$W)q~N&3ZJP72{sg+QUQvCP8|wyhYeDfg5@W z&P*qtGGHZT1U%fRh+kL6;mdR%*kv+d`ep~KNvgR0i|G*66OA!kj8s(Uu{?<|{m9o| zxop`Kzn++MtBoDJr_kLoq-P z;mU9WG)oBc z>u^dJ&^UYrl^I$EWO((7PR!X!zPn`6GVZ=8)V^LV`quQ5BIKD$_^eOc2Ra(%WMy4I z|2xd+s@*$0><5-hHw%xpHRne~6yES>po8p-l%2p+M9wE9io&HJ3CWvy_>*gq>bSis z3EyBO@b6hvwr>gso@c<1^u?9bk=o?Ktgx^a@yDFl@toD&WLy5KX0NZK2{N*7wXDp3 z(|uQW$-17gO_T+^i>b%wsKJquS^#dS1@-249k#2uoK&6%H8=|D=ipEfOKh~h#FYX) z2O@GJ4uX}wmbTINQS{c_5)#bVjg5^LI8f_IyNee(T!)Y?1cUzDQu%6dK+K*?XovS9 zco)AB+F!nYodk1@!zJ$F01t7>>u2Af7bo8u?+Vlf)}=q@2z$=;sk;n+y+Ys=gKcwh z#$=UV#OG}D(+*$0W8#^zh$B^pJ;rHyFoe?KJ3o5omz1`_nrwaAn?J+(l12g za=_ZxvHZ@Sg}Nor+Ax=sGj76^vts5UMWZO|uf%P2I7B}?l7ekp$=zB)iO=zpkeD9I5=LP^JG4)K|uxMatD2^>(S5+&fv8|jK-aAPDgzti# zG$(?{htCe1Hl`!8)h`tlh*R%~1OHo;nC{*G6nS{YJ40NzDpG^>#@JzE?(DPaIPJq= zi}fZ325cAzH2oE#1dB^b*6aVf?$-%>aRJKgJ$P^%Ry$$OnRsNy2$~jitfwK4gLq6M z4w*eLzC)1KJ4)l`>Pp(-Zu>sq3S3fBPtZJ&b)slw?N(M{c*K%`*Gf2WXYXnhh5kRS zoq1T!=^OT+io}FWwvr{1qD0mj)Rao18h#?Qjj|Lmgcd4PmSm}vEG?pq3Y93uSfWBw zF_vU65iKeSy`Q_8zu)8iS|M0#Fgcywd`Y-@SXcIcLBJZ|?|8qHCVJ&tiI388}fL_-8+u5d)6P9TbRV^!KaJ zIqX=oE}&2GL;V1q(c{J)AgC(h_e(4?Pis;OxP1jgn^p41EywQAW0y3wwR?h^{JCry z;QM&Ao(`a&rVeC2@X-*GSkm!aCdwlX~lRFiS_&K<)7%cccaFqR` zw2=WhSp$eU@sL&$V%Snw-Of)5xE++}^SmcoBY&#!@yuBJ_w{Px^+dr0Rz&T1j??5q z1*2UZgy?Q-*M9bJQ|`f4=0tz;TCse2!VtHA&Z_d_2z$?0fp0uJzZ0`NW>80aRL>IE zrU6UW@UILzsF#VH>Wwj@Gom-=@CsvWR8;foXI^;A-=*du))f7=-dO{3PO2NrHKgR? zYxw;6bH>hYVD#(84su;FG?u}Z^IO+21eX?bPI_Uvg16cMZ{&9Nc_pAe_;UZsly5N^ zRA_@FEJ2g$W;1%TuvWTMG+9Qnqe;I1E-n4T`{nM{g{1-YUamSG;!eI=@UEujHZDlw ziotAaf0Bc|z=rkUa1#k^mI}#>6FI4%#6(KPNsm8=X67iL=Ri~t=h}``TJ0Ao5`C+;3Z&%+D+clUC`M29M&Pu9 zbs_{;aiuF+sUWEDUMlkR{>t_1n8C`QQh4s4oavvVhfF!FM6OY=S7}6E{f!O92Lr6L zTTYN-ai)K~lulxp)OkU+B%9X(IsY3eb(R1wA>z#?TELo{#Fska^?`KA|MclGY~XG$ z=pkXYsO@K8itpI1?Jc4m3>>AptqE2*SxmyDG`vi?71V2_+4Rb$G#rOZw$=&rOG5sa zYlIX*6p$r} zq9+>&vU^`?o!1nfmXE7jFPBviD#fJ~Ha<>to|D}o9o~IF<}x>rp4bL3xbEcBD#}6m z&x3{z?R}M?FMM;@i8{)B(Km7&C5#0w;h9Jf)22Uf=&qxMjd%>Yu2n0Mqy-_uNVTu3=@fU{uZxhWgnmRrCVpH28^=-OS#1j;U>Zcsl?TJ zb(a{p(F^ z%qsa-K-cNT?QU+mG%)RpkAEE;q#2-~cY@WM3E)xoS~S~aMg~w~^AUHyEGGSfu0EBG zYwLPj`w<+iN(PHyq=4a;)mYmHy=#EQP<+l_ zmYnS|Ud-x=k@u-yHGO)7-L3(aaxtG;zGPM(x6Iqp)~KVry)#DKP9!hiW*R>}s$mC7 zjNStUaiVBC1g}0gTDmjzIC=1`EeS;#d1^ZpjAGORIu#z*l7Q^aQ{aKA4YL~-=xN?K zNUbx7?450Gt-!3EDN&zJ7!7>z%YM}@_GAc5^qP@fW!kCzc%#U!6C-|$AIHqKHFfzw z1CPwi;d6dZ8x_E^a-xR6^kZ`8=M0Y#xhl*DWX|6xLvN5nt*%iB=w6r=aF)ahU-{|T z?mFU=4<-|F=iBLseaMW}yI1?X9a~wwh9n(3$#LrtIv_~olMwhi)mS$^YYI=rHsN5m zgL3mj-MR}y;*|gq?v?i98i&uP-W`cM;np>^9x<&@qq6(dH?In7|31~1HBxe4RZdYY ztf=$r$i)j8Dx77~g3}Rk#(l1-z4d?q%EPH-vd7d*mhG4Qza?tU zo-@Z8_Kr|CNWZV@oS=X2>o`5(B*4TM650ODku=^J_Cfd#81FnV3g87Kuqd+9B=ENO zf9e|bQ6onN3fbM8H_ot2%WKxn?4`G{wl5&vjpE|s`*Ctkx@aN9tt=GfH0J4!6ki^- z<%RcO?o!dEpc0~GY?Z}zJI^xG5O*?+DsB)TXPde5AV24PJ+k+|H&N1Cf3j0v67Pte zx87VTo}PnunzzG?NNJG5ZyVv|%hMJF&x#e*s~rGAy7}+eVcg5?kPjL4x^?S3^`tt!+zxy*XCJ=NdcxZSH*U;GI#th~)HHLGZ^|*S;#X=}@RCe<{>_C(7gAGNV zF;Ks6SVUFPLeYH-q|)}z3**dPd-jA@#V_rzqO$iC$P$3Ku7{SoHe?9Zq-X&!-WfVd z=)vpbjOR@97^d!S@B$MA63PGGpZz{kQ`5X?;U%prhtd)KH&!&=!?lMxylr}s3nAx_ zxl8A+U`74kbUU3}P4)kiP|Cu%+puVD7CWS@G@VF8#c($XZAG>mWD+dt#c(ajv)s-5 ziTE=2v5{ifxLl7OCz!Ex8U2u~XXn=6wJ`QRcXG?ffCvwzNzw#b;d3CNac@zj z->VzDa(c0Z;j^wUS(|srtdGc*jV?bCe`vH=E<{*}QnQw}UuD+#6|vU7 zEw=E%pJR>Wl;=i<^PJtExwc` zF48g*W3<8}0PcAGeG*kkuOZWJ!&1}4?NQMKDyzYgCl3uDIJ5~S5>`qGo&xP03C zCm+RNys_kT6RwIhikPOY>Cj!(&NRdnx?TgP6+mTJEd{118**eXQZQbjuzw6q+fIzG7XYo zMHhH!g8Bp}u;SeKlzBi*3CMO@Ubh5LAt2gb&mo}w%lZj3z)^W17c1;+9#!c~0P(_s@G!|| zS?ZE0hEY!AI7&&~|G;jL+jvvRD}aQZf9R^(_Yv1)dtr&(B;}rLf=hjZJ$vO0HMM%= zxN7=m{}l(P`$;x*w0EDhPU~9cR`7jHRFB|e)Qu3Fb)Ye&mPR2C9U)M`DRdnI0-Qpi zaC!q<-Yso?lIJspss>TA1*AWB7okrP={toI>WqSZqA#%(+t_(uqI@!kc}# z$sS3O!8K|Mi7=RcHtoZf43Z8c6yul}NQzt^xo^+Ir&lJ`PJkG?V&7v6oOUO-9YH>#-;bCm3OMFA?@8v_oO_ zeAMmpX2ev~$84muoaX}!0ab;^XGM3__1B59sA5ksvx z&oqWpG$+U03QctW6xA_d*}rXL*za8T#Q*U45gf$PxX5|46Ul}2Sq8hqnV!Gg ziZVtR$-^=E>^8gY7yZ*v+U3ccy)8Q$rB1f1hCjX(Ww%zY)xTK(Y2>z$tH0^DPrRCK zbv&^$=FvAPO{I@kcRm;f{E>@F63GA!)Uy6qOF%gOO;Ua~BVz<8JbAV-5uP2PWzJbz z-_TInKJOQLVG+S#RQM+r3T#gHp)y(WE5DBRp%RC!&Ha#>jNotuVwCk~NiB1Cw{&(^ zgP($=9zmB!3~Gc2@Ilb^c^(Zz=(g6$|B5B~{|s$~U)Wv92(8LXu^u~)Lr!3RaO2J$ zd7iO=^kG`1E;5JN;CsCcDnz6g^N~;sB_sMEOYzi}|K?VeXDu`V(-lKuS1 z!W8y%&g|Je1horgDw=t7Ho6Ipi2|{_3Hgx#p#{n}kTD2oztov-O}>~sp@-{4WzqDD z=eZc#!n%-tLC1iriukrDK#)7mC|3JP{VE#nnVH=DoSi2TOgr1@FIstVYO}&}mK4W2 z-R`_|cOivfA&LqRH`;>?0vEP%eD?`ktr}c$?$v~Xlpcn@(#~igY$oS*8);OT*I+c+o;`|2&7!|C}?{QI+q}`_Xui~}3a?F2 zyv7c)(O$$D&IfdYGN1Ym$*UL?E3BQUZeUd3np_?}bcw&O(M6eEciud^yu5e0w6es) z-}8FVh`r^+zVe5Y{SijWbowvAvX95nig%h5XB6m(g(D}E=*OaAtsfPfaQEY0V;DQ0 za<#Aa;&8Y{-8D}pV(Q=zu`OX|CsGOlx*1nyGjyAx94F>?JWVmofu?(g<(R{F26cZ) zdL~NW@;VY&M<=I)PDTU!^)q2OfY3ogG_T|#xmOn9`2f5ib~>T(Jf;Rf!vZlQ5Cd3l zgRng7QrsU_`OL%2s@%<1AwR;bW~kyb&!NCeE4G)=HZsf7QXRYxy-gG4E;wQVsuQ&R zBVy0=n~c0zLScTDB~Y>087O3u>NGeYq%#6$7Mf){E3L6(EkgwL!ipHeJ7ZmZM*XSP zZ{*)BQBg}1B2SdAEcX!}&VvWf1uG?q89~(H>q*8jv@!o%?U=kpFyl09#saUP&gX9| z{~|_x{P>Zbe=x@m@tE;W^*PwPO=ozofUX7y|D+I1x%KMxgt6z)Ev>_Hl=36`acBf` z-m|8GE8c3tL9c+)3Qe459MN%&>wdx7>gGrzyg)&a<-MdTK?qXw?9v1YyG9KOFQYV4 z9_?eja`Y+o>GL}Tui#{b_bKfTD3{*68qs}zeBH&r6sD$T`2C!JYeLh&uia~UPn4au zt+#(_)Ug=ZJ5u^5JX*hRUopya^UvV5lO5alZV0@+H#axeK9!Cy4e}xQL@_B_NXHPb zU1PlofJ#EqE+#WD@!ooRA}SXqtRIJ%A(ecPXSKXCLgaQ_p~k$Ea>5dXSPvImoRsgyy z1VMMArw_6&Xl99l$|4LeZv32u$`!oO!1a6{@(py>%!!?+cm`Ypw!IiVjqVxkDqNNY z4|?~m(3fQ(Gm#K?k_-Oe2+?}&IfRq)HF$&Qck-W?5p(27(G}+Na{fxbqAc1S9Q>Me zR$W!~<*BOq10Mp6OI)_*@{e>Xiz$Qw+ltj)M7HeLzoSG^I!nr^Ea2V_ymWX2Lqx+_Jn~IWRgB6A~Ws{AD2!-Bew`vME)^2@d$;-M`}3u`uQImD~B5nG-L#FGv{$ zxHyYrO3LMqqYW!M_2cB)PfFL5cu_kSv}`MAakJ;O{S;^np{=ygl7 z%}__TyrttutE<%>A}Lb+BD%SSRXkH)PJ$uA*9C!~trG)M+CGYe7`=zh=NL>e?T;!F z9`tM@mSN2#IrW*I=u>5bvokYKl6LeR{l8t0?0x2@-tGDoja^M;Zg$QOHWNx^gzfTB zW54$b)M=FQ2@mMyI7wk==s;I%_5DhrH?xM;JDXa&IV!~dR@lD$g~jnYmucn`rD~;~ zU-b$%UlTB{3mivt)&-jd@uf))iwO_j)oSVqL-SmnoZ|8ys{by!4DLN;_j6zhu9zU1 z-}Y`0!j06(=&ZSeV%$^Dwq&&&CRc`kK1q5GqAsL(&CepeIsjH>W>2xu4l#|-P91#o z5H=NKrDh;{WGKt+u(w+072WW)%h$SiIFy1%3@7JE_h(!P_ZIkRI~AXT@{xuu54kWh zC-kw z1-^$rjo#1c+Kmwxa+7!(^vjbq{I9N{^^A>?YV=O-GBUN{WM+sblI+Yj8kA&Gzex#y zH#V1;XuoibIvPOSI<`M=69B46Jap`r+O3@&UsCsM_`k|lR3XQ~r5L#N0I|?VJSda0m%MyBa?a|kft<+b;+MhTE(zgddgoLnbco*ZR zU2*Q(4O(PY_h(AKp+l|M_kvCa(xze#qwGZ<7_B$xDYi^+Bl(dcxem#nC*N5h%a zy_*E`eb#yAF{dc%Qpt6k>hO)ei8s$s->*{Wu_%+x06xEpgMO@o)u;onDzI6-k!CkL zCY-uvJXsu}DB;2jRP>X|#$PgW-g#jXUNbv{79Qk1so!5YL;)$6pap) zH~!KkKR+J|aN(Ld4MLCj6tEpWMQBEsEO8l~z=kBT8%*}Pho((xZecnk2`{vfkmz9` zy&Ofh7{U2N>q~vTBf-v9H!;t_)iveF#3xUmo<8Tg#Ns!P8sRzk5A`Av&8v6s&ONRo zLk%@_e?D~FUddm-tu%OPyVie4BKhBaAR0mP zkWK7j{eqPZXDSoPS@PX`PkN839N$ZCyw3s8SDdWOZBn#;nEb%kk?uunyEz_0w$tv^ zJnf0h06=8`uqAu?=|T=e9B{- z5OJ%Q-+$@i#TxB`=z~C@$-8fqVH=4+wi}?Rb?f{5NRA$Hobcbz4Y!t1?#RDxZf>5N zU2^Z<*y}%XK34%1kz_?UZCMPI)B{p^)~zg$x&x zRfDwxDDV>fpl}?Z%18)~pLKBfmygK?sfWml^;P#iq<^yc0_9@b6klj7ExV;)q;s>^ zQY#1cW4K?b4~70PSAgAjde7`6Uy zwsOVd4`O@?lLKYU!gKHVCu?K`_V1G8;x)Ov+ZpRny`Dw$evOgz-ZpgOy)io`8di(-jt(6R^kA3rOcYjU@!vE?qQ69=r3a5sU+C`X-P3FfXJx+UY*nQMycx+wY1F~P^ z)OPfa$+_3(RK?lW`R!M_nZ}(lPntAD&MYdfucLZwd%u@63%bXp9kZ01E>)sAU$@R4 z#_rlUoNSIQ3VEw9`j5FP@3&uoKQvXayKCZvUXK>_;P)8;$BIng<+(3!6nP9GmfvRbdTzd032cztw&Y7&zE}m^3?lMMy#_MURDIGs*QV!j08)B;>#unT-twS&ixV#51^}ug;13l4id^Ux!hF{Xr>(T+%fsZRw@$5U1aqE^xjXv^BEz%mthU*27Ctaq833|Leb|$Ro43fnoX8n7T`TsWwv{ooOZo>BlyB!&jk$-y@SW@aYWloR?#6;+?(4_LohyAgX6EVO*d5#M_n$iH zajUG}`?TB<`#$8iHaBfK(-_#g`Rlb0BV&f{+!@;c=&_jS{*MyqW}h88Wa!Y1zP@Sm zl20<os;0JSi4&wGlGg{*9e-_6_%<`ndXf9QpMUlAPX6EGu_j+P z8NB)VGoMih6Nl`dbo6fc9Q7)@i<;)=7R`xpDcoq+FZiaF?=KRGe@C~r9()tiVG3XC zmcNPl(O+IRD?7Wjc!m4gwH0-n-sYs8C{3D|T<#FnPa?V6`}RUf;Qf_22F91pif~CT zU8&XaLz-X2s5<<;RwF?6w9V-wCDldFx=$WIZtzx-NF-Gw{{2mEPEMnD7e4WjQU3O- zbwwKdPBL(hk(~H9=!63ABJq#Y2oV44sL?}J{QLj<>+=lvedeKG*Q_$8?%g}nm+KbM z(Q3cH(Q4|x_*GZZ&p+C6=AusMwNaz=X+HG)RdRJnp1sxUhDA63EdB6@&5>1YDV6S` qYvXY1MisNL!hp{;VU<-?AI3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Caps Lock + + + + + + + + + + + + Shift + + + + Shift + + + + + + + + + + + + fullscreen + tabbedlayout + defaultlayout + dmenu + focus floating/tiling + left + down + up + right + splithoriz. + Mod1 + openterminal + splitvert. + stackedlayout + focusparent + resizemode + T + + diff --git a/docs/4.0/keyboard-layer2.png b/docs/4.0/keyboard-layer2.png new file mode 100644 index 0000000000000000000000000000000000000000..83616d935af20b2894e55d973b98d416d015a5ae GIT binary patch literal 49858 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�^!L?RiOt75+m*D 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

V(1P4dJ+awr!fZc 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 ROga9up6xIzb>^a9{tX$%z6}5X literal 0 HcmV?d00001 diff --git a/docs/4.0/keyboard-layer2.svg b/docs/4.0/keyboard-layer2.svg new file mode 100644 index 0000000..70cc602 --- /dev/null +++ b/docs/4.0/keyboard-layer2.svg @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Caps Lock + + + + + + + + + + + + + + + + + + + + + Shift + + + + Shift + + + + + + + + + + + + toggle tiling/floating + killwindow + exiti3 + restarti3 + moveleft + movedown + moveup + moveright + Mod1 + + diff --git a/docs/4.0/modes.png b/docs/4.0/modes.png new file mode 100644 index 0000000000000000000000000000000000000000..656a6dbb91d284b849aedf214a7c494baf031d16 GIT binary patch literal 5826 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 literal 0 HcmV?d00001 diff --git a/docs/4.0/multi-monitor.html b/docs/4.0/multi-monitor.html new file mode 100644 index 0000000..ee42703 --- /dev/null +++ b/docs/4.0/multi-monitor.html @@ -0,0 +1,108 @@ + + + + + + +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/4.0/refcard.pdf b/docs/4.0/refcard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ff733d256e49febc38ce5087cdd7fdaf07d974e GIT binary patch literal 61582 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 C;;ixj literal 0 HcmV?d00001 diff --git a/docs/4.0/repositories.html b/docs/4.0/repositories.html new file mode 100644 index 0000000..db62780 --- /dev/null +++ b/docs/4.0/repositories.html @@ -0,0 +1,120 @@ + + + + + + +i3: Debian and Ubuntu repositories + + + + + + + +
+

i3 - improved tiling WM

+ +
+
+ +
+

1. When should you use our repositories?

+
+

In general, you should use the repositories of your distribution. Adding +third-party repositories to your /etc/sources.list has security implications +and makes your apt-get update take longer. However, in some cases, using our +repositories makes sense:

+
+
+You are using Debian stable +
+
+

+ The latest version of i3 will be in Debian testing quite soon. The version + in Debian stable can be old, however (we cannot update it after stable has + been released). The best way is to add Debian testing and tell apt to + prefer Debian stable. You should not use our repository. +

+
+
+You are using Ubuntu +
+
+

+ Only a handful of packages are maintained by Ubuntu developers. The rest is + synchronized periodically from Debian, every 6 months. Therefore, Ubuntu + often includes old versions of i3. You should use our Ubuntu repository. +

+
+
+You want the latest i3 development version +
+
+

+ If you are using Debian (Debian-derived systems might work, too) and want + the latest development version of i3, you should use our Debian repository. +

+
+
+
+
+
+

2. Ubuntu repository

+
+

The Ubuntu repository is provided by sur5r and contains the latest stable release +of i3. To use it, run the following commands:

+
+
+
# echo 'deb http://debian.sur5r.net/i3/ natty universe' >> /etc/apt/sources.list
+# apt-get update
+# apt-get install i3
+
+

The following Ubuntu versions are currently available: lucid, maverick, natty.

+
+
+
+

3. Debian repository

+
+

Our Debian repository contains packages which are automatically built a few +minutes after every commit. To use it, run the following commands:

+
+
+
# echo 'deb http://build.i3wm.org/debian/i3-wm sid main' >> /etc/apt/sources.list
+# apt-get update
+# apt-get install i3-wm
+
+

To ensure that the autobuilt i3 packages will be preferred to the packages of +your distribution, put the following entry at the beginning of your +/etc/apt/preferences:

+
+
+
Package: *
+Pin: origin "build.i3wm.org"
+Pin-Priority: 1001
+
+

Then, install i3-wm.

+
+
+
+

+ + + diff --git a/docs/4.0/single_terminal.png b/docs/4.0/single_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe918cd2089f16a3b72b9291f655b57b0adefbf GIT binary patch literal 3382 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 B=(_*_ literal 0 HcmV?d00001 diff --git a/docs/4.0/stacklimit.png b/docs/4.0/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/4.0/tree-layout1.png b/docs/4.0/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/4.0/tree-shot1.png b/docs/4.0/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/4.0/tree-shot2.png b/docs/4.0/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/4.0/tree-shot3.png b/docs/4.0/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/4.0/two_columns.png b/docs/4.0/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/4.0/two_terminals.png b/docs/4.0/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/4.0/userguide.html b/docs/4.0/userguide.html new file mode 100644 index 0000000..513cb9e --- /dev/null +++ b/docs/4.0/userguide.html @@ -0,0 +1,1206 @@ + + + + + + +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 us on IRC (preferred) or post your +question(s) on the mailing list.

+
+
+
+

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 mod (alt):

+

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

+

Keys to use with Shift+mod:

+

+ +Keys to use with Shift+mod + +

+

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

+
+
+
+

2. Using i3

+
+

Throughout this guide, the keyword mod will be used to refer to the +configured modifier. This is the alt key (Mod1) by default, with windows (Mod4) +being a popular alternative.

+
+

2.1. Opening terminals and moving around

+

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

+

+Single terminal +

+

If you now open another terminal, i3 will place it next to the current one, +splitting the screen size in half. Depending on your monitor, i3 will put the +created window beside the existing window (on wide displays) or below the +existing window (rotated displays).

+

+Two terminals +

+

To move the focus between the two terminals, you can 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, mod+J is left, mod+K +is down, mod+L is up and mod+; is right. So, to switch between the +terminals, use mod+K or mod+L. Of course, you can also use the arrow keys.

+

At the moment, your workspace is split (it contains two terminals) in a +specific direction (horizontal by default). Every window can be split +horizontally or vertically again, just like the workspace. The terminology is +"window" for a container that actually contains an X11 window (like a terminal +or browser) and "split container" for containers that consist of one or more +windows.

+

TODO: picture of the tree

+

To split a window vertically, press mod+v. To split it horizontally, press +mod+h.

+
+
+

2.2. Changing the container layout

+

A split container can have one of the following layouts:

+
+
+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 mod+e for default, mod+h for stacking and +mod+w for tabbed.

+

+Container modes +

+
+
+

2.3. Toggling fullscreen mode for a window

+

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

+

There is also a global fullscreen mode in i3 in which the client will span all +available outputs.

+
+
+

2.4. Opening other applications

+

Aside from opening applications from a terminal, you can also use the handy +dmenu which is opened by pressing mod+d by default. Just type the name +(or a part of it) of the application which you want to open. The corresponding +application 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] 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 mod+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 mod+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 mod+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

+

The easiest way to resize a container is by using the mouse: Grab the border +and move it to the wanted size.

+

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 mod+Shift+r.

+
+
+

2.10. Exiting i3

+

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

+
+
+

2.11. 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). Those windows usually set the +appropriate hint and are opened in floating mode by default.

+

You can enable floating mode for a window by pressing mod+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. Tree

+
+

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 dock areas and a content container, 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.

+
+

3.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
+
+
+
+

3.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 (mod+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 mod+v to create a Vertical Split Container (to +open a Horizontal Split Container, use mod+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.

+
+
+

3.3. Focus parent

+

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 focus parent, 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. Focus parent, then open new terminal
+
+
+
+
+
+

4. 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.

+

On first start (and on all following starts, unless you have a configuration +file), i3 will offer you to create a configuration file. You can tell the +wizard to use either Alt (Mod1) or Windows (Mod4) as modifier in the config +file. Also, the created config file will use the key symbols of your current +keyboard layout. To start the wizard, use the command i3-config-wizard. +Please note that you must not have ~/.i3/config, otherwise the wizard will +exit.

+
+

4.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
+
+
+
+

4.2. Fonts

+

i3 uses X core fonts (not Xft) for rendering window titles. 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.

+

If i3 cannot open the configured font, it will output an error in the logfile +and fall back to a working font.

+

Syntax:

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

Examples:

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

4.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 custom vendor + 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
+bindcode [Modifiers+]keycode command
+
+

Examples:

+
+
+
# Fullscreen
+bindsym mod+f f
+
+# Restart
+bindsym mod+Shift+r restart
+
+# Notebook-specific hotkeys
+bindcode 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 :-). +

+
+
+
+
+

4.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>
+
+

Example:

+
+
+
floating_modifier Mod1
+
+
+
+

4.5. Orientation for new workspaces

+

New workspaces get a reasonable default orientation: Wide-screen monitors +(anything wider than high) get horizontal orientation, rotated monitors +(anything higher than wide) get vertical orientation.

+

With the default_orientation configuration directive, you can override that +behaviour.

+

Syntax:

+
+
+
default_orientation <horizontal|vertical|auto>
+
+

Example:

+
+
+
default_orientation vertical
+
+
+
+

4.6. Layout mode for new containers

+

This option determines in which mode new containers on workspace level will +start.

+

Syntax:

+
+
+
workspace_layout <default|stacking|tabbed>
+
+

Example:

+
+
+
workspace_layout tabbed
+
+
+
+

4.7. Border style for new windows

+

This option determines which border style new windows will have.

+

Syntax:

+
+
+
new_window <normal|1pixel|borderless>
+
+

Example:

+
+
+
new_window 1pixel
+
+
+
+

4.8. Arbitrary commands for specific windows (for_window)

+

With the for_window command, you can let i3 execute any command when it +encounters a specific window. This can be used to set windows to floating or to +change their border style, for example.

+

Syntax:

+
+
+
for_window [criteria] command
+
+

Examples:

+
+
+
# enable floating mode for all XTerm windows
+for_window [class="XTerm"] mode floating
+
+# Make all urxvts use a 1-pixel border:
+for_window [class="urxvt"] border 1pixel
+
+# A less useful, but rather funny example:
+# makes the window floating as soon as I change
+# directory to ~/work
+for_window [title="x200: ~/work"] mode floating
+
+
+
+

4.9. 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
+
+

Example:

+
+
+
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).

+
+
+

4.10. Automatically putting clients on specific workspaces

+

Specific windows can be matched by window class and/or window title. It is +recommended that you match on window classes instead of window titles whenever +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 → work
+assign "urxvt" → 2
+assign "urxvt/VIM" → 3
+assign "gecko" → 4
+
+

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.

+
+
+

4.11. 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. exec +commands will not run when restarting i3, if you need a command to run +also when restarting i3 you should use the exec_always +keyword. These commands will be run in order.

+

Syntax:

+
+
+
exec command
+exec_always command
+
+

Examples:

+
+
+
exec i3status | dzen2 -dock
+exec_always ~/my_script.sh
+
+
+
+

4.12. 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
+
+
+
+

4.13. Changing colors

+

You can change all colors which i3 uses to draw the window decorations.

+

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.

+
+
+

4.14. 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.

+

The IPC socket is enabled by default and will be created in +/tmp/i3-%u/ipc-socket.%p where %u is your UNIX username and %p is the PID +of i3.

+

You can override the default path through the environment-variable I3SOCK or +by specifying the ipc-socket directive.

+

Examples:

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

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

+
+
+

4.15. 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>
+
+

Example:

+
+
+
focus_follows_mouse no
+
+
+
+

4.16. Popups during fullscreen mode

+

When you are in fullscreen mode, some applications still open popup windows +(take Xpdf for example). This is because these applications may not be aware +that they are in fullscreen mode (they do not check the corresponding hint). +There are two things which are possible to do in this situation:

+
    +
  1. +

    +Just ignore the popup (don’t map it). This won’t interrupt you while you are + in fullscreen. However, some apps might react badly to this (deadlock until + you go out of fullscreen). +

    +
  2. +
  3. +

    +Leave fullscreen mode. This is the default. +

    +
  4. +
+

Syntax:

+
+
+
popup_during_fullscreen <ignore|leave_fullscreen>
+
+

Example:

+
+
+
popup_during_fullscreen ignore
+
+
+
+
+
+

5. List of commands

+
+
+

5.1. Splitting containers

+

The split command makes the current window a split container. Split containers +can contain multiple windows. Every split container has an orientation, it is +either split horizontally (a new window gets placed to the right of the current +one) or vertically (a new window gets placed below the current one).

+

If you apply this command to a split container with the same orientation, +nothing will happen. If you use a different orientation, the split container’s +orientation will be changed (if it does not have more than one window).

+

Syntax:

+
+
+
split <vertical|horizontal>
+
+

Example:

+
+
+
split vertical
+
+
+
+

5.2. Manipulating layout

+

Use layout default, layout stacking or layout tabbed to change the +current container layout to default, stacking or tabbed layout, respectively.

+

To make the current window (!) fullscreen, use fullscreen, to make +it floating (or tiling again) use floating enable respectively floating disable +(or floating toggle):

+

Examples:

+
+
+
bindsym mod+s layout stacking
+bindsym mod+l layout default
+bindsym mod+w layout tabbed
+
+# Toggle fullscreen
+bindsym mod+f fullscreen
+
+# Toggle floating/tiling
+bindsym mod+t floating toggle
+
+
+
+

5.3. Focusing/Moving containers

+

To change the focus, use the focus command: focus left, focus right, focus down and focus up.

+

There are a few special parameters you can use for the focus command:

+
+
+parent +
+
+

+ Sets focus to the Parent Container of the current Container. +

+
+
+child +
+
+

+ The opposite of focus parent, sets the focus to the last focused + child container. +

+
+
+floating +
+
+

+ Sets focus to the last focused floating container. +

+
+
+tiling +
+
+

+ Sets focus to the last focused tiling container. +

+
+
+mode_toggle +
+
+

+ Toggles between floating/tiling containers. +

+
+
+

For moving, use move left, move right, move down and move up.

+

Examples:

+
+
+
# Focus clients on the left, bottom, top, right:
+bindsym mod+j focus left
+bindsym mod+k focus down
+bindsym mod+l focus up
+bindsym mod+semicolon focus right
+
+# Focus parent container
+bindsym mod+u focus parent
+
+# Focus last floating/tiling container
+bindsym mod+g focus mode_toggle
+
+# Move client to the left, bottom, top, right:
+bindsym mod+j move left
+bindsym mod+k move down
+bindsym mod+l move up
+bindsym mod+semicolon move right
+
+
+
+

5.4. Changing workspaces/moving containers to workspaces

+

To change to a specific workspace, use the workspace command, followed by the +number or name of the workspace. To move containers to specific workspaces, use +move workspace.

+

You can also switch to the next and previous workspace with the commands +workspace next and workspace prev, 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 mod+1 workspace 1
+bindsym mod+2 workspace 2
+...
+
+bindsym mod+Shift+1 move workspace 1
+bindsym mod+Shift+2 move workspace 2
+...
+
+
+
+

5.5. Resizing containers/windows

+

If you want to resize containers/windows 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 j resize shrink left
+        bindsym Shift+j resize grow left
+
+        bindsym k resize grow bottom
+        bindsym Shift+k resize shrink bottom
+
+        bindsym l resize shrink top
+        bindsym Shift+l resize grow top
+
+        bindsym semicolon resize grow right
+        bindsym Shift+semicolon resize shrink right
+
+        bindcode 36 mode default
+}
+
+# Enter resize mode
+bindsym mod+r mode "resize"
+
+
+
+

5.6. 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. You can use the focus command +with criteria for that.

+

Syntax:

+
+
+
[class="class"] focus
+[title="title"] focus
+
+

Examples:

+
+
+
# Get me to the next open VIM instance
+bindsym mod+a [class="urxvt" title="VIM"] focus
+
+
+
+

5.7. 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
+[con_mark="identifier"] focus
+
+

Example (in a terminal):

+
+
+
$ i3-msg mark irssi
+$ i3-msg '[con_mark="irssi"] focus'
+
+
+
+

5.8. Changing border style

+

To change the border of the current client, you can use border normal to use the normal +border (including window title), border 1pixel to use a 1-pixel border (no window title) +and border none to make the client borderless.

+

There is also border toggle which will toggle the different border styles.

+

Examples:

+
+
+
bindsym mod+t border normal
+bindsym mod+y border 1pixel
+bindsym mod+u border none
+
+
+
+

5.9. 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. 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 mod+Shift+r restart
+bindsym mod+Shift+w reload
+bindsym mod+Shift+e exit
+
+
+
+
+
+

6. 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).

+
+

6.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.

+
+
+

6.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. +
+
+
+
+
+

7. i3 and the rest of your software world

+
+
+

7.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. Because +i3status only spits out text, you need to combine it with some other tool, like +i3bar. Use a pipe to connect them: i3status | i3bar -d.

+

Regardless of which application you use to display the status line, you +want to make sure that it registers as a dock window using EWMH hints. i3 will +position the window either at the top or at the bottom of the screen, depending +on which hint the application sets. With i3bar, you can use -d or -dbottom +for positioning it at the bottom and -dtop to position it at the top of the +screen.

+
+
+

7.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.

+
+

7.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).

+
+
+

7.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/4.0/wsbar.html b/docs/4.0/wsbar.html new file mode 100644 index 0000000..7a3b822 --- /dev/null +++ b/docs/4.0/wsbar.html @@ -0,0 +1,147 @@ + + + + + + +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/4.0/wsbar.png b/docs/4.0/wsbar.png new file mode 100644 index 0000000000000000000000000000000000000000..0789dec532bea9c358c782f14f6c95a0cece5319 GIT binary patch literal 14339 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/index.html.mako b/docs/index.html.mako index 927ca16..1c890bc 100644 --- a/docs/index.html.mako +++ b/docs/index.html.mako @@ -11,31 +11,47 @@ below will hopefully answer all your questions. If you have any corrections or suggestions please let us know!

+

+Because version 4.0 is quite new, we still have the old documentation for 3.ε +online for a few weeks. You can chose which version you want by clicking on the +boxes right next to the links. +

+

For users

-User’s Guide
+User’s Guide +4.0 +3.ε
Introduction and reference. Read this one.

-Multi-monitor
-Interesting for users of the nVidia binary driver. +Multi-monitor +4.0 +3.ε
+Interesting for users of the nVidia driver.

-Debugging i3
+Debugging i3 +4.0 +3.ε
Explains you how to enable the i3 logfile.

-External workspace bars
+External workspace bars +4.0 +3.ε
About bar programs such as i3bar or dzen2.

-i3 reference card (PDF)
+i3 reference card (PDF) +4.0 +3.ε
Might be useful to memorize i3’s shortcuts.

@@ -49,17 +65,23 @@ Tells you how to check out our git repository.

-Hacking Howto
+Hacking Howto +4.0 +3.ε
Helps you if you want to get into i3’s source code.

-Debugging i3
+Debugging i3 +4.0 +3.ε
Explains you how to enable core dumps.

-IPC documentation
+IPC documentation +4.0 +3.ε
Explains how i3’s Inter Process Communication interface works. Read this if you want to talk to i3 within your own scripts or programs.

-- 2.39.5