mirror of https://github.com/0intro/wmii
1006 lines
40 KiB
TeX
1006 lines
40 KiB
TeX
%TODO: please mention the /def/rules mechanism!
|
|
|
|
|
|
%guide to wmii-4
|
|
%Copyright (C) 2005, 2006 by Steffen Liebergeld, Salva Peir\'o
|
|
|
|
%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} %options given to article are inherited to all packages
|
|
\usepackage[latin1]{inputenc}
|
|
\usepackage[left=3cm,top=2cm,right=2cm,bottom=3cm]{geometry}
|
|
\usepackage{times}
|
|
\usepackage{hyperref} % option [dvipdfm] disables clickable refs
|
|
\hypersetup{pdftex, colorlinks=true, linkcolor=blue, filecolor=blue,
|
|
pagecolor=blue, urlcolor=blue, pdfauthor={Steffen Liebergeld, Salva Pei\'ro},
|
|
pdftitle={A Guide to wmii-4}}
|
|
\usepackage{indentfirst,moreverb}
|
|
% remove this if you want, it's just a matter of imposed imperialist cultures
|
|
% so if I'm given the chance to choose I choose to indent the first paragraph
|
|
% (I learn this way in the school, and don't want to relearn the British way)
|
|
|
|
%% welcome to the dirty tricks section
|
|
\newcommand{\hrefx}[1]{\href{#1}{#1}} % explicit \href
|
|
% un'% below so latex2html can handle refs correctly (until a better solution is found)
|
|
%\usepackage{html} % gives clickable refs to latex2html
|
|
%\renewcommand{\href}[2]{\htmladdnormallink{#2}{#1}}
|
|
%\renewcommand{\hrefx}[1]{\htmladdnormallink{#1}{#1}}
|
|
%\renewcommand{\verbatiminput}[1]{\input{#1}}
|
|
\renewcommand{\familydefault}{\sfdefault}
|
|
\newcommand{\wmii}{\emph{wmii}}
|
|
|
|
\newenvironment{itemize*}
|
|
{\begin{itemize}
|
|
\setlength{\itemsep}{0pt}
|
|
\setlength{\parskip}{0pt}}
|
|
{\end{itemize}}
|
|
\date{\today}
|
|
\author{
|
|
Steffen\\Liebergeld \\\\
|
|
\small{with help from}\\
|
|
Salvador\\Peir\'o
|
|
}
|
|
|
|
\title{A Guide to wmii-4%
|
|
\thanks{Thanks to the wmii community, in particular all the
|
|
people mentioned at \href{http://wmii.de/index.php/WMII/People}{WMII/people}.}
|
|
}
|
|
%\email{stepardo@gmail.com \and saoret.one@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-4. People who have used wmi, \wmii-2.5 or even ion will get
|
|
to know what is new and different in \wmii-4, 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-4 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 goals is to not exceed $10 k$ lines of
|
|
code~\footnote{ benefit of the $10 k$ SLOC restriction is that
|
|
it's easier to read/understand, thus it's easier to use and get
|
|
used to it}.
|
|
|
|
\wmii{} tries to be very portable and to give the user as much
|
|
freedom as possible.
|
|
|
|
\wmii-4 is the third major release of the second generation of the
|
|
window manager improved~\footnote{ the ii is actually the roman
|
|
numeral for 2.}. \wmii{} first introduced a new paradigm in version
|
|
2.5, namely dynamic window management, that overcomes the
|
|
limitations imposed by the WIMP paradigm (see also the companion
|
|
\emph{wmii.tex}).
|
|
|
|
\subsection{Target audience}
|
|
|
|
I presume the reader already has experience with Unix, knows all
|
|
the basic terminology and concepts like files and editors.
|
|
|
|
I hope you are open minded towards new ideas, and willing to spend some
|
|
time learning \wmii-4~\footnote{remember the refrain: ``nobody
|
|
can teach you what you don't want to know''.}.
|
|
|
|
If you only want to know how to operate \wmii-4 and are not
|
|
interested in the inner workings or in scripting, you may read
|
|
sections \ref{sec:conf&install}, \ref{sec:terms} and subsection
|
|
\ref{subsec:firststeps} and skip the rest.
|
|
|
|
However, to get the most out of \wmii-4 you should probably read
|
|
the whole document ``sequentially'', i.e. from beginning to end.
|
|
Another possibility is to read/consume the guide ``on demand'' as
|
|
you notice you need more information or details to understand
|
|
better some concept. We recommend you to read the introductory
|
|
chapters first, use some time to get settled in the \wmii-world
|
|
and read the scripting chapters later on.
|
|
|
|
\section{Configuration and install}
|
|
\label{sec:conf&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 from \hrefx{http://wmii.de} free of charge~\footnote{ please have
|
|
a look at \hrefx{http://wmii.de/repos/wmii/LICENSE} for
|
|
details}.
|
|
|
|
\subsection{Configuration and installation}
|
|
|
|
First of all, have a look if there are binary packages of \wmii{} in
|
|
your distribution. Debian, Ubuntu and Gentoo should already have
|
|
good packages. If you found a trustworthy package, you may now safely
|
|
skip this section.
|
|
|
|
For all those who are still reading this, let me tell you that you are
|
|
on the good side because if you grab the sources and compile them yourself
|
|
you'll benefit from having everything in it's original place, which will
|
|
ease your use of \wmii.
|
|
|
|
\begin{enumerate}
|
|
|
|
\item Uninstalling a previous version:
|
|
\begin{verbatim}
|
|
cd /path/to/wmii-previous
|
|
make uninstall && make clean
|
|
\end{verbatim}
|
|
|
|
In case you're installing a newer version of \wmii, this is the
|
|
first thing you should do otherwise you'll end up mixing
|
|
binaries, configuration files and manual-pages of different and
|
|
potentially incompatible versions.
|
|
|
|
\item Unpack it:
|
|
\begin{verbatim}
|
|
tar xzf wmii-4.tar.gz
|
|
cd wmii-4
|
|
\end{verbatim}
|
|
|
|
\item Edit the configuration:
|
|
\begin{verbatim}
|
|
vim config.mk
|
|
\end{verbatim}
|
|
|
|
The most important variable to set is the \verb+PREFIX+, which
|
|
states, where you want \wmii-4 to be installed to. If you are unsure, keep the
|
|
default, it won't break your system.
|
|
|
|
\item Run make and make install:
|
|
\begin{verbatim}
|
|
make && make install
|
|
\end{verbatim}
|
|
|
|
\item Setup 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}
|
|
|
|
% Not necessary, .xinitrc is sourced by xinit anyways
|
|
%
|
|
% Make sure that the \emph{\~{}/.xinitrc} is executable:
|
|
%
|
|
% \begin{verbatim}
|
|
% chmod u+x ~/.xinitrc
|
|
% \end{verbatim}
|
|
|
|
\end{enumerate}
|
|
|
|
Now you are finished. Please note that autoconf tools are not used
|
|
for various reasons~\footnote{ read
|
|
\hrefx{http://www.ohse.de/uwe/articles/aal.html} and
|
|
\hrefx{http://lists.cse.psu.edu/archives/9fans/2003-November/029714.html}
|
|
for further details}. Please don't ask the \wmii{} developers to use autoconf,
|
|
they won't listen to you.
|
|
|
|
|
|
\section{Terminology}
|
|
\label{sec:terms}
|
|
|
|
Before you actually start doing your first steps in \wmii, first the
|
|
terminology has to be clarified.
|
|
|
|
\subsection{Clients}
|
|
|
|
A client is a program, that provides you a graphical user interface for
|
|
a special purpose, e.g. a web browser, or a terminal.
|
|
|
|
\subsection{Focus}
|
|
|
|
The (input) focus is the client, which currently receives your input.
|
|
In X11 exactly one client can get your input at a time. If you input
|
|
some command into your terminal, the terminal window has the input focus,
|
|
whereas all the other windows do not receive the input you enter.
|
|
|
|
\subsection{Events}
|
|
|
|
An event is a message generated by X server to notify X clients about
|
|
states. For instance, X generates a button press event, if you click
|
|
into a window.
|
|
|
|
\subsection{Tags}
|
|
|
|
A tag is an alphanumeric string you can associate to clients,
|
|
which allows you to group clients in a natural way.
|
|
|
|
In \wmii, there are no workspaces anymore. Instead, all clients matching a
|
|
particular tag are displayed at a time. For instance, if you tag your
|
|
browser and a terminal window with the tag ``web-browser'', and you request
|
|
to view all clients matching this tag, \wmii{} will display your browser
|
|
and the terminal on the screen.
|
|
It is also possible to give clients multiple tags, which is described later.
|
|
|
|
\subsection{View}
|
|
|
|
A view is the set of displayed clients, which match a specific single tag.
|
|
A view is pretty similar to the ``workspace'' metaphor in other window
|
|
managers, though more powerful.
|
|
|
|
Only one view can be visible at a time.
|
|
|
|
Views are related to the tags, which are currently in use. You have exactly
|
|
one view for each single tag, thus you can only view sets of clients which
|
|
match an existing tag.
|
|
|
|
If you destroy the last client with a tag, the view of this tag is
|
|
destroyed.
|
|
|
|
\subsection{Column}
|
|
|
|
A column is a distinct part of a view, where clients are arranged
|
|
automatically in a vertical direction.
|
|
|
|
In \wmii, you are able to divide each view into different columns.
|
|
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 is
|
|
destroyed automatically.
|
|
|
|
% no, a view might contain floating clients only as well
|
|
% Please be aware, that every view has at least one column or a floating window.
|
|
|
|
\subsection{Layout}
|
|
|
|
A layout is the arrangement of clients in a column.
|
|
There are three different ways to arrange clients in a column.
|
|
\paragraph{default} This layout arranges each client with
|
|
equally vertical space fitting into the column's height.
|
|
\paragraph{maximum} This layout arranges all clients with
|
|
the same geometry as the column, showing only one of them at a time.
|
|
\paragraph{stacking} This layout arranges all clients
|
|
like a stack, where only the focused client is completely
|
|
visible, and all other clients can be accessed through its title-bars.
|
|
This is an alternative approach to \emph{tabbing}.
|
|
|
|
\section{Getting started}
|
|
|
|
Now it is time to start diving into the \wmii{} user experience. I suggest you
|
|
to try everything described by yourself immediately, instead of first reading
|
|
it, to avoid "memory leakage". It is very helpful, if you print this
|
|
document on paper or have it available on a different screen, because you might not
|
|
be able to view it during your first steps in \wmii.
|
|
|
|
Note, that the \emph{MOD} key I am referring to, may resemble
|
|
different keys on different systems. By default it is the
|
|
\emph{Mod1} or \emph{Alt} key in X11. Normally this is the key labelled with
|
|
\emph{Alt} on your keyboard.
|
|
|
|
The notation \emph{MOD}-\emph{Key} means to press \emph{MOD} and
|
|
\emph{Key} both at the same time.
|
|
|
|
All key combinations can be freely configured, but for the sake of
|
|
simplicity I'll stick with the default key combinations for this
|
|
guide. You will learn how to alter the bindings in the
|
|
section \ref{sec:scripting}.
|
|
|
|
The default key combinations heavily use the home row navigation keys
|
|
\emph{h} (left), \emph{j} (down), \emph{k} (up), and \emph{l} (right),
|
|
which are associated with the specific direction.
|
|
|
|
\subsection{First steps}
|
|
\label{subsec:firststeps}
|
|
|
|
Start your X session now. Since it is the first time you
|
|
start \wmii, a window with a little tutorial will show up. You are
|
|
free to read it, but you may also follow this guide :-)
|
|
|
|
First of all, press \emph{MOD-Enter} to start an xterm. It will
|
|
take half of the vertical space, so you have two equally arranged
|
|
windows. If you press \emph{MOD-Enter} again, you have three
|
|
windows that are arranged equally.
|
|
|
|
To switch between the three windows, press
|
|
\emph{MOD-j}, which cycles the focus between the three windows.
|
|
|
|
You can also press \emph{MOD-k} to switch to the window above or
|
|
\emph{MOD-j} to switch to the window below the current.
|
|
|
|
Now look at the title-bars of those windows. They display
|
|
important information: the first label contains the tag of
|
|
the window. The second label displays the window's title.
|
|
|
|
Similar information is displayed in the status-bar at the bottom. The
|
|
first labels display the tags currently in use and highlight the currently
|
|
selected view. On the right side some status information is displayed, by
|
|
default the system load and the current time (see
|
|
subsection~\ref{subsec:status} for details).
|
|
|
|
\subsection{Using columns}
|
|
|
|
As described earlier, \wmii{} uses columns to arrange your windows.
|
|
Your view already consists of a single column.
|
|
Next, you will create a new column.
|
|
|
|
In \wmii{} columns always consists of at least a single client,
|
|
thus to create a new column, you need at least two clients at hand.
|
|
|
|
Now focus a client of your choice and press \emph{MOD-Shift-l},
|
|
which moves the client rightwards. As you see, \wmii{} creates
|
|
a new column by dividing the view horizontally in two equally big
|
|
areas. The focused client has been moved into the new column.
|
|
|
|
If you close the last client of a column, the column is destroyed
|
|
immediately. If the last client of the current view is closed,
|
|
the view will be removed accordingly as well.
|
|
|
|
If you press \emph{MOD-j} to change focus, you will see that \wmii
|
|
actually cycles the focus in the current column only.
|
|
|
|
To change the focus to a different column, you can press \emph{MOD-l}
|
|
(right) and \emph{MOD-h} (left) respectively.
|
|
|
|
It is also possible to swap adjacent clients among columns. To swap
|
|
clients leftwards, press \emph{MOD-Control-h}. To swap clients
|
|
rightwards, press \emph{MOD-Control-l}.
|
|
|
|
\subsection{What about layouts?}
|
|
|
|
Layouts arrange clients in a column. They are related to a single
|
|
column. Thus it is possible to have different columns in one view, each
|
|
using another layout.
|
|
|
|
The default layout arranges each client of the column with equally
|
|
vertical space. You can enable this layout with \emph{MOD-d}
|
|
(where the ``d'' stands for default) explicitly.
|
|
|
|
The stacking layout can be enabled with \emph{MOD-s}. As you see now,
|
|
there is only one client using as much space as possible, and only
|
|
title-bars of the other clients displayed in the column. You can
|
|
switch between the clients in the column using \emph{MOD-j}.
|
|
|
|
The max-layout maximises all clients to the same geometry as the column.
|
|
Only the focused client is displayed at a time, all other clients
|
|
are behind it. You can switch between the clients with \emph{MOD-j}.
|
|
|
|
\subsection{Floating layer}
|
|
|
|
To handle clients in the classical way, like in conventional window
|
|
managers, the so-called ``floating layer'' is used. Actually there are a
|
|
bunch of clients which don't fit well into the tiled world, because they
|
|
have been designed with the conventional window management in mind,
|
|
for instance clients like the Gimp or xmms.
|
|
|
|
While \wmii{} is a dynamic window manager, which does the window arrangement
|
|
for you automatically, those old fashioned programs rely on the
|
|
conventional window managing concept, where all the clients fly around on
|
|
your desktop and you are forced to constantly order the mess.
|
|
|
|
To attach such broken clients to the floating layer, you can toggle the
|
|
focus between floating and managed layer through pressing \emph{MOD-Space}.
|
|
The \emph{MOD-Shift-Space} shortcut toggles the focused window between
|
|
floating and managed layer.
|
|
|
|
Note, the floating layer is addressed as the zeroth-column internally.
|
|
|
|
\subsection{Tags}
|
|
|
|
Up to now all your clients were tagged with ``1'', and you only had
|
|
this single view. But a single view does not scale well, once
|
|
too many clients appear which are used for different unrelated tasks.
|
|
Thus you might want to have a view per task, e.g. a view
|
|
with your editor and your programming tools, another view
|
|
with your browser, and a third view with your music jukebox.
|
|
|
|
The good news is, that the tagging concept provides a very dynamic way to
|
|
achieve such kinds of grouping.
|
|
|
|
You can give the focused client another tag by pressing
|
|
\emph{MOD-Shift-Number}, number being one of the numbers 0 to 9.
|
|
|
|
You can then switch views through pressing \emph{MOD-Number}.
|
|
|
|
Normally, whenever a new client appears, it automatically inherits the tag
|
|
of the currently selected view.
|
|
|
|
%% TODO: better tag handling (this is about to change in \wmii{} till
|
|
%%version 3)
|
|
|
|
Note, there are more powerful uses of tags you will learn about in the next
|
|
chapter. You will then be able to assign multiple tags to one client and to
|
|
use proper strings as tags.
|
|
|
|
\subsection{How do I close a window?}
|
|
|
|
Most X-clients have a menu option or button to be closed. For the rare
|
|
cases they don't provide a mouse-driven way, like in most terminals,
|
|
you can press \emph{MOD-Shift-c} to close a window.
|
|
|
|
\subsection{How do I start programs?}
|
|
|
|
You may start programs from a terminal. But \wmii{} contains a special
|
|
keyboard-driven program menu, which is accessible through pressing
|
|
\emph{MOD-p}. Please note, that the content of this menu is provided by a
|
|
simple shell-script.
|
|
|
|
You will see a list of programs. If you start typing, the
|
|
menu will cut the list and only display items which match
|
|
the input you entered so far (in that order). Whenever there is
|
|
only one item left, the menu highlights it and you can start it
|
|
by pressing \emph{Enter}. You are free to cancel any action by
|
|
pressing \emph{ESC}.
|
|
|
|
Thus, if you want to start firefox, just type ``fire'' and press
|
|
enter~\footnote{On my system it is sufficient to type ``efo'' to
|
|
start firefox ;-)}.
|
|
|
|
\subsection{How do I quit wmii?}
|
|
You can quit \wmii, by using the action's menu (\emph{MOD-a})
|
|
and selecting the action ``quit''. That's all.
|
|
|
|
\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
|
|
decisions about window arrangement, thus taking most extra work away
|
|
from the user and letting him concentrate on his work. This can also be
|
|
seen as tacit window management.
|
|
|
|
\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, they were able to
|
|
split the task into several smaller binaries, each with a distinct
|
|
job.
|
|
|
|
\subsection{The glue that puts it all together---9P}
|
|
|
|
Programs in the Unix world usually communicate via buffers which are
|
|
addressed by (file) descriptors, one of them are sockets.
|
|
|
|
To create a lightweight but powerful communication protocol, the \wmii
|
|
developers closely looked at the design of Plan9 and chose the 9P
|
|
protocol.
|
|
|
|
The basic ideas for configuring and running \wmii{} were taken from
|
|
the Acme user interface for programmers of Plan9. Similar to Acme,
|
|
\wmii{} provides a filesystem-interface, which can be accessed by
|
|
9P clients. This allows to interact with any different kind of
|
|
application through a file system interface, which might be implemented
|
|
in any programming language of choice. This also avoids to force
|
|
client programmers to a specific programming language or paradigm.
|
|
|
|
The interface of \wmii{} can be compared to the \emph{procfs} file
|
|
system of the Linux kernel.
|
|
|
|
If you want to interact with a running \wmii{} process, you can access its 9P
|
|
file-system service through either using the bundled tool \emph{wmiir} or
|
|
the 9P2000 kernel module of a Linux kernel later than 2.4.16+. Using the
|
|
kernel module has the advantage to mount the filesystem of \wmii{} into your
|
|
file system hierarchy directly, though it has the drawback that this need
|
|
\emph{root} privileges.
|
|
|
|
\subsection{Tools}
|
|
|
|
This section provides a basic overview about the tools which are bundled
|
|
with \wmii. But for a more detailed description, you should read the associated
|
|
man page of the specific tool.
|
|
|
|
\begin{description}
|
|
|
|
\item
|
|
\emph{wmiir} is a small tool we is used to access the
|
|
virtual file-system service of \wmii{} remotely. It basically supports four
|
|
operations:
|
|
|
|
\begin{itemize*}
|
|
\item read
|
|
\item write
|
|
\item remove
|
|
\item create
|
|
\end{itemize*}
|
|
|
|
wmiir needs to know the address of the file-system service to work
|
|
with. On startup, \wmii{} exports the \verb+WMII_ADDRESS+ environment variable,
|
|
which points to the address of the file-system service of \wmii.
|
|
This address can be:
|
|
\begin{itemize*}
|
|
\item a local unix socket address like \verb+unix!/path/to/socket+
|
|
\item a tcp-capable socket address like \verb+tcp!hostname:port+
|
|
\end{itemize*}
|
|
|
|
If you want to work on a different filesystem, you may specify it
|
|
manually with the \emph{-a address} command line option.
|
|
A sample invocation looks like:
|
|
\begin{verbatim}
|
|
wmiir read /
|
|
\end{verbatim}
|
|
This command actually prints the contents of the root directory of the
|
|
virtual file-system of \wmii.
|
|
|
|
\item
|
|
\emph{wmiimenu} is a generic keyboard-driven menu, which matches items
|
|
through providing patterns. You may want to learn more about it by reading
|
|
the man-page.
|
|
|
|
\item
|
|
\emph{wmiiwarp} is a tiny tool to warp the mouse pointer at specific
|
|
coordinates on your screen.
|
|
|
|
\item
|
|
\emph{wmiiwm} is the main window manager binary. You may interact
|
|
with its virtual file-system only.
|
|
|
|
\item
|
|
\emph{wmiipsel} prints the contents of the current X selection to
|
|
STDOUT. This is useful for scripts.
|
|
|
|
\end{description}
|
|
|
|
\subsection{Conclusion}
|
|
|
|
The virtual file-system service of \wmii{} and the tools presented enable
|
|
you to fully control the window manager from scripts.
|
|
You will see some examples in the next section
|
|
\ref{sec:scripting}.
|
|
|
|
\section{Scripting wmii}
|
|
\label{sec:scripting}
|
|
|
|
In this chapter you will see how to control \wmii{} through scripts. I will
|
|
give you some pointers, that you can start scripting on your own.
|
|
|
|
\subsection{Language}
|
|
|
|
As mentioned earlier, the only requirement for interacting with \wmii{} is to
|
|
access its file-system service. The easiest way to do this, is by using
|
|
the wmiir tool. Thus shell scripts are the easiest way of adapting \wmii
|
|
too fit your needs.
|
|
|
|
Hence, you can control \wmii{} in any programming language you want. However,
|
|
\wmii's default scripts are written in a subset of ``sh'' that is POSIX
|
|
compliant, to keep \wmii{} as \emph{portable} as possible.
|
|
|
|
To keep simplicity, the following examples will stick to ``sh'' as well,
|
|
and don't depend on python, tcl, ruby, \dots
|
|
|
|
% - who doesn't have a shell?, extra! we're giving them for free this week
|
|
|
|
\subsection{Actions}
|
|
|
|
In \wmii{} you may group certain tasks into \emph{actions}. Actions
|
|
are nothing more than simple scripts which are located either in
|
|
your local or in the default \wmii{} configuration
|
|
directory~\footnote{ \texttt{\$CONFPREFIX} is set in
|
|
\emph{config.mk} which points to \texttt{/usr/local/etc}
|
|
or \texttt{\$HOME/.wmii-4} by default}.
|
|
Through pressing \emph{MOD-a} you can open the actions menu. It works
|
|
similar to the program menu, but only displays actions.
|
|
|
|
You might want to add your own actions through writing shell scripts in the
|
|
default \wmii{} configuration directory or in the \texttt{\$HOME/.wmii-4}.
|
|
|
|
This works, because in the \wmii{} controlling script exports the variable
|
|
\verb+$PATH+ as\\ \verb+$PATH=~/.wmii-4:$CONFPREFIX/wmii:$PATH+ before
|
|
launching the wmiiwm, this way local user actions under
|
|
\verb+~/.wmii-4+ take precedence over the defaults from
|
|
\verb+$CONFPREFIX/wmii+ of the default actions.
|
|
|
|
You may edit this file on the fly, which means you don't need to
|
|
stop \wmii{} before editing. After you've finished editing, you may
|
|
simply run wmiirc and the changes will take effect immediately.
|
|
To do so, just open the actions menu (with pressing \emph{MOD-a}) and
|
|
choose the \emph{wmiirc} action. It's also possible to launch \wmii{} actions
|
|
directly from a terminal, which is a neat side effect that results from
|
|
exporting \verb+$PATH+ in the \wmii{} startup script.
|
|
|
|
\subsection{wmiirc}
|
|
|
|
\emph{wmiirc} is a special ``sh''-script which is launched on startup
|
|
of \wmii{} to take care of configuring and controlling \wmii.
|
|
|
|
It does so through writing data to several files of the virtual \wmii
|
|
file-system, and through reading events reported by \wmii{} during runtime.
|
|
Events are mostly shortcut presses, mouse clicks or user-defined.
|
|
The events are processed in a loop in the script.
|
|
|
|
Thus, for the basic configuration of \wmii, like changing the default
|
|
modifier key \emph{MOD=Mod1} or the navigation keys this script is
|
|
the place to look at.
|
|
|
|
The name \emph{wmiirc} means \wmii{} \emph{run command}, because ``rc'' is an
|
|
old Unix abbreviation for ``run command''.
|
|
|
|
\subsection{Changing the style}
|
|
|
|
The style of \wmii-4 is defined through font and colour values, which are
|
|
unobtrusively exported with the following \emph{environment variables}.
|
|
|
|
\begin{verbatim}
|
|
WMII_SELCOLORS='#000000 #eaffff #8888cc'
|
|
WMII_NORMCOLORS='#000000 #ffffea #bdb76b'
|
|
WMII_FONT=static
|
|
\end{verbatim}
|
|
|
|
\verb+WMII_SELCOLORS+ defines the colours of the selected client's window
|
|
title and border, whereas \verb+WMII_NORMCOLORS+ defines the colours of all
|
|
unselected clients. The numbers are hexadecimal rgb tuple-values, which you
|
|
might know from HTML. You can grab them with the Gimps colour-chooser for instance.
|
|
|
|
The first colour defines the text colour of strings in bars and menus.
|
|
The second colour defines the background colour of bars and clients, and
|
|
the third colour defines the 1px borders surrounding bars and clients.
|
|
|
|
\verb+WMII_FONT+ defines the font which should be used for drawing text.
|
|
in title-bars, the status-bar, and the wmiimenu.
|
|
You can query for different fonts using \emph{xfontsel} for instance.
|
|
|
|
\subsection{Filling the status-bar}
|
|
\label{subsec:status}
|
|
|
|
The status bar of \wmii{} has it's own \verb+/bar+ directory with
|
|
a subdirectory for each of the labels created. So while editing
|
|
this document my status-bar looked like:
|
|
|
|
\begin{verbatim}
|
|
$ wmiir read /bar
|
|
d-r-x------ salva salva 0 Mon Apr 17 14:19:51 2006 1
|
|
d-r-x------ salva salva 0 Mon Apr 17 14:19:51 2006 2
|
|
d-r-x------ salva salva 0 Mon Apr 17 14:19:51 2006 status
|
|
\end{verbatim}
|
|
|
|
At the same time each of the subdirectories contains two files,
|
|
|
|
\begin{verbatim}
|
|
$ wmiir read /bar/status
|
|
--rw------- salva salva 23 Mon Apr 17 14:22:14 2006 colors
|
|
--rw------- salva salva 23 Mon Apr 17 14:22:14 2006 data
|
|
\end{verbatim}
|
|
|
|
|
|
The first file contains the colour definitions that control how the
|
|
bar will be drawn, while the second contains the data
|
|
which is displayed.
|
|
|
|
Now you can start your own experiments by creating a new label, and
|
|
exploring and modifying it by reading \& writing values to it's
|
|
\verb+colors+ \& \verb+data+ files. A nice feature of the bar
|
|
(and clients) is that they generate events corresponding to mouse
|
|
clicks on them. You can open a terminal and run
|
|
\verb+wmiir read /event+ to see how the events are generated
|
|
when you click onto the status-bar. This is a mechanism that allows
|
|
controlling applications directly from the bar. If you've
|
|
finished and you want to get rid of your label,
|
|
a \verb+wmiir remove /bar/foo+ command.
|
|
|
|
If you want to learn more, take a look at the status script and
|
|
visit \hrefx{http://wmii.de} for good examples, like the following:
|
|
|
|
\begin{itemize*}
|
|
\item \emph{status}: monitoring remaining battery, temperature, \dots on laptops
|
|
\item \emph{status-mpd}: controlling the running mpd
|
|
\item \emph{status-load}: show the machine load
|
|
\item \emph{status-net}: monitoring wireless network signal
|
|
\end{itemize*}
|
|
|
|
Now open the default status script and try to understand yourself,
|
|
how it works \verbatiminput{../rc/status}. The first line is a handy
|
|
\verb+xwrite+ function declaration, to prevent you from several verbosity
|
|
when issuing a write to some file. The following 3 lines take care of
|
|
creating and setting up the \verb+status+ label. The last section is a
|
|
\verb+while+ loop
|
|
that \emph{tries} to write the system load and date information
|
|
to the bar.\\
|
|
|
|
The tricky bit is, that it \emph{tries}. So what could make the write
|
|
fail? If \verb+xwrite+ tried to write to a non existent (removed)
|
|
label, then it would fail, thus the condition of the loop would be
|
|
false, and the status script exits cleanly, which makes sense
|
|
because nobody wants a program that updates a nonexistent label.\\
|
|
|
|
Now go back to the first lines of the script, and note
|
|
that there is a \verb+sleep delay+ between the removal of the
|
|
label and it's creation.
|
|
|
|
This ensures that the \verb+status+ label will not exist, hence all
|
|
the writes made from any previously running \verb+status+ script
|
|
will fail, thus they will finish. This way we make sure that
|
|
we only run one status script at each time. And thus we keep the
|
|
one-to-one correspondence between label and status script.
|
|
|
|
\subsection{Assigning new tags}
|
|
|
|
As mentioned before, you can achieve more powerful things with tags, than
|
|
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 separate the
|
|
tags with a ``+''.
|
|
|
|
\begin{verbatim}
|
|
echo -n web+code | wmiir write /view/sel/sel/tags
|
|
\end{verbatim}
|
|
|
|
This command would give the current focused client the tags
|
|
``web'' and ``code''.
|
|
|
|
You can now view the ``web'' tag by executing the following:
|
|
|
|
\begin{verbatim}
|
|
echo -n view web | wmiir write /ctl
|
|
\end{verbatim}
|
|
|
|
As the development of \wmii-4 progressed, it became clear that this
|
|
action is so common, that it got its own keybinding. By default
|
|
\emph{MOD-t} brings up a menu to choose a view and
|
|
\emph{MOD-Shift-t} brings up a menu enabling you to assign new
|
|
tags to the focused client.
|
|
|
|
% TODO:
|
|
% I would also like to put/see a recommended readings or bibliography
|
|
% section this will be of course biased by my use of plumber and acme
|
|
% from p9p but i think it's worth mentioning both them here. similar to:
|
|
% http://wmii.de/contrib/guide-es/beginnersguide/node10.html
|
|
|
|
\section{The End}
|
|
\label{sec:end}
|
|
|
|
We hope this helps you getting used to \wmii.
|
|
If you've seen something that you think is wrong, confusing or missing in
|
|
this document, feel free to drop us a note:
|
|
|
|
Contact information is to be found here:
|
|
\href{http://wmii.de/index.php/BeginnersGuide}{direct mail},
|
|
\href{http://wmii.de/index.php/MailingList}{[wmii]} mailing-list,
|
|
\href{http://wmii.de/index.php/IRC}{\#wmii} irc channel or even
|
|
with smoke signals~\footnote{ but don't ask us for advice, here
|
|
you're on your own \texttt{;-P}.}.
|
|
|
|
Also remember that \wmii{} is written by people with taste, so most
|
|
of the decisions made have strong reasons supporting them, so if
|
|
you think something doesn't make sense or doesn't fit into the
|
|
picture, just try to understand it by yourself first before
|
|
asking, probably you'll end up learning a lot and if its really
|
|
wrong in the end, you'll provide us with much better feedback to
|
|
solve the issue.
|
|
|
|
\newpage
|
|
|
|
\section{Appendix}
|
|
\label{sec:appendix}
|
|
|
|
\subsection{filesystem}
|
|
|
|
\begin{description}
|
|
|
|
\item [/bar]
|
|
\begin{itemize*}
|
|
\item the bar namespace
|
|
\item to add a label, create /bar/\verb+label+ (this automatically creates the
|
|
\verb+colors+ and \verb+data+ files.
|
|
\item to delete it, remove /bar/\verb+label+
|
|
\end{itemize*}
|
|
|
|
\item [/bar/label]
|
|
\begin{itemize*}
|
|
\item each bar has it's own namespace which is named according to it's
|
|
label
|
|
\item label can be any arbitrary string
|
|
\end{itemize*}
|
|
|
|
\item [/bar/label/data]
|
|
\begin{itemize*}
|
|
\item the data written to the label \verb+label+
|
|
\end{itemize*}
|
|
|
|
\item [/bar/label/colors]
|
|
\begin{itemize*}
|
|
\item the colours of the bar
|
|
\end{itemize*}
|
|
|
|
\item [/client]
|
|
\begin{itemize*}
|
|
\item the clients namespace
|
|
\end{itemize*}
|
|
|
|
\item [/client/n]
|
|
\begin{itemize*}
|
|
\item every client, including ones not shown in the view has a namespace here
|
|
\item \verb+n+ is a non-negative integer and clients are numbered oldest first
|
|
\end{itemize*}
|
|
|
|
\item [/client/n/class]
|
|
\begin{itemize*}
|
|
\item a file containing the class:instance information for client \verb+n+
|
|
\end{itemize*}
|
|
|
|
\item [/client/n/ctl]
|
|
\begin{itemize*}
|
|
\item control file for client \verb+n+
|
|
\item accepted commands:
|
|
\begin{itemize*}
|
|
\item kill (removes client)
|
|
\item sendto \verb+area|prev|next|new+
|
|
\item swap \verb+up|down|prev|next+
|
|
\end{itemize*}
|
|
\end{itemize*}
|
|
|
|
\item [/client/n/geom]
|
|
\begin{itemize*}
|
|
\item the window geometry of client \verb+n+
|
|
\item displayed as four blank separated integers (x y width height?)
|
|
\end{itemize*}
|
|
|
|
\item [/client/n/index] contains the client's index in the /client namespace, in this case n
|
|
|
|
\item [/client/n/name]
|
|
\begin{itemize*}
|
|
\item the name of client \verb+n+ as it's seen by \wmii{} (displayed in the tagbar)
|
|
\end{itemize*}
|
|
|
|
\item [/client/n/tags]
|
|
\begin{itemize*}
|
|
\item a plus(+)-separated list of tags to which client \verb+n+ is related
|
|
\end{itemize*}
|
|
|
|
\item [/ctl]
|
|
\begin{itemize*}
|
|
\item the \wmii{} control file and command interface
|
|
\item accepted commands:
|
|
\begin{itemize*}
|
|
\item quit
|
|
\item retag
|
|
\item view \verb+tag+
|
|
\end{itemize*}
|
|
\end{itemize*}
|
|
|
|
\item [/def]
|
|
\item [/def/border] width of the border around clients
|
|
\item [/def/font] the font used by \wmii{} (an xlib font name)
|
|
\item [/def/keys] a newline separated list of the keys to be grabbed by \wmii
|
|
\item [/def/rules]
|
|
\begin{itemize*}
|
|
\item a newline separated list of rules to specify how to automatically tag clients
|
|
\item matches against the class.instance values of a client
|
|
\item syntax: \verb+/$regex/ -> $tag+ (tag might be \~{} to indicate floating mode
|
|
\end{itemize*}
|
|
\item [/def/colwidth] with of newly created columns (in px)
|
|
\item [/def/colmode] mode of newly created columns
|
|
|
|
|
|
\item [/view]
|
|
\begin{itemize*}
|
|
\item a manifestation of the collection of clients associated with a specific
|
|
tag
|
|
\end{itemize*}
|
|
|
|
\item [/view/area]
|
|
\begin{itemize*}
|
|
\item each area has its own namespace in the current view
|
|
\item the areas are numbered starting with 0
|
|
\item 0 is always the floating area, the others are columns
|
|
\end{itemize*}
|
|
|
|
\item [/view/area/ctl]
|
|
\begin{itemize*}
|
|
\item accepted commands:
|
|
\begin{itemize*}
|
|
\item select \verb+client|prev|next+
|
|
\item client refers to the client number relative to the number and
|
|
age of the clients in \verb+area+
|
|
\end{itemize*}
|
|
\end{itemize*}
|
|
|
|
\item [/view/area/mode] the current layout for the area, equal, stack or max
|
|
\item [/view/area/sel] the selected client of the area
|
|
\item [/view/area/client] the namespace for each client in \verb+area+
|
|
\item [/view/ctl] accepted commands: select \verb+area|prev|next|toggle+
|
|
\item [/view/sel] the selected area in workspace
|
|
\item [/view/tag] the tag which is common to all clients in the workspace
|
|
|
|
\end{description}
|
|
|
|
\newpage
|
|
|
|
\subsection{keybindings}
|
|
Here are the default keybindings. \verb+$MODKEY+ is a placeholder, which is
|
|
usually mapped to Mod1 or Alt.
|
|
\begin{table}[h]
|
|
\begin{tabular}{|l|l|}
|
|
\hline % Puts in a horizontal line
|
|
Keybinding &Action \\ %Table Headers , columns separated by &,
|
|
%rows ended by \\
|
|
\hline
|
|
\hline
|
|
Moving Focus&\\
|
|
\verb+$MODKEY+-h&move focus to prev column \\
|
|
\verb+$MODKEY+-l&move focus to next column \\
|
|
\verb+$MODKEY+-j&move focus to next client in column \\
|
|
\verb+$MODKEY+-k&move focus to prev client in column \\
|
|
\verb+$MODKEY+-space&toggle to/from floating column 0 \\
|
|
\verb+$MODKEY+-[0-9]&select tag/view [0-9] \\
|
|
Moving Clients&\\
|
|
\verb+$MODKEY+-Control-h&swap client with last client of prev column \\
|
|
\verb+$MODKEY+-Control-l&swap client with last client of next column \\
|
|
\verb+$MODKEY+-Control-j&swap client down in the column \\
|
|
\verb+$MODKEY+-Control-k&swap client up in the column \\
|
|
\verb+$MODKEY+-Shift-h&send client to prev column \\
|
|
\verb+$MODKEY+-Shift-l&send client to next column \\
|
|
\verb+$MODKEY+-Shift-space&send client to/from floating column 0 \\
|
|
\verb+$MODKEY+-Shift-[0-9]&send client to tag/view [0-9] \\
|
|
Layouts&\\
|
|
\verb+$MODKEY+-d&select default layout \\
|
|
\verb+$MODKEY+-s&select stacked layout \\
|
|
\verb+$MODKEY+-m&select max layout \\
|
|
Menu Bar Functions&\\
|
|
\verb+$MODKEY+-a&choose action from menu bar \\
|
|
\verb+$MODKEY+-p&choose program from menu bar \\
|
|
\verb+$MODKEY+-t&choose view from menu bar \\
|
|
\verb+$MODKEY+-Shift-t&assign tag(s) to client from menu bar \\
|
|
Clients and Applications&\\
|
|
\verb+$MODKEY+-Return&open terminal client \\
|
|
\verb+$MODKEY+-Shift-c&kill client \\
|
|
\hline
|
|
\end{tabular}
|
|
\caption{Default keybindings of \wmii}
|
|
\end{table}
|
|
|
|
\newpage
|
|
|
|
\section{Credits}
|
|
\label{sec:credits}
|
|
|
|
|
|
\begin{description}
|
|
\item [Author] Steffen Liebergeld
|
|
\item [Main critic and inquisitor] Salvador Peir\'o
|
|
|
|
\item [Helpers]
|
|
Anselm Garbe \\
|
|
Denis Grelich \\
|
|
Ross Mohn \\
|
|
Neptun Florin \\
|
|
Jochen Schwartz \\
|
|
Adrian Ratnapala \\
|
|
\end{description}
|
|
|
|
\section{Copyright notice}
|
|
|
|
guide to wmii-4\\
|
|
Copyright (C) 2005, 2006 by Steffen Liebergeld, Salva Peir\'o
|
|
|
|
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.
|
|
|
|
\end{document}
|