From 7adfd37a124e991ee2b22873ea3ba818241b8724 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 27 May 2010 20:21:17 +0200 Subject: [PATCH] Add documentation for external workspace bars --- docs/Makefile | 5 ++- docs/wsbar | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ docs/wsbar.dia | Bin 0 -> 1899 bytes docs/wsbar.png | Bin 0 -> 14339 bytes 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 docs/wsbar create mode 100644 docs/wsbar.dia create mode 100644 docs/wsbar.png diff --git a/docs/Makefile b/docs/Makefile index b17413ca..79e5019a 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,5 +1,5 @@ -all: hacking-howto.html debugging.html userguide.html ipc.html multi-monitor.html +all: hacking-howto.html debugging.html userguide.html ipc.html multi-monitor.html wsbar.html hacking-howto.html: hacking-howto asciidoc -a toc -n $< @@ -16,6 +16,9 @@ ipc.html: ipc multi-monitor.html: multi-monitor asciidoc -a toc -n $< +wsbar.html: wsbar + asciidoc -a toc -n $< + clean: rm -f */*.{aux,log,toc,bm,pdf,dvi} rm -f *.log *.html diff --git a/docs/wsbar b/docs/wsbar new file mode 100644 index 00000000..9e379dd9 --- /dev/null +++ b/docs/wsbar @@ -0,0 +1,94 @@ +External workspace bars +======================= +Michael Stapelberg +May 2010 + +This document describes why the internal workspace bar is minimal and how an +external workspace bar can be used. It explains the concepts using +i3-wsbar+ +as the reference implementation. + +== Internal and external bars + +The internal workspace bar of i3 is meant to be a reasonable default so that +you can use i3 without having too much hassle when setting it up. It is quite +simple and intended to stay this way. So, there is no way to display your own +information in this bar (unlike dwm, wmii, awesome, …). + +We chose not to implement such a mechanism because that would be duplicating +already existing functionality of tools such as dzen2, xmobar and similar. +Instead, you should disable the internal bar and use an external workspace bar +(which communicates with i3 through its IPC interface). + +== dock mode + +You typically want to see the same workspace bar on every workspace on a +specific screen. Also, you don’t want to place the workspace bar somewhere +in your layout by hand. This is where dock mode comes in: When a program sets +the appropriate hint (_NET_WM_WINDOW_TYPE_DOCK), it will be managed in dock +mode by i3. That means it will be placed at the bottom of the screen (while +other edges of the screen are possible in the NetWM standard, this is not yet +implemented in i3), it will not overlap any other window and it will be on +every workspace for the specific screen it was placed on initially. + +== The IPC interface + +In the context of using an external workspace bar, the IPC interface needs to +provide the bar program with the current workspaces and output (as in VGA-1, +LVDS-1, …) configuration. In the other direction, the program has to be able +to switch to specific workspaces. + +By default, the IPC interface is enabled and places its UNIX socket in ++~/.i3/ipc.sock+. + +To learn more about the protocol which is used for IPC, see +docs/ipc+. + +== Output changes (on-the-fly) + +i3 implements the RandR API and can handle changing outputs quite well. So, an +external workspace bar implementation needs to make sure that when you change +the resolution of any of your screens (or enable/disable an output), the bars +will be adjusted properly. + +== i3-wsbar, the reference implementation + +Please keep in mind that +i3-wsbar+ is just a reference implementation. It is +shipped with i3 to have a reasonable default. Thus, +i3-wsbar+ is designed to +work well with dzen2 and there are no plans to make it more generic. + +=== The big picture + +The most common reason to use an external workspace bar is to integrate system +information such as what +i3status+ provides into the workspace bar (to save +screen space). So, we have +i3status+ or a similar program, which only provides +text output (formatted in some way). To display this text nicely on the screen, +there are programs such as dzen2, xmobar and similar. We will stick to dzen2 +from here on. So, we have the output of i3status, which needs to go into dzen2 +somehow. But we also want to display the list of workspaces. +i3-wsbar+ takes +input on stdin, combines it with a formatted workspace list and pipes it to +dzen2. + +Please note that +i3-wsbar+ does not print its output to stdout. Instead, it +launches the dzen2 instances on its own. This is necessary to handle changes +in the available outputs (to place a new dzen2 on a new screen for example). + +image:wsbar.png["Overview",link="wsbar.png"] + +=== Running i3-wsbar + +The most simple usage of i3-wsbar looks like this: +------------------------------- +i3-wsbar -c "dzen2 -x %x -dock" +------------------------------- + +The +%x+ in the command name will be replaced by the X position of the output +for which this workspace bar is running. i3 will automatically place the +workspace bar on the correct output when dzen2 is started in dock mode. The +bar which you will see should look exactly like the internal bar of i3. + +To actually get a benefit, you want to give +i3-wsbar+ some input: +------------------------------------------ +i3status | i3-wsbar -c "dzen2 -x %x -dock" +------------------------------------------ + +It is recommended to place the above command in your i3 configuration file +to start it automatically with i3. diff --git a/docs/wsbar.dia b/docs/wsbar.dia new file mode 100644 index 0000000000000000000000000000000000000000..d117ce075a4400334f757e706e5fb7853049d6d6 GIT binary patch literal 1899 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