%guide to wmii-3
%Copyright (C) 2005, 2006 by Steffen Liebergeld

%This program is free software; you can redistribute it and/or
%modify it under the terms of the GNU General Public License
%as published by the Free Software Foundation, version 2

%This program is distributed in the hope that it will be useful,
%but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%GNU General Public License for more details.

%You should have received a copy of the GNU General Public License
%along with this program; if not, write to the Free Software
%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%02110-1301, USA.

\documentclass[12pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[left=3cm,top=2cm,right=2cm,bottom=3cm]{geometry}
\usepackage[a4paper,dvipdfm]{hyperref}
%\usepackage{ngerman}
\usepackage{times}
\newenvironment{itemize*}
  {\begin{itemize}
      \setlength{\itemsep}{0pt}
      \setlength{\parskip}{0pt}}
  {\end{itemize}}
\date{\today}
\author{Steffen Liebergeld}
\title{A Guide to wmii-3}
%\email{stepardo@gmail.com}

\begin{document}

\maketitle

\tableofcontents

\newpage

\section{Abstract}

  \subsection{The purpose of this document}

    This document tries to be a good starting point for people new to
    wmii-3.  People who have used wmi, wmii-2.5 or even ion will get
    to know what is new and different in wmii-3, and people who have
    never used a tiling window manager before will fall in love with
    the new concept.
  
  \subsection{Wmii - the second generation of window manager improved}

    Wmii-3 is a new kind of window manager. It is designed to have a
    small memory footprint, be extremely modularised and have as
    little code as possible, thus ensuring as few bugs as possible. In
    fact, one of our official goal is to not to exceed 10000 lines of
    code.

    Wmii tries to be very portable and to give the user as many
    freedom as possible.

    Wmii-3 is the third mayor release of the second generation of the
    window manager improved \footnote{The ii is actually a roman
    letter for the number 2}. Wmii first introduced a new paradigm in
    version 2.5, namely the dynamic window management.
  
  \subsection{Target audience}

    I presume the reader already has some experiences with Unix, knows
    all the basic terminology like files or editors. It is helpful if
    you know what a socket and a network protocol is.

    The best audience is always the audience that is open minded
    against new ideas, and is willing to spend some time learning it.
  
\section{Configuration and install}

  \subsection{Obtaining wmii}

    Wmii is licensed under the MIT/X Consortium License, which
    basically means it is free software, and you are free to download
    it free of charge
    \footnote{Please have a look at http://wmii.de/repos/wmii/LICENSE
    for details} .

    You may download it from http://wmii.de/
  
  \subsection{Configuration and Installation}

    Unpack it:
  
    \begin{verbatim}
      tar xzf wmii-3.tar.gz
      cd wmii-3
    \end{verbatim}
  
    Edit the configuration:

    \begin{verbatim}
      vim config.mk
    \end{verbatim}

    The most important variable to set is the PREFIX, which states,
    where you want wmii-3 to be installed to.

    Run make and make install:

    \begin{verbatim}
      make && make install
    \end{verbatim}

    Now you have to tell the X-Server to start wmii as your default
    window manager. You may do that by editing the file
    \emph{~/.xinitrc}.

    \begin{verbatim}
      #!/bin/sh
      exec wmii
    \end{verbatim}

    Make sure that the \emph{~/.xinitrc} is executable:

    \begin{verbatim}
      chmod a+x ~/.xinitrc
    \end{verbatim}

    And you are finished. Please note that we do not use the autoconf
    tools for various reasons, you may read about it here
    \footnote{
      http://www.ohse.de/uwe/articles/aal.html \linebreak[4]
      http://lists.cse.psu.edu/archives/9fans/2003-November/029714.html
      } . Please don't ask us to use autoconf, we won't do it.

\section{Terminology}
  
  Before you actually start doing your first steps in wmii, we have to
  make sure we are both talking about the same things. So here is some
  terminology.

  \subsection{Clients}

    A client is a program, that draws a window to the
    screen 
    \footnote{Actually it is the program that requests the xserver
      to draw the window. But never mind;-)}
    . For example your browser or your xterm is a client.
  
  \subsection{Focus}

    In X11, exactly one client gets the users input. If you write some
    command in your xterm, this xterm has the focus, whereas all the
    other windows do not react on the input you give
    \footnote{Actually
      this is not precise at all, because some programs catch input
      before it is sent to the focussed client. But you do not need to
      know about this..}
    We will say from now on, that the xterm has the
    focus.
  
  \subsection{Events}

    Events are generated by your input. For example when you click
    into a window, that is an event. Events are used for example to
    interact with the window manager. You will see how this works
    later on.
  
  \subsection{Tags}

    Tags are names you can give for clients. That allows you to group
    clients.  In wmii, there are no workspaces anymore. Instead, we
    simply show only one tag at one time. Thus, if you name a client
    "web-browser" and request the wm to only show the tag
    "web-browser", you will only see that one client. If you tag a
    xterm with the same tag, it will also be shown, when your first
    client with the tag "web-browser" is visible. It is also possible
    to give clients multiple tags, but more on this later.

  \subsection{View}

    When you request the window manager to only show windows with one
    particular tag, you may call this a view. You might imagine, that
    this somewhat resembles the "workspace" of other window managers.

    You might have different views with only one of them visible at a
    particular time.

    Views are defined by the tags only, so if you don't have a tag of
    a particular name, you don't have a view of that name.  Similarly,
    if you destroy the last client with one tag, the view with the
    same name also gets destroyed.

  \subsection{Column}

    In wmii, you are able to divide each view into different columns,
    which are distinct parts of the screen, divided by an invisible
    line between each other. You should be aware, that every column
    holds at least one client. As soon as you close the last client of
    a column, the column will be destroyed.

    Please be aware, that every view has at least one column.

  \subsection{Layout}

    You may order clients in a column in three different ways. The
    first, which is also the default, is to give each window equally
    much vertical space in a column. The second is to have each client
    maximised in the column, showing only one of them at a time, while
    hiding the others. And last but not least you may have the clients
    stacked, which means have to one client use as much space as
    possible and to show only the title-bars of the other windows.

\section{Getting started}

  It is now time to start diving into the wmii user experience. I
  suggest you to try the things I describe yourself immediately
  instead of first reading it, forgetting half of it and then trying
  to start. It is very helpful if you have this document printed out
  or have it on a different machine, since you won't be able to view
  it during your first steps in wmii.

  On a special note, the \emph{MOD} key I am referring to may resemble
  different keys on different platforms. It is what X knows as the
  \emph{Meta} or \emph{Alt} key. Most probably, this is the \emph{Alt}
  key left of the space-bar on your keyboard.

  The notation \emph{MOD+Key} means to press \emph{MOD}, hold it and
  to press \emph{Key}.

  All key combinations may be freely configured, but for the sake of
  simplicity I'll stick with the default bindings for this
  introduction. You may find out how to alter the bindings in the
  ``Scripting wmii''-Chapter.

  \subsection{First steps}

    You may now start your X session. Since it is the first time you
    start wmii, a window with some tutorial messages will occur. You
    are free to read it, but you may also follow the beginners guide
    :-)

    First of all, press \emph{MOD+t} to start an xterm. It will take
    half of the vertical space, so you now have two equally big
    windows. If you press \emph{MOD+t} again, you have three windows
    that are equally big.

    To switch between the three windows, you may now press
    \emph{MOD+Tab}, which cycles the focus between the three windows.

    You may also press \emph{MOD+k} to switch to the window above or
    \emph{MOD+j} to switch to the window below the current.

    Now have a look at the title-bars of those windows. They show some
    important information: the first term is the name of the tag of
    the window. Then, after the vertical line (the pipe symbol) wmii
    shows the title of the window.

    The same information is also shown on the menu-bar. The first
    things are names of the different tags you gave to your windows,
    with the current view highlighted. Then it shows the title of the
    focused window. On the right side it shows some system status
    information like the load and the current time.

  \subsection{Using Columns}

    As you know wmii uses columns to align your windows. Even now,
    that you didn't really see it your view already consists of one
    maximised column. The next step is to create a new column.

    In wmii columns are defined by its clients. Thus you need a client
    to create a new column. That is why you may now focus a client of
    your choice and press \emph{MOD+n}. As you see, wmii created a new
    column by dividing the view horizontally in two equally big
    spaces. The last focused client has been put into the new column.

    If you close the last window of a column, the column will vanish
    immediately. And when the last column is gone, the view will be
    removed accordingly.

    It should be clear, that you really need at least two clients to
    have two columns.

    If you press \emph{MOD+Tab} to change focus, you will see that
    wmii actually cycles the focus in the current column only. That is
    why you need commands to change the current column.

    In wmii you may use \emph{MOD+l} to change to the column on the
    right and \emph{MOD+h} to change to the column on the left.

    It is also possible to make a client swap columns. To move a
    client to the column on the left, press \emph{MOD+Enter} and to
    move it to the right column, press \emph{MOD+Shift+Enter}.

  \subsection{What about layouts}

    Layouts are different methods of how to align windows in a
    column. They apply only to one column each. Thus it is possible to
    have different columns in one view, each having another layout.

    The default layout is to give each client in the column equally
    much vertical space. You may enable this layout with \emph{MOD+e}
    (where the ``e'' stands for equal).

    Another layout is the stacked layout. You enable stacking by
    \emph{MOD+s}. As you see now, there in only one client using as
    much space as possible, whereas you only see the title-bars of the
    other clients in the column. You may still switch between the
    clients in the column using \emph{MOD+Tab}.

    The third layout is the max-layout, which maximises all the
    clients to use all the space in the column each. Only the focused
    client is visible and the other are hidden behind. You may still
    switch between those clients with \emph{MOD+Tab}.

  \subsection{Float pages}

    You may have asked yourself how classical clients, consisting of
    multiple windows fit into the picture.

    Well, they don't. But wmii has a solution to make the usable
    nevertheless. For clients like the Gimp or xmms there is a special
    mode, which has completely different semantics.

    While wmii is a dynamic window manager, which really takes all the
    work of positioning and aligning clients from you, those old
    fashioned programs rely on the old window managing concept, where
    all the clients fly around on the desktop and the user has to tell
    them where to stay. We have the term floating windows for this
    pragma.

    To come to the point: wmii also allows you to use floating
    clients. You may enable floating mode for a window by focusing it
    and pressing \emph{MOD+Space}. You may bring it back into a column
    (the column it came from) by pressing \emph{MOD+Shift+Space}.

    As a side note, this floating mode is actually the zeroth column
    internally. You will see later on why this was implemented this
    way.

  \subsection{Tags}

    Up to now all your clients had the tag ``1'', and you only had
    this one view. It is obvious that having only one view might
    become a problem if there are too many clients cluttering it and
    making it a pure mess. Also you might want to have a view with
    your editor and your programming tools and another with your
    browser and a third with your music jukebox.

    The good news is, that with the concept of tags and views this is
    actually possible.

    You may give the focused client another tag by pressing
    \emph{MOD+Shift+Number}, number being one of the numbers 1 to 9.

    You can then switch views by pressing \emph{MOD+Number}.

    Whenever a new client is created, it automatically gets the tag of
    the current view.

  %% TODO: better tag handling (this is about to change in wmii till 
  %%version 3)

    For the moment I just tell you, that there are further
    possibilities with tags, but they are mostly accessible with
    advanced techniques, you will learn in the next chapter. You will
    then be able to assign multiple tags to one client and to use
    proper strings as tags.

\section{Looking under the hood}

  In this chapter you will learn how wmii was designed, which ideas
  the wmii developers followed and how it was implemented.

  \subsection{Dynamic window management}

    Wmii was designed around the new idea of dynamic window
    management. Dynamic window management means, that the window
    manager should make all the decisions about where to place a new
    client itself, thus taking all the extra work from the user and
    letting him concentrate on his work.

  \subsection{Modularity - using distinct tools for distinct tasks}

    The developers of wmii know about the most powerful ideas of
    Unix. One of them is the idea to use distinct tools for distinct
    tasks. By carefully designing the window manager, we were able to
    split the task into two smaller binaries, each with a distinct
    job.
  
  \subsection{The glue that puts it all together - 9p}

    Programs in Unix have several different possibilities to exchange
    information, the most powerful being sockets.

    To create a lightweight but powerful communication protocol, we
    looked closely at the design of Plan9 and chose the 9P2000
    protocol.

    The basic ideas for configuring and running wmii were taken from
    Plan9 too. Like in Plan9, everything configurable in wmii is a
    file. Thus, if you want to interact with a running wmii, you may
    alter those files either using the shipped tool \emph{wmiir} or -
    if you use fuse - you may also mount the virtual file-system of
    wmii into your global name-space.
  
  \subsection{wmiir}

    \emph{wmiir} is a little tool we use to alter the files in the
    virtual file-system of wmii. It basically has four tasks:

    \begin{itemize*}
    \item read
    \item write
    \item remove
    \item create
    \end{itemize*}

    Wmiir needs to know the socket file of the file-system to work
    on. Usually this is already defined in the environment variable
    \begin{verbatim}
      WMIIR_SOCKET
    \end{verbatim}. If it isn't, or you want to work on another
    file-system, you may specify it manually with the switch -s
    socket-file.

    A sample invocation would look like the following:

    \begin{verbatim}
      wmiir read /
    \end{verbatim}
    
    This command actually prints the root of the virtual file-system
    of wmii.

  \subsection{wmiimenu}

    \emph{wmiimenu} is a generic X11 menu. It is highly customisable,
    efficient and supports user-defined contents. You may want to
    learn more about it by reading the man-page.

  \subsection{wmiiwarp}

    \emph{wmiiwarp} is a little tool to position the mouse pointer to
    different places. It only takes two coordinates as arguments.

  \subsection{wmiiwm}

    \emph{wmiiwm} is the main window manager binary. You may interact
    with its virtual file-system only.

  \subsection{wmiipsel}

    \emph{wmiipsel} prints the contents of the X clipboard to
    STDOUT. This is useful for scripts.

  \subsection{Conclusion}

    By having the virtual file-system and a lightweight protocol to
    fit our tools together, we are now able to fully script our window
    manager. You will see some examples in the chapter ``Scripting
    wmii''.

\section{Scripting wmii}

  In this chapter you will see how to script wmii. I will give you a
  good starting point and give you some examples so you can start your
  own examples.

  \subsection{Language}

    You may script wmii in any programming language you want. However,
    for the sake of simplicity, I'll use ``sh'' for the examples. I
    chose ``sh'' because the standard startup scripts of wmii are
    written in ``sh'' too.

    When you start your own experiments, just use the language you are
    most comfortable with.

  \subsection{wmiirc}

    \emph{wmiirc} is a ``sh''-script, which is run on startup of
    wmii. It first sets up the initial file-system, writes some values
    to certain files and then starts the event loop to react on
    certain events like key-presses or mouse clicks. For the basic
    configuration of wmii this is probably the place to look at.

    You may edit this file on the fly, which means you don't need to
    stop wmii before editing. After you finished editing, you may
    simply run wmiirc and the changes will take effect.

    To run the altered wmiirc just go to the actions menu
    \emph{MOD+Control+a} and choose \emph{wmiirc}.

  \subsection{actions}

    In wmii you may group certain tasks into \emph{actions}. Actions
    are nothing more than simple executables which are located either
    in your local or in your global wmii configuration directory.

%  \footbote{This is normally either ~/.wmii-3/ or
%  /usr/local/etc/wmii-3}

    As you see, even \emph{wmiirc} is an \emph{action}. You might want
    to add your own actions by writing shell scripts and putting them
    into the right directory.

  \subsection{Practical execises}

    \subsubsection{Assigning new tags}

      As I told you before, you can do much more things with tags than
      what you can do with the standard key-bindings. You might use
      any string as a tag. You may even use more than one tag per
      client. To do so, you have to seperate the tags with a ``+''.

      \begin{verbatim}
        echo -n foo+bar | wmiir write /view/sel/sel/tags
      \end{verbatim}

      This command would give the current focused client the tags
      ``foo'' and ``bar''.

      You may now go to the new view foo by executing the following:

      \begin{verbatim}
        echo -n select foo | wmiir write /ctl
      \end{verbatim}

    \subsubsection{Filling the status-bar}

      

\section{Copyright notice}

\end{document}
