[wiki] [sites] wiki updated

From: <hg_AT_suckless.org>
Date: Thu, 17 Sep 2009 14:17:08 +0000 (UTC)

changeset: 256:9960091a4124
parent: 195:88aa1f2a9521
user: Kris Maglione <jg_AT_suckless.org>
date: Thu Aug 27 12:57:08 2009 -0400
files: suckless.org/index.md wmii.suckless.org/index.md
description:
Release wmii 3.9a1


diff -r 88aa1f2a9521 -r 9960091a4124 suckless.org/index.md
--- a/suckless.org/index.md Thu Aug 27 12:24:48 2009 -0400
+++ b/suckless.org/index.md Thu Aug 27 12:57:08 2009 -0400
_AT_@ -3,6 +3,10 @@
 
 Read more about our [philosophy](/common/) and join us on the [mailing list](common/community).
 
+2009/08/27
+----------
+[wmii 3.9a1](http://wmii.suckless.org/) released: [download](http://dl.suckless.org/wmii/wmii+ixp-3.9a1.tgz)
+
 2009/08/03
 ----------
 New [9base](http://tools.suckless.org/9base) release: [9base-3](http://dl.suckless.org/tools/9base-3.tar.gz)
diff -r 88aa1f2a9521 -r 9960091a4124 wmii.suckless.org/index.md
--- a/wmii.suckless.org/index.md Thu Aug 27 12:24:48 2009 -0400
+++ b/wmii.suckless.org/index.md Thu Aug 27 12:57:08 2009 -0400
_AT_@ -14,7 +14,7 @@
 -----
 
 * Latest release: [wmii-3.6](http://dl.suckless.org/wmii/wmii-3.6.tar.gz) (Note that it requires [dmenu](http://tools.suckless.org/dmenu) and [libixp-0.4](/libs/libixp.html), [p9p](http://plan9.us/) recommended)
-* Latest snapshot: [wmii+ixp-20090703](http://dl.suckless.org/wmii/wmii+ixp-snap20090703.tgz)
+* Latest alpha: [wmii 3.9a1](http://dl.suckless.org/wmii/wmii+ixp-3.9a1.tgz)
 * Latest devel tip: <code>hg clone [http://hg.suckless.org/wmii](http://hg.suckless.org/wmii)</code>
 * Bugs: [Google Code issue tracker](http://code.google.com/p/wmii/issues)
 * Mailing List: `dev+subscribe_AT_suckless.org` ([Archives](http://lists.suckless.org/dev/)) ([Old Archives](http://lists.suckless.org/wmii/)) (see [community](http://suckless.org/common/community/) for details)

changeset: 257:358b27c0da93
tag: tip
parent: 256:9960091a4124
parent: 255:b78091cb2c5f
user: Kris Maglione <jg_AT_suckless.org>
date: Thu Sep 17 10:17:04 2009 -0400
files: default.suckless.org/_werc/lib/top_bar.inc dwm.suckless.org/dwm.gif dwm.suckless.org/manpage.md dwm.suckless.org/patches/altmovefocus.md dwm.suckless.org/patches/boldfont.md dwm.suckless.org/patches/clientspertag.md dwm.suckless.org/patches/color_status_bar.md dwm.suckless.org/patches/colored_status_text.md dwm.suckless.org/patches/dwm-5.2-colorstatus.diff dwm.suckless.org/patches/dwm-5.2-colorstatus.xinitrc dwm.suckless.org/patches/dwm-5.2-gaplessgrid.diff dwm.suckless.org/patches/dwm-5.2-monocle_count.diff dwm.suckless.org/patches/dwm-5.2-pertag.diff dwm.suckless.org/patches/dwm-5.3.1-statuscolors.diff dwm.suckless.org/patches/dwm-5.3.1-statuscolors.png dwm.suckless.org/patches/dwm-5.4-pertag.diff dwm.suckless.org/patches/dwm-r1437-gaplessgrid.diff dwm.suckless.org/patches/email_notifier_script.md dwm.suckless.org/patches/fibonacci.md dwm.suckless.org/patches/float_border_color.md dwm.suckless.org/patches/gridmode.md dwm.suckless.org/patches/monocle_count.md dwm.suckless.org/patches/mouseontit
le.md dwm.suckless.org/patches/moveresize.md dwm.suckless.org/patches/movestack.md dwm.suckless.org/patches/nmaster+bstack-5.6.1.diff dwm.suckless.org/patches/pertag.md dwm.suckless.org/patches/push-5.3.c dwm.suckless.org/patches/push-5.6.c dwm.suckless.org/patches/raiselower.md dwm.suckless.org/patches/save_floats.md dwm.suckless.org/patches/tagall.md dwm.suckless.org/patches/taglayouts.md dwm.suckless.org/patches/tilemovemouse.md dwm.suckless.org/patches/workspaces.md suckless.org/common/broken_programs.md suckless.org/common/bugs.md suckless.org/common/community.md suckless.org/common/cool_programs.md suckless.org/common/donations.md suckless.org/common/dynamic_window_management.md suckless.org/common/faq.md suckless.org/common/index.md suckless.org/common/other_projects.md suckless.org/common/patches.md suckless.org/common/project_ideas.md suckless.org/common/style_guide.md suckless.org/index.md suckless.org/wiki/sandbox.md surf.suckless.org/surf.gif wmii.suckless.org/index.md wmii.suckless.org/wmii.gif
description:
Merge.


diff -r 9960091a4124 -r 358b27c0da93 default.suckless.org/_werc/lib/footer.inc
--- a/default.suckless.org/_werc/lib/footer.inc Thu Aug 27 12:57:08 2009 -0400
+++ b/default.suckless.org/_werc/lib/footer.inc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,26 +1,13 @@
-<br class="doNotDisplay doNotPrint" />
-
-<div class="left"><a href="http://werc.cat-v.org/">Powered by werc</a></div>
-
+<div class="left">
+ <a href="http://werc.cat-v.org/">Powered by werc</a>
+</div>
 <div class="right">
-<form action="http://www.google.com/cse" id="cse-search-box" style="display: in
-line">
- <div style="display: inline">
- <input type="hidden" name="cx" value="001621472792195143094:yaf_hfror00"/>
- <input type="hidden" name="ie" value="UTF-8" />
- <input type="text" name="q" size="32" />
- <input type="submit" name="sa" value="Search" />
- </div>
-</form>
-<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script>
+ <form action="http://www.google.com/cse" id="cse-search-box">
+ <div>
+ <input type="hidden" name="cx" value="001621472792195143094:yaf_hfror00" />
+ <input type="hidden" name="ie" value="UTF-8" />
+ <input type="text" name="q" size="31" />
+ <input type="submit" name="sa" value="Search" />
+ </div>
+ </form>
 </div>
-
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-var pageTracker = _gat._getTracker("UA-4071820-1");
-pageTracker._initData();
-pageTracker._trackPageview();
-</script>
diff -r 9960091a4124 -r 358b27c0da93 default.suckless.org/_werc/lib/sitemap.tpl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/default.suckless.org/_werc/lib/sitemap.tpl Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,67 @@
+<h1>Site map</h1>
+
+%{
+tmpfile=/tmp/werc_sitemap_$pid.txt
+tmpfilex=/tmp/werc_sitemapx_$pid.txt
+saveddf=$dirfilter
+
+MON2NUM='s/Jan/01/; s/Feb/02/; s/Mar/03/; s/Apr/04/; s/May/05/; s/Jun/06/; s/Jul/07/; s/Aug/08/; s/Sep/09/; s/Oct/10/; s/Nov/11/; s/Dec/12/;'
+
+fn get_mdate {
+ t=`{mtime $1}
+ t=`{date $t(1) | sed -e $MON2NUM -e 's/ ([0-9]) / 0\1 /g'} # Make sure day of the month is two digits.
+ echo $t(6)^'-'^$t(2)^'-'^$t(3)
+}
+
+fn listDir {
+ d=$1
+ dirfilter=$saveddf
+ if(test -f $d/_werc/config)
+ . ./$d/_werc/config
+
+ if(~ $#perm_redir_to 0) {
+ echo '<ul class="sitemap-list">'
+
+ for(i in `{ls -dF $d^*/ $d^*.md $d^*.html $d^*.txt >[2]/dev/null | sed $dirfilter}) {
+ desc=`{get_file_title $i}
+ u=`{echo $i|sed 's!'$sitedir'!!; '$dirclean's!/index$!/!; '}
+ if(! ~ $#desc 0 && ! ~ $desc '')
+ desc=' - '$"desc
+ n=`{echo /$u|sed 's/[\-_]/ /g; s,.*/([^/]+)/?$,\1,'}
+ echo '<li><a href="'$u'">'^$"n^'</a>' $"desc '</li>'
+ echo $base_url^$u >> $tmpfile
+ echo '<url><loc>'$base_url^$u'</loc><lastmod>'^`{get_mdate $i}^'</lastmod></url>' >> $tmpfilex
+ if(test -d $i)
+ _AT_{ listDir $i }
+ }
+ echo '</ul>'
+ }
+}
+
+
+fltr_cache listDir $sitedir/
+
+if(test -s $tmpfile) {
+ mv $tmpfile $sitedir/sitemap.txt &
+}
+if not if(test -f $tmpfile)
+ rm $tmpfile
+
+if(test -s $tmpfilex) {
+ {
+ echo '<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
+
+ cat $tmpfilex
+ rm $tmpfilex &
+ echo '</urlset>'
+ # TODO Enable automaic search engine update notification.
+ #hget 'http://google.com/ping?sitemap='^`{url_encode $base_url'/sitemap.gz'} > /dev/null
+
+ } | gzip > $sitedir/sitemap.gz &
+ #} > $sitedir/sitemap.xml &
+}
+if not if(test -f $tmpfilex)
+ rm $tmpfilex
+
+%}
diff -r 9960091a4124 -r 358b27c0da93 default.suckless.org/_werc/lib/top_bar.inc
--- a/default.suckless.org/_werc/lib/top_bar.inc Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,19 +0,0 @@
- <div class="left">
- <a href="http://suckless.org">home</a> &nbsp;
- <a href="http://hg.suckless.org">code</a> &nbsp;
- <a href="http://dl.suckless.org">download</a> &nbsp;
- <a href="http://dwm.suckless.org">dwm</a> &nbsp;
- <a href="http://libs.suckless.org">libs</a> &nbsp;
- <a href="http://st.suckless.org">st</a> &nbsp;
- <a href="http://surf.suckless.org">surf</a> &nbsp;
- <a href="http://tools.suckless.org">tools</a> &nbsp;
- <a href="http://wmii.suckless.org">wmii</a> &nbsp;
- <a href="http://wmi.suckless.org">wmi</a>
- </div>
-
- <div class="right">
- <span class="doNotDisplay">Related sites:</span>
- <!-- | <a href="http://garbe.us/update_log">site updates</a> | -->
- <a href="/sitemap">site map</a>
- </div>
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/_werc/config
--- a/dwm.suckless.org/_werc/config Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/_werc/config Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,3 +1,4 @@
 masterSite=default.suckless.org
 siteTitle='dwm'
+siteImage='/dwm.png'
 siteSubTitle='dynamic window manager'
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/_werc/lib/top_bar.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/_werc/lib/top_bar.inc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+ <ul>
+ <li><a href="http://suckless.org">home/</a></li>
+ <li><a href="http://hg.suckless.org">code</a></li>
+ <li><a href="http://dl.suckless.org">download</a></li>
+ <li><a href="http://man.suckless.org">man/</a></li>
+ <li class="thisPage"><a href="http://dwm.suckless.org">dwm/</a></li>
+ <li><a href="http://libs.suckless.org">libs/</a></li>
+ <li><a href="http://st.suckless.org">st</a></li>
+ <li><a href="http://surf.suckless.org">surf</a></li>
+ <li><a href="http://tools.suckless.org">tools/</a></li>
+ <li><a href="http://wmii.suckless.org">wmii/</a></li>
+ <li><a href="http://wmi.suckless.org">wmi/</a></li>
+ </ul>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/dwm.gif
Binary file dwm.suckless.org/dwm.gif has changed
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/dwm.png
Binary file dwm.suckless.org/dwm.png has changed
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/index.md
--- a/dwm.suckless.org/index.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/index.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,10 +1,3 @@
-![dwm](dwm.gif)
-
-DYNAMIC WINDOW MANAGER
-======================
-
-Description
------------
 dwm is a dynamic window manager for X. It manages windows in tiled, monocle
 and floating layouts. Either layout can be applied dynamically, optimising the
 environment for the application in use and the task performed.
_AT_@ -47,7 +40,7 @@
 
 Links
 -----
-* [Man page](manpage)
+* [Man page](http://man.suckless.org/dwm/1/dwm)
 * Mailing List: `dev+subscribe_AT_suckless.org` ([Archives](http://lists.suckless.org/dev/)) ([Old Archives](http://lists.suckless.org/dwm/)) (see [community](http://suckless.org/common/community/) for details)
 * IRC channel: #suckless at irc.oftc.net ([irc log](TODO))
 
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/manpage.md
--- a/dwm.suckless.org/manpage.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,231 +0,0 @@
-<H1>DWM</H1>
-
-<H2>NAME</H2>
-
-dwm - dynamic window manager
-<H2>SYNOPSIS</H2>
-
-<B>dwm</B> [<B>-v</B>]
-
-<H2>DESCRIPTION</H2>
-
-dwm is a dynamic window manager for X. It manages windows in tiled, monocle
-and floating layouts. Either layout can be applied dynamically, optimising the
-environment for the application in use and the task performed.
-<P>
-
-In tiled layouts windows are managed in a master and stacking area. The master
-area contains the window which currently needs most attention, whereas the
-stacking area contains all other windows. In monocle layout all windows are
-maximised to the screen size. In floating layout windows can be resized and
-moved freely. Dialog windows are always managed floating, regardless of the
-layout applied.
-<P>
-
-Windows are grouped by tags. Each window can be tagged with one or multiple
-tags. Selecting certain tags displays all windows with these tags.
-<P>
-
-Each screen contains a small status bar which displays all available tags, the
-layout, the number of visible windows, the title of the focused window, and the
-text read from the root window name property, if the screen is focused. A
-floating window is indicated with an empty square and a maximised floating
-window is indicated with a filled square before the windows title. The
-selected tags are indicated with a different color. The tags of the focused
-window are indicated with a filled square in the top left corner. The tags
-which are applied to one or more windows are indicated with an empty square in
-the top left corner.
-<P>
-
-dwm draws a small border around windows to indicate the focus state.
-<H2>OPTIONS</H2>
-
-<DL COMPACT>
-<DT><B>-v</B>
-
-<DD>
-prints version information to standard output, then exits.
-</DL>
-<H2>USAGE</H2>
-
-<H3>Status bar</H3>
-
-<DL COMPACT>
-<DT><B>X root window name</B>
-
-<DD>
-is read and displayed in the status text area. It can be set with the
-<B>xsetroot</B>(1)
-command.
-<DT><B>Button1</B>
-
-<DD>
-click on a tag label to display all windows with that tag, click on the layout
-label toggles between tiled and floating layout.
-<DT><B>Button3</B>
-
-<DD>
-click on a tag label adds/removes all windows with that tag to/from the view.
-<DT><B>Mod1-Button1</B>
-
-<DD>
-click on a tag label applies that tag to the focused window.
-<DT><B>Mod1-Button3</B>
-
-<DD>
-click on a tag label adds/removes that tag to/from the focused window.
-</DL>
-<H3>Keyboard commands</H3>
-
-<DL COMPACT>
-<DT><B>Mod1-Shift-Return</B>
-
-<DD>
-Start
-<B>uxterm</B>(1).
-
-<DT><B>Mod1-,</B>
-
-<DD>
-Focus previous screen, if any.
-<DT><B>Mod1-.</B>
-
-<DD>
-Focus next screen, if any.
-<DT><B>Mod1-Shift-,</B>
-
-<DD>
-Send focused window to previous screen, if any.
-<DT><B>Mod1-Shift-.</B>
-
-<DD>
-Send focused window to next screen, if any.
-<DT><B>Mod1-b</B>
-
-<DD>
-Toggles bar on and off.
-<DT><B>Mod1-t</B>
-
-<DD>
-Sets tiled layout.
-<DT><B>Mod1-f</B>
-
-<DD>
-Sets floating layout.
-<DT><B>Mod1-m</B>
-
-<DD>
-Sets monocle layout.
-<DT><B>Mod1-space</B>
-
-<DD>
-Toggles between current and previous layout.
-<DT><B>Mod1-j</B>
-
-<DD>
-Focus next window.
-<DT><B>Mod1-k</B>
-
-<DD>
-Focus previous window.
-<DT><B>Mod1-h</B>
-
-<DD>
-Decrease master area size.
-<DT><B>Mod1-l</B>
-
-<DD>
-Increase master area size.
-<DT><B>Mod1-Return</B>
-
-<DD>
-Zooms/cycles focused window to/from master area (tiled layouts only).
-<DT><B>Mod1-Shift-c</B>
-
-<DD>
-Close focused window.
-<DT><B>Mod1-Shift-space</B>
-
-<DD>
-Toggle focused window between tiled and floating state.
-<DT><B>Mod1-Tab</B>
-
-<DD>
-Toggles to the previously selected tags.
-<DT><B>Mod1-Shift-[1..n]</B>
-
-<DD>
-Apply nth tag to focused window.
-<DT><B>Mod1-Shift-0</B>
-
-<DD>
-Apply all tags to focused window.
-<DT><B>Mod1-Control-Shift-[1..n]</B>
-
-<DD>
-Add/remove nth tag to/from focused window.
-<DT><B>Mod1-[1..n]</B>
-
-<DD>
-View all windows with nth tag.
-<DT><B>Mod1-0</B>
-
-<DD>
-View all windows with any tag.
-<DT><B>Mod1-Control-[1..n]</B>
-
-<DD>
-Add/remove all windows with nth tag to/from the view.
-<DT><B>Mod1-Shift-q</B>
-
-<DD>
-Quit dwm.
-</DL>
-<H3>Mouse commands</H3>
-
-<DL COMPACT>
-<DT><B>Mod1-Button1</B>
-
-<DD>
-Move focused window while dragging. Tiled windows will be toggled to the floating state.
-<DT><B>Mod1-Button2</B>
-
-<DD>
-Toggles focused window between floating and tiled state.
-<DT><B>Mod1-Button3</B>
-
-<DD>
-Resize focused window while dragging. Tiled windows will be toggled to the floating state.
-</DL>
-<H2>CUSTOMIZATION</H2>
-
-dwm is customized by creating a custom config.h and (re)compiling the source
-code. This keeps it fast, secure and simple.
-<H2>SEE ALSO</H2>
-
-<B><A HREF="http://tools.suckless.org/dmenu">dmenu</A></B>(1)
-
-<H2>BUGS</H2>
-
-Java applications which use the XToolkit/XAWT backend may draw grey windows
-only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
-JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
-are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
-environment variable
-<B>AWT_TOOLKIT=MToolkit</B>
-(to use the older Motif backend instead) or running
-<B>xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D</B>
-or
-<B>wmname LG3D</B>
-(to pretend that a non-reparenting window manager is running that the
-XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
-<B>_JAVA_AWT_WM_NONREPARENTING=1</B>.
-
-<P>
-
-GTK 2.10.9+ versions contain a broken <B>Save-As</B> file dialog implementation,
-which requests to reconfigure its window size in an endless loop. However, its
-window is still respondable during this state, so you can simply ignore the flicker
-until a new GTK version appears, which will fix this bug, approximately
-GTK 2.10.12+ versions.
-<P>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/altmovefocus.md
--- a/dwm.suckless.org/patches/altmovefocus.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,10 +0,0 @@
-ANOTHER FOCUS MOVING MODEL
-==========================
-
-Description
------------
-When a single tag is displayed, calling view() or tag() with it as an argument is useless. This patch enables moving focus forward with view() calls and backward with tag() instead of doing nothing. Of course, those who toggle several tags at time or just have more than 3-4 tags won't benefit much from such behaviour.
-
-Download
---------
-* [dwm-5.2-altmovefocus.diff](http://mkmks.org/files/patches/dwm-5.2-altmovefocus.diff)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/attachaside-5.6.1.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/attachaside-5.6.1.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,38 @@
+diff -r 9f79d36bd5e0 dwm.c
+--- a/dwm.c Tue Sep 08 13:33:58 2009 +0100
++++ b/dwm.c Tue Sep 15 14:19:26 2009 +0200
+_AT_@ -153,6 +153,7 @@
+ static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
+ static void arrange(void);
+ static void attach(Client *c);
++static void attachaside(Client *c);
+ static void attachstack(Client *c);
+ static void buttonpress(XEvent *e);
+ static void checkotherwm(void);
+_AT_@ -397,6 +398,17 @@
+ }
+
+ void
++attachaside(Client *c) {
++ Client *at = nexttiled(c->mon->clients);;
++ if(c->mon->sel == NULL || c->mon->sel->isfloating || !at) {
++ attach(c);
++ return;
++ }
++ c->next = at->next;
++ at->next = c;
++}
++
++void
+ attachstack(Client *c) {
+ c->snext = c->mon->stack;
+ c->mon->stack = c;
+_AT_@ -1105,7 +1117,7 @@
+ c->isfloating = trans != None || c->isfixed;
+ if(c->isfloating)
+ XRaiseWindow(dpy, c->win);
+- attach(c);
++ attachaside(c);
+ attachstack(c);
+ XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
+ XMapWindow(dpy, c->win);
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/attachaside.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/attachaside.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,51 @@
+# ATTACHASIDE
+
+## Description
+
+Make new client get attached and focused in the stacking area instead of
+always becoming the new master.
+Basically an attachabove mod.
+
+## Example
+
+ Original behaviour :
+ +-----------------+-------+
+ | | |
+ | | P |
+ | | |
+ | N +-------|
+ | | |
+ | | |
+ | | |
+ +-----------------+-------+
+
+
+ New Behaviour :
+ +-----------------+-------+
+ | | |
+ | | N |
+ | | |
+ | P +-------+
+ | | |
+ | | |
+ | | |
+ +-----------------+-------+
+
+
+ +-----------------+-------+
+ | | |
+ | | P |
+ | | |
+ | +-------+
+ | | |
+ | | N |
+ | | |
+ +-----------------+-------+
+
+## Download
+
+ * [attachaside-5.6.1.diff](attachaside-5.6.1.diff) (1.1K) (20090915)
+
+## Author
+
+ * Jerome Andrieux - <jerome_AT_gcu.info>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/boldfont.md
--- a/dwm.suckless.org/patches/boldfont.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,27 +0,0 @@
-BOLDFONT
-========
-
-Description
------------
-
-This patch makes dwm use a different font (specified as `boldfont` in
-`config.h`) for occupied tags, and titles of floating windows.
-
-It also removes the squares that now mark occupied tags and floating windows.
-
-Configuration
--------------
-
- static const char font[] = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*";
- static const char boldfont[] = "-*-terminus-bold-r-normal-*-14-*-*-*-*-*-*-*";
-
-Download
---------
-
-- [dwm-5.2-boldfont.diff](http://novsak.name/files/dwm/dwm-5.2-boldfont.diff)
-- [dwm-5.1-boldfont.diff](http://novsak.name/files/dwm/dwm-5.1-boldfont.diff)
-
-Author
-------
-
-- Luka Novsak <[lukanovsak_AT_gmail.com](mailto:lukanovsak_AT_gmail.com)>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/bottom_stack.md
--- a/dwm.suckless.org/patches/bottom_stack.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/bottom_stack.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,12 +1,25 @@
-BOTTOM STACK PATCH
-==================
+BOTTOM STACK
+============
 
 Description
 -----------
-This patch provides an additional bottom stack layout for the dwm window manager. (It no longer includes code for 'tileleft' or 'bstacklandscape'). Use 'patch -p0' when patching.
+`bstack` and `bstackhoriz` are two bottom stack layouts for dwm.
 
-Bottom Stack Tiling:
---------------------
+Include the sources in your `config.h` (after the definition of `mfact`)
+and update the layouts and key bindings.
+
+ #include "bstack.c"
+ #include "bstackhoriz.c"
+
+ static const Layout layouts[] = {
+ /* symbol arrange function */
+ ...
+ { "TTT", bstack },
+ { "===", bstackhoriz },
+
+
+Bottom Stack Tiling
+-------------------
 
         bstack (TTT)
         +-----------------+
_AT_@ -18,7 +31,18 @@
         | | | |
         +-----+-----+-----+
 
+ bstackhoriz (===)
+ +-----------------+
+ | |
+ | |
+ | |
+ +-----------------+
+ +-----------------+
+ +-----------------+
+ +-----------------+
+
 Download
 --------
-* [dwm-5.6.1-bstack.diff](http://bsdgroup.org/files/dwm-5.6.1-bstack.diff) (2k) (20090726)
-* [dwm-5.5-bstack.diff](http://bsdgroup.org/files/dwm-5.5-bstack.diff) (2k) (20090307)
+* [bstack.c](bstack.c) (dwm 5.6.1) (20090908)
+* [bstackhoriz.c](bstackhoriz.c) (dwm 5.6.1) (20090908)
+* see older versions in [historical patches](historical)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/bstack.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/bstack.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,29 @@
+static void
+bstack(Monitor *m) {
+ int x, y, h, w, mh;
+ unsigned int i, n;
+ Client *c;
+
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ if(n == 0)
+ return;
+ /* master */
+ c = nexttiled(m->clients);
+ mh = m->mfact * m->wh;
+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, (n == 1 ? m->wh : mh) - 2 * c->bw, False);
+ if(--n == 0)
+ return;
+ /* tile stack */
+ x = m->wx;
+ y = (m->wy + mh > c->y + c->h) ? c->y + c->h + 2 * c->bw : m->wy + mh;
+ w = m->ww / n;
+ h = (m->wy + mh > c->y + c->h) ? m->wy + m->wh - y : m->wh - mh;
+ if(w < bh)
+ w = m->ww;
+ for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, /* remainder */ ((i + 1 == n)
+ ? m->wx + m->ww - x - 2 * c->bw : w - 2 * c->bw), h - 2 * c->bw, False);
+ if(w != m->ww)
+ x = c->x + WIDTH(c);
+ }
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/bstackhoriz.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/bstackhoriz.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,30 @@
+static void
+bstackhoriz(Monitor *m) {
+ int x, y, h, w, mh;
+ unsigned int i, n;
+ Client *c;
+
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ if(n == 0)
+ return;
+ /* master */
+ c = nexttiled(m->clients);
+ mh = m->mfact * m->wh;
+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, (n == 1 ? m->wh : mh) - 2 * c->bw, False);
+ if(--n == 0)
+ return;
+ /* tile stack */
+ x = m->wx;
+ y = (m->wy + mh > c->y + c->h) ? c->y + c->h + 2 * c->bw : m->wy + mh;
+ w = m->ww;
+ h = (m->wy + mh > c->y + c->h) ? m->wy + m->wh - y : m->wh - mh;
+ h /= n;
+ if(h < bh)
+ h = m->wh;
+ for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
+ ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
+ if(h != m->wh)
+ y = c->y + HEIGHT(c);
+ }
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/clientspertag.md
--- a/dwm.suckless.org/patches/clientspertag.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/clientspertag.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,54 +1,48 @@
-LIMIT CLIENTS PER TAG PATCH
-===========================
+# CLIENTS PER TAG
 
-Last update: 2007-10-25
+## Description
 
-See [nmaster][2] for cpt on dwm-4.6.
+This patch modifies the tile() layout to limit the maximum number of visible
+clients per tag. Out-of-limit windows are arranged behind the visible ones
+in the slave area.
 
-This patch allows you to limit the number of clients to be shown.
-This restriction only affects non-floating windows.
 
-This patch can be used as a 'set' or 'toggle' mode.
+ +-----------------------+ +-----------------------+
+ | -1/3 | | 2/3 |
+ +-----------+-----------+ +-----------+-----------+
+ | | | | | |
+ | | 2 | | | |
+ | | | | | |
+ | 1 +-----------+ | 1 | 2 |
+ | | | | | |
+ | | 3 | | | |
+ | | | | | |
+ +-----------+-----------+ +-----------+-----------+
+ cpt=-1 cpt=2
 
-Tips
-----
+## Usage
 
-* To show all windows put "-1" as argument value.
-* To only display floating windows put "0" as argument.
-* For a toggling pair put "^2".
+ 1. Download the patch and apply according to the [general instructions](.).
+ 2. The patch adds two new keybindings (META-q/a) which set cpt to ^2 and ^3:
 
-Configuration
--------------
+If the argument to 'clientspertag' starts with '^' pressing twice the key
+will result on swapping between the defined value and -1.
 
-The MODKEY+w toggles between two visible tiled windows and MODKEY+SHIFT+w hides all tiled windows.
+ * To show all windows put "-1" as argument value.
+ * To only display floating windows put "0" as argument.
+ * For a toggling pair put "^2".
 
- { MODKEY|ShiftMask, XK_q, clientspertag, "0" }, \
- { MODKEY, XK_q, clientspertag, "^1" }, \
- { MODKEY, XK_w, clientspertag, "^2" }, \
- { MODKEY, XK_e, clientspertag, "^3" }, \
+ static Key keys[] = {
+ /* modifier key function argument */
+ ...
+ { MODKEY, XK_q, clientspertag, {.v="^2"} },
+ { MODKEY, XK_a, clientspertag, {.v="^3"} },
+ };
 
-Download
---------
+## Download
 
-You can download this patch [dwm-4.4-cpt.patch](http://news.nopcode.org/dwm-4.4-cpt.patch) (3K)
+ * [dwm-5.6.1-cpt.diff](dwm-5.6.1-cpt.diff) (2.9k) (20090913)
 
-See [nmaster][1] for dwm-4.6.
+## Maintainer
 
-Here's a [patch][2] from <i>Ritesh Kumar</i> that modifies dwm.c to show cpt and total number of clients in the statusbar.
-
-TODO
-----
-
-* Maybe it should be renamed to "tiledlimit" or "clientslimit".
-* Think about a way to make the focused client always visible (enhanced monocle patch?)
-
-Feedback is welcome :)
-
-AUTHOR
-------
-
-* pancake -- pancake /at/ youterm /dot/ com
-
-[1]: /dwm/patches/nmaster.html
-[2]: http://news.nopcode.org/cptdwm-4.6.diff
-
+ * pancake - <pancake_AT_nopcode.org>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/color_status_bar.md
--- a/dwm.suckless.org/patches/color_status_bar.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,35 +0,0 @@
-# COLOR STATUS BAR #
-
-## Description ##
-
-This patch adds some color to the status bar. It allows you to change the colorset of text portions from "norm" to "sel" (and back) and to invert the colorset (the foreground becomes the background color and vice versa).
-
-
-## Usage ##
-
-Download the patch and apply it according to the [general instructions](.). The patch will make the following changes:
-
- * colorstatus.c: adding the file
- * dwm.c: adding the include-line for 'colorstatus.c'
- * dwm.c ('drawbar' function): adding the int-variable 'stextw'
- * dwm.c ('drawbar' function): changing the 'drawtext' section for stext
-
-
-## Configuration ##
-
-The configuration is done in the file '.xinitrc', where you define the status bar text. You can add the following tags:
-
- * '[c]' (without quotes): toggles the colorset (norm -> sel or sel -> norm depending on the currently selected colorset)
- * '[i]' (without quotes): inverts the current colorset (fgcolor -> bgcolor and bgcolor -> fgcolor)
-
-The change is applied from the position of the tag onwards. To revert the change you have to set the same tag again.
-
-### Example ###
-echo -e NEW mail: $mailnew \| VOL front: $audiofront \| BAT:[i]$batpercent[i]\| CPU: $cpuavgload \| $datestr[c]$timestr
-
-
-## Download ##
-
- * [dwm-5.2-colorstatus.diff](dwm-5.2-colorstatus.diff) (4.1k, 131 additional lines) (20081117)
- * [.xinitrc example](dwm-5.2-colorstatus.xinitrc) (0.8k) (20081117)
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/colored_status_text.md
--- a/dwm.suckless.org/patches/colored_status_text.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,60 +0,0 @@
-# COLORED STATUS TEXT #
-
-## Description ##
-
-This patch enables colored text in the status bar. It changes the way colors are defined in config.h, allowing the user to define multiple color combinations for use in their status script.
-
-## Configuration ##
-
-Download the patch and apply it according to the [general instructions](.).
-
-Modify the colors definition in 'config.h' to suit your needs. Make sure to define at least 3 colors as they will be used for 'normal', 'selected', and 'urgent' windows, respectively.
-
-## Usage ##
-
-Add code to your status script to output the raw characters '\x03' to switch to the 'urgent' color, or '\x04' to switch to the 4th defined color, etc. Note that the color indices in the status text are +1 from the definition in 'config.h' (because '\0' is the string terminator). To switch back to the normal text color use '\x01'.
-
-### Example ###
-
-The following definition in 'config.h':
-
- #define NUMCOLORS 4
- static const char colors[NUMCOLORS][ColLast][8] = {
- // border foreground background
- { "#000033", "#dddddd", "#000033" }, // normal
- { "#000088", "#ffffff", "#000088" }, // selected
- { "#ff0000", "#000000", "#ffff00" }, // urgent/warning (black on yellow)
- { "#ff0000", "#ffffff", "#ff0000" }, // error (white on red)
- // add more here
- };
-
-Coupled with a matching status script produces the following:
- ![Example Colored Status Text](dwm-5.3.1-statuscolors.png)
-
-A really silly example:
-
- echo -e "normal \x01 selected \x03 warning/urgent \x04 error \x01 back to normal text" | dwm
-
-An example status script snippet to take advantage of the colors:
-
- status=""
- if [$batperc -le 10]; then
- # use "warning" color
- status+="\x03 BAT: $batperc"
- elif [$batperc -le 5]; then
- # use "error" color
- status+="\x04 BAT: $batperc"
- else
- # default is normal color
- status+="BAT: $batperc"
- fi
-
- # switch back to normal color for date
- status+="\x01| "+$(date)
-
- echo -e $status
-
-## Download ##
-
- * [dwm-5.3.1-statuscolors.diff](dwm-5.3.1-statuscolors.diff)
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.2-colorstatus.diff
--- a/dwm.suckless.org/patches/dwm-5.2-colorstatus.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,183 +0,0 @@
-diff -up dwm-5.2-original/colorstatus.c dwm-5.2-modified/colorstatus.c
---- /dev/null 2008-11-17 18:12:14.000000000 +0100
-+++ dwm-5.2-modified/colorstatus.c 2008-11-17 18:09:29.000000000 +0100
-_AT_@ -0,0 +1,144 @@
-+int
-+drawstatustext(int x) {
-+ char cd[] = "[c]", id[] = "[i]";
-+ char buf1[256] = {0};
-+ Bool parse = True;
-+ Bool cs = False, is = False;
-+ int stextw = 0;
-+
-+ strcpy(buf1, stext);
-+ while(parse) {
-+ char *cp = 0, *ip = 0;
-+
-+ cp = strstr(buf1, cd);
-+ ip = strstr(buf1, id);
-+ if(cp != NULL || ip != NULL) {
-+ char buf2[256] = {0}, buf3[256] = {0};
-+ size_t clen2 = -1, ilen2 = -1, len2 = 0, dlen = 0, offset3 = 0, len3 = 0;
-+
-+ if(cp != NULL)
-+ clen2 = cp - buf1;
-+ if(ip != NULL)
-+ ilen2 = ip - buf1;
-+ if(clen2 < 0) {
-+ len2 = ilen2;
-+ dlen = strlen(id);
-+ }
-+ else if(ilen2 < 0) {
-+ len2 = clen2;
-+ dlen = strlen(cd);
-+ }
-+ else if(clen2 < ilen2) {
-+ len2 = clen2;
-+ dlen = strlen(cd);
-+ }
-+ else {
-+ len2 = ilen2;
-+ dlen = strlen(id);
-+ }
-+ strncpy(buf2, buf1, len2);
-+ offset3 = len2 + dlen;
-+ len3 = strlen(buf1) - offset3;
-+ strncpy(buf3, buf1 + offset3, len3);
-+ if(buf2 != NULL && strlen(buf2) > 0)
-+ stextw = stextw + TEXTW(buf2);
-+
-+ memset(buf1, '\0', sizeof(buf1));
-+ strcpy(buf1, buf3);
-+ }
-+ else {
-+ stextw = stextw + TEXTW(buf1);
-+ parse = False;
-+ }
-+ }
-+ dc.x = ww - stextw;
-+
-+ memset(buf1, '\0', sizeof(buf1));
-+ strcpy(buf1, stext);
-+ parse = True;
-+ while(parse) {
-+ char *cp = 0, *ip = 0;
-+
-+ cp = strstr(buf1, cd);
-+ ip = strstr(buf1, id);
-+ if(cp != NULL || ip != NULL) {
-+ char buf2[256] = {0}, buf3[256] = {0};
-+ size_t clen2 = -1, ilen2 = -1, len2 = 0, dlen = 0, offset3 = 0, len3 = 0;
-+ Bool cs3 = cs, is3 = is;
-+
-+ if(cp != NULL)
-+ clen2 = cp - buf1;
-+ if(ip != NULL)
-+ ilen2 = ip - buf1;
-+ if(clen2 < 0) {
-+ len2 = ilen2;
-+ dlen = strlen(id);
-+ is3 = !is;
-+ }
-+ else if(ilen2 < 0) {
-+ len2 = clen2;
-+ dlen = strlen(cd);
-+ cs3 = !cs;
-+ }
-+ else if(clen2 < ilen2) {
-+ len2 = clen2;
-+ dlen = strlen(cd);
-+ cs3 = !cs;
-+ }
-+ else {
-+ len2 = ilen2;
-+ dlen = strlen(id);
-+ is3 = !is;
-+ }
-+
-+ strncpy(buf2, buf1, len2);
-+ offset3 = len2 + dlen;
-+ len3 = strlen(buf1) - offset3;
-+ strncpy(buf3, buf1 + offset3, len3);
-+ if(buf2 != NULL && strlen(buf2) > 0) {
-+ dc.w = TEXTW(buf2);
-+ if(cs) {
-+ if(is)
-+ drawtext(buf2, dc.sel, True);
-+ else
-+ drawtext(buf2, dc.sel, False);
-+ }
-+ else {
-+ if(is)
-+ drawtext(buf2, dc.norm, True);
-+ else
-+ drawtext(buf2, dc.norm, False);
-+ }
-+ dc.x = dc.x + dc.w;
-+ }
-+
-+ cs = cs3;
-+ is = is3;
-+ memset(buf1, '\0', sizeof(buf1));
-+ strcpy(buf1, buf3);
-+ }
-+ else {
-+ dc.w = TEXTW(buf1);
-+ dc.x = ww - dc.w;
-+ if(dc.x < x) {
-+ dc.x = x;
-+ dc.w = ww - x;
-+ }
-+ if(cs) {
-+ if(is)
-+ drawtext(buf1, dc.sel, True);
-+ else
-+ drawtext(buf1, dc.sel, False);
-+ }
-+ else {
-+ if(is)
-+ drawtext(buf1, dc.norm, True);
-+ else
-+ drawtext(buf1, dc.norm, False);
-+ }
-+ parse = False;
-+ }
-+ }
-+
-+ return(stextw);
-+}
-diff -up dwm-5.2-original/dwm.c dwm-5.2-modified/dwm.c
---- dwm-5.2-original/dwm.c 2008-09-09 21:46:17.000000000 +0200
-+++ dwm-5.2-modified/dwm.c 2008-11-17 18:09:29.000000000 +0100
-_AT_@ -239,6 +239,7 @@ static Layout *lt[] = { NULL, NULL };
- static Window root, barwin;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-+#include "colorstatus.c"
-
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
-_AT_@ -495,6 +496,7 @@ drawbar(void) {
- unsigned int i, occ = 0, urg = 0;
- unsigned long *col;
- Client *c;
-+ int stextw = 0;
-
- for(c = clients; c; c = c->next) {
- occ |= c->tags;
-_AT_@ -517,13 +519,8 @@ drawbar(void) {
- }
- else
- x = dc.x;
-- dc.w = TEXTW(stext);
-- dc.x = ww - dc.w;
-- if(dc.x < x) {
-- dc.x = x;
-- dc.w = ww - x;
-- }
-- drawtext(stext, dc.norm, False);
-+ stextw = drawstatustext(x);
-+ dc.x = ww - stextw;
- if((dc.w = dc.x - x) > bh) {
- dc.x = x;
- if(sel) {
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.2-colorstatus.xinitrc
--- a/dwm.suckless.org/patches/dwm-5.2-colorstatus.xinitrc Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,24 +0,0 @@
-while true
-do
- datestr=`date '+%a, %x'`
- timestr=`date '+%H:%M'`
-
- cpuavgload=`uptime | sed -n 's/.*: //; s/, .*// p'`
-
- batcurrent=`sed -n 's/ mAh//; s/remaining[ a-z:]*// p' /proc/acpi/battery/BAT1/state`
- batfull=`sed -n 's/ mAh//; s/last full[ a-z:]*// p' /proc/acpi/battery/BAT1/info`
- batpercent=`echo "($batcurrent*100)/$batfull" | bc`
- if [ $batpercent -lt 10 ]
- then batpercent=`echo [c]$batpercent%[c]`
- else batpercent=`echo $batpercent%`
- fi
-
- audiofront=`amixer sget Front | sed -n 's/\] \[[^%]*\]//; s/[ ]*Front Left: Playback [0-9]* \[// p'`
-
- mailnew=`claws-mail --status inbox | sed -n 's/ [ 0-9ClawsMinotrug\.]*// p'`
-
- echo -e NEW mail: $mailnew \| VOL front: $audiofront \| BAT:[i]$batpercent[i]\| CPU: $cpuavgload \| $datestr[c]$timestr
-
- sleep 2
-done | dwm
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.2-gaplessgrid.diff
--- a/dwm.suckless.org/patches/dwm-5.2-gaplessgrid.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,59 +0,0 @@
-diff -up dwm-5.2-original/config.def.h dwm-5.2-modified/config.def.h
---- dwm-5.2-original/config.def.h 2008-09-09 21:46:17.000000000 +0200
-+++ dwm-5.2-modified/config.def.h 2008-10-20 20:07:42.000000000 +0200
-_AT_@ -28,11 +28,13 @@ static Rule rules[] = {
- static float mfact = 0.55; /* factor of master area size [0.05..0.95] */
- static Bool resizehints = True; /* False means respect size hints in tiled resizals */
-
-+#include "gaplessgrid.c"
- static Layout layouts[] = {
- /* symbol arrange function */
- { "[]=", tile }, /* first entry is default */
- { "><>", NULL }, /* no layout function means floating behavior */
- { "[M]", monocle },
-+ { "###", gaplessgrid },
- };
-
- /* key definitions */
-diff -up dwm-5.2-original/gaplessgrid.c dwm-5.2-modified/gaplessgrid.c
---- /dev/null 2008-10-20 20:09:51.000000000 +0200
-+++ dwm-5.2-modified/gaplessgrid.c 2008-10-20 20:06:59.000000000 +0200
-_AT_@ -0,0 +1,38 @@
-+void
-+gaplessgrid() {
-+ unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
-+ Client *c;
-+
-+ for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
-+ n++;
-+ if(n == 0)
-+ return;
-+
-+ /* grid dimensions */
-+ for(cols = 0; cols <= n/2; cols++)
-+ if(cols*cols >= n)
-+ break;
-+ if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
-+ cols = 2;
-+ rows = n/cols;
-+
-+ /* window geometries (cell height/width/x/y) */
-+ cw = ww / (cols ? cols : 1);
-+ cn = 0; /* current column number */
-+ rn = 0; /* current row number */
-+ for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) {
-+ if(i/rows+1 > cols-n%cols)
-+ rows = n/cols+1;
-+ ch = wh / (rows ? rows : 1);
-+ cx = wx + cn*cw;
-+ cy = wy + rn*ch;
-+ resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, False);
-+
-+ i++;
-+ rn++;
-+ if(rn >= rows) { /* jump to the next column */
-+ rn = 0;
-+ cn++;
-+ }
-+ }
-+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.2-monocle_count.diff
--- a/dwm.suckless.org/patches/dwm-5.2-monocle_count.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,32 +0,0 @@
---- dwm-5.2/dwm.c 2008-09-09 21:46:17.000000000 +0200
-+++ dwm-5.2-monocle_count/dwm.c 2008-10-13 00:04:38.000000000 +0200
-_AT_@ -491,7 +491,8 @@
-
- void
- drawbar(void) {
-- int x;
-+ int x, a= 0, s= 0;
-+ char posbuf[10];
- unsigned int i, occ = 0, urg = 0;
- unsigned long *col;
- Client *c;
-_AT_@ -517,6 +518,19 @@
- }
- else
- x = dc.x;
-+ if(lt[sellt]->arrange == monocle){
-+ dc.x= x;
-+ for(c= nexttiled(clients), a= 0, s= 0; c; c= nexttiled(c->next), a++)
-+ if(c == stack)
-+ s= a;
-+ if(!s && a)
-+ s= a;
-+ snprintf(posbuf, LENGTH(posbuf), "[%d/%d]", s, a);
-+ dc.w= TEXTW(posbuf);
-+ drawtext(posbuf, dc.norm, False);
-+ x= dc.x + dc.w;
-+ }
-+
- dc.w = TEXTW(stext);
- dc.x = ww - dc.w;
- if(dc.x < x) {
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.2-pertag.diff
--- a/dwm.suckless.org/patches/dwm-5.2-pertag.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,123 +0,0 @@
---- dwm-5.2/dwm.c 2008-09-09 21:46:17.000000000 +0200
-+++ dwm-5.2-pertag/dwm.c 2008-10-12 23:53:30.000000000 +0200
-_AT_@ -240,6 +240,11 @@
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-+static int curtag = 1, prevtag = 1;
-+static Layout *lts[LENGTH(tags) + 1];
-+static double mfacts[LENGTH(tags) + 1];
-+static Bool showbars[LENGTH(tags) + 1];
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
-
-_AT_@ -1272,7 +1277,7 @@
- if(!arg || !arg->v || arg->v != lt[sellt])
- sellt ^= 1;
- if(arg && arg->v)
-- lt[sellt] = (Layout *)arg->v;
-+ lt[sellt] = lts[curtag] = (Layout *)arg->v;
- if(sel)
- arrange();
- else
-_AT_@ -1289,7 +1294,7 @@
- f = arg->f < 1.0 ? arg->f + mfact : arg->f - 1.0;
- if(f < 0.1 || f > 0.9)
- return;
-- mfact = f;
-+ mfact = mfacts[curtag] = f;
- arrange();
- }
-
-_AT_@ -1337,12 +1342,27 @@
- if(!dc.font.set)
- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-
-+ /* init mfacts */
-+ for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+ mfacts[i] = mfact;
-+ }
-+
-+ /* init layouts */
-+ for(i=0; i < LENGTH(tags) + 1; i++) {
-+ lts[i] = &layouts[0];
-+ }
-+
-+
- /* init bar */
- for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
- w = TEXTW(layouts[i].symbol);
- blw = MAX(blw, w);
- }
-
-+ for(i=0; i < LENGTH(tags) + 1; i++) {
-+ showbars[i] = showbar;
-+ }
-+
- wa.override_redirect = 1;
- wa.background_pixmap = ParentRelative;
- wa.event_mask = ButtonPressMask|ExposureMask;
-_AT_@ -1457,7 +1477,7 @@
-
- void
- togglebar(const Arg *arg) {
-- showbar = !showbar;
-+ showbar = showbars[curtag] = !showbar;
- updategeom();
- updatebar();
- arrange();
-_AT_@ -1490,9 +1510,23 @@
- void
- toggleview(const Arg *arg) {
- unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
-+ unsigned int i;
-
- if(mask) {
-+ if(mask == ~0) {
-+ prevtag = curtag;
-+ curtag = 0;
-+ }
-+ if(!(mask & 1 << (curtag - 1))) {
-+ prevtag = curtag;
-+ for (i=0; !(mask & 1 << i); i++);
-+ curtag = i + 1;
-+ }
- tagset[seltags] = mask;
-+ lt[sellt] = lts[curtag];
-+ mfact = mfacts[curtag];
-+ if (showbar != showbars[curtag])
-+ togglebar(NULL);
- clearurgent();
- arrange();
- }
-_AT_@ -1661,11 +1695,28 @@
-
- void
- view(const Arg *arg) {
-+ unsigned int i;
- if((arg->ui & TAGMASK) == tagset[seltags])
- return;
- seltags ^= 1; /* toggle sel tagset */
-- if(arg->ui & TAGMASK)
-+ if(arg->ui & TAGMASK) {
- tagset[seltags] = arg->ui & TAGMASK;
-+ prevtag = curtag;
-+ if(arg->ui == ~0)
-+ curtag = 0;
-+ else {
-+ for (i=0; !(arg->ui & 1 << i); i++);
-+ curtag = i + 1;
-+ }
-+ } else {
-+ prevtag= curtag ^ prevtag;
-+ curtag^= prevtag;
-+ prevtag= curtag ^ prevtag;
-+ }
-+ lt[sellt]= lts[curtag];
-+ mfact = mfacts[curtag];
-+ if(showbar != showbars[curtag])
-+ togglebar(NULL);
- clearurgent();
- arrange();
- }
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.3.1-statuscolors.diff
--- a/dwm.suckless.org/patches/dwm-5.3.1-statuscolors.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,228 +0,0 @@
-diff -r 94032e7d3943 config.def.h
---- a/config.def.h Sat Dec 06 11:22:30 2008 +0000
-+++ b/config.def.h Sat Dec 06 11:24:26 2008 -0500
-_AT_@ -1,13 +1,16 @@
- /* See LICENSE file for copyright and license details. */
-
- /* appearance */
-+#define NUMCOLORS 4 // need at least 3
-+static const char colors[NUMCOLORS][ColLast][8] = {
-+ // border foreground background
-+ { "#cccccc", "#000000", "#cccccc" }, // 0 = normal
-+ { "#0066ff", "#ffffff", "#0066ff" }, // 1 = selected
-+ { "#0066ff", "#0066ff", "#ffffff" }, // 2 = urgent/warning
-+ { "#ff0000", "#ffffff", "#ff0000" }, // 3 = error
-+ // add more here
-+};
- static const char font[] = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*";
--static const char normbordercolor[] = "#cccccc";
--static const char normbgcolor[] = "#cccccc";
--static const char normfgcolor[] = "#000000";
--static const char selbordercolor[] = "#0066ff";
--static const char selbgcolor[] = "#0066ff";
--static const char selfgcolor[] = "#ffffff";
- static unsigned int borderpx = 1; /* border pixel of windows */
- static unsigned int snap = 32; /* snap pixel */
- static Bool showbar = True; /* False means no bar */
-_AT_@ -49,7 +52,7 @@
- #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
-
- /* commands */
--static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
-+static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG], "-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL };
- static const char *termcmd[] = { "uxterm", NULL };
-
- static Key keys[] = {
-diff -r 94032e7d3943 dwm.c
---- a/dwm.c Sat Dec 06 11:22:30 2008 +0000
-+++ b/dwm.c Sat Dec 06 11:24:26 2008 -0500
-_AT_@ -52,6 +52,7 @@
- #define MAX(a, b) ((a) > (b) ? (a) : (b))
- #define MIN(a, b) ((a) < (b) ? (a) : (b))
- #define MAXTAGLEN 16
-+#define MAXCOLORS 8
- #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
- #define WIDTH(x) ((x)->w + 2 * (x)->bw)
- #define HEIGHT(x) ((x)->h + 2 * (x)->bw)
-_AT_@ -97,8 +98,7 @@
-
- typedef struct {
- int x, y, w, h;
-- unsigned long norm[ColLast];
-- unsigned long sel[ColLast];
-+ unsigned long colors[MAXCOLORS][ColLast];
- Drawable drawable;
- GC gc;
- struct {
-_AT_@ -147,8 +147,9 @@
- static void detachstack(Client *c);
- static void die(const char *errstr, ...);
- static void drawbar(void);
--static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
--static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
-+static void drawcoloredtext(char *text);
-+static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
-+static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);
- static void enternotify(XEvent *e);
- static void expose(XEvent *e);
- static void focus(Client *c);
-_AT_@ -501,14 +502,14 @@
- dc.x = 0;
- for(i = 0; i < LENGTH(tags); i++) {
- dc.w = TEXTW(tags[i]);
-- col = tagset[seltags] & 1 << i ? dc.sel : dc.norm;
-- drawtext(tags[i], col, urg & 1 << i);
-- drawsquare(sel && sel->tags & 1 << i, occ & 1 << i, urg & 1 << i, col);
-+ col = dc.colors[ (tagset[seltags] & 1 << i ? 1 : (urg & 1 << i ? 2:0)) ];
-+ drawtext(tags[i], col, True);
-+ drawsquare(sel && sel->tags & 1 << i, occ & 1 << i, col);
- dc.x += dc.w;
- }
- if(blw > 0) {
- dc.w = blw;
-- drawtext(lt[sellt]->symbol, dc.norm, False);
-+ drawtext(lt[sellt]->symbol, dc.colors[0], True);
- x = dc.x + dc.w;
- }
- else
-_AT_@ -519,27 +520,57 @@
- dc.x = x;
- dc.w = ww - x;
- }
-- drawtext(stext, dc.norm, False);
-+ drawcoloredtext(stext);
- if((dc.w = dc.x - x) > bh) {
- dc.x = x;
- if(sel) {
-- drawtext(sel->name, dc.sel, False);
-- drawsquare(sel->isfixed, sel->isfloating, False, dc.sel);
-+ drawtext(sel->name, dc.colors[1], True);
-+ drawsquare(sel->isfixed, sel->isfloating, dc.colors[1]);
- }
- else
-- drawtext(NULL, dc.norm, False);
-+ drawtext(NULL, dc.colors[0], True);
- }
- XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, ww, bh, 0, 0);
- XSync(dpy, False);
- }
-
- void
--drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
-+drawcoloredtext(char *text) {
-+ Bool first=True;
-+ char *buf = text, *ptr = buf, c = 1;
-+ unsigned long *col = dc.colors[0];
-+ int i, ox = dc.x;
-+
-+ while( *ptr ) {
-+ for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++);
-+ if( !*ptr ) break;
-+ c=*ptr;
-+ *ptr=0;
-+ if( i ) {
-+ dc.w = ww - dc.x;
-+ drawtext(buf, col, first);
-+ dc.x += textnw(buf, i) + textnw(&c,1);
-+ if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;
-+ first = False;
-+ } else if( first ) {
-+ ox = dc.x += textnw(&c,1);
-+ }
-+ *ptr = c;
-+ col = dc.colors[ c-1 ];
-+ buf = ++ptr;
-+ }
-+ if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;
-+ drawtext(buf, col, True);
-+ dc.x = ox;
-+}
-+
-+void
-+drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
- int x;
- XGCValues gcv;
- XRectangle r = { dc.x, dc.y, dc.w, dc.h };
-
-- gcv.foreground = col[invert ? ColBG : ColFG];
-+ gcv.foreground = col[ ColFG ];
- XChangeGC(dpy, dc.gc, GCForeground, &gcv);
- x = (dc.font.ascent + dc.font.descent + 2) / 4;
- r.x = dc.x + 1;
-_AT_@ -555,18 +586,18 @@
- }
-
- void
--drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
-+drawtext(const char *text, unsigned long col[ColLast], Bool pad) {
- char buf[256];
- int i, x, y, h, len, olen;
- XRectangle r = { dc.x, dc.y, dc.w, dc.h };
-
-- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
-+ XSetForeground(dpy, dc.gc, col[ ColBG ]);
- XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
- if(!text)
- return;
- olen = strlen(text);
-- h = dc.font.ascent + dc.font.descent;
-- y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
-+ h = pad ? (dc.font.ascent + dc.font.descent) : 0;
-+ y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
- x = dc.x + (h / 2);
- /* shorten text if necessary */
- for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
-_AT_@ -575,7 +606,7 @@
- memcpy(buf, text, len);
- if(len < olen)
- for(i = len; i && i > len - 3; buf[--i] = '.');
-- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
-+ XSetForeground(dpy, dc.gc, col[ ColFG ]);
- if(dc.font.set)
- XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
- else
-_AT_@ -609,7 +640,7 @@
- for(c = stack; c && !ISVISIBLE(c); c = c->snext);
- if(sel && sel != c) {
- grabbuttons(sel, False);
-- XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
-+ XSetWindowBorder(dpy, sel->win, dc.colors[0][ColBorder]);
- }
- if(c) {
- if(c->isurgent)
-_AT_@ -617,7 +648,7 @@
- detachstack(c);
- attachstack(c);
- grabbuttons(c, True);
-- XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
-+ XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]);
- XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
- }
- else
-_AT_@ -878,7 +909,7 @@
-
- wc.border_width = c->bw;
- XConfigureWindow(dpy, w, CWBorderWidth, &wc);
-- XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
-+ XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);
- configure(c); /* propagates border_width, if size doesn't change */
- updatesizehints(c);
- XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
-_AT_@ -1329,12 +1360,11 @@
- cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
-
- /* init appearance */
-- dc.norm[ColBorder] = getcolor(normbordercolor);
-- dc.norm[ColBG] = getcolor(normbgcolor);
-- dc.norm[ColFG] = getcolor(normfgcolor);
-- dc.sel[ColBorder] = getcolor(selbordercolor);
-- dc.sel[ColBG] = getcolor(selbgcolor);
-- dc.sel[ColFG] = getcolor(selfgcolor);
-+ for(i=0; i<NUMCOLORS; i++) {
-+ dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
-+ dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
-+ dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
-+ }
- dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
- dc.gc = XCreateGC(dpy, root, 0, 0);
- XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.3.1-statuscolors.png
Binary file dwm.suckless.org/patches/dwm-5.3.1-statuscolors.png has changed
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.4-pertag.diff
--- a/dwm.suckless.org/patches/dwm-5.4-pertag.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,123 +0,0 @@
-diff -r add6eb26ebaa dwm.c
---- a/dwm.c Sat Dec 20 12:02:14 2008 +0000
-+++ b/dwm.c Sun Dec 21 18:39:14 2008 +0100
-_AT_@ -240,6 +240,11 @@ static Window root, barwin;
- static Window root, barwin;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-+
-+static int curtag = 1, prevtag = 1;
-+static Layout *lts[LENGTH(tags) + 1];
-+static double mfacts[LENGTH(tags) + 1];
-+static Bool showbars[LENGTH(tags) + 1];
-
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
-_AT_@ -1244,7 +1249,7 @@ setlayout(const Arg *arg) {
- if(!arg || !arg->v || arg->v != lt[sellt])
- sellt ^= 1;
- if(arg && arg->v)
-- lt[sellt] = (Layout *)arg->v;
-+ lt[sellt] = lts[curtag] = (Layout *)arg->v;
- if(sel)
- arrange();
- else
-_AT_@ -1261,7 +1266,7 @@ setmfact(const Arg *arg) {
- f = arg->f < 1.0 ? arg->f + mfact : arg->f - 1.0;
- if(f < 0.1 || f > 0.9)
- return;
-- mfact = f;
-+ mfact = mfacts[curtag] = f;
- arrange();
- }
-
-_AT_@ -1309,11 +1314,26 @@ setup(void) {
- if(!dc.font.set)
- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-
-+ /* init mfacts */
-+ for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+ mfacts[i] = mfact;
-+ }
-+
-+ /* init layouts */
-+ for(i=0; i < LENGTH(tags) + 1; i++) {
-+ lts[i] = &layouts[0];
-+ }
-+
-+
- /* init bar */
- for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
- w = TEXTW(layouts[i].symbol);
- blw = MAX(blw, w);
- }
-+
-+ for(i=0; i < LENGTH(tags) + 1; i++) {
-+ showbars[i] = showbar;
-+ }
-
- wa.override_redirect = 1;
- wa.background_pixmap = ParentRelative;
-_AT_@ -1434,7 +1454,7 @@ tile(void) {
-
- void
- togglebar(const Arg *arg) {
-- showbar = !showbar;
-+ showbar = showbars[curtag] = !showbar;
- updategeom();
- updatebar();
- arrange();
-_AT_@ -1467,9 +1487,23 @@ void
- void
- toggleview(const Arg *arg) {
- unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
-+ unsigned int i;
-
- if(mask) {
-+ if(mask == ~0) {
-+ prevtag = curtag;
-+ curtag = 0;
-+ }
-+ if(!(mask & 1 << (curtag - 1))) {
-+ prevtag = curtag;
-+ for (i=0; !(mask & 1 << i); i++);
-+ curtag = i + 1;
-+ }
- tagset[seltags] = mask;
-+ lt[sellt] = lts[curtag];
-+ mfact = mfacts[curtag];
-+ if (showbar != showbars[curtag])
-+ togglebar(NULL);
- arrange();
- }
- }
-_AT_@ -1644,11 +1678,28 @@ updatewmhints(Client *c) {
-
- void
- view(const Arg *arg) {
-+ unsigned int i;
- if((arg->ui & TAGMASK) == tagset[seltags])
- return;
- seltags ^= 1; /* toggle sel tagset */
-- if(arg->ui & TAGMASK)
-+ if(arg->ui & TAGMASK) {
- tagset[seltags] = arg->ui & TAGMASK;
-+ prevtag = curtag;
-+ if(arg->ui == ~0)
-+ curtag = 0;
-+ else {
-+ for (i=0; !(arg->ui & 1 << i); i++);
-+ curtag = i + 1;
-+ }
-+ } else {
-+ prevtag= curtag ^ prevtag;
-+ curtag^= prevtag;
-+ prevtag= curtag ^ prevtag;
-+ }
-+ lt[sellt]= lts[curtag];
-+ mfact = mfacts[curtag];
-+ if(showbar != showbars[curtag])
-+ togglebar(NULL);
- arrange();
- }
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-5.6.1-cpt.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/dwm-5.6.1-cpt.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,71 @@
+diff -ru dwm-5.6.1/dwm.c dwm-5.6.1-cpt/dwm.c
+--- dwm-5.6.1/dwm.c 2009-07-26 15:01:50.000000000 +0200
++++ dwm-5.6.1-cpt/dwm.c 2009-09-13 18:08:50.000000000 +0200
+_AT_@ -268,12 +268,23 @@
+ static Window root;
+
+ /* configuration, allows nested code to access above variables */
++static int cpt = -1;
++static void clientspertag(const Arg *arg) {
++ const char *cmd = (const char *)arg->v;
++ if (cmd[0]=='^') {
++ if (cpt==-1) cpt = atoi(cmd+1);
++ else if (cpt==atoi(cmd+1)) cpt = -1;
++ else cpt = atoi(cmd+1);
++ } else cpt = atoi(cmd);
++ arrange();
++}
+ #include "config.h"
+
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+
+ /* function implementations */
++
+ void
+ applyrules(Client *c) {
+ const char *class, *instance;
+_AT_@ -674,7 +685,7 @@
+ drawtext(m->lt[m->sellt]->symbol, dc.norm, False);
+ dc.x += dc.w;
+ }
+- snprintf(ntext, sizeof ntext, "%u", n);
++ snprintf(ntext, sizeof ntext, "%d/%u", cpt, n);
+ dc.w = TEXTW(ntext);
+ drawtext(ntext, dc.norm, False);
+ x = (dc.x += dc.w);
+_AT_@ -1435,6 +1446,7 @@
+ sw = DisplayWidth(dpy, screen);
+ sh = DisplayHeight(dpy, screen);
+ bh = dc.h = dc.font.height + 2;
++ cpt = -1;
+ updategeom();
+ /* init atoms */
+ wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
+_AT_@ -1549,6 +1561,7 @@
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ if(n == 0)
+ return;
++ if (cpt!=-1 && n>cpt) n = cpt;
+ /* master */
+ c = nexttiled(m->clients);
+ mw = m->mfact * m->ww;
+_AT_@ -1563,10 +1576,15 @@
+ if(h < bh)
+ h = m->wh;
+ for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
+- resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
+- ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
+- if(h != m->wh)
+- y = c->y + HEIGHT(c);
++ if (cpt!=-1 && i>=cpt) {
++ resize(c, x, m->wy, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
++ ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
++ } else {
++ resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
++ ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
++ if(h != m->wh)
++ y = c->y + HEIGHT(c);
++ }
+ }
+ }
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/dwm-r1437-gaplessgrid.diff
--- a/dwm.suckless.org/patches/dwm-r1437-gaplessgrid.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,59 +0,0 @@
-diff -up dwm-5.2-original/config.def.h dwm-5.2-modified/config.def.h
---- dwm-5.2-original/config.def.h 2008-09-09 21:46:17.000000000 +0200
-+++ dwm-5.2-modified/config.def.h 2008-10-20 20:07:42.000000000 +0200
-_AT_@ -28,11 +28,13 @@ static Rule rules[] = {
- static float mfact = 0.55; /* factor of master area size [0.05..0.95] */
- static Bool resizehints = True; /* False means respect size hints in tiled resizals */
-
-+#include "gaplessgrid.c"
- static Layout layouts[] = {
- /* symbol arrange function */
- { "[]=", tile }, /* first entry is default */
- { "><>", NULL }, /* no layout function means floating behavior */
- { "[M]", monocle },
-+ { "###", gaplessgrid },
- };
-
- /* key definitions */
-diff -up dwm-5.2-original/gaplessgrid.c dwm-5.2-modified/gaplessgrid.c
---- /dev/null 2008-10-20 20:09:51.000000000 +0200
-+++ dwm-5.2-modified/gaplessgrid.c 2008-10-20 20:06:59.000000000 +0200
-_AT_@ -0,0 +1,38 @@
-+void
-+gaplessgrid(Monitor *m) {
-+ unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
-+ Client *c;
-+
-+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next))
-+ n++;
-+ if(n == 0)
-+ return;
-+
-+ /* grid dimensions */
-+ for(cols = 0; cols <= n/2; cols++)
-+ if(cols*cols >= n)
-+ break;
-+ if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
-+ cols = 2;
-+ rows = n/cols;
-+
-+ /* window geometries (cell height/width/x/y) */
-+ cw = m->ww / (cols ? cols : 1);
-+ cn = 0; /* current column number */
-+ rn = 0; /* current row number */
-+ for(i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
-+ if(i/rows+1 > cols-n%cols)
-+ rows = n/cols+1;
-+ ch = m->wh / (rows ? rows : 1);
-+ cx = m->wx + cn*cw;
-+ cy = m->wy + rn*ch;
-+ resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw);
-+
-+ i++;
-+ rn++;
-+ if(rn >= rows) { /* jump to the next column */
-+ rn = 0;
-+ cn++;
-+ }
-+ }
-+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/email_notifier_script.md
--- a/dwm.suckless.org/patches/email_notifier_script.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,62 +0,0 @@
-EMAIL NOTIFIER SCRIPT
-=====================
-
-Description
------------
-
-This init script is based on some ideas taken from the dwm ML. It adds email
-notification using `fetchmail`. It also adds the functionality of showing the
-content of the file `$HOME/.message` when it exists. This can be used for
-displaying info by other programs writing to this file.
-
-When a new email arrives a flashing text message is shown on the dwm's
-status bar.
-
-Config .fetchmailrc
--------------------
-This config works with GMail over IMAP with the IDLE extension for low bandwidth usage:
-
- poll imap.gmail.com port 993 proto IMAP user "<your_user>_AT_gmail.com"
- there with password "<your_pass>" keep ssl idle
-
-Init script
------------
-
-The notification is flashing during 60 seconds, then it is removed. Lines
-written to `.message` are displayed during a second in the status bar. If
-`.message` is deleted, the normal status message (date and uptime) returns.
-
-A pipe must be used with `fetchmail` when using IDLE extension because this way
-it waits for updates from the inbox not doing polling.
-If the `.message` file exists with some content, it is preserved and no email
-notification is shown.
-
- fetchmail --check 2>/dev/null | while read line; do
- new=`echo $line | sed 's/(//' | awk '{print $1-$3}'`
- if [ $new != 0 ] && [ ! -e ~/.message ]; then
- echo "New mail($new)" > ~/.message
- echo "!!! !!! !!!" >> ~/.message
- sleep 60
- if grep '^New mail' ~/.message >/dev/null 2>/dev/null; then
- rm -f ~/.message
- fi
- fi
- done &
- while true; do
- if [ -r ~/.message ]; then
- while read line; do
- xsetroot -name "$line"
- sleep 1
- done < ~/.message
- else
- xsetroot -name "`date` `uptime | sed 's/.*,//'`"
- sleep 1
- fi
- done &
- exec dwm
- rm -f ~/.message
-
-Author
-------
-
-- Ricardo Catalinas Jiménez <[jimenezrick_AT_gmail.com](mailto:jimenezrick_AT_gmail.com)>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/fibonacci.md
--- a/dwm.suckless.org/patches/fibonacci.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/fibonacci.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -40,19 +40,17 @@
 
 ## Download
 
- * [dwm-5.2-fibonacci.diff][5] (1.9k) (20081003)
- * [dwm-5.1-fibonacci.diff][3] (1.9k) (20080731)
+ * [dwm-5.6.1-fibonacci.diff][4] (1.9k) (20090911)
 
-## Author
+## Maintainer
 
- * Jeroen Schot - <schot_AT_a-eskwadraat.nl>
+ * Niki Yoshiuchi - <aplusbi_AT_gmail.com>
 
-Joe Thornber's spiral tiling for [Xmonad][4] formed the inspiration for this
+Joe Thornber's spiral tiling for [Xmonad][3] formed the inspiration for this
 patch. Thanks to Jan Christoph Ebersbach for updating this patch for versions
 4.5 to 4.9.
 
 [1]: http://schot.a-eskwadraat.nl/images/dwm-spiral_small.png
 [2]: http://schot.a-eskwadraat.nl/images/dwm-spiral.png
-[3]: http://schot.a-eskwadraat.nl/files/dwm-5.1-fibonacci.diff
-[4]: http://www.xmonad.org
-[5]: http://www.aplusbi.com/dwm/dwm-5.2-fibonacci.diff
+[3]: http://www.xmonad.org
+[4]: http://www.aplusbi.com/projects/dwm/dwm-5.6.1-fibonacci.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/float_border_color.md
--- a/dwm.suckless.org/patches/float_border_color.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,19 +0,0 @@
-# FLOAT BORDER COLOR #
-
-## Description ##
-
-This patch allows you to specify a different border color for floating windows.
-
-## Download ##
- * [dwm-5.0-float-border-color2.diff][3]
- * [dwm-4.6-float-border-color2.diff][2]
- * [dwm-4.5-float-border-color2.diff][1]
-
-## Author ##
- * Message-ID: <20070626093131.GA5005_AT_shota.mine.nu>
- * Updated by Jan Christoph Ebersbach - <jceb_AT_tzi.de>
-
-[1]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-float-border-color2.diff
-[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-float-border-color2.diff
-[3]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-float-border-color2.diff
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/gapless_grid.md
--- a/dwm.suckless.org/patches/gapless_grid.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/gapless_grid.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,34 +1,30 @@
-# GAPLESS GRID LAYOUT #
+# GAPLESS GRID LAYOUT
 
-## Description ##
+## Description
 
-This patch is similar to [gridmode][1] (in fact it is an altered version) in that it provides a layout for dwm, which arranges the windows in a grid. Though instead of using a regular grid, which in case leaves empty cells (e. g. with 3 windows there are 4 cells, one cell is empty), it uses the same number of columns, but adjusts the number of rows (at first x rows and (x+1) rows, when needed) leaving no empty cells.
+This patch is an altered [gridmode](../historical/gridmode) layout for dwm,
+which arranges the windows in a grid.
+Instead of using a regular grid, which might leave empty cells when there are
+not enough windows to fill the grid, it adjusts the number of windows in the
+first few columns to avoid empty cells.
 
+## Usage
 
-## Usage ##
+Download `gaplessgrid.c` and add the gapless layout to your `config.h`:
 
-Download the patch and apply it according to the [general instructions](.). The patch will make the following changes:
+ #include "gaplessgrid.c"
+
+ static const Layout layouts[] = {
+ /* symbol arrange function */
+ { "###", gaplessgrid },
+ ...
+
+ static Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_g, setlayout, {.v = &layouts[0] } },
+ ...
 
- - gaplessgrid.c: adding the file
- - config.def.h: adding the include-line for 'gaplessgrid.c'
- - config.def.h: adding the layout '"###", gaplessgrid'
+## Download
 
-Comment: There may be problems applying the patch, if another layout has been added before.
-
-
-## Configuration ##
-
- * Transfer the changes made by the patch in 'config.def.h' to 'config.h', if needed.
- * Add a key definition like '{ MODKEY, XK_g, setlayout, {.v = &layouts[3]} },'.
-
-
-## Download ##
-
- * [dwm-5.2-gaplessgrid.diff][2] (1.9k) (20081020)
- * [dwm-r1437-gaplessgrid.diff][3] (1.9k) (20090704)
-
-
-[1]: /dwm/patches/gridmode.html
-[2]: http://dwm.suckless.org/patches/dwm-5.2-gaplessgrid.diff
-[3]: http://dwm.suckless.org/patches/dwm-r1437-gaplessgrid.diff
-
+* [gaplessgrid.c](gaplessgrid.c) (dwm 5.6.1) (20090908)
+* see [historical patches](historical) for older versoins
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/gaplessgrid.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/gaplessgrid.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,36 @@
+void
+gaplessgrid(Monitor *m) {
+ unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
+ Client *c;
+
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next))
+ n++;
+ if(n == 0)
+ return;
+
+ /* grid dimensions */
+ for(cols = 0; cols <= n/2; cols++)
+ if(cols*cols >= n)
+ break;
+ if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
+ cols = 2;
+ rows = n/cols;
+
+ /* window geometries */
+ cw = cols ? m->ww / cols : m->ww;
+ cn = 0; /* current column number */
+ rn = 0; /* current row number */
+ for(i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
+ if(i/rows + 1 > cols - n%cols)
+ rows = n/cols + 1;
+ ch = rows ? m->wh / rows : m->wh;
+ cx = m->wx + cn*cw;
+ cy = m->wy + rn*ch;
+ resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, False);
+ rn++;
+ if(rn >= rows) {
+ rn = 0;
+ cn++;
+ }
+ }
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/gridmode.md
--- a/dwm.suckless.org/patches/gridmode.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,48 +0,0 @@
-# GRIDMODE PATCH #
-
-## Description ##
-
-This patch adds an extra layout mode to dwm called `grid` in which the windows are arranged in a grid of windows of equal sizes. It comes very in handy especially with tools that operate on multiple windows at once such Cluster SSH.
-
-## Usage ##
-
-Add a grid-symbol to your `config.h` file.
-
-## Screenshots ##
-
-[Grid mode][5] (it also includes a minor patch to make dwm more colourful :D)
-
-## Download ##
- * [dwm-5.2-gridmode.diff][11]
- * [dwm-5.0-gridmode.diff][10]
- * [dwm-4.7-gridmode.diff][9]
- * [dwm-4.6-gridmode.diff][8]
- * [dwm-4.5-gridmode.diff][7]
- * [dwm-4.4.1-gridmode.diff][6]
- * [dwm-4.3-gridmode.diff][4]
- * [dwm-4.0-gridmode.diff][3]
- * [dwm-3.9-gridmode.diff][2]
- * [dwm-3.8-gridmode.diff][1]
-
-## Author ##
-
- * Alexandru E. Ungur <grid_AT_rb.no-ip.biz>
- * Updated by Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
- * Updated to 5.2 & small fix by V4hn - v4hn.de
-Feedback is more than welcome :-)
-
-## Acknowledgments ##
-
-The patch would look a lot uglier without Jukka Salmi's constant help. Thanks Jukka :-)
-
-[1]: http://dwm.slax.no-ip.biz/dwm-3.8-gridmode.diff
-[2]: http://dwm.slax.no-ip.biz/dwm-3.9-gridmode.diff
-[3]: http://dwm.slax.no-ip.biz/dwm-4.0-gridmode.diff
-[4]: http://dwm.slax.no-ip.biz/dwm-4.3-gridmode.diff
-[5]: http://dwm.slax.no-ip.biz/dwm4.3.png
-[6]: http://schot.a-eskwadraat.nl/files/dwm-4.4.1-gridmode.diff
-[7]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-gridmode.diff
-[8]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-gridmode.diff
-[9]: http://www.e-jc.de/dwm/4.7/current/dwm-4.7-gridmode.diff
-[10]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-gridmode.diff
-[11]: http://www.v4hn.de/patches/dwm-5.2-gridmode.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/altmovefocus.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/altmovefocus.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,10 @@
+ANOTHER FOCUS MOVING MODEL
+==========================
+
+Description
+-----------
+When a single tag is displayed, calling view() or tag() with it as an argument is useless. This patch enables moving focus forward with view() calls and backward with tag() instead of doing nothing. Of course, those who toggle several tags at time or just have more than 3-4 tags won't benefit much from such behaviour.
+
+Download
+--------
+* [dwm-5.2-altmovefocus.diff](http://mkmks.org/files/patches/dwm-5.2-altmovefocus.diff)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/boldfont.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/boldfont.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,27 @@
+BOLDFONT
+========
+
+Description
+-----------
+
+This patch makes dwm use a different font (specified as `boldfont` in
+`config.h`) for occupied tags, and titles of floating windows.
+
+It also removes the squares that now mark occupied tags and floating windows.
+
+Configuration
+-------------
+
+ static const char font[] = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*";
+ static const char boldfont[] = "-*-terminus-bold-r-normal-*-14-*-*-*-*-*-*-*";
+
+Download
+--------
+
+- [dwm-5.2-boldfont.diff](http://novsak.name/files/dwm/dwm-5.2-boldfont.diff)
+- [dwm-5.1-boldfont.diff](http://novsak.name/files/dwm/dwm-5.1-boldfont.diff)
+
+Author
+------
+
+- Luka Novsak <[lukanovsak_AT_gmail.com](mailto:lukanovsak_AT_gmail.com)>
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/bottom_stack.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/bottom_stack.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,24 @@
+BOTTOM STACK PATCH
+==================
+
+Description
+-----------
+This patch provides an additional bottom stack layout for the dwm window manager. (It no longer includes code for 'tileleft' or 'bstacklandscape'). Use 'patch -p0' when patching.
+
+Bottom Stack Tiling:
+--------------------
+
+ bstack (TTT)
+ +-----------------+
+ | |
+ | |
+ | |
+ +-----+-----+-----+
+ | | | |
+ | | | |
+ +-----+-----+-----+
+
+Download
+--------
+* [dwm-5.6.1-bstack.diff](http://bsdgroup.org/files/dwm-5.6.1-bstack.diff) (2k) (20090726)
+* [dwm-5.5-bstack.diff](http://bsdgroup.org/files/dwm-5.5-bstack.diff) (2k) (20090307)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/color_status_bar.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/color_status_bar.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,35 @@
+# COLOR STATUS BAR #
+
+## Description ##
+
+This patch adds some color to the status bar. It allows you to change the colorset of text portions from "norm" to "sel" (and back) and to invert the colorset (the foreground becomes the background color and vice versa).
+
+
+## Usage ##
+
+Download the patch and apply it according to the [general instructions](.). The patch will make the following changes:
+
+ * colorstatus.c: adding the file
+ * dwm.c: adding the include-line for 'colorstatus.c'
+ * dwm.c ('drawbar' function): adding the int-variable 'stextw'
+ * dwm.c ('drawbar' function): changing the 'drawtext' section for stext
+
+
+## Configuration ##
+
+The configuration is done in the file '.xinitrc', where you define the status bar text. You can add the following tags:
+
+ * '[c]' (without quotes): toggles the colorset (norm -> sel or sel -> norm depending on the currently selected colorset)
+ * '[i]' (without quotes): inverts the current colorset (fgcolor -> bgcolor and bgcolor -> fgcolor)
+
+The change is applied from the position of the tag onwards. To revert the change you have to set the same tag again.
+
+### Example ###
+echo -e NEW mail: $mailnew \| VOL front: $audiofront \| BAT:[i]$batpercent[i]\| CPU: $cpuavgload \| $datestr[c]$timestr
+
+
+## Download ##
+
+ * [dwm-5.2-colorstatus.diff](dwm-5.2-colorstatus.diff) (4.1k, 131 additional lines) (20081117)
+ * [.xinitrc example](dwm-5.2-colorstatus.xinitrc) (0.8k) (20081117)
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/colored_status_text.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/colored_status_text.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,60 @@
+# COLORED STATUS TEXT #
+
+## Description ##
+
+This patch enables colored text in the status bar. It changes the way colors are defined in config.h, allowing the user to define multiple color combinations for use in their status script.
+
+## Configuration ##
+
+Download the patch and apply it according to the [general instructions](.).
+
+Modify the colors definition in 'config.h' to suit your needs. Make sure to define at least 3 colors as they will be used for 'normal', 'selected', and 'urgent' windows, respectively.
+
+## Usage ##
+
+Add code to your status script to output the raw characters '\x03' to switch to the 'urgent' color, or '\x04' to switch to the 4th defined color, etc. Note that the color indices in the status text are +1 from the definition in 'config.h' (because '\0' is the string terminator). To switch back to the normal text color use '\x01'.
+
+### Example ###
+
+The following definition in 'config.h':
+
+ #define NUMCOLORS 4
+ static const char colors[NUMCOLORS][ColLast][8] = {
+ // border foreground background
+ { "#000033", "#dddddd", "#000033" }, // normal
+ { "#000088", "#ffffff", "#000088" }, // selected
+ { "#ff0000", "#000000", "#ffff00" }, // urgent/warning (black on yellow)
+ { "#ff0000", "#ffffff", "#ff0000" }, // error (white on red)
+ // add more here
+ };
+
+Coupled with a matching status script produces the following:
+ ![Example Colored Status Text](dwm-5.3.1-statuscolors.png)
+
+A really silly example:
+
+ echo -e "normal \x01 selected \x03 warning/urgent \x04 error \x01 back to normal text" | dwm
+
+An example status script snippet to take advantage of the colors:
+
+ status=""
+ if [$batperc -le 10]; then
+ # use "warning" color
+ status+="\x03 BAT: $batperc"
+ elif [$batperc -le 5]; then
+ # use "error" color
+ status+="\x04 BAT: $batperc"
+ else
+ # default is normal color
+ status+="BAT: $batperc"
+ fi
+
+ # switch back to normal color for date
+ status+="\x01| "+$(date)
+
+ echo -e $status
+
+## Download ##
+
+ * [dwm-5.3.1-statuscolors.diff](dwm-5.3.1-statuscolors.diff)
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.2-colorstatus.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.2-colorstatus.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,183 @@
+diff -up dwm-5.2-original/colorstatus.c dwm-5.2-modified/colorstatus.c
+--- /dev/null 2008-11-17 18:12:14.000000000 +0100
++++ dwm-5.2-modified/colorstatus.c 2008-11-17 18:09:29.000000000 +0100
+_AT_@ -0,0 +1,144 @@
++int
++drawstatustext(int x) {
++ char cd[] = "[c]", id[] = "[i]";
++ char buf1[256] = {0};
++ Bool parse = True;
++ Bool cs = False, is = False;
++ int stextw = 0;
++
++ strcpy(buf1, stext);
++ while(parse) {
++ char *cp = 0, *ip = 0;
++
++ cp = strstr(buf1, cd);
++ ip = strstr(buf1, id);
++ if(cp != NULL || ip != NULL) {
++ char buf2[256] = {0}, buf3[256] = {0};
++ size_t clen2 = -1, ilen2 = -1, len2 = 0, dlen = 0, offset3 = 0, len3 = 0;
++
++ if(cp != NULL)
++ clen2 = cp - buf1;
++ if(ip != NULL)
++ ilen2 = ip - buf1;
++ if(clen2 < 0) {
++ len2 = ilen2;
++ dlen = strlen(id);
++ }
++ else if(ilen2 < 0) {
++ len2 = clen2;
++ dlen = strlen(cd);
++ }
++ else if(clen2 < ilen2) {
++ len2 = clen2;
++ dlen = strlen(cd);
++ }
++ else {
++ len2 = ilen2;
++ dlen = strlen(id);
++ }
++ strncpy(buf2, buf1, len2);
++ offset3 = len2 + dlen;
++ len3 = strlen(buf1) - offset3;
++ strncpy(buf3, buf1 + offset3, len3);
++ if(buf2 != NULL && strlen(buf2) > 0)
++ stextw = stextw + TEXTW(buf2);
++
++ memset(buf1, '\0', sizeof(buf1));
++ strcpy(buf1, buf3);
++ }
++ else {
++ stextw = stextw + TEXTW(buf1);
++ parse = False;
++ }
++ }
++ dc.x = ww - stextw;
++
++ memset(buf1, '\0', sizeof(buf1));
++ strcpy(buf1, stext);
++ parse = True;
++ while(parse) {
++ char *cp = 0, *ip = 0;
++
++ cp = strstr(buf1, cd);
++ ip = strstr(buf1, id);
++ if(cp != NULL || ip != NULL) {
++ char buf2[256] = {0}, buf3[256] = {0};
++ size_t clen2 = -1, ilen2 = -1, len2 = 0, dlen = 0, offset3 = 0, len3 = 0;
++ Bool cs3 = cs, is3 = is;
++
++ if(cp != NULL)
++ clen2 = cp - buf1;
++ if(ip != NULL)
++ ilen2 = ip - buf1;
++ if(clen2 < 0) {
++ len2 = ilen2;
++ dlen = strlen(id);
++ is3 = !is;
++ }
++ else if(ilen2 < 0) {
++ len2 = clen2;
++ dlen = strlen(cd);
++ cs3 = !cs;
++ }
++ else if(clen2 < ilen2) {
++ len2 = clen2;
++ dlen = strlen(cd);
++ cs3 = !cs;
++ }
++ else {
++ len2 = ilen2;
++ dlen = strlen(id);
++ is3 = !is;
++ }
++
++ strncpy(buf2, buf1, len2);
++ offset3 = len2 + dlen;
++ len3 = strlen(buf1) - offset3;
++ strncpy(buf3, buf1 + offset3, len3);
++ if(buf2 != NULL && strlen(buf2) > 0) {
++ dc.w = TEXTW(buf2);
++ if(cs) {
++ if(is)
++ drawtext(buf2, dc.sel, True);
++ else
++ drawtext(buf2, dc.sel, False);
++ }
++ else {
++ if(is)
++ drawtext(buf2, dc.norm, True);
++ else
++ drawtext(buf2, dc.norm, False);
++ }
++ dc.x = dc.x + dc.w;
++ }
++
++ cs = cs3;
++ is = is3;
++ memset(buf1, '\0', sizeof(buf1));
++ strcpy(buf1, buf3);
++ }
++ else {
++ dc.w = TEXTW(buf1);
++ dc.x = ww - dc.w;
++ if(dc.x < x) {
++ dc.x = x;
++ dc.w = ww - x;
++ }
++ if(cs) {
++ if(is)
++ drawtext(buf1, dc.sel, True);
++ else
++ drawtext(buf1, dc.sel, False);
++ }
++ else {
++ if(is)
++ drawtext(buf1, dc.norm, True);
++ else
++ drawtext(buf1, dc.norm, False);
++ }
++ parse = False;
++ }
++ }
++
++ return(stextw);
++}
+diff -up dwm-5.2-original/dwm.c dwm-5.2-modified/dwm.c
+--- dwm-5.2-original/dwm.c 2008-09-09 21:46:17.000000000 +0200
++++ dwm-5.2-modified/dwm.c 2008-11-17 18:09:29.000000000 +0100
+_AT_@ -239,6 +239,7 @@ static Layout *lt[] = { NULL, NULL };
+ static Window root, barwin;
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
++#include "colorstatus.c"
+
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
+_AT_@ -495,6 +496,7 @@ drawbar(void) {
+ unsigned int i, occ = 0, urg = 0;
+ unsigned long *col;
+ Client *c;
++ int stextw = 0;
+
+ for(c = clients; c; c = c->next) {
+ occ |= c->tags;
+_AT_@ -517,13 +519,8 @@ drawbar(void) {
+ }
+ else
+ x = dc.x;
+- dc.w = TEXTW(stext);
+- dc.x = ww - dc.w;
+- if(dc.x < x) {
+- dc.x = x;
+- dc.w = ww - x;
+- }
+- drawtext(stext, dc.norm, False);
++ stextw = drawstatustext(x);
++ dc.x = ww - stextw;
+ if((dc.w = dc.x - x) > bh) {
+ dc.x = x;
+ if(sel) {
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.2-colorstatus.xinitrc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.2-colorstatus.xinitrc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,24 @@
+while true
+do
+ datestr=`date '+%a, %x'`
+ timestr=`date '+%H:%M'`
+
+ cpuavgload=`uptime | sed -n 's/.*: //; s/, .*// p'`
+
+ batcurrent=`sed -n 's/ mAh//; s/remaining[ a-z:]*// p' /proc/acpi/battery/BAT1/state`
+ batfull=`sed -n 's/ mAh//; s/last full[ a-z:]*// p' /proc/acpi/battery/BAT1/info`
+ batpercent=`echo "($batcurrent*100)/$batfull" | bc`
+ if [ $batpercent -lt 10 ]
+ then batpercent=`echo [c]$batpercent%[c]`
+ else batpercent=`echo $batpercent%`
+ fi
+
+ audiofront=`amixer sget Front | sed -n 's/\] \[[^%]*\]//; s/[ ]*Front Left: Playback [0-9]* \[// p'`
+
+ mailnew=`claws-mail --status inbox | sed -n 's/ [ 0-9ClawsMinotrug\.]*// p'`
+
+ echo -e NEW mail: $mailnew \| VOL front: $audiofront \| BAT:[i]$batpercent[i]\| CPU: $cpuavgload \| $datestr[c]$timestr
+
+ sleep 2
+done | dwm
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.2-gaplessgrid.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.2-gaplessgrid.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,59 @@
+diff -up dwm-5.2-original/config.def.h dwm-5.2-modified/config.def.h
+--- dwm-5.2-original/config.def.h 2008-09-09 21:46:17.000000000 +0200
++++ dwm-5.2-modified/config.def.h 2008-10-20 20:07:42.000000000 +0200
+_AT_@ -28,11 +28,13 @@ static Rule rules[] = {
+ static float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+ static Bool resizehints = True; /* False means respect size hints in tiled resizals */
+
++#include "gaplessgrid.c"
+ static Layout layouts[] = {
+ /* symbol arrange function */
+ { "[]=", tile }, /* first entry is default */
+ { "><>", NULL }, /* no layout function means floating behavior */
+ { "[M]", monocle },
++ { "###", gaplessgrid },
+ };
+
+ /* key definitions */
+diff -up dwm-5.2-original/gaplessgrid.c dwm-5.2-modified/gaplessgrid.c
+--- /dev/null 2008-10-20 20:09:51.000000000 +0200
++++ dwm-5.2-modified/gaplessgrid.c 2008-10-20 20:06:59.000000000 +0200
+_AT_@ -0,0 +1,38 @@
++void
++gaplessgrid() {
++ unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
++ Client *c;
++
++ for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
++ n++;
++ if(n == 0)
++ return;
++
++ /* grid dimensions */
++ for(cols = 0; cols <= n/2; cols++)
++ if(cols*cols >= n)
++ break;
++ if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
++ cols = 2;
++ rows = n/cols;
++
++ /* window geometries (cell height/width/x/y) */
++ cw = ww / (cols ? cols : 1);
++ cn = 0; /* current column number */
++ rn = 0; /* current row number */
++ for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) {
++ if(i/rows+1 > cols-n%cols)
++ rows = n/cols+1;
++ ch = wh / (rows ? rows : 1);
++ cx = wx + cn*cw;
++ cy = wy + rn*ch;
++ resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, False);
++
++ i++;
++ rn++;
++ if(rn >= rows) { /* jump to the next column */
++ rn = 0;
++ cn++;
++ }
++ }
++}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.2-pertag.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.2-pertag.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,123 @@
+--- dwm-5.2/dwm.c 2008-09-09 21:46:17.000000000 +0200
++++ dwm-5.2-pertag/dwm.c 2008-10-12 23:53:30.000000000 +0200
+_AT_@ -240,6 +240,11 @@
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+
++static int curtag = 1, prevtag = 1;
++static Layout *lts[LENGTH(tags) + 1];
++static double mfacts[LENGTH(tags) + 1];
++static Bool showbars[LENGTH(tags) + 1];
++
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
+
+_AT_@ -1272,7 +1277,7 @@
+ if(!arg || !arg->v || arg->v != lt[sellt])
+ sellt ^= 1;
+ if(arg && arg->v)
+- lt[sellt] = (Layout *)arg->v;
++ lt[sellt] = lts[curtag] = (Layout *)arg->v;
+ if(sel)
+ arrange();
+ else
+_AT_@ -1289,7 +1294,7 @@
+ f = arg->f < 1.0 ? arg->f + mfact : arg->f - 1.0;
+ if(f < 0.1 || f > 0.9)
+ return;
+- mfact = f;
++ mfact = mfacts[curtag] = f;
+ arrange();
+ }
+
+_AT_@ -1337,12 +1342,27 @@
+ if(!dc.font.set)
+ XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+
++ /* init mfacts */
++ for(i=0; i < LENGTH(tags) + 1 ; i++) {
++ mfacts[i] = mfact;
++ }
++
++ /* init layouts */
++ for(i=0; i < LENGTH(tags) + 1; i++) {
++ lts[i] = &layouts[0];
++ }
++
++
+ /* init bar */
+ for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
+ w = TEXTW(layouts[i].symbol);
+ blw = MAX(blw, w);
+ }
+
++ for(i=0; i < LENGTH(tags) + 1; i++) {
++ showbars[i] = showbar;
++ }
++
+ wa.override_redirect = 1;
+ wa.background_pixmap = ParentRelative;
+ wa.event_mask = ButtonPressMask|ExposureMask;
+_AT_@ -1457,7 +1477,7 @@
+
+ void
+ togglebar(const Arg *arg) {
+- showbar = !showbar;
++ showbar = showbars[curtag] = !showbar;
+ updategeom();
+ updatebar();
+ arrange();
+_AT_@ -1490,9 +1510,23 @@
+ void
+ toggleview(const Arg *arg) {
+ unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
++ unsigned int i;
+
+ if(mask) {
++ if(mask == ~0) {
++ prevtag = curtag;
++ curtag = 0;
++ }
++ if(!(mask & 1 << (curtag - 1))) {
++ prevtag = curtag;
++ for (i=0; !(mask & 1 << i); i++);
++ curtag = i + 1;
++ }
+ tagset[seltags] = mask;
++ lt[sellt] = lts[curtag];
++ mfact = mfacts[curtag];
++ if (showbar != showbars[curtag])
++ togglebar(NULL);
+ clearurgent();
+ arrange();
+ }
+_AT_@ -1661,11 +1695,28 @@
+
+ void
+ view(const Arg *arg) {
++ unsigned int i;
+ if((arg->ui & TAGMASK) == tagset[seltags])
+ return;
+ seltags ^= 1; /* toggle sel tagset */
+- if(arg->ui & TAGMASK)
++ if(arg->ui & TAGMASK) {
+ tagset[seltags] = arg->ui & TAGMASK;
++ prevtag = curtag;
++ if(arg->ui == ~0)
++ curtag = 0;
++ else {
++ for (i=0; !(arg->ui & 1 << i); i++);
++ curtag = i + 1;
++ }
++ } else {
++ prevtag= curtag ^ prevtag;
++ curtag^= prevtag;
++ prevtag= curtag ^ prevtag;
++ }
++ lt[sellt]= lts[curtag];
++ mfact = mfacts[curtag];
++ if(showbar != showbars[curtag])
++ togglebar(NULL);
+ clearurgent();
+ arrange();
+ }
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.3.1-statuscolors.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.3.1-statuscolors.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,228 @@
+diff -r 94032e7d3943 config.def.h
+--- a/config.def.h Sat Dec 06 11:22:30 2008 +0000
++++ b/config.def.h Sat Dec 06 11:24:26 2008 -0500
+_AT_@ -1,13 +1,16 @@
+ /* See LICENSE file for copyright and license details. */
+
+ /* appearance */
++#define NUMCOLORS 4 // need at least 3
++static const char colors[NUMCOLORS][ColLast][8] = {
++ // border foreground background
++ { "#cccccc", "#000000", "#cccccc" }, // 0 = normal
++ { "#0066ff", "#ffffff", "#0066ff" }, // 1 = selected
++ { "#0066ff", "#0066ff", "#ffffff" }, // 2 = urgent/warning
++ { "#ff0000", "#ffffff", "#ff0000" }, // 3 = error
++ // add more here
++};
+ static const char font[] = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*";
+-static const char normbordercolor[] = "#cccccc";
+-static const char normbgcolor[] = "#cccccc";
+-static const char normfgcolor[] = "#000000";
+-static const char selbordercolor[] = "#0066ff";
+-static const char selbgcolor[] = "#0066ff";
+-static const char selfgcolor[] = "#ffffff";
+ static unsigned int borderpx = 1; /* border pixel of windows */
+ static unsigned int snap = 32; /* snap pixel */
+ static Bool showbar = True; /* False means no bar */
+_AT_@ -49,7 +52,7 @@
+ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+
+ /* commands */
+-static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
++static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", colors[0][ColBG], "-nf", colors[0][ColFG], "-sb", colors[1][ColBG], "-sf", colors[1][ColFG], NULL };
+ static const char *termcmd[] = { "uxterm", NULL };
+
+ static Key keys[] = {
+diff -r 94032e7d3943 dwm.c
+--- a/dwm.c Sat Dec 06 11:22:30 2008 +0000
++++ b/dwm.c Sat Dec 06 11:24:26 2008 -0500
+_AT_@ -52,6 +52,7 @@
+ #define MAX(a, b) ((a) > (b) ? (a) : (b))
+ #define MIN(a, b) ((a) < (b) ? (a) : (b))
+ #define MAXTAGLEN 16
++#define MAXCOLORS 8
+ #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
+ #define WIDTH(x) ((x)->w + 2 * (x)->bw)
+ #define HEIGHT(x) ((x)->h + 2 * (x)->bw)
+_AT_@ -97,8 +98,7 @@
+
+ typedef struct {
+ int x, y, w, h;
+- unsigned long norm[ColLast];
+- unsigned long sel[ColLast];
++ unsigned long colors[MAXCOLORS][ColLast];
+ Drawable drawable;
+ GC gc;
+ struct {
+_AT_@ -147,8 +147,9 @@
+ static void detachstack(Client *c);
+ static void die(const char *errstr, ...);
+ static void drawbar(void);
+-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+-static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
++static void drawcoloredtext(char *text);
++static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
++static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);
+ static void enternotify(XEvent *e);
+ static void expose(XEvent *e);
+ static void focus(Client *c);
+_AT_@ -501,14 +502,14 @@
+ dc.x = 0;
+ for(i = 0; i < LENGTH(tags); i++) {
+ dc.w = TEXTW(tags[i]);
+- col = tagset[seltags] & 1 << i ? dc.sel : dc.norm;
+- drawtext(tags[i], col, urg & 1 << i);
+- drawsquare(sel && sel->tags & 1 << i, occ & 1 << i, urg & 1 << i, col);
++ col = dc.colors[ (tagset[seltags] & 1 << i ? 1 : (urg & 1 << i ? 2:0)) ];
++ drawtext(tags[i], col, True);
++ drawsquare(sel && sel->tags & 1 << i, occ & 1 << i, col);
+ dc.x += dc.w;
+ }
+ if(blw > 0) {
+ dc.w = blw;
+- drawtext(lt[sellt]->symbol, dc.norm, False);
++ drawtext(lt[sellt]->symbol, dc.colors[0], True);
+ x = dc.x + dc.w;
+ }
+ else
+_AT_@ -519,27 +520,57 @@
+ dc.x = x;
+ dc.w = ww - x;
+ }
+- drawtext(stext, dc.norm, False);
++ drawcoloredtext(stext);
+ if((dc.w = dc.x - x) > bh) {
+ dc.x = x;
+ if(sel) {
+- drawtext(sel->name, dc.sel, False);
+- drawsquare(sel->isfixed, sel->isfloating, False, dc.sel);
++ drawtext(sel->name, dc.colors[1], True);
++ drawsquare(sel->isfixed, sel->isfloating, dc.colors[1]);
+ }
+ else
+- drawtext(NULL, dc.norm, False);
++ drawtext(NULL, dc.colors[0], True);
+ }
+ XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, ww, bh, 0, 0);
+ XSync(dpy, False);
+ }
+
+ void
+-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
++drawcoloredtext(char *text) {
++ Bool first=True;
++ char *buf = text, *ptr = buf, c = 1;
++ unsigned long *col = dc.colors[0];
++ int i, ox = dc.x;
++
++ while( *ptr ) {
++ for( i = 0; *ptr < 0 || *ptr > NUMCOLORS; i++, ptr++);
++ if( !*ptr ) break;
++ c=*ptr;
++ *ptr=0;
++ if( i ) {
++ dc.w = ww - dc.x;
++ drawtext(buf, col, first);
++ dc.x += textnw(buf, i) + textnw(&c,1);
++ if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;
++ first = False;
++ } else if( first ) {
++ ox = dc.x += textnw(&c,1);
++ }
++ *ptr = c;
++ col = dc.colors[ c-1 ];
++ buf = ++ptr;
++ }
++ if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;
++ drawtext(buf, col, True);
++ dc.x = ox;
++}
++
++void
++drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
+ int x;
+ XGCValues gcv;
+ XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+
+- gcv.foreground = col[invert ? ColBG : ColFG];
++ gcv.foreground = col[ ColFG ];
+ XChangeGC(dpy, dc.gc, GCForeground, &gcv);
+ x = (dc.font.ascent + dc.font.descent + 2) / 4;
+ r.x = dc.x + 1;
+_AT_@ -555,18 +586,18 @@
+ }
+
+ void
+-drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
++drawtext(const char *text, unsigned long col[ColLast], Bool pad) {
+ char buf[256];
+ int i, x, y, h, len, olen;
+ XRectangle r = { dc.x, dc.y, dc.w, dc.h };
+
+- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
++ XSetForeground(dpy, dc.gc, col[ ColBG ]);
+ XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
+ if(!text)
+ return;
+ olen = strlen(text);
+- h = dc.font.ascent + dc.font.descent;
+- y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
++ h = pad ? (dc.font.ascent + dc.font.descent) : 0;
++ y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);
+ x = dc.x + (h / 2);
+ /* shorten text if necessary */
+ for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
+_AT_@ -575,7 +606,7 @@
+ memcpy(buf, text, len);
+ if(len < olen)
+ for(i = len; i && i > len - 3; buf[--i] = '.');
+- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
++ XSetForeground(dpy, dc.gc, col[ ColFG ]);
+ if(dc.font.set)
+ XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
+ else
+_AT_@ -609,7 +640,7 @@
+ for(c = stack; c && !ISVISIBLE(c); c = c->snext);
+ if(sel && sel != c) {
+ grabbuttons(sel, False);
+- XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
++ XSetWindowBorder(dpy, sel->win, dc.colors[0][ColBorder]);
+ }
+ if(c) {
+ if(c->isurgent)
+_AT_@ -617,7 +648,7 @@
+ detachstack(c);
+ attachstack(c);
+ grabbuttons(c, True);
+- XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
++ XSetWindowBorder(dpy, c->win, dc.colors[1][ColBorder]);
+ XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+ }
+ else
+_AT_@ -878,7 +909,7 @@
+
+ wc.border_width = c->bw;
+ XConfigureWindow(dpy, w, CWBorderWidth, &wc);
+- XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
++ XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);
+ configure(c); /* propagates border_width, if size doesn't change */
+ updatesizehints(c);
+ XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
+_AT_@ -1329,12 +1360,11 @@
+ cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
+
+ /* init appearance */
+- dc.norm[ColBorder] = getcolor(normbordercolor);
+- dc.norm[ColBG] = getcolor(normbgcolor);
+- dc.norm[ColFG] = getcolor(normfgcolor);
+- dc.sel[ColBorder] = getcolor(selbordercolor);
+- dc.sel[ColBG] = getcolor(selbgcolor);
+- dc.sel[ColFG] = getcolor(selfgcolor);
++ for(i=0; i<NUMCOLORS; i++) {
++ dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );
++ dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );
++ dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );
++ }
+ dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
+ dc.gc = XCreateGC(dpy, root, 0, 0);
+ XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.3.1-statuscolors.png
Binary file dwm.suckless.org/patches/historical/dwm-5.3.1-statuscolors.png has changed
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-5.4-pertag.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-5.4-pertag.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,123 @@
+diff -r add6eb26ebaa dwm.c
+--- a/dwm.c Sat Dec 20 12:02:14 2008 +0000
++++ b/dwm.c Sun Dec 21 18:39:14 2008 +0100
+_AT_@ -240,6 +240,11 @@ static Window root, barwin;
+ static Window root, barwin;
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
++
++static int curtag = 1, prevtag = 1;
++static Layout *lts[LENGTH(tags) + 1];
++static double mfacts[LENGTH(tags) + 1];
++static Bool showbars[LENGTH(tags) + 1];
+
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
+_AT_@ -1244,7 +1249,7 @@ setlayout(const Arg *arg) {
+ if(!arg || !arg->v || arg->v != lt[sellt])
+ sellt ^= 1;
+ if(arg && arg->v)
+- lt[sellt] = (Layout *)arg->v;
++ lt[sellt] = lts[curtag] = (Layout *)arg->v;
+ if(sel)
+ arrange();
+ else
+_AT_@ -1261,7 +1266,7 @@ setmfact(const Arg *arg) {
+ f = arg->f < 1.0 ? arg->f + mfact : arg->f - 1.0;
+ if(f < 0.1 || f > 0.9)
+ return;
+- mfact = f;
++ mfact = mfacts[curtag] = f;
+ arrange();
+ }
+
+_AT_@ -1309,11 +1314,26 @@ setup(void) {
+ if(!dc.font.set)
+ XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+
++ /* init mfacts */
++ for(i=0; i < LENGTH(tags) + 1 ; i++) {
++ mfacts[i] = mfact;
++ }
++
++ /* init layouts */
++ for(i=0; i < LENGTH(tags) + 1; i++) {
++ lts[i] = &layouts[0];
++ }
++
++
+ /* init bar */
+ for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
+ w = TEXTW(layouts[i].symbol);
+ blw = MAX(blw, w);
+ }
++
++ for(i=0; i < LENGTH(tags) + 1; i++) {
++ showbars[i] = showbar;
++ }
+
+ wa.override_redirect = 1;
+ wa.background_pixmap = ParentRelative;
+_AT_@ -1434,7 +1454,7 @@ tile(void) {
+
+ void
+ togglebar(const Arg *arg) {
+- showbar = !showbar;
++ showbar = showbars[curtag] = !showbar;
+ updategeom();
+ updatebar();
+ arrange();
+_AT_@ -1467,9 +1487,23 @@ void
+ void
+ toggleview(const Arg *arg) {
+ unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
++ unsigned int i;
+
+ if(mask) {
++ if(mask == ~0) {
++ prevtag = curtag;
++ curtag = 0;
++ }
++ if(!(mask & 1 << (curtag - 1))) {
++ prevtag = curtag;
++ for (i=0; !(mask & 1 << i); i++);
++ curtag = i + 1;
++ }
+ tagset[seltags] = mask;
++ lt[sellt] = lts[curtag];
++ mfact = mfacts[curtag];
++ if (showbar != showbars[curtag])
++ togglebar(NULL);
+ arrange();
+ }
+ }
+_AT_@ -1644,11 +1678,28 @@ updatewmhints(Client *c) {
+
+ void
+ view(const Arg *arg) {
++ unsigned int i;
+ if((arg->ui & TAGMASK) == tagset[seltags])
+ return;
+ seltags ^= 1; /* toggle sel tagset */
+- if(arg->ui & TAGMASK)
++ if(arg->ui & TAGMASK) {
+ tagset[seltags] = arg->ui & TAGMASK;
++ prevtag = curtag;
++ if(arg->ui == ~0)
++ curtag = 0;
++ else {
++ for (i=0; !(arg->ui & 1 << i); i++);
++ curtag = i + 1;
++ }
++ } else {
++ prevtag= curtag ^ prevtag;
++ curtag^= prevtag;
++ prevtag= curtag ^ prevtag;
++ }
++ lt[sellt]= lts[curtag];
++ mfact = mfacts[curtag];
++ if(showbar != showbars[curtag])
++ togglebar(NULL);
+ arrange();
+ }
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/dwm-r1437-gaplessgrid.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/dwm-r1437-gaplessgrid.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,59 @@
+diff -up dwm-5.2-original/config.def.h dwm-5.2-modified/config.def.h
+--- dwm-5.2-original/config.def.h 2008-09-09 21:46:17.000000000 +0200
++++ dwm-5.2-modified/config.def.h 2008-10-20 20:07:42.000000000 +0200
+_AT_@ -28,11 +28,13 @@ static Rule rules[] = {
+ static float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+ static Bool resizehints = True; /* False means respect size hints in tiled resizals */
+
++#include "gaplessgrid.c"
+ static Layout layouts[] = {
+ /* symbol arrange function */
+ { "[]=", tile }, /* first entry is default */
+ { "><>", NULL }, /* no layout function means floating behavior */
+ { "[M]", monocle },
++ { "###", gaplessgrid },
+ };
+
+ /* key definitions */
+diff -up dwm-5.2-original/gaplessgrid.c dwm-5.2-modified/gaplessgrid.c
+--- /dev/null 2008-10-20 20:09:51.000000000 +0200
++++ dwm-5.2-modified/gaplessgrid.c 2008-10-20 20:06:59.000000000 +0200
+_AT_@ -0,0 +1,38 @@
++void
++gaplessgrid(Monitor *m) {
++ unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
++ Client *c;
++
++ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next))
++ n++;
++ if(n == 0)
++ return;
++
++ /* grid dimensions */
++ for(cols = 0; cols <= n/2; cols++)
++ if(cols*cols >= n)
++ break;
++ if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
++ cols = 2;
++ rows = n/cols;
++
++ /* window geometries (cell height/width/x/y) */
++ cw = m->ww / (cols ? cols : 1);
++ cn = 0; /* current column number */
++ rn = 0; /* current row number */
++ for(i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
++ if(i/rows+1 > cols-n%cols)
++ rows = n/cols+1;
++ ch = m->wh / (rows ? rows : 1);
++ cx = m->wx + cn*cw;
++ cy = m->wy + rn*ch;
++ resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw);
++
++ i++;
++ rn++;
++ if(rn >= rows) { /* jump to the next column */
++ rn = 0;
++ cn++;
++ }
++ }
++}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/fibonacci.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/fibonacci.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,58 @@
+# FIBONACCI LAYOUTS
+
+## Description
+
+This patch adds two new layouts (`spiral` and `dwindle`) that arranges all
+windows in Fibonacci tiles: The first window uses half the screen, the second
+the half of the remainder, etc. ASCII art and a real screenshot of the spiral
+arrangement can be seen below.
+
+ +-----------+-----------+ +-----------+-----------+
+ | | | | | |
+ | | 2 | | | 2 |
+ | | | | | |
+ | 1 +--+--+-----+ | 1 +-----+-----+
+ | | 5|-.| | | | | 4 |
+ | +--+--+ 3 | | | 3 +--+--+
+ | | 4 | | | | | 5|-.|
+ +-----------+-----+-----+ +-----------+-----+-----+
+ spiral dwindle
+
+[![dwm in spiral layout.][1]][2]
+
+*Links2, sic, xterm & xclock in spiral layout.*
+
+## Usage
+
+ 1. Download the patch and apply according to the [general instructions](.).
+ 2. Include the `fibonacci.c` source file and add `spiral` and/or `dwindle` to
+ the `Layout` section of your `config.h` file.
+ Example from `config.default.h`:
+
+ #include "fibonacci.c"
+ static Layout layout[] = { \
+ /* symbol function */ \
+ { "[]=", tile }, /* first entry is default */ \
+ { "><>", floating }, \
+ { "(_AT_)", spiral }, \
+ { "[\\]", dwindle }, \
+ };
+
+## Download
+
+ * [dwm-5.2-fibonacci.diff][5] (1.9k) (20081003)
+ * [dwm-5.1-fibonacci.diff][3] (1.9k) (20080731)
+
+## Author
+
+ * Jeroen Schot - <schot_AT_a-eskwadraat.nl>
+
+Joe Thornber's spiral tiling for [Xmonad][4] formed the inspiration for this
+patch. Thanks to Jan Christoph Ebersbach for updating this patch for versions
+4.5 to 4.9.
+
+[1]: http://schot.a-eskwadraat.nl/images/dwm-spiral_small.png
+[2]: http://schot.a-eskwadraat.nl/images/dwm-spiral.png
+[3]: http://schot.a-eskwadraat.nl/files/dwm-5.1-fibonacci.diff
+[4]: http://www.xmonad.org
+[5]: http://www.aplusbi.com/dwm/dwm-5.2-fibonacci.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/float_border_color.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/float_border_color.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,19 @@
+# FLOAT BORDER COLOR #
+
+## Description ##
+
+This patch allows you to specify a different border color for floating windows.
+
+## Download ##
+ * [dwm-5.0-float-border-color2.diff][3]
+ * [dwm-4.6-float-border-color2.diff][2]
+ * [dwm-4.5-float-border-color2.diff][1]
+
+## Author ##
+ * Message-ID: <20070626093131.GA5005_AT_shota.mine.nu>
+ * Updated by Jan Christoph Ebersbach - <jceb_AT_tzi.de>
+
+[1]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-float-border-color2.diff
+[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-float-border-color2.diff
+[3]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-float-border-color2.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/gapless_grid.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/gapless_grid.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,34 @@
+# GAPLESS GRID LAYOUT #
+
+## Description ##
+
+This patch is similar to [gridmode][1] (in fact it is an altered version) in that it provides a layout for dwm, which arranges the windows in a grid. Though instead of using a regular grid, which in case leaves empty cells (e. g. with 3 windows there are 4 cells, one cell is empty), it uses the same number of columns, but adjusts the number of rows (at first x rows and (x+1) rows, when needed) leaving no empty cells.
+
+
+## Usage ##
+
+Download the patch and apply it according to the [general instructions](.). The patch will make the following changes:
+
+ - gaplessgrid.c: adding the file
+ - config.def.h: adding the include-line for 'gaplessgrid.c'
+ - config.def.h: adding the layout '"###", gaplessgrid'
+
+Comment: There may be problems applying the patch, if another layout has been added before.
+
+
+## Configuration ##
+
+ * Transfer the changes made by the patch in 'config.def.h' to 'config.h', if needed.
+ * Add a key definition like '{ MODKEY, XK_g, setlayout, {.v = &layouts[3]} },'.
+
+
+## Download ##
+
+ * [dwm-5.2-gaplessgrid.diff][2] (1.9k) (20081020)
+ * [dwm-r1437-gaplessgrid.diff][3] (1.9k) (20090704)
+
+
+[1]: /dwm/patches/gridmode.html
+[2]: http://dwm.suckless.org/patches/dwm-5.2-gaplessgrid.diff
+[3]: http://dwm.suckless.org/patches/dwm-r1437-gaplessgrid.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/gridmode.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/gridmode.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,48 @@
+# GRIDMODE PATCH #
+
+## Description ##
+
+This patch adds an extra layout mode to dwm called `grid` in which the windows are arranged in a grid of windows of equal sizes. It comes very in handy especially with tools that operate on multiple windows at once such Cluster SSH.
+
+## Usage ##
+
+Add a grid-symbol to your `config.h` file.
+
+## Screenshots ##
+
+[Grid mode][5] (it also includes a minor patch to make dwm more colourful :D)
+
+## Download ##
+ * [dwm-5.2-gridmode.diff][11]
+ * [dwm-5.0-gridmode.diff][10]
+ * [dwm-4.7-gridmode.diff][9]
+ * [dwm-4.6-gridmode.diff][8]
+ * [dwm-4.5-gridmode.diff][7]
+ * [dwm-4.4.1-gridmode.diff][6]
+ * [dwm-4.3-gridmode.diff][4]
+ * [dwm-4.0-gridmode.diff][3]
+ * [dwm-3.9-gridmode.diff][2]
+ * [dwm-3.8-gridmode.diff][1]
+
+## Author ##
+
+ * Alexandru E. Ungur <grid_AT_rb.no-ip.biz>
+ * Updated by Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+ * Updated to 5.2 & small fix by V4hn - v4hn.de
+Feedback is more than welcome :-)
+
+## Acknowledgments ##
+
+The patch would look a lot uglier without Jukka Salmi's constant help. Thanks Jukka :-)
+
+[1]: http://dwm.slax.no-ip.biz/dwm-3.8-gridmode.diff
+[2]: http://dwm.slax.no-ip.biz/dwm-3.9-gridmode.diff
+[3]: http://dwm.slax.no-ip.biz/dwm-4.0-gridmode.diff
+[4]: http://dwm.slax.no-ip.biz/dwm-4.3-gridmode.diff
+[5]: http://dwm.slax.no-ip.biz/dwm4.3.png
+[6]: http://schot.a-eskwadraat.nl/files/dwm-4.4.1-gridmode.diff
+[7]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-gridmode.diff
+[8]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-gridmode.diff
+[9]: http://www.e-jc.de/dwm/4.7/current/dwm-4.7-gridmode.diff
+[10]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-gridmode.diff
+[11]: http://www.v4hn.de/patches/dwm-5.2-gridmode.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/index.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/index.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,10 @@
+This section contains patches for old versions of dwm.
+
+old offsite patches
+-------------------
+* [dwm-meillo](http://prog.marmaro.de/dwm-meillo/)
+* [dwm-mitch](http://www.cgarbs.de/dwm-mitch.en.html)
+* [fnegronidwm](http://sharesource.org/project/fnegronidwm/wiki/)
+* [patches written by InfinityX](http://flash.metawaredesign.co.uk/4/)
+* [display date](http://henry.precheur.org/2009/5/20/dwm%2C_display_date_patch_updated.html)
+* [DWM-Hacked](http://sourceforge.net/projects/dwm-hacked/)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/mouseontitle.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/mouseontitle.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,33 @@
+MOUSE EVENTS ON TITLE
+=====================
+
+Last update: 2007-10-25
+
+Adds mouse events on the title bar to switch between clients using
+the mouse wheel and using the left click to zoom, right click kill
+and middle click for toggling the floating.
+
+This way you can easily manage tiled clients with the mouse.
+
+The right click on the layout area maximizes the client.
+
+If you are using the nmaster patch you will be able to change the nmaster value using the mouse wheel.
+
+Change the mwfact using the wheel at x=0 placing the cursor inside the bar.
+
+Patch
+-----
+
+Latest patch for [dwm 4.7][2] is here.
+For [dwm 4.6][1] take this one.
+
+See in event.c at function 'buttonpress()' to patch older dwm releases.
+
+AUTHOR
+------
+
+* pancake &lt;youterm.com&gt;
+
+[1]:http://news.nopcode.org/mouseontitle-4.6.diff
+[2]:http://news.nopcode.org/mouseontitle-4.7.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/moveresize.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/moveresize.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,64 @@
+MOVE RESIZE AND MAXIMIZE VERTICAL/HORIZONTAL PATCH
+==================================================
+
+Description
+-----------
+These patches provide helper functions for moving and resizing floating windows using keybindings.
+
+Configuration
+-------------
+This is a sample 'hjkl'-style configuration:
+
+ { MODKEY, XK_h, moveresize, "-25x 0y 0w 0h" }, \
+ { MODKEY, XK_l, moveresize, "25x 0y 0w 0h" }, \
+ { MODKEY, XK_j, moveresize, "0x 25y 0w 0h" }, \
+ { MODKEY, XK_k, moveresize, "0x -25y 0w 0h" }, \
+ { MODKEY|ControlMask, XK_h, moveresize, "0X 0y 0w 0h" }, \
+ { MODKEY|ControlMask, XK_l, moveresize, "9000X 0y 0w 0h" }, \
+ { MODKEY|ControlMask, XK_j, moveresize, "0x 9000Y 0w 0h" }, \
+ { MODKEY|ControlMask, XK_k, moveresize, "0x 15Y 0w 0h" }, \
+ { MODKEY|ShiftMask, XK_h, moveresize, "0x 0y -25w 0h" }, \
+ { MODKEY|ShiftMask, XK_l, moveresize, "0x 0y 25w 0h" }, \
+ { MODKEY|ShiftMask, XK_j, moveresize, "0x 0y 0w 25h" }, \
+ { MODKEY|ShiftMask, XK_k, moveresize, "0x 0y 0w -25h" }, \
+ { MODKEY|ControlMask|ShiftMask, XK_h, togglehorizontalmax, NULL }, \
+ { MODKEY|ControlMask|ShiftMask, XK_l, togglehorizontalmax, NULL }, \
+ { MODKEY|ControlMask|ShiftMask, XK_j, toggleverticalmax, NULL }, \
+ { MODKEY|ControlMask|ShiftMask, XK_k, toggleverticalmax, NULL }, \
+
+Download
+--------
+
+5.0
+
+ * [dwm-5.0-moveresize.diff][7]
+ * [dwm-5.0-maximize_vert_horz.diff][8]
+
+4.6
+
+ * [dwm-4.6-moveresize.diff][5]
+ * [dwm-4.6-maximize_vert_horz.diff][6]
+
+4.5
+
+ * [dwm-4.5-moveresize.diff][3]
+ * [dwm-4.5-maximize_vert_horz.diff][4]
+
+4.4
+
+ * [dwm-4.4-moveresize.diff][1]
+ * [dwm-4.4-maximize_vert_horz.diff][2]
+
+Author
+------
+ * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+
+[1]: http://www.e-jc.de/dwm/dwm-4.4-moveresize.diff
+[2]: http://www.e-jc.de/dwm/dwm-4.4-maximize_vert_horz.diff
+[3]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-moveresize.diff
+[4]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-maximize_vert_horz.diff
+[5]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-moveresize.diff
+[6]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-maximize_vert_horz.diff
+[7]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-moveresize.diff
+[8]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-maximize_vert_horz.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/movestack.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/movestack.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,32 @@
+# MOVESTACK
+
+## Description
+
+This plugin allows you to move clients around in the stack and swap them with
+the master. It emulates the behavior off mod+shift+j and mod+shift+k in Xmonad.
+movestack(+1) will swap the client with the current focus with the next client.
+movestack(-1) will swap the client with the current focus with the previous client.
+
+## Usage
+
+ 1. Download the patch and apply according to the [general instructions](.).
+ 2. Include the `movestack.c` source file and add keys that call movestack.
+ Example from `config.default.h`:
+
+ #include "movestack.c"
+ static Key keys[] = {
+ /* modifier key function argument */
+ ...
+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
+ ...
+
+## Download
+
+ * [dwm-5.2-movestack.diff][1] (1.9k) (20081003)
+
+## Author
+
+ * Niki Yoshiuchi - <aplusbi_AT_gmail.com>
+
+[1]: http://www.aplusbi.com/dwm/dwm-5.2-movestack.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/nmaster+bstack-5.6.1.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/nmaster+bstack-5.6.1.diff Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,195 @@
+diff -r e47a47bd3ed4 config.def.h
+--- a/config.def.h Tue Jul 21 10:57:54 2009 +0100
++++ b/config.def.h Mon Aug 24 17:14:00 2009 +0200
+_AT_@ -24,11 +24,13 @@
+
+ /* layout(s) */
+ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
++static const int nmaster = 1; /* default number of master windows */
+ static const Bool resizehints = True; /* False means respect size hints in tiled resizals */
+
+ static const Layout layouts[] = {
+ /* symbol arrange function */
+ { "[]=", tile }, /* first entry is default */
++ { "TTT", bstack },
+ { "><>", NULL }, /* no layout function means floating behavior */
+ { "[M]", monocle },
+ };
+_AT_@ -57,12 +59,15 @@
+ { MODKEY, XK_k, focusstack, {.i = -1 } },
+ { MODKEY, XK_h, setmfact, {.f = -0.05} },
+ { MODKEY, XK_l, setmfact, {.f = +0.05} },
++ { MODKEY|ShiftMask, XK_h, incnmaster, {.i = +1 } },
++ { MODKEY|ShiftMask, XK_l, incnmaster, {.i = -1 } },
+ { MODKEY, XK_Return, zoom, {0} },
+ { MODKEY, XK_Tab, view, {0} },
+ { MODKEY|ShiftMask, XK_c, killclient, {0} },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
+- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
+- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
++ { MODKEY, XK_o, setlayout, {.v = &layouts[1]} },
++ { MODKEY, XK_f, setlayout, {.v = &layouts[2]} },
++ { MODKEY, XK_m, setlayout, {.v = &layouts[3]} },
+ { MODKEY, XK_space, setlayout, {0} },
+ { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
+ { MODKEY, XK_0, view, {.ui = ~0 } },
+diff -r e47a47bd3ed4 dwm.c
+--- a/dwm.c Tue Jul 21 10:57:54 2009 +0100
++++ b/dwm.c Mon Aug 24 17:14:00 2009 +0200
+_AT_@ -122,6 +122,7 @@
+
+ struct Monitor {
+ float mfact;
++ int nmaster;
+ int num;
+ int by; /* bar geometry */
+ int mx, my, mw, mh; /* screen size */
+_AT_@ -205,6 +206,8 @@
+ static void setclientstate(Client *c, long state);
+ static void setlayout(const Arg *arg);
+ static void setmfact(const Arg *arg);
++static void incnmaster(const Arg *arg);
++static void setnmaster(const Arg *arg);
+ static void setup(void);
+ static void showhide(Client *c);
+ static void sigchld(int signal);
+_AT_@ -213,6 +216,7 @@
+ static void tagmon(const Arg *arg);
+ static int textnw(const char *text, unsigned int len);
+ static void tile(Monitor *);
++static void bstack(Monitor *);
+ static void togglebar(const Arg *arg);
+ static void togglefloating(const Arg *arg);
+ static void toggletag(const Arg *arg);
+_AT_@ -1423,6 +1427,24 @@
+ }
+
+ void
++incnmaster(const Arg *arg) {
++ if(!arg || !selmon->lt[selmon->sellt]->arrange)
++ return;
++ selmon->nmaster += arg->i;
++ if(selmon->nmaster < 0) selmon->nmaster = 0;
++ arrange();
++}
++
++void
++setnmaster(const Arg *arg) {
++ if(!arg || !selmon->lt[selmon->sellt]->arrange)
++ return;
++ selmon->nmaster = arg->i;
++ if(selmon->nmaster < 0) selmon->nmaster = 0;
++ arrange();
++}
++
++void
+ setup(void) {
+ unsigned int i;
+ int w;
+_AT_@ -1542,7 +1564,7 @@
+
+ void
+ tile(Monitor *m) {
+- int x, y, h, w, mw;
++ int x, y, h, w, mw, nm;
+ unsigned int i, n;
+ Client *c;
+
+_AT_@ -1550,23 +1572,81 @@
+ if(n == 0)
+ return;
+ /* master */
+- c = nexttiled(m->clients);
+- mw = m->mfact * m->ww;
+- resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw, False);
+- if(--n == 0)
+- return;
++ if(m->nmaster > 0) {
++ nm = n < m->nmaster ? n : m->nmaster;
++ c = nexttiled(m->clients);
++ mw = m->mfact * m->ww;
++ h = m->wh / nm;
++ y = m->wy;
++ for(i=0; i<nm; i++, c = nexttiled(c->next)) {
++ resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
++ ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
++ if(h != m->wh)
++ y = c->y + HEIGHT(c);
++ }
++ n -= nm;
++ if(n == 0) return;
++ } else {
++ mw = 0;
++ c = nexttiled(m->clients);
++ }
+ /* tile stack */
+- x = (m->wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : m->wx + mw;
++ x = m->wx + mw;
+ y = m->wy;
+- w = (m->wx + mw > c->x + c->w) ? m->wx + m->ww - x : m->ww - mw;
++ w = m->ww - mw;
+ h = m->wh / n;
+ if(h < bh)
+ h = m->wh;
+- for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
++ for(i = 0; c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
+ ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
+ if(h != m->wh)
+ y = c->y + HEIGHT(c);
++ }
++}
++
++void
++bstack(Monitor *m) {
++ int x, y, h, w, mh, nm;
++ unsigned int i, n;
++ Client *c;
++
++ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
++ if(n == 0)
++ return;
++
++ if(m->nmaster > 0) {
++ nm = n < m->nmaster ? n : m->nmaster;
++ c = nexttiled(m->clients);
++ mh = m->mfact * m->wh;
++ x = m->wx;
++ h = m->wh;
++ w = m->ww / nm;
++ for(i=0; i<nm; i++, c = nexttiled(c->next)) {
++ resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
++ (n == nm ? m->wh : mh) - 2 * c->bw, False);
++ if(w != m->ww)
++ x = c->x + WIDTH(c);
++ }
++ n -= nm;
++ if(n == 0) return;
++ } else {
++ mh = 0;
++ c = nexttiled(m->clients);
++ }
++
++ x = m->wx;
++ y = m->wy + mh;
++ w = m->ww / n;
++ h = m->wh - mh;
++ if(h < bh)
++ h = m->wh;
++
++ for(i = 0; c; c = nexttiled(c->next), i++) {
++ resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
++ h - 2 * c->bw, False);
++ if(w != m->ww)
++ x = c->x + WIDTH(c);
+ }
+ }
+
+_AT_@ -1734,6 +1814,7 @@
+ m->sellt = 0;
+ m->tagset[0] = m->tagset[1] = 1;
+ m->mfact = mfact;
++ m->nmaster = nmaster;
+ m->showbar = showbar;
+ m->topbar = topbar;
+ m->lt[0] = &layouts[0];
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/nmaster.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/nmaster.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,58 @@
+# NMASTER PATCH
+
+## Description
+
+This patch restores the ability to have multiple clients in the master area of the tiled layout.
+This feature was dropped from vanilla dwm in version 4.4.
+
+See [nmaster.c][1] header documentation for installing this patch with tilecols and clientspertag for dwm 4.6.
+
+ ntile (-|=)
+ +----------+------+
+ | | |
+ | +------+
+ |----------| |
+ | +------+
+ | | |
+ +----------+------+
+
+NOTE: The nmaster.c (patch for dwm 4.6) mixes the clientspertag patch together with another layout called tilecols.
+
+## Usage
+
+ 1. Download the patch and apply according to the [general instructions](.).
+ 2. Add the `NMASTER` value to your `config.h`.
+ Example from `config.default.h`:
+
+ #define NMASTER 2 /* clients in master area*/
+
+ 3. Add keybindings to `incmaster()` to your `config.h`.
+ Example from `config.default.h`:
+
+ { MODKEY|ShiftMask, XK_k, incnmaster, "-1" }, \
+ { MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \
+
+The nmaster patch for dwm 4.6 (current development hg branch) installation is far more simple.
+Installation instructions are placed on the top of the .c file.
+
+The nmaster patch for dwm 4.6 adds two new layouts called ntile (classic) and dntile (dinamic).
+
+## Download
+
+ * [nmaster-4.7.c][4] (dwm 4.7) (7.3kb (20071123)
+ * [nmaster.c][3] (dwm 4.6) (7.3kb) (20071025)
+ - contains ntile, dntile and tilecols. Also supports the clients-per-tag
+ * [nmaster-4.5.diff][2] (dwm 4.5) (2.7kb) (20071016)
+ * [dwm-4.4.1-nmaster.diff][1] (dwm 4.4) (2.8kb) (20070826)
+ * [nmaster+bstack-5.6.1.diff](nmaster+bstack-5.6.1.diff) (dwm 5.6.1) (5.9kb) (20090824)
+ - another variation; contains bstack with nmaster support
+
+[1]: http://schot.a-eskwadraat.nl/files/dwm-4.4.1-nmaster.diff
+[2]: http://news.nopcode.org/nmaster-4.5.patch
+[3]: http://news.nopcode.org/nmaster.c
+[4]: http://news.nopcode.org/nmaster-4.7.c
+
+## Maintainer
+
+ * pancake &lt;youterm.com&gt;
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/pertag.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/pertag.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,27 @@
+# PERTAG #
+
+## Description ##
+
+More general approach of [taglayouts patch][3]. The patch keeps layout, mwfact, barpos and nmaster (if
+installed) per tag.
+
+## Download ##
+ * [dwm-5.4-pertag.diff][7]
+ * [dwm-5.2-pertag.diff][6]
+ * [dwm-5.1-pertag.diff][5]
+ * [dwm-5.0-pertag.diff][4]
+ * [dwm-4.6-pertag.diff][1]
+ * [dwm-4.6-pertag_nmaster.diff][2]
+
+## Author ##
+
+ * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+ * Updated by V4hn - v4hn.de
+
+[1]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-pertag.diff
+[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-pertag_nmaster.diff
+[3]: /dwm/patches/taglayouts.html
+[4]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-pertag.diff
+[5]: http://v4hn.de/patches/dwm-5.1-pertag.diff
+[6]: http://dwm.suckless.org/patches/dwm-5.2-pertag.diff
+[7]: http://dwm.suckless.org/patches/dwm-5.4-pertag.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/push-5.3.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/push-5.3.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,56 @@
+static Client *
+prevtiled(Client *c) {
+ Client *p, *r;
+
+ for (p = clients, r = NULL; p && p != c; p = p->next)
+ if (!p->isfloating && ISVISIBLE(p))
+ r = p;
+ return r;
+}
+
+static void
+pushup(const Arg *arg) {
+ Client *c;
+
+ if (!sel || sel->isfloating)
+ return;
+ if ((c = prevtiled(sel))) {
+ /* attach before c */
+ detach(sel);
+ sel->next = c;
+ if (clients == c)
+ clients = sel;
+ else {
+ for (c = clients; c->next != sel->next; c = c->next);
+ c->next = sel;
+ }
+ } else {
+ /* move to the end */
+ for (c = sel; c->next; c = c->next);
+ detach(sel);
+ sel->next = NULL;
+ c->next = sel;
+ }
+ focus(sel);
+ arrange();
+}
+
+static void
+pushdown(const Arg *arg) {
+ Client *c;
+
+ if (!sel || sel->isfloating)
+ return;
+ if ((c = nexttiled(sel->next))) {
+ /* attach after c */
+ detach(sel);
+ sel->next = c->next;
+ c->next = sel;
+ } else {
+ /* move to the front */
+ detach(sel);
+ attach(sel);
+ }
+ focus(sel);
+ arrange();
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/push-5.6.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/push-5.6.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,58 @@
+static Client *
+prevtiled(Client *c) {
+ Client *p, *r;
+
+ for(p = selmon->clients, r = NULL; p && p != c; p = p->next)
+ if(!p->isfloating && ISVISIBLE(p))
+ r = p;
+ return r;
+}
+
+static void
+pushup(const Arg *arg) {
+ Client *sel = selmon->sel;
+ Client *c;
+
+ if(!sel || sel->isfloating)
+ return;
+ if((c = prevtiled(sel))) {
+ /* attach before c */
+ detach(sel);
+ sel->next = c;
+ if(selmon->clients == c)
+ selmon->clients = sel;
+ else {
+ for(c = selmon->clients; c->next != sel->next; c = c->next);
+ c->next = sel;
+ }
+ } else {
+ /* move to the end */
+ for(c = sel; c->next; c = c->next);
+ detach(sel);
+ sel->next = NULL;
+ c->next = sel;
+ }
+ focus(sel);
+ arrange();
+}
+
+static void
+pushdown(const Arg *arg) {
+ Client *sel = selmon->sel;
+ Client *c;
+
+ if(!sel || sel->isfloating)
+ return;
+ if((c = nexttiled(sel->next))) {
+ /* attach after c */
+ detach(sel);
+ sel->next = c->next;
+ c->next = sel;
+ } else {
+ /* move to the front */
+ detach(sel);
+ attach(sel);
+ }
+ focus(sel);
+ arrange();
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/push.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/push.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,16 @@
+# PUSH UP/DOWN
+
+## Description
+
+This patch provides a way to move clients position inside the clients list.
+
+ #include "push-5.6.c"
+
+ { MODKEY|ControlMask, XK_j, pushdown, {0} },
+ { MODKEY|ControlMask, XK_k, pushup, {0} },
+
+## Download
+
+ * [push-5.6.c](push-5.6.c) (1K) (20090709)
+ * [push-5.3.c](push-5.3.c) (1K) (20090124)
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/raiselower.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/raiselower.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,15 @@
+# RAISELOWER #
+
+## Description ##
+
+This patch enables you to raise or lower the selected floating window.
+
+## Download ##
+ * [dwm-5.0-raiselower.diff][1]
+
+## Author ##
+
+ * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+
+[1]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-raiselower.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/save_floats.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/save_floats.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,23 @@
+# SAVE FLOATS PATCH #
+
+## Description ##
+
+This patch saves size and position of every floating window before it is forced
+into tiled mode. If the window is made floating again, the old dimensions will
+be restored.
+
+## Download ##
+ * [dwm-5.0-save_floats.diff][4]
+ * [dwm-4.6-save_floats.diff][3]
+ * [dwm-4.5-save_floats.diff][2]
+ * [dwm-4.4-save_floats.diff][1]
+
+## Author ##
+ * http://nymu.net/patches
+ * Updated by Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+
+[1]: http://www.e-jc.de/dwm/dwm-4.4-save_floats.diff
+[2]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-save_floats.diff
+[3]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-save_floats.diff
+[4]: http://www.e-jc.de/dwm/5.0/fb1833284e4b/dwm-5.0-save_floats.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/tagall.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/tagall.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,32 @@
+# TAG ALL #
+
+## Description ##
+
+Shortcut to move all (floating) windows from one tag to another.
+
+## Download ##
+ * [dwm-5.0-tagall.diff][3]
+ * [dwm-4.6-tagall.diff][2]
+ * [dwm-4.5-tagall.diff][1]
+
+## Configuration ##
+
+ * MODKEY+Shift+F1 moves all floating windows of the current tag to tag 1
+
+ { MODKEY|ShiftMask, XK_F1, tagall, "F1" }, \
+ ...
+ { MODKEY|ShiftMask, XK_F9, tagall, "F9" }, \
+
+ * MODKEY+Shift+F1 moves all windows of the current tag to tag 1
+
+ { MODKEY|ShiftMask, XK_F1, tagall, "1" }, \
+ ...
+ { MODKEY|ShiftMask, XK_F9, tagall, "9" }, \
+
+## Author ##
+ * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+
+[1]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-tagall.diff
+[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-tagall.diff
+[3]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-tagall.diff
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/taglayouts.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/taglayouts.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,27 @@
+# TAGLAYOUTS #
+
+## Description ##
+
+This patch enables one layout per tag in contrast of one layout for all tags. - A more general approach is the [pertag patch][4].
+
+## Download ##
+ * [taglayouts-4.6.diff][3] - static implementation of taglayouts (saves 7 LOCs)
+ * [dwm-4.6-taglayouts.diff][2]
+ * [dwm-4.5-taglayouts.diff][1]
+
+## Known Bugs ##
+
+ * If you had selected multiple tags and try to get back to them with the
+ viewprevtag method, keep in mind that the layout of the FIRST tag is used,
+ that was previously selected.
+
+## Author ##
+
+ * http://na.srck.net/dwm
+ * Updated by Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
+
+[1]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-taglayouts.diff
+[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-taglayouts.diff
+[3]: http://news.nopcode.org/taglayouts-4.6.diff
+[4]: /dwm/patches/pertag.html
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/tilemovemouse.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/tilemovemouse.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,20 @@
+MOVE TILED WINDOW WITH MOUSE
+============================
+
+Description
+-----------
+tilemovemouse() lets you drag a client to a different position *without*
+floating it. Reordering windows this way is fun.
+
+ static Button buttons[] = {
+ /* click event mask button function argument */
+ { ClkClientWin, MODKEY, Button1, tilemovemouse, {0} },
+ };
+
+
+Download
+--------
+[tilemovemouse](http://lists.suckless.org/dwm/0903/7773.html)
+
+
+Last update: 2009-03-20
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/historical/workspaces.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/historical/workspaces.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,84 @@
+Workspaces
+==========
+
+*by [Jesus Galan (yiyus)](mailto:yiyu dot jgl at gmail>) (aug 30 21:41:42 CEST 2008)*
+
+Adds to dwm the functionality of remembering tagset, layout and mfact for a given number of workspaces. You can also define preconfigured workspaces.
+
+Code
+----
+
+Insert this code before your keys definitions in config.h or in an included .c file:
+
+ typedef struct Workspace Workspace;
+ struct Workspace {
+ unsigned int tagset;
+ Layout *lt;
+ float mfact;
+ };
+
+ static Workspace workspaces[] = {
+ /* tagset layout fact */
+ { (1 << 0), &layouts[0], 0.55},
+ { (1 << 0) | (1<< 8), &layouts[0], 0.75},
+ { (1 << 0) | (1<< 1) | (1<< 8), &layouts[1], 0},
+ { (1<< 8), &layouts[2], 0},
+ };
+
+ static unsigned int ws = 0;
+
+ static void
+ setws(int nws) {
+ workspaces[ws].tagset = tagset[seltags];
+ workspaces[ws].lt = lt[sellt];
+ workspaces[ws].mfact = (workspaces[ws].lt == &layouts[0]) ? mfact : 0;
+ if(nws < LENGTH(workspaces))
+ ws = nws;
+ if(workspaces[ws].tagset) {
+ tagset[seltags] = workspaces[ws].tagset;
+ lt[sellt] = workspaces[ws].lt;
+ if(workspaces[ws].mfact != 0)
+ mfact = workspaces[ws].mfact;
+ arrange();
+ }
+ }
+
+ static void
+ prevws(const Arg *arg) {
+ setws((ws == 0) ? LENGTH(workspaces) - 1 : ws - 1);
+ }
+
+ static void
+ nextws(const Arg *arg) {
+ setws((ws == LENGTH(workspaces) - 1) ? 0 : ws + 1);
+ }
+
+And then, you can define keys:
+
+ { MODKEY, XK_Tab, nextws, {0} },
+ { MODKEY|ShiftMask, XK_Tab, prevws, {0} },
+
+Or mouse buttons:
+
+ { ClkTagBar, 0, Button4, prevws, {0} },
+ { ClkTagBar, 0, Button5, nextws, {0} },
+
+Comments
+--------
+
+It is so easy to change the viewed tags, layout and mfact in dwm than having artifacts to remember them are not necessary, this patch is just an example of how it could be implemented, but it won't be updated for future releases.
+
+It should be easy to add to the workspaces the possibility to remember bar position too.
+
+It is not necessary to define all your workspaces (or any of them). You can perfectly do:
+
+ static Workspace workspaces[16] = {
+ /* tagset layout fact */
+ { (1 << 0), &layouts[0], 0.55},
+ { (1 << 0) | (1<< 8), &layouts[0], 0.75},
+ };
+
+or:
+
+ static Workspace workspaces[16];
+
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/index.md
--- a/dwm.suckless.org/patches/index.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/index.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -29,16 +29,6 @@
     patch -p1 < path/to/patch.diff
 
 
-offsite patches
----------------
-* [dwm-meillo](http://prog.marmaro.de/dwm-meillo/)
-* [dwm-mitch](http://www.cgarbs.de/dwm-mitch.en.html)
-* [fnegronidwm](http://sharesource.org/project/fnegronidwm/wiki/)
-* [patches written by InfinityX](http://flash.metawaredesign.co.uk/4/)
-* [display date](http://henry.precheur.org/2009/5/20/dwm%2C_display_date_patch_updated.html)
-* [DWM-Hacked](http://sourceforge.net/projects/dwm-hacked/) -- (old)
-
-
 related projects
 ----------------
 * [awesome](http://awesome.naquadah.org/) -- dwm fork with XCB, EWMH, Lua script, Xft, D-Bus, multihead.. support
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/monocle_count.md
--- a/dwm.suckless.org/patches/monocle_count.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,12 +0,0 @@
-MONOCLE STACK COUNT
-====================
-
-Description
------------
-This patch provides a count of the number of stacks as well as the number of the current windows in the stack.
-This count is displayed in the statusbar as [CURRENT/TOTAL], e.g. [1/5], only when the monocle layout has been chosen.
-
-Download
---------
-* [dwm-5.2-monocle_count.diff](http://dwm.suckless.org/patches/dwm-5.2-monocle_count.diff)
-* [dwm-5.1-monocle_count.diff](http://v4hn.de/patches/dwm-5.1-monocle_count.diff)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/mouseontitle.md
--- a/dwm.suckless.org/patches/mouseontitle.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,33 +0,0 @@
-MOUSE EVENTS ON TITLE
-=====================
-
-Last update: 2007-10-25
-
-Adds mouse events on the title bar to switch between clients using
-the mouse wheel and using the left click to zoom, right click kill
-and middle click for toggling the floating.
-
-This way you can easily manage tiled clients with the mouse.
-
-The right click on the layout area maximizes the client.
-
-If you are using the nmaster patch you will be able to change the nmaster value using the mouse wheel.
-
-Change the mwfact using the wheel at x=0 placing the cursor inside the bar.
-
-Patch
------
-
-Latest patch for [dwm 4.7][2] is here.
-For [dwm 4.6][1] take this one.
-
-See in event.c at function 'buttonpress()' to patch older dwm releases.
-
-AUTHOR
-------
-
-* pancake &lt;youterm.com&gt;
-
-[1]:http://news.nopcode.org/mouseontitle-4.6.diff
-[2]:http://news.nopcode.org/mouseontitle-4.7.diff
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/moveresize.md
--- a/dwm.suckless.org/patches/moveresize.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,64 +0,0 @@
-MOVE RESIZE AND MAXIMIZE VERTICAL/HORIZONTAL PATCH
-==================================================
-
-Description
------------
-These patches provide helper functions for moving and resizing floating windows using keybindings.
-
-Configuration
--------------
-This is a sample 'hjkl'-style configuration:
-
- { MODKEY, XK_h, moveresize, "-25x 0y 0w 0h" }, \
- { MODKEY, XK_l, moveresize, "25x 0y 0w 0h" }, \
- { MODKEY, XK_j, moveresize, "0x 25y 0w 0h" }, \
- { MODKEY, XK_k, moveresize, "0x -25y 0w 0h" }, \
- { MODKEY|ControlMask, XK_h, moveresize, "0X 0y 0w 0h" }, \
- { MODKEY|ControlMask, XK_l, moveresize, "9000X 0y 0w 0h" }, \
- { MODKEY|ControlMask, XK_j, moveresize, "0x 9000Y 0w 0h" }, \
- { MODKEY|ControlMask, XK_k, moveresize, "0x 15Y 0w 0h" }, \
- { MODKEY|ShiftMask, XK_h, moveresize, "0x 0y -25w 0h" }, \
- { MODKEY|ShiftMask, XK_l, moveresize, "0x 0y 25w 0h" }, \
- { MODKEY|ShiftMask, XK_j, moveresize, "0x 0y 0w 25h" }, \
- { MODKEY|ShiftMask, XK_k, moveresize, "0x 0y 0w -25h" }, \
- { MODKEY|ControlMask|ShiftMask, XK_h, togglehorizontalmax, NULL }, \
- { MODKEY|ControlMask|ShiftMask, XK_l, togglehorizontalmax, NULL }, \
- { MODKEY|ControlMask|ShiftMask, XK_j, toggleverticalmax, NULL }, \
- { MODKEY|ControlMask|ShiftMask, XK_k, toggleverticalmax, NULL }, \
-
-Download
---------
-
-5.0
-
- * [dwm-5.0-moveresize.diff][7]
- * [dwm-5.0-maximize_vert_horz.diff][8]
-
-4.6
-
- * [dwm-4.6-moveresize.diff][5]
- * [dwm-4.6-maximize_vert_horz.diff][6]
-
-4.5
-
- * [dwm-4.5-moveresize.diff][3]
- * [dwm-4.5-maximize_vert_horz.diff][4]
-
-4.4
-
- * [dwm-4.4-moveresize.diff][1]
- * [dwm-4.4-maximize_vert_horz.diff][2]
-
-Author
-------
- * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
-
-[1]: http://www.e-jc.de/dwm/dwm-4.4-moveresize.diff
-[2]: http://www.e-jc.de/dwm/dwm-4.4-maximize_vert_horz.diff
-[3]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-moveresize.diff
-[4]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-maximize_vert_horz.diff
-[5]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-moveresize.diff
-[6]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-maximize_vert_horz.diff
-[7]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-moveresize.diff
-[8]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-maximize_vert_horz.diff
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/movestack.md
--- a/dwm.suckless.org/patches/movestack.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/movestack.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -23,10 +23,10 @@
 
 ## Download
 
- * [dwm-5.2-movestack.diff][1] (1.9k) (20081003)
+ * [dwm-5.6.1-movestack.diff][1] (2.4k) (20090911)
 
 ## Author
 
  * Niki Yoshiuchi - <aplusbi_AT_gmail.com>
 
-[1]: http://www.aplusbi.com/dwm/dwm-5.2-movestack.diff
+[1]: http://www.aplusbi.com/projects/dwm/dwm-5.6.1-movestack.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/nmaster+bstack-5.6.1.diff
--- a/dwm.suckless.org/patches/nmaster+bstack-5.6.1.diff Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,195 +0,0 @@
-diff -r e47a47bd3ed4 config.def.h
---- a/config.def.h Tue Jul 21 10:57:54 2009 +0100
-+++ b/config.def.h Mon Aug 24 17:14:00 2009 +0200
-_AT_@ -24,11 +24,13 @@
-
- /* layout(s) */
- static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
-+static const int nmaster = 1; /* default number of master windows */
- static const Bool resizehints = True; /* False means respect size hints in tiled resizals */
-
- static const Layout layouts[] = {
- /* symbol arrange function */
- { "[]=", tile }, /* first entry is default */
-+ { "TTT", bstack },
- { "><>", NULL }, /* no layout function means floating behavior */
- { "[M]", monocle },
- };
-_AT_@ -57,12 +59,15 @@
- { MODKEY, XK_k, focusstack, {.i = -1 } },
- { MODKEY, XK_h, setmfact, {.f = -0.05} },
- { MODKEY, XK_l, setmfact, {.f = +0.05} },
-+ { MODKEY|ShiftMask, XK_h, incnmaster, {.i = +1 } },
-+ { MODKEY|ShiftMask, XK_l, incnmaster, {.i = -1 } },
- { MODKEY, XK_Return, zoom, {0} },
- { MODKEY, XK_Tab, view, {0} },
- { MODKEY|ShiftMask, XK_c, killclient, {0} },
- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
-- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
-- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
-+ { MODKEY, XK_o, setlayout, {.v = &layouts[1]} },
-+ { MODKEY, XK_f, setlayout, {.v = &layouts[2]} },
-+ { MODKEY, XK_m, setlayout, {.v = &layouts[3]} },
- { MODKEY, XK_space, setlayout, {0} },
- { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
- { MODKEY, XK_0, view, {.ui = ~0 } },
-diff -r e47a47bd3ed4 dwm.c
---- a/dwm.c Tue Jul 21 10:57:54 2009 +0100
-+++ b/dwm.c Mon Aug 24 17:14:00 2009 +0200
-_AT_@ -122,6 +122,7 @@
-
- struct Monitor {
- float mfact;
-+ int nmaster;
- int num;
- int by; /* bar geometry */
- int mx, my, mw, mh; /* screen size */
-_AT_@ -205,6 +206,8 @@
- static void setclientstate(Client *c, long state);
- static void setlayout(const Arg *arg);
- static void setmfact(const Arg *arg);
-+static void incnmaster(const Arg *arg);
-+static void setnmaster(const Arg *arg);
- static void setup(void);
- static void showhide(Client *c);
- static void sigchld(int signal);
-_AT_@ -213,6 +216,7 @@
- static void tagmon(const Arg *arg);
- static int textnw(const char *text, unsigned int len);
- static void tile(Monitor *);
-+static void bstack(Monitor *);
- static void togglebar(const Arg *arg);
- static void togglefloating(const Arg *arg);
- static void toggletag(const Arg *arg);
-_AT_@ -1423,6 +1427,24 @@
- }
-
- void
-+incnmaster(const Arg *arg) {
-+ if(!arg || !selmon->lt[selmon->sellt]->arrange)
-+ return;
-+ selmon->nmaster += arg->i;
-+ if(selmon->nmaster < 0) selmon->nmaster = 0;
-+ arrange();
-+}
-+
-+void
-+setnmaster(const Arg *arg) {
-+ if(!arg || !selmon->lt[selmon->sellt]->arrange)
-+ return;
-+ selmon->nmaster = arg->i;
-+ if(selmon->nmaster < 0) selmon->nmaster = 0;
-+ arrange();
-+}
-+
-+void
- setup(void) {
- unsigned int i;
- int w;
-_AT_@ -1542,7 +1564,7 @@
-
- void
- tile(Monitor *m) {
-- int x, y, h, w, mw;
-+ int x, y, h, w, mw, nm;
- unsigned int i, n;
- Client *c;
-
-_AT_@ -1550,23 +1572,81 @@
- if(n == 0)
- return;
- /* master */
-- c = nexttiled(m->clients);
-- mw = m->mfact * m->ww;
-- resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw, False);
-- if(--n == 0)
-- return;
-+ if(m->nmaster > 0) {
-+ nm = n < m->nmaster ? n : m->nmaster;
-+ c = nexttiled(m->clients);
-+ mw = m->mfact * m->ww;
-+ h = m->wh / nm;
-+ y = m->wy;
-+ for(i=0; i<nm; i++, c = nexttiled(c->next)) {
-+ resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
-+ ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
-+ if(h != m->wh)
-+ y = c->y + HEIGHT(c);
-+ }
-+ n -= nm;
-+ if(n == 0) return;
-+ } else {
-+ mw = 0;
-+ c = nexttiled(m->clients);
-+ }
- /* tile stack */
-- x = (m->wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : m->wx + mw;
-+ x = m->wx + mw;
- y = m->wy;
-- w = (m->wx + mw > c->x + c->w) ? m->wx + m->ww - x : m->ww - mw;
-+ w = m->ww - mw;
- h = m->wh / n;
- if(h < bh)
- h = m->wh;
-- for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
-+ for(i = 0; c; c = nexttiled(c->next), i++) {
- resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
- ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
- if(h != m->wh)
- y = c->y + HEIGHT(c);
-+ }
-+}
-+
-+void
-+bstack(Monitor *m) {
-+ int x, y, h, w, mh, nm;
-+ unsigned int i, n;
-+ Client *c;
-+
-+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
-+ if(n == 0)
-+ return;
-+
-+ if(m->nmaster > 0) {
-+ nm = n < m->nmaster ? n : m->nmaster;
-+ c = nexttiled(m->clients);
-+ mh = m->mfact * m->wh;
-+ x = m->wx;
-+ h = m->wh;
-+ w = m->ww / nm;
-+ for(i=0; i<nm; i++, c = nexttiled(c->next)) {
-+ resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
-+ (n == nm ? m->wh : mh) - 2 * c->bw, False);
-+ if(w != m->ww)
-+ x = c->x + WIDTH(c);
-+ }
-+ n -= nm;
-+ if(n == 0) return;
-+ } else {
-+ mh = 0;
-+ c = nexttiled(m->clients);
-+ }
-+
-+ x = m->wx;
-+ y = m->wy + mh;
-+ w = m->ww / n;
-+ h = m->wh - mh;
-+ if(h < bh)
-+ h = m->wh;
-+
-+ for(i = 0; c; c = nexttiled(c->next), i++) {
-+ resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
-+ h - 2 * c->bw, False);
-+ if(w != m->ww)
-+ x = c->x + WIDTH(c);
- }
- }
-
-_AT_@ -1734,6 +1814,7 @@
- m->sellt = 0;
- m->tagset[0] = m->tagset[1] = 1;
- m->mfact = mfact;
-+ m->nmaster = nmaster;
- m->showbar = showbar;
- m->topbar = topbar;
- m->lt[0] = &layouts[0];
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/nmaster-sym.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/nmaster-sym.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,130 @@
+enum {MaxMon = 8};
+static int nmasters[MaxMon];
+static int initnm = 0;
+
+static void
+initnmaster(void) {
+ int i;
+
+ if(initnm)
+ return;
+ for(i = 0; i < MaxMon; i++)
+ nmasters[i] = nmaster;
+ initnm = 1;
+}
+
+static void
+incnmaster(const Arg *arg) {
+ if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
+ return;
+ nmasters[selmon->num] += arg->i;
+ if(nmasters[selmon->num] < 0)
+ nmasters[selmon->num] = 0;
+ arrange();
+}
+
+static void
+setnmaster(const Arg *arg) {
+ if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
+ return;
+ nmasters[selmon->num] = arg->i > 0 ? arg->i : 0;
+ arrange();
+}
+
+static void
+ntile(Monitor *m) {
+ static char ntext[8];
+ int x, y, h, w, mw, nm;
+ unsigned int i, n;
+ Client *c;
+
+ initnmaster();
+ /* override layout symbol */
+ snprintf(ntext, sizeof ntext, "%d]=", nmasters[m->num]);
+ m->ltsymbol = ntext;
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ c = nexttiled(m->clients);
+ nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
+ if(nm > n)
+ nm = n;
+ /* master */
+ if(nm > 0) {
+ mw = m->mfact * m->ww;
+ h = m->wh / nm;
+ if(h < bh)
+ h = m->wh;
+ y = m->wy;
+ for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
+ resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
+ ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
+ if(h != m->wh)
+ y = c->y + HEIGHT(c);
+ }
+ n -= nm;
+ } else
+ mw = 0;
+ if(n == 0)
+ return;
+ /* tile stack */
+ x = m->wx + mw;
+ y = m->wy;
+ w = m->ww - mw;
+ h = m->wh / n;
+ if(h < bh)
+ h = m->wh;
+ for(i = 0; c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, w - 2 * c->bw,
+ ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
+ if(h != m->wh)
+ y = c->y + HEIGHT(c);
+ }
+}
+
+static void
+nbstack(Monitor *m) {
+ static char ntext[8];
+ int x, y, h, w, mh, nm;
+ unsigned int i, n;
+ Client *c;
+
+ initnmaster();
+ /* override layout symbol */
+ snprintf(ntext, sizeof ntext, "T%dT", nmasters[m->num]);
+ m->ltsymbol = ntext;
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ c = nexttiled(m->clients);
+ nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
+ if(nm > n)
+ nm = n;
+ /* master */
+ if(nm > 0) {
+ mh = m->mfact * m->wh;
+ w = m->ww / nm;
+ if(w < bh)
+ w = m->ww;
+ x = m->wx;
+ for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
+ resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
+ (n == nm ? m->wh : mh) - 2 * c->bw, False);
+ if(w != m->ww)
+ x = c->x + WIDTH(c);
+ }
+ n -= nm;
+ } else
+ mh = 0;
+ if(n == 0)
+ return;
+ /* tile stack */
+ x = m->wx;
+ y = m->wy + mh;
+ w = m->ww / n;
+ h = m->wh - mh;
+ if(w < bh)
+ w = m->ww;
+ for(i = 0; c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
+ h - 2 * c->bw, False);
+ if(w != m->ww)
+ x = c->x + WIDTH(c);
+ }
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/nmaster.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/nmaster.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,122 @@
+enum {MaxMon = 8};
+static int nmasters[MaxMon];
+static int initnm = 0;
+
+static void
+initnmaster(void) {
+ int i;
+
+ if(initnm)
+ return;
+ for(i = 0; i < MaxMon; i++)
+ nmasters[i] = nmaster;
+ initnm = 1;
+}
+
+static void
+incnmaster(const Arg *arg) {
+ if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
+ return;
+ nmasters[selmon->num] += arg->i;
+ if(nmasters[selmon->num] < 0)
+ nmasters[selmon->num] = 0;
+ arrange();
+}
+
+static void
+setnmaster(const Arg *arg) {
+ if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
+ return;
+ nmasters[selmon->num] = arg->i > 0 ? arg->i : 0;
+ arrange();
+}
+
+static void
+ntile(Monitor *m) {
+ int x, y, h, w, mw, nm;
+ unsigned int i, n;
+ Client *c;
+
+ initnmaster();
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ c = nexttiled(m->clients);
+ nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
+ if(nm > n)
+ nm = n;
+ /* master */
+ if(nm > 0) {
+ mw = m->mfact * m->ww;
+ h = m->wh / nm;
+ if(h < bh)
+ h = m->wh;
+ y = m->wy;
+ for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
+ resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
+ ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
+ if(h != m->wh)
+ y = c->y + HEIGHT(c);
+ }
+ n -= nm;
+ } else
+ mw = 0;
+ if(n == 0)
+ return;
+ /* tile stack */
+ x = m->wx + mw;
+ y = m->wy;
+ w = m->ww - mw;
+ h = m->wh / n;
+ if(h < bh)
+ h = m->wh;
+ for(i = 0; c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, w - 2 * c->bw,
+ ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
+ if(h != m->wh)
+ y = c->y + HEIGHT(c);
+ }
+}
+
+static void
+nbstack(Monitor *m) {
+ int x, y, h, w, mh, nm;
+ unsigned int i, n;
+ Client *c;
+
+ initnmaster();
+ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ c = nexttiled(m->clients);
+ nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
+ if(nm > n)
+ nm = n;
+ /* master */
+ if(nm > 0) {
+ mh = m->mfact * m->wh;
+ w = m->ww / nm;
+ if(w < bh)
+ w = m->ww;
+ x = m->wx;
+ for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
+ resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
+ (n == nm ? m->wh : mh) - 2 * c->bw, False);
+ if(w != m->ww)
+ x = c->x + WIDTH(c);
+ }
+ n -= nm;
+ } else
+ mh = 0;
+ if(n == 0)
+ return;
+ /* tile stack */
+ x = m->wx;
+ y = m->wy + mh;
+ w = m->ww / n;
+ h = m->wh - mh;
+ if(w < bh)
+ w = m->ww;
+ for(i = 0; c; c = nexttiled(c->next), i++) {
+ resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
+ h - 2 * c->bw, False);
+ if(w != m->ww)
+ x = c->x + WIDTH(c);
+ }
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/nmaster.md
--- a/dwm.suckless.org/patches/nmaster.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/nmaster.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -5,54 +5,55 @@
 This patch restores the ability to have multiple clients in the master area of the tiled layout.
 This feature was dropped from vanilla dwm in version 4.4.
 
-See [nmaster.c][1] header documentation for installing this patch with tilecols and clientspertag for dwm 4.6.
+ ntile (-|=)
+ +----------+------+
+ | | |
+ | +------+
+ |----------| |
+ | +------+
+ | | |
+ +----------+------+
 
- ntile (-|=)
- +----------+------+
- | | |
- | +------+
- |----------| |
- | +------+
- | | |
- +----------+------+
-
-NOTE: The nmaster.c (patch for dwm 4.6) mixes the clientspertag patch together with another layout called tilecols.
+ nbstack (-|-)
+ +--------+--------+
+ | | |
+ | | |
+ |-----+--+--+-----+
+ | | | |
+ | | | |
+ +-----+-----+-----+
 
 ## Usage
 
- 1. Download the patch and apply according to the [general instructions](.).
- 2. Add the `NMASTER` value to your `config.h`.
- Example from `config.default.h`:
+* Download `nmaster.c` into the source directory of dwm.
+* Add `nmaster` default value to your `config.h`.
+* Include `nmaster.c` in `config.h` after the definition of `nmaster`.
+* Add `ntile` and/or `nbstack` to your layouts.
+* Add keybindings to `incnmaster` and/or `setnmaster` to your `config.h`.
 
- #define NMASTER 2 /* clients in master area*/
+## Example
 
- 3. Add keybindings to `incmaster()` to your `config.h`.
- Example from `config.default.h`:
-
- { MODKEY|ShiftMask, XK_k, incnmaster, "-1" }, \
- { MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \
-
-The nmaster patch for dwm 4.6 (current development hg branch) installation is far more simple.
-Installation instructions are placed on the top of the .c file.
-
-The nmaster patch for dwm 4.6 adds two new layouts called ntile (classic) and dntile (dinamic).
+ static const int nmaster = 2; /* default number of clients in the master area */
+
+ #include "nmaster.c"
+
+ static const Layout layouts[] = {
+ /* symbol arrange function */
+ { "-|=", ntile },
+ { "-|-", nbstack },
+ ...
+
+ static Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_a, incmaster, {.i = +1 } },
+ { MODKEY, XK_z, incmaster, {.i = -1 } },
+ { MODKEY, XK_x, setmaster, {.i = 2 } },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[0] } },
+ { MODKEY, XK_b, setlayout, {.v = &layouts[1] } },
+ ...
 
 ## Download
 
- * [nmaster-4.7.c][4] (dwm 4.7) (7.3kb (20071123)
- * [nmaster.c][3] (dwm 4.6) (7.3kb) (20071025)
- - contains ntile, dntile and tilecols. Also supports the clients-per-tag
- * [nmaster-4.5.diff][2] (dwm 4.5) (2.7kb) (20071016)
- * [dwm-4.4.1-nmaster.diff][1] (dwm 4.4) (2.8kb) (20070826)
- * [nmaster+bstack-5.6.1.diff](nmaster+bstack-5.6.1.diff) (dwm 5.6.1) (5.9kb) (20090824)
- - another variation; contains bstack with nmaster support
-
-[1]: http://schot.a-eskwadraat.nl/files/dwm-4.4.1-nmaster.diff
-[2]: http://news.nopcode.org/nmaster-4.5.patch
-[3]: http://news.nopcode.org/nmaster.c
-[4]: http://news.nopcode.org/nmaster-4.7.c
-
-## Maintainer
-
- * pancake &lt;youterm.com&gt;
-
+* [nmaster-sym.c](nmaster-sym.c) (dwm 5.7) (20090916) - layout symbol shows the number of masters
+* [nmaster.c](nmaster.c) (dwm 5.6.1) (20090908)
+* see older versions in [historical patches](historical)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/pertag.md
--- a/dwm.suckless.org/patches/pertag.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,27 +0,0 @@
-# PERTAG #
-
-## Description ##
-
-More general approach of [taglayouts patch][3]. The patch keeps layout, mwfact, barpos and nmaster (if
-installed) per tag.
-
-## Download ##
- * [dwm-5.4-pertag.diff][7]
- * [dwm-5.2-pertag.diff][6]
- * [dwm-5.1-pertag.diff][5]
- * [dwm-5.0-pertag.diff][4]
- * [dwm-4.6-pertag.diff][1]
- * [dwm-4.6-pertag_nmaster.diff][2]
-
-## Author ##
-
- * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
- * Updated by V4hn - v4hn.de
-
-[1]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-pertag.diff
-[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-pertag_nmaster.diff
-[3]: /dwm/patches/taglayouts.html
-[4]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-pertag.diff
-[5]: http://v4hn.de/patches/dwm-5.1-pertag.diff
-[6]: http://dwm.suckless.org/patches/dwm-5.2-pertag.diff
-[7]: http://dwm.suckless.org/patches/dwm-5.4-pertag.diff
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/push-5.3.c
--- a/dwm.suckless.org/patches/push-5.3.c Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,56 +0,0 @@
-static Client *
-prevtiled(Client *c) {
- Client *p, *r;
-
- for (p = clients, r = NULL; p && p != c; p = p->next)
- if (!p->isfloating && ISVISIBLE(p))
- r = p;
- return r;
-}
-
-static void
-pushup(const Arg *arg) {
- Client *c;
-
- if (!sel || sel->isfloating)
- return;
- if ((c = prevtiled(sel))) {
- /* attach before c */
- detach(sel);
- sel->next = c;
- if (clients == c)
- clients = sel;
- else {
- for (c = clients; c->next != sel->next; c = c->next);
- c->next = sel;
- }
- } else {
- /* move to the end */
- for (c = sel; c->next; c = c->next);
- detach(sel);
- sel->next = NULL;
- c->next = sel;
- }
- focus(sel);
- arrange();
-}
-
-static void
-pushdown(const Arg *arg) {
- Client *c;
-
- if (!sel || sel->isfloating)
- return;
- if ((c = nexttiled(sel->next))) {
- /* attach after c */
- detach(sel);
- sel->next = c->next;
- c->next = sel;
- } else {
- /* move to the front */
- detach(sel);
- attach(sel);
- }
- focus(sel);
- arrange();
-}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/push-5.6.c
--- a/dwm.suckless.org/patches/push-5.6.c Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,58 +0,0 @@
-static Client *
-prevtiled(Client *c) {
- Client *p, *r;
-
- for(p = selmon->clients, r = NULL; p && p != c; p = p->next)
- if(!p->isfloating && ISVISIBLE(p))
- r = p;
- return r;
-}
-
-static void
-pushup(const Arg *arg) {
- Client *sel = selmon->sel;
- Client *c;
-
- if(!sel || sel->isfloating)
- return;
- if((c = prevtiled(sel))) {
- /* attach before c */
- detach(sel);
- sel->next = c;
- if(selmon->clients == c)
- selmon->clients = sel;
- else {
- for(c = selmon->clients; c->next != sel->next; c = c->next);
- c->next = sel;
- }
- } else {
- /* move to the end */
- for(c = sel; c->next; c = c->next);
- detach(sel);
- sel->next = NULL;
- c->next = sel;
- }
- focus(sel);
- arrange();
-}
-
-static void
-pushdown(const Arg *arg) {
- Client *sel = selmon->sel;
- Client *c;
-
- if(!sel || sel->isfloating)
- return;
- if((c = nexttiled(sel->next))) {
- /* attach after c */
- detach(sel);
- sel->next = c->next;
- c->next = sel;
- } else {
- /* move to the front */
- detach(sel);
- attach(sel);
- }
- focus(sel);
- arrange();
-}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/push.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/patches/push.c Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,58 @@
+static Client *
+prevtiled(Client *c) {
+ Client *p, *r;
+
+ for(p = selmon->clients, r = NULL; p && p != c; p = p->next)
+ if(!p->isfloating && ISVISIBLE(p))
+ r = p;
+ return r;
+}
+
+static void
+pushup(const Arg *arg) {
+ Client *sel = selmon->sel;
+ Client *c;
+
+ if(!sel || sel->isfloating)
+ return;
+ if((c = prevtiled(sel))) {
+ /* attach before c */
+ detach(sel);
+ sel->next = c;
+ if(selmon->clients == c)
+ selmon->clients = sel;
+ else {
+ for(c = selmon->clients; c->next != sel->next; c = c->next);
+ c->next = sel;
+ }
+ } else {
+ /* move to the end */
+ for(c = sel; c->next; c = c->next);
+ detach(sel);
+ sel->next = NULL;
+ c->next = sel;
+ }
+ focus(sel);
+ arrange();
+}
+
+static void
+pushdown(const Arg *arg) {
+ Client *sel = selmon->sel;
+ Client *c;
+
+ if(!sel || sel->isfloating)
+ return;
+ if((c = nexttiled(sel->next))) {
+ /* attach after c */
+ detach(sel);
+ sel->next = c->next;
+ c->next = sel;
+ } else {
+ /* move to the front */
+ detach(sel);
+ attach(sel);
+ }
+ focus(sel);
+ arrange();
+}
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/push.md
--- a/dwm.suckless.org/patches/push.md Thu Aug 27 12:57:08 2009 -0400
+++ b/dwm.suckless.org/patches/push.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -2,15 +2,15 @@
 
 ## Description
 
-This patch provides a way to move clients position inside the clients list.
+`pushup` and `pushdown` provide a way to move clients inside the clients list.
 
- #include "push-5.6.c"
-
- { MODKEY|ControlMask, XK_j, pushdown, {0} },
- { MODKEY|ControlMask, XK_k, pushup, {0} },
+ #include "push.c"
+
+ static Key keys[] = {
+ ...
+ { MODKEY|ControlMask, XK_j, pushdown, {0} },
+ { MODKEY|ControlMask, XK_k, pushup, {0} },
 
 ## Download
 
- * [push-5.6.c](push-5.6.c) (1K) (20090709)
- * [push-5.3.c](push-5.3.c) (1K) (20090124)
-
+* [push.c](push.c) (dwm 5.6.1) (20090709)
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/raiselower.md
--- a/dwm.suckless.org/patches/raiselower.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,15 +0,0 @@
-# RAISELOWER #
-
-## Description ##
-
-This patch enables you to raise or lower the selected floating window.
-
-## Download ##
- * [dwm-5.0-raiselower.diff][1]
-
-## Author ##
-
- * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
-
-[1]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-raiselower.diff
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/save_floats.md
--- a/dwm.suckless.org/patches/save_floats.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,23 +0,0 @@
-# SAVE FLOATS PATCH #
-
-## Description ##
-
-This patch saves size and position of every floating window before it is forced
-into tiled mode. If the window is made floating again, the old dimensions will
-be restored.
-
-## Download ##
- * [dwm-5.0-save_floats.diff][4]
- * [dwm-4.6-save_floats.diff][3]
- * [dwm-4.5-save_floats.diff][2]
- * [dwm-4.4-save_floats.diff][1]
-
-## Author ##
- * http://nymu.net/patches
- * Updated by Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
-
-[1]: http://www.e-jc.de/dwm/dwm-4.4-save_floats.diff
-[2]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-save_floats.diff
-[3]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-save_floats.diff
-[4]: http://www.e-jc.de/dwm/5.0/fb1833284e4b/dwm-5.0-save_floats.diff
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/tagall.md
--- a/dwm.suckless.org/patches/tagall.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,32 +0,0 @@
-# TAG ALL #
-
-## Description ##
-
-Shortcut to move all (floating) windows from one tag to another.
-
-## Download ##
- * [dwm-5.0-tagall.diff][3]
- * [dwm-4.6-tagall.diff][2]
- * [dwm-4.5-tagall.diff][1]
-
-## Configuration ##
-
- * MODKEY+Shift+F1 moves all floating windows of the current tag to tag 1
-
- { MODKEY|ShiftMask, XK_F1, tagall, "F1" }, \
- ...
- { MODKEY|ShiftMask, XK_F9, tagall, "F9" }, \
-
- * MODKEY+Shift+F1 moves all windows of the current tag to tag 1
-
- { MODKEY|ShiftMask, XK_F1, tagall, "1" }, \
- ...
- { MODKEY|ShiftMask, XK_F9, tagall, "9" }, \
-
-## Author ##
- * Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
-
-[1]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-tagall.diff
-[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-tagall.diff
-[3]: http://www.e-jc.de/dwm/5.0/current/dwm-5.0-tagall.diff
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/taglayouts.md
--- a/dwm.suckless.org/patches/taglayouts.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,27 +0,0 @@
-# TAGLAYOUTS #
-
-## Description ##
-
-This patch enables one layout per tag in contrast of one layout for all tags. - A more general approach is the [pertag patch][4].
-
-## Download ##
- * [taglayouts-4.6.diff][3] - static implementation of taglayouts (saves 7 LOCs)
- * [dwm-4.6-taglayouts.diff][2]
- * [dwm-4.5-taglayouts.diff][1]
-
-## Known Bugs ##
-
- * If you had selected multiple tags and try to get back to them with the
- viewprevtag method, keep in mind that the layout of the FIRST tag is used,
- that was previously selected.
-
-## Author ##
-
- * http://na.srck.net/dwm
- * Updated by Jan Christoph Ebersbach - <jceb_AT_e-jc.de>
-
-[1]: http://www.e-jc.de/dwm/4.5/dwm-4.5-tip_ac233c362502-taglayouts.diff
-[2]: http://www.e-jc.de/dwm/4.6/current/dwm-4.6-taglayouts.diff
-[3]: http://news.nopcode.org/taglayouts-4.6.diff
-[4]: /dwm/patches/pertag.html
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/tilemovemouse.md
--- a/dwm.suckless.org/patches/tilemovemouse.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,20 +0,0 @@
-MOVE TILED WINDOW WITH MOUSE
-============================
-
-Description
------------
-tilemovemouse() lets you drag a client to a different position *without*
-floating it. Reordering windows this way is fun.
-
- static Button buttons[] = {
- /* click event mask button function argument */
- { ClkClientWin, MODKEY, Button1, tilemovemouse, {0} },
- };
-
-
-Download
---------
-[tilemovemouse](http://lists.suckless.org/dwm/0903/7773.html)
-
-
-Last update: 2009-03-20
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/patches/workspaces.md
--- a/dwm.suckless.org/patches/workspaces.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,84 +0,0 @@
-Workspaces
-==========
-
-*by [Jesus Galan (yiyus)](mailto:yiyu dot jgl at gmail>) (aug 30 21:41:42 CEST 2008)*
-
-Adds to dwm the functionality of remembering tagset, layout and mfact for a given number of workspaces. You can also define preconfigured workspaces.
-
-Code
-----
-
-Insert this code before your keys definitions in config.h or in an included .c file:
-
- typedef struct Workspace Workspace;
- struct Workspace {
- unsigned int tagset;
- Layout *lt;
- float mfact;
- };
-
- static Workspace workspaces[] = {
- /* tagset layout fact */
- { (1 << 0), &layouts[0], 0.55},
- { (1 << 0) | (1<< 8), &layouts[0], 0.75},
- { (1 << 0) | (1<< 1) | (1<< 8), &layouts[1], 0},
- { (1<< 8), &layouts[2], 0},
- };
-
- static unsigned int ws = 0;
-
- static void
- setws(int nws) {
- workspaces[ws].tagset = tagset[seltags];
- workspaces[ws].lt = lt[sellt];
- workspaces[ws].mfact = (workspaces[ws].lt == &layouts[0]) ? mfact : 0;
- if(nws < LENGTH(workspaces))
- ws = nws;
- if(workspaces[ws].tagset) {
- tagset[seltags] = workspaces[ws].tagset;
- lt[sellt] = workspaces[ws].lt;
- if(workspaces[ws].mfact != 0)
- mfact = workspaces[ws].mfact;
- arrange();
- }
- }
-
- static void
- prevws(const Arg *arg) {
- setws((ws == 0) ? LENGTH(workspaces) - 1 : ws - 1);
- }
-
- static void
- nextws(const Arg *arg) {
- setws((ws == LENGTH(workspaces) - 1) ? 0 : ws + 1);
- }
-
-And then, you can define keys:
-
- { MODKEY, XK_Tab, nextws, {0} },
- { MODKEY|ShiftMask, XK_Tab, prevws, {0} },
-
-Or mouse buttons:
-
- { ClkTagBar, 0, Button4, prevws, {0} },
- { ClkTagBar, 0, Button5, nextws, {0} },
-
-Comments
---------
-
-It is so easy to change the viewed tags, layout and mfact in dwm than having artifacts to remember them are not necessary, this patch is just an example of how it could be implemented, but it won't be updated for future releases.
-
-It should be easy to add to the workspaces the possibility to remember bar position too.
-
-It is not necessary to define all your workspaces (or any of them). You can perfectly do:
-
- static Workspace workspaces[16] = {
- /* tagset layout fact */
- { (1 << 0), &layouts[0], 0.55},
- { (1 << 0) | (1<< 8), &layouts[0], 0.75},
- };
-
-or:
-
- static Workspace workspaces[16];
-
diff -r 9960091a4124 -r 358b27c0da93 dwm.suckless.org/scripts/email_notifier_script.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dwm.suckless.org/scripts/email_notifier_script.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,62 @@
+EMAIL NOTIFIER SCRIPT
+=====================
+
+Description
+-----------
+
+This init script is based on some ideas taken from the dwm ML. It adds email
+notification using `fetchmail`. It also adds the functionality of showing the
+content of the file `$HOME/.message` when it exists. This can be used for
+displaying info by other programs writing to this file.
+
+When a new email arrives a flashing text message is shown on the dwm's
+status bar.
+
+Config .fetchmailrc
+-------------------
+This config works with GMail over IMAP with the IDLE extension for low bandwidth usage:
+
+ poll imap.gmail.com port 993 proto IMAP user "<your_user>_AT_gmail.com"
+ there with password "<your_pass>" keep ssl idle
+
+Init script
+-----------
+
+The notification is flashing during 60 seconds, then it is removed. Lines
+written to `.message` are displayed during a second in the status bar. If
+`.message` is deleted, the normal status message (date and uptime) returns.
+
+A pipe must be used with `fetchmail` when using IDLE extension because this way
+it waits for updates from the inbox not doing polling.
+If the `.message` file exists with some content, it is preserved and no email
+notification is shown.
+
+ fetchmail --check 2>/dev/null | while read line; do
+ new=`echo $line | sed 's/(//' | awk '{print $1-$3}'`
+ if [ $new != 0 ] && [ ! -e ~/.message ]; then
+ echo "New mail($new)" > ~/.message
+ echo "!!! !!! !!!" >> ~/.message
+ sleep 60
+ if grep '^New mail' ~/.message >/dev/null 2>/dev/null; then
+ rm -f ~/.message
+ fi
+ fi
+ done &
+ while true; do
+ if [ -r ~/.message ]; then
+ while read line; do
+ xsetroot -name "$line"
+ sleep 1
+ done < ~/.message
+ else
+ xsetroot -name "`date` `uptime | sed 's/.*,//'`"
+ sleep 1
+ fi
+ done &
+ exec dwm
+ rm -f ~/.message
+
+Author
+------
+
+- Ricardo Catalinas Jiménez <[jimenezrick_AT_gmail.com](mailto:jimenezrick_AT_gmail.com)>
diff -r 9960091a4124 -r 358b27c0da93 libs.suckless.org/_werc/lib/top_bar.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libs.suckless.org/_werc/lib/top_bar.inc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+ <ul>
+ <li><a href="http://suckless.org">home/</a></li>
+ <li><a href="http://hg.suckless.org">code</a></li>
+ <li><a href="http://dl.suckless.org">download</a></li>
+ <li><a href="http://man.suckless.org">man/</a></li>
+ <li><a href="http://dwm.suckless.org">dwm/</a></li>
+ <li class="thisPage"><a href="http://libs.suckless.org">libs/</a></li>
+ <li><a href="http://st.suckless.org">st</a></li>
+ <li><a href="http://surf.suckless.org">surf</a></li>
+ <li><a href="http://tools.suckless.org">tools/</a></li>
+ <li><a href="http://wmii.suckless.org">wmii/</a></li>
+ <li><a href="http://wmi.suckless.org">wmi/</a></li>
+ </ul>
diff -r 9960091a4124 -r 358b27c0da93 libs.suckless.org/index.md
--- a/libs.suckless.org/index.md Thu Aug 27 12:57:08 2009 -0400
+++ b/libs.suckless.org/index.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,3 +1,1 @@
-LIBS
-====
 This directory contains the libraries which have been created by the suckless community during the time.
diff -r 9960091a4124 -r 358b27c0da93 man.suckless.org/_werc/lib/top_bar.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/man.suckless.org/_werc/lib/top_bar.inc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+ <ul>
+ <li><a href="http://suckless.org">home/</a></li>
+ <li><a href="http://hg.suckless.org">code</a></li>
+ <li><a href="http://dl.suckless.org">download</a></li>
+ <li class="thisPage"><a href="http://man.suckless.org">man/</a></li>
+ <li><a href="http://dwm.suckless.org">dwm/</a></li>
+ <li><a href="http://libs.suckless.org">libs/</a></li>
+ <li><a href="http://st.suckless.org">st</a></li>
+ <li><a href="http://surf.suckless.org">surf</a></li>
+ <li><a href="http://tools.suckless.org">tools/</a></li>
+ <li><a href="http://wmii.suckless.org">wmii/</a></li>
+ <li><a href="http://wmi.suckless.org">wmi/</a></li>
+ </ul>
diff -r 9960091a4124 -r 358b27c0da93 st.suckless.org/_werc/config
--- a/st.suckless.org/_werc/config Thu Aug 27 12:57:08 2009 -0400
+++ b/st.suckless.org/_werc/config Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,3 +1,3 @@
 masterSite=default.suckless.org
 siteTitle='st'
-siteSubTitle='st, a simple X terminal'
+siteSubTitle='a simple X terminal'
diff -r 9960091a4124 -r 358b27c0da93 st.suckless.org/_werc/lib/top_bar.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/st.suckless.org/_werc/lib/top_bar.inc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+ <ul>
+ <li><a href="http://suckless.org">home/</a></li>
+ <li><a href="http://hg.suckless.org">code</a></li>
+ <li><a href="http://dl.suckless.org">download</a></li>
+ <li><a href="http://man.suckless.org">man/</a></li>
+ <li><a href="http://dwm.suckless.org">dwm/</a></li>
+ <li><a href="http://libs.suckless.org">libs/</a></li>
+ <li class="thisPage"><a href="http://st.suckless.org">st</a></li>
+ <li><a href="http://surf.suckless.org">surf</a></li>
+ <li><a href="http://tools.suckless.org">tools/</a></li>
+ <li><a href="http://wmii.suckless.org">wmii/</a></li>
+ <li><a href="http://wmi.suckless.org">wmi/</a></li>
+ </ul>
diff -r 9960091a4124 -r 358b27c0da93 st.suckless.org/index.md
--- a/st.suckless.org/index.md Thu Aug 27 12:57:08 2009 -0400
+++ b/st.suckless.org/index.md Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,8 +1,3 @@
-ST
-==
-
-Description
------------
 st is a simple terminal implementation for X.
 
 
_AT_@ -14,10 +9,10 @@
 Download
 --------
 * [MIT/X Consortium license](http://hg.suckless.org/st/raw-file/tip/LICENSE)
-* See also [st](http://st.suckless.org)
+* tip tarball: [http://hg.suckless.org/st/archive/tip.tar.gz](http://hg.suckless.org/st/archive/tip.tar.gz)
 
 Development
 -----------
-st is actively developed. You can [browse](http://hg.suckless.org/st) its source code repository or get a copy using [Mercurial](http://www.selenic.com/mercurial/) with following command:
+st is actively developed. You can [browse](http://hg.suckless.org/st) its source code repository or get a copy using [Mercurial](http://www.selenic.com/mercurial/) with the following command:
 
         hg clone http://hg.suckless.org/st
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/_werc/config
--- a/suckless.org/_werc/config Thu Aug 27 12:57:08 2009 -0400
+++ b/suckless.org/_werc/config Thu Sep 17 10:17:04 2009 -0400
_AT_@ -2,8 +2,22 @@
 siteTitle='suckless.org'
 siteSubTitle='Dedicated to software that sucks less'
 
-conf_perm_redirect '^/gsoc\.html' 'http://suckless.org/common/project_ideas'
-conf_perm_redirect '^/gsoc' 'http://suckless.org/common/project_ideas'
+conf_perm_redirect '^/gsoc\.html' 'http://suckless.org/project_ideas'
+conf_perm_redirect '^/gsoc$' 'http://suckless.org/project_ideas'
+conf_perm_redirect '^/gsoc/i$' 'http://suckless.org/project_ideas'
+conf_perm_redirect '^/common/broken_programs(.*)' 'http://suckless.org/misc/broken_programs\1'
+conf_perm_redirect '^/common/bugs(.*)' 'http://suckless.org/devel/bugs\1'
+conf_perm_redirect '^/common/community(.*)' 'http://suckless.org/community\1'
+conf_perm_redirect '^/common/cool_programs(.*)' 'http://suckless.org/misc/cool_programs\1'
+conf_perm_redirect '^/common/donations(.*)' 'http://suckless.org/donations\1'
+conf_perm_redirect '^/common/dynamic_window_management(.*)' 'http://suckless.org/manifest/dynamic_window_management\1'
+conf_perm_redirect '^/common/faq(.*)' 'http://suckless.org/devel/faq\1'
+conf_perm_redirect '^/common/other_projects(.*)' 'http://suckless.org/other_projects\1'
+conf_perm_redirect '^/common/patches(.*)' 'http://suckless.org/devel/patches\1'
+conf_perm_redirect '^/common/project_ideas(.*)' 'http://suckless.org/project_ideas\1'
+conf_perm_redirect '^/common/style_guide(.*)' 'http://suckless.org/devel/style_guide\1'
+conf_perm_redirect '^/common/$' 'http://suckless.org/manifest'
+conf_perm_redirect '^/common$' 'http://suckless.org/manifest'
 conf_perm_redirect '^/dwm/index.html' 'http://dwm.suckless.org'
 conf_perm_redirect '^/dwm/(.*)\.html' 'http://dwm.suckless.org/\1'
 conf_perm_redirect '^/dwm/(.*)' 'http://dwm.suckless.org/\1'
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/_werc/lib/top_bar.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/_werc/lib/top_bar.inc Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+ <ul>
+ <li class="thisPage"><a href="http://suckless.org">home/</a></li>
+ <li><a href="http://hg.suckless.org">code</a></li>
+ <li><a href="http://dl.suckless.org">download</a></li>
+ <li><a href="http://man.suckless.org">man/</a></li>
+ <li><a href="http://dwm.suckless.org">dwm/</a></li>
+ <li><a href="http://libs.suckless.org">libs/</a></li>
+ <li><a href="http://st.suckless.org">st</a></li>
+ <li><a href="http://surf.suckless.org">surf</a></li>
+ <li><a href="http://tools.suckless.org">tools/</a></li>
+ <li><a href="http://wmii.suckless.org">wmii/</a></li>
+ <li><a href="http://wmi.suckless.org">wmi/</a></li>
+ </ul>
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/broken_programs.md
--- a/suckless.org/common/broken_programs.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,50 +0,0 @@
-BROKEN PROGRAMS
-===============
-
-There are many broken X programs. Go bug the developers of these
-broken programs to fix them. Here are some of the main causes of this
-brokenness:
-
-* The program assumes a specific window management model, i.e.
- assumes you are using a WIMP-window manager like those found in KDE
- or Gnome. This assumption breaks the [ICCCM conventions](http://tronche.com/gui/x/icccm/).
-* The application uses a fixed size - this limitation does not fit
- into the world of tiling window managers very well,
- and can also be seen as breaking the ICCCM conventions, because a
- fixed sized window assumes a specific window management model as
- well (though the ICCCM does not forbid fixed-size windows). In any
- case, the ICCCM requests that clients accept any size the window
- manager proposes to them.
-* The program is based on strange non-standard window manager
- hints that only work properly with a window manager supporting
- these extensions - this simply breaks the ICCCM as well. E.g. trash
- icon programs.
-* The program does not conform to ICCCM due to some missing or
- improperly set hints.
-
-WORKAROUND
-----------
-
-If you still need some program which expects a floating WM, use it in
-floating mode.
-
-The following programs are broken (see [cool programs](/common/cool_programs.html) for saner alternatives):
-
-* beep-media-player
-* [Firefox](http://www.mozilla.org/products/firefox) (doesn't set the
- TRANSIENT_FOR hint correctly on its download dialog)
-* [GIMP](http://www.gimp.org/) (GIMP expects a float environment to
- be useable)
-* gqview
-* gthumb
-* mplayer with GUI (assumes special window management model. It works
- without the GUI)
-* Xchat
-* xine (same as xmms)
-* XMMS (assumes fixed size, doesn't set transient_for hint properly)
-
-
-SEE ALSO
---------
-
-The [list of harmful software](http://harmful.cat-v.org/software/) at [cat-v.org](http://cat-v.org).
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/bugs.md
--- a/suckless.org/common/bugs.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,28 +0,0 @@
-BUGS
-====
-
-Debugging
----------
-If you find any crashes, please send a full backtrace to the dedicated mailing list.
-You can create backtraces with `gdb`:
-
-Before starting a program, you may have to allow core file creation. It is
-recommended that you put this in your profile:
-
- $ ulimit -c unlimited
-
-Then start the program as usual.
-
-After the program crashes, do the following:
-
- $ gdb --quiet `which program` /path/to/core
- gdb> bt full
-
-If you encounter freezes (no crash at all) of the program, you can debug as follows:
-
- $ gdb --quiet `which program` --attach `pgrep -o program`
- gdb> bt full
-
-Send the output of that command to the mailing list along with the output of
-`program -v`! Thank you!
-
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/community.md
--- a/suckless.org/common/community.md Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,99 +0,0 @@
-COMMUNITY
-=========
-
-Mailing lists
--------------
-
-* `dev_AT_suckless.org` - for dwm/wmii/st/... users, development discussion, bug reports, patches, and general discussion
-* `hackers_AT_suckless.org` - commit messages and diffs from all suckless projects are posted here, and can be replied to
-* `wiki_AT_suckless.org` - for discussion about wiki, also automatic wiki commit messages are posted here.
-
-### Best practice
-
-Please mention `dwm` or `wmii` in the subject when beginning a new discussion
-on the `dev_AT_suckless.org` mailing list, if your email is stricly `dwm` or
-`wmii` related only.
-
-### Mailing list commands
-
-Send a mail from your (not yet) subscribed email address to one of the
-following addresses to perform the described action.
-
-**After both subscribe and unsubscribe command, confirmation email will be send to you (So look into your spam bin)!**
-
-**Note, replace `MAILHOST` with `suckless.org`**
-
-### `dev_AT_suckless.org`
-
-* `dev+subscribe_AT_MAILHOST` - subscribe to the mailing list
-* `dev+subscribe-digest_AT_MAILHOST` - subscribe to the digest version of the mailing list
-* `dev+subscribe-nomail_AT_MAILHOST` - subscribe without receiving e-mails from the mailing list
-* `dev+unsubscribe_AT_MAILHOST` - unsubscribe from the mailing list
-* `dev+unsubscribe-digest_AT_MAILHOST` - unsubscribe from the digest version
-* `dev+unsubscribe-nomail_AT_MAILHOST` - receive e-mails from the maing list
-* `dev+get-N_AT_MAILHOST` - retrieve message number N
-* `dev+help_AT_MAILHOST` - receive detailed description of the mailing list commands
-
-### `hackers_AT_suckless.org`
-
-* `hackers+subscribe_AT_MAILHOST` - subscribe to the mailing list
-* `hackers+subscribe-digest_AT_MAILHOST` - subscribe to the digest version of the mailing list
-* `hackers+subscribe-nomail_AT_MAILHOST` - subscribe without receiving e-mails from the mailing list
-* `hackers+unsubscribe_AT_MAILHOST` - unsubscribe from the mailing list
-* `hackers+unsubscribe-digest_AT_MAILHOST` - unsubscribe from the digest version
-* `hackers+unsubscribe-nomail_AT_MAILHOST` - receive e-mails from the maing list
-* `hackers+get-N_AT_MAILHOST` - retrieve message number N
-* `hackers+help_AT_MAILHOST` - receive detailed description of the mailing list commands
-
-### `wiki_AT_suckless.org`
-
-* `wiki+subscribe_AT_MAILHOST` - subscribe to the mailing list
-* `wiki+subscribe-digest_AT_MAILHOST` - subscribe to the digest version of the mailing list
-* `wiki+subscribe-nomail_AT_MAILHOST` - subscribe without receiving e-mails from the mailing list
-* `wiki+unsubscribe_AT_MAILHOST` - unsubscribe from the mailing list
-* `wiki+unsubscribe-digest_AT_MAILHOST` - unsubscribe from the digest version
-* `wiki+unsubscribe-nomail_AT_MAILHOST` - receive e-mails from the maing list
-* `wiki+get-N_AT_MAILHOST` - retrieve message number N
-* `wiki+help_AT_MAILHOST` - receive detailed description of the mailing list commands
-
-
-Mailing lists web archive
--------------------------
-
-Archive of all mails posted to mailing lists is accessible via [http://lists.suckless.org/](http://lists.suckless.org/)
-
-* [dev mailing list archive][devarchive]
-* [hackers mailing list archive][hackersarchive]
-* [wiki mailing list archive][wikiarchive]
-
-Old
----
-* [dwm mailing list archive][dwmarchive]
-* [wmii mailing list archive][wmiiarchive]
-
-Related lists
--------------
-
-* [9fans](http://plan9.bell-labs.com/wiki/plan9/mailing_lists/#9fans) - Fans of the [Plan 9 from Bell Labs](http://9fans.net) operating system.
-* [inferno-list](http://plan9.bell-labs.com/wiki/plan9/mailing_lists/#INFERNO-LIST) - Inferno users and developers
-
-IRC
----
-
-The channels are in the [OFTC](http://www.oftc.net) IRC network: [irc.oftc.net](irc://irc.oftc.net/)
-
-Official channel of suckless.org projects:
-
-* [#suckless](irc://irc.oftc.net/#suckless)
-
-Other popular channels:
-
-* [#acme](irc://irc.oftc.net/#acme)
-* [#plan9](irc://irc.freenode.net/#plan9)
-* [#inferno](irc://irc.freenode.net/#inferno)
-
-[devarchive]: http://lists.suckless.org/dev/
-[dwmarchive]: http://lists.suckless.org/dwm/
-[hackersarchive]: http://lists.suckless.org/hackers/
-[wikiarchive]: http://lists.suckless.org/wiki/
-[wmiiarchive]: http://lists.suckless.org/wmii/
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/cool_programs.md
--- a/suckless.org/common/cool_programs.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,100 +0,0 @@
-COOL PROGRAMS
-=============
-
-Some programs work well with wmii or dwm. Some general rules of thumb
-for judging a programs as usable are:
-
-* The program will accept any window size
-* The program consists of a single window (There are no nested windows, such as in Xpdf)
-
-This covers most console-based programs and programs from [plan9port][].
-
-Text Editors
-------------
-* [acme][acme] - [Rob Pike][rob]'s framing text editor for Plan 9. Included in [plan9port][].
-* [nvi](http://www.bostic.com/vi/) - A small, multiple file vi-alike.
-* [sam](http://sam.cat-v.org/) - An editor by [Rob Pike][rob] with inspiration from ed.
-* [traditional vi](http://ex-vi.sourceforge.net/) - A fixed version of the original vi.
-* [vim](http://www.vim.org) (With the GUI, use `:set go+=c` to kill popup dialogs)
-* [wily](http://www.cs.yorku.ca/~oz/wily/) - An acme clone for POSIX.
-
-Audio Players
--------------
-* [cmus](http://onion.dynserv.net/~timo/cmus.html)
-* [cplay](http://mask.tf.hut.fi/~flu/hacks/cplay/)
-* [moc](http://moc.daper.net/)
-* [mpd](http://www.musicpd.org/) - A client/server based music player with console and graphical front-ends.
-* [mpg123](http://www.mpg123.de/) - A console mpg player which doesn't use auto*hell, or extra libraries.
-* [mpg321](http://mpg321.sourceforge.net)
-* [PyTone](http://www.luga.de/pytone/) - PyTone is a music jukebox written in Python with a curses based GUI. It provides features like crossfading and multiple players, special emphasis is put on ease of use.
-* [vorbis-tools](http://www.xiph.org/) (Ogg/FLAC) - Command-line tools to play Ogg and FLAC files.
-
-Media Players
--------------
-* [mplayer](http://www.mplayerhq.hu/) (without GUI) - You know mplayer, but you may not know that it works well without the GUI.
-* smplayer
-
-Utilities
----------
-* [9menu](http://www.freshports.org/x11/9menu/) - A menu program based on the Blit-style menus so prevalent in Plan 9.
-	  A take on it is included with wmii.
-* [dmenu](/programs/dmenu.html) - Obvious
-
-Image Viewers
--------------
-* [feh](http://linuxbrit.co.uk/feh/)
-* [jpg/gif/bmp/png][plan9port] - Simple programs from Plan 9 to display images in no-frills windows. Included with plan9port.
-* [page][plan9port] - Plan 9's image/document viewer program. Included with plan9port.
-* [qiv](http://www.klografx.net/qiv/)
-* [xli](http://pantransit.reptiles.org/prog/)
-* [xzgv](http://sourceforge.net/projects/xzgv)
-
-IRC Clients
------------
-* [acme:SAC](http://caerwyn.com/acme/index.html)
-* [ii](/programs/ii.html) - A FIFO based IRC client which is part of the suckless.org project.
-* [ircc](http://www.r-36.net/ircc.tgz) - A no-frills, ncurses free, console-based IRC client.
-* [Irc](http://swtch.com/irc/)
-* [ircrc](http://plan9.bell-labs.com/sources/contrib/fgb/rc/ircrc) - An rc-based IRC client similar to ircc. Needs minor modification to run on UNIX.
-* [irssi](http://www.irssi.org/)
-* [sic](/programs/sic.html) - Another suckless.org IRC client. Similar to ircc.
-
-Mail Clients
-------------
-* [heirloom-mailx](http://heirloom.sourceforge.net/mailx.html) - A mail client based on the original Berkeley Mail 8.1 with many new features.
-* [Mail][plan9port] - A mail client for [acme][acme]. Included with plan9port.
-* [mutt](http://www.mutt.org/)
-* [muttator](http://vimperator.org/) - A Thunderbird extension to make it keyboard friendly and mutt/Vim-like.
-* [nmh](http://www.nongnu.org/nmh/)
-* Sylpheed claws
-
-Instant Messaging Clients
--------------------------
-* [bitlbee](http://www.bitlbee.org/) - A program to translate IM protocols to IRC. You can now IM from your IRC client, and you don't even need to install anything.
-* [centericq](http://konst.org.ua/centericq/)
-* [centerim](http://www.centerim.org/) - A centericq fork.
-* [climm](http://www.climm.org/)
-* [mcabber](http://www.lilotux.net/~mikael/mcabber/) - A console jabber client.
-* [ysm](http://ysmv7.sourceforge.net/)
-
-Web Browsers
-------------
-* [Vimperator](http://vimperator.org/) - An extension to make Firefox keyboard friendly and Vim-like.
-	Developed in part by wmii's maintainer.
-* [Conkeror](http://www.conkeror.org/) - A Gecko based browser, imparting it Emacs style key bindings, appearances, and behaviors.
-* [Dillo](http://www.dillo.org/) (try the i18n version)
-* [ELinks](http://elinks.or.cz/)
-* [links2](http://links.twibright.com/)
-* [Lynx](http://lynx.isc.org/)
-* [w3m](http://w3m.sf.net/)
-* [edbrowse](http://edbrowse.sourceforge.net/)
-* [uzbl](http://uzbl.org/)
-
-Web Servers (httpd)
-------------
-* [Nostromo](http://www.nazgul.ch/dev_nostromo.html)
-
-[rob]: http://herpolhode.com/rob/
-[plan9port]: http://swtch.com/plan9port/
-[acme]: http://acme.cat-v.org
-
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/donations.md
--- a/suckless.org/common/donations.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,35 +0,0 @@
-DONATIONS
-=========
-We thank all people who have donated or are donating in one way or another
-to a suckless.org related project. We kindly ask to continue donating to the
-suckless.org project. As the project grows and grows, there are plans to get
-in touch with the [GSoC](http://code.google.com/soc/2008/) in 2009 to sponsor
-more less sucking projects we have in mind.
-
-Present
--------
-Following people are currently donating in one or another way to the suckless.org project:
-
-* Jason Thigpen donates a slicehost server, which hosts the source code and the tarballs of our projects.
-* Anselm R Garbe donates all other servers currently in use.
-* John V. Turek donated <b> 10 EUR</b>
-
-Past
-----
-Following people have donated to the [wmii](/wmii) resp. [dwm](/dwm) project
-certain amounts of money, which have been used for the dedicated server rent
-in the past:
-
-* Filippo Negroni donated <b> 10 GBP </b>
-* Markus Schnalke donated <b> 10 EUR</b>
-* Sebastian Noack donated <b> 50 EUR </b>
-* Jason Thigpen donated <b> 100 USD </b>
-* Markus Schnalke donated <b> 20 EUR </b>
-* Enno 'Gottox' Boland donated <b>50 EUR</b>
-* Ivan F. Villanueva B. donated <b>20 EUR</b>
-* Alexandre Dulaunoy donated <b>100 EUR</b>
-* Alexis Hildebrandt donated <b>100 EUR</b>
-* Al Wong (aka alvin) donated <b>100 USD</b>
-* Heiko Schlichting (aka rundstutzen) donated <b>100 EUR</b>
-
-
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/dynamic_window_management.md
--- a/suckless.org/common/dynamic_window_management.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,42 +0,0 @@
-DYNAMIC WINDOW MANAGEMENT
-=========================
-
-We think that static window management as seen in Ion or wmi-10 is a far too
-rigid and inflexible working environment. In [acme](http://acme.cat-v.org),
-larswm, and oberon, dynamic window management frees the user from these
-limitations. The user can start as many applications and windows as he likes,
-and easily arrange them in a useful way, helped by the window manager - the
-working environment changes with the tasks the user is performing. The
-experience is very fluid and natural.  Similar concepts have been introduced in
-wmii and dwm.
-
-Dynamic window management states that it is the window manager's job to manage
-windows - and not the user's job to have to set up some specialized layout that
-will only work for one specific work scenario. This has been the larswm motto
-for a long time. In contrast to static window management, the user rarely has
-to think about how to organize windows, no matter what he is doing or how many
-applications are running at the same time. The window manager adapts to the
-current environment and helps the user manage and mold it to his needs, rather
-than forcing it to use a preset, fixed layout and trying to shoehorn all
-windows and applications into it.
-
-Dynamic window management has many advantages - you can create and tear down
-whole working environments in a matter of seconds rather than spending time
-fine-tuning a fixed layout that cannot work well in all cases. The number and
-nature of windows you work with changes all the time, and a dynamic window
-manager lets you adapt to that and always efficiently use your precious screen
-real estate.
-
-Some will argue that you should setup a different static workspace for each of
-the tasks you perform (one for web browsing, one for email reading, one for
-coding, etc.), but that is just a workaround for the limitations of static
-window management, and it doesn't account for the many sub-usage patterns each
-main task has.
-
-For example: the layout you use during debugging would probably be quite
-different to the one used during refactoring, you might want to have a patch
-someone emailed you in view while you look at some code, or edit a
-configuration file while you look at a man page or website. Dynamic window
-management lets you mix and match on the fly to always have the windows you
-need in view, and only the windows you need, without the need to reserve extra
-space which you may or may not end up using.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/faq.md
--- a/suckless.org/common/faq.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,9 +0,0 @@
-FAQ
-===
-Why don't you use autoconf, et al.?
------------------------------------
-We don't use auto*hell for various reasons, start here:
-
-* [&#8220;Stop the autoconf insanity! Why we need a new build system.&#8221;](http://freshmeat.net/articles/view/889/)
-* [&#8220;Why autoconf, automake and libtool fail&#8221;](http://www.ohse.de/uwe/articles/aal.html)
-* [&#8220;[9fans] configure misery&#8221;](http://lists.cse.psu.edu/archives/9fans/2003-November/029714.html)
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/index.md
--- a/suckless.org/common/index.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,59 +0,0 @@
-SUCK LESS PHILOSOPHY
-====================
-
-Background
-----------
-We are the home of quality software such as [dwm](http://dwm.suckless.org),
-[dmenu](http://tools.suckless.org), [libixp](http://libs.suckless.org/libixp),
-[wmii](http://wmii.suckless.org) and plenty of other [tools](http://tools.suckless.org), with
-a focus on simplicity, clarity and frugality. Our philosophy is
-about keeping things simple, minimal and usable. We believe this should become
-the mainstream philosophy in the IT sector. Unfortunately, the tendency for
-complex, error-prone and slow software seems to be prevalent in the present-day
-software industry. We intend to prove the opposite with our software projects.
-
-Our project focuses on advanced and experienced computer users. In contrast
-with the usual proprietary software world or many mainstream open source
-projects that focus more on average and non-technical end users, we think that
-experienced users are mostly ignored. This is particularly true for user
-interfaces, such as graphical environments on desktop computers, on mobile
-devices, and in so-called Web applications. We believe that the market of
-experienced users is growing continuously, with each user looking for more
-appropriate solutions for his/her work style.
-
-Designing simple and elegant software is far more difficult than letting ad-hoc
-or over-ambitious features obscure the code over time. However one has to pay
-this price to achieve reliability and maintainability. Furthermore, minimalism
-results in reasonable and attainable goals. We strive to maintain minimalism and
-clarity to drive development to completion.
-
-Manifest
---------
-Many (open source) hackers are proud if they achieve large amounts of code,
-because they believe the more lines of code they've written, the more progress
-they have made. The more progress they have made, the more skilled they are.
-This is simply a delusion.
-
-Most hackers actually don't care much about code quality. Thus, if they get
-something working which seems to solve a problem, they stick with it. If this
-kind of software development is applied to the same source code throughout its
-entire life-cycle, we're left with large amounts of code, a totally screwed
-code structure, and a flawed system design. This is because of a lack of
-conceptual clarity and integrity in the development process.
-
-Code complexity is the mother of bloated, hard to use, and totally inconsistent
-software. With complex code, problems are solved in suboptimal ways, valuable
-resources are endlessly tied up, performance slows to a halt, and
-vulnerabilities become a commonplace. The only solution is to scrap the entire
-project and rewrite it from scratch.
-
-The bad news: quality rewrites rarely happen, because hackers are proud of
-large amounts of code. They think they understand the complexity in the code,
-thus there's no need to rewrite it. They think of themselves as masterminds,
-understanding what others can never hope to grasp. To these types, complex
-software is the ideal.
-
-Ingenious ideas are simple. Ingenious software is simple. Simplicity is the
-heart of the Unix philosophy. The more code lines you have removed, the more
-progress you have made. As the number of lines of code in your software
-shrinks, the more skilled you have become and the less your software sucks.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/other_projects.md
--- a/suckless.org/common/other_projects.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,11 +0,0 @@
-OTHER PROJECTS
-==============
-There are several other projects which are inspired by the spirit of suckless.
-
-* [dietline](http://news.nopcode.org/dietline.c)
-* [dvtm](http://www.brain-dump.org/projects/dvtm/)
-* [dzen](http://dzen.geekmode.org/)
-* [kelp](http://kelp.sf.net)
-* [sltar](http://s01.de/~gottox/index.cgi/proj_sltar)
-* [smu](http://s01.de/~gottox/index.cgi/proj_smu)
-* [bgs](http://s01.de/~gottox/index.cgi/proj_bgs)
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/patches.md
--- a/suckless.org/common/patches.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,28 +0,0 @@
-PATCHES
-=======
-
-diff generation
----------------
-For mercurial users:
-
-    cd program-directory
-    hg diff > program-X.Y-yourpatchname.diff
-
-For tarballs:
-    
-    cd modified-program-directory/..
-    diff -up original-program-directory modified-program-directory > program-X.Y-yourpatchname.diff
-
-where `X.Y` is a wmii tag name or version number.
-
-patch program
--------------
-For mercurial users:
-    
-    cd program-directory
-    hg patch path/to/patch.diff
-
-For tarballs:
-
-    cd program-directory
-    patch -p1 < path/to/patch.diff
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/project_ideas.md
--- a/suckless.org/common/project_ideas.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,181 +0,0 @@
-PROJECT IDEAS FOR FUTURE GSOCs
-==============================
-We applied as a mentoring organization for [Google Summer of Code 2009](http://code.google.com/soc/), but were rejected this time. Perhaps we will apply in 2010 again.
-
-Please read our [philosophy](/common) for background information.
-
-Mentors
--------
-We intend that each student will be the project leader of his/her particular
-project and the only individual with commit privilege for the repository.
-
-There will be one mentor and one backup mentor per project. In addition, the
-suckless.org community will act as a rigid external reviewer of the
-student's progress, as well as of the mentor's.
-
-General ideas
--------------
-Our project ideas in general intended to focus on:
-
-* Graphical user interfaces for expert users (such as more advanced
-  concepts for mail clients, messaging clients, music players, text editors)
-* Web applications for expert users following our GUI concepts
-* Mobile applications for expert users following our GUI concepts
-* General userland enhancements to Unix-like operating systems, in particular
-  GNU/Linux
-* Audio applications
-* Image/Streaming/Gallery desktop and web applications
-* Foundations of a new windowing system for Unix-like operating systems
-  (based on xorg drivers, but no X11- or XServer-dependency)
-* Improvements of our existing software projects
-
-Concrete ideas
---------------
-The listed ideas generally require good knowledge of C and experience with
-Unix-like operating systems. The difficulty ranges from medium to high.
-An academic background in computer science is desirable but not essential.
-
-### Unix utilities
-
-Projects like [dmenu](http://tools.suckless.org/dmenu) prove that it's possible
-to bring the Unix philosophy onto the desktop and into the land of graphical
-applications. We believe that there is big potential for doing similar things
-for other purposes such as managing contacts, bookmarks, browsing
-files/directories, reading/managing mails, organizing/viewing images/videos and
-listening to music, all in a very elegant and Unix-like way. We believe that such
-tools should have a GUI but communicate via standard I/O and be very flexible in
-the combination of their purposes.
-
-***Requirements:*** Good knowledge of the Unix userland, C and of the Xlib is essential.
-
-### Port dwm to different platforms
-
-Many dwm users who have to use Microsoft Windows regularly have requested a
-port of dwm to Microsoft Windows. There are several tiling window managers, but
-unfortunately the majority are proprietary software and can't keep up with dwm.
-
-Similarly we believe that porting dwm to Mac OS X, or onto mobile devices (with
-certain constraints) might create a new paradigm of future window management
-concepts in mainstream software.
-
-There might also be the opportunity to make dwm itself more friendly with
-well-established desktop environments, to integrate well with Gnome or KDE in
-order to prove that dynamic and tiled window management should be the default
-in future window management concepts.
-
-***Requirements:*** Good knowledge of the Xlib and C is desirable. Also good
-knowledge of the specific target platform, such as Cocoa/Quartz on Max OS X,
- resp. Win32 API on Windows would be desirable.
-
-### ddm
-
-There is no suckless display manager for X11 at the moment, thus a new
-dynamic display manager (ddm) should be designed and implemented.
-
-***Requirements:*** Good knowledge of the Xlib and C is desirable.
-
-### stm
-
-There seems to be a need for a suckless ticket management system, as this
-is a common task in today's daily activity in business and private time
-management. This task includes the design and implementation of a suckless
-system that solves the problems of TTS (Trouble Ticket System), ARS (Action
-Request System) and IRS (Incident Response System) all together.
-
-***Requirements:*** Good knowledge of web technologies are essential, good knowledge of C is desirable.
-
-### Lightweight volume manager alternative
-
-We'd like to see a lightweight and simple alternative to gnome-volume-manager
-and similar programs.
-
-There's one such project already available at <http://tools.suckless.org/skvm>.
-
-***Requirements:*** Good C knowledge and knowledge of DBUS and similar techniques are essential.
-
-### Yet another less sucking editor
-
-Although vi(m) does its job, it has become a monster over the years. We
-believe there is a gap between [ed](http://man.cat-v.org/plan_9/1/ed), [sam](http://sam.cat-v.org), [acme](http://acme.cat-v.org) and vim which must be filled with
-a completely new, less-sucking editor.
-
-***Requirements:*** Good C knowledge and knowledge of I/O APIs is essential.
-
-### Less sucking C99 subset spec
-
-Although sufficient, C99 is not a perfect programming language. It suffers from
-legacy syntax and semantics and lacks features that make designing libraries
-and developing abstractions much easier. To address these shortcomings the
-student should survey the problems of C, evaluate possible solutions and
-enhance the language as a subset of C99.
-
-***Requirements:*** Very good C knowledge is essential.
-
-### Modern libc
-
-The standard libc is full of awkward and legacy concepts. We believe that
-recent approaches such as Google's bionic libc are a step into the right
-direction, though not radical enough. We think there is a great opportunity to
-implement a completely new libc which abstracts a very nice standard
-environment which can be implemented on modern OS platforms in a straightforward manner. 
-Our goal would be to realize an initial proposal on Linux.
-
-***Requirements:*** Very good C knowledge is essential.
-
-### Improve tcc
-
-We'd like to see [tcc](http://bellard.org/tcc/) being continued and improved.  gcc is too slow and too
-focused on language-agnostics and particularly focused on its C++ support. We
-have the impression that most open source software is written in C and makes no
-use of C++, so we desire an improved tcc.
-
-We are also concerned about recent attempts to implement the C front-end of gcc
-in C++. We believe that is a bad decision in general (due to demanding C++ as
-bootstrapping environment) and would like to get rid of the gcc dependency
-for these reasons.
-
-We'd like the improved tcc to be able to build all suckless projects
-and perhaps the modern libc replacement.
-
-***Requirements:*** Very good C knowledge is essential as well as knowledge of x86 assembler and executable formats.
-
-### Comprehensive code audit
-
-All software hosted at suckless.org should undergo a comprehensive
-code audit. This includes search for vulnerabilities, verification of
-all algorithms, proof-reading of the documentation and possibly a code
-clean-up. The result has to be a report on all found errors and maybe some
-advice for the project maintainers. This task requires experience in this
-field.
-
-***Requirements:*** Good C knowledge is essential.
-
-### Improve sltar
-
-[sltar](http://s01.de/~gottox/index.cgi/proj_sltar) is a simplified tar
-implementation which lacks gzip and bzip2 integration. The task requires to
-extend sltar with these and to also write a test suite for it.
-
-***Requirements:*** Good C knowledge would be desirable.
-
-### Write a decent mailing list Web archive system
-
-All web archive systems such as hypermail, pipermail, etc. have plenty
-drawbacks and are quite out-dated. This task requires to write a completely new
-web mailing list archiving tool that follows the thread view concepts found in
-the mutt MUA and which is designed with low footprint and efficiency in mind.
-
-We expect this tool as a stand-alone Unix tool written in C or shell.
-
-***Requirements:*** Good C/Shell/HTML5 knowledge would be desirable.
-
-### Extend werc with a repository browser
-
-This task requires to extend [werc](http://werc.cat-v.org) with a source
-browser for VCS repositories including support for
-[subversion](http://subversion.tigris.org/),
-[mercurial](http://www.selenic.com/mercurial/) and [git](http://git-scm.com).
-
-***Requirements:*** Good knowledge of the [rc](http://en.wikipedia.org/wiki/Rc) shell
-and the [Plan 9 userland for Unix](http://plan9.us) is essential. Good C
-knowledge for the helper tools would be desirable.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/common/style_guide.md
--- a/suckless.org/common/style_guide.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,49 +0,0 @@
-Style guide of code hosted on suckless.org
-==========================================
-When it comes to code style questions, it is very likely that individual
-programmers will disagree. It is absolutely fine to use an individual style for
-individual projects, especially if only one developer is involved. However, if
-there are two or more programmers involved in a project, guidelines become
-handy in order to meet the first basic rule we follow:
-
-* Code developed by different individuals should follow a common style among those to found a consistent base.
-
-Thus consistency in the code style being used is more important than any
-particular detail of the style itself. Due to the fact that most of the software of
-suckless.org has been developed by more than one individual, some sort of
-common style found in the code appeared during the past years. This common
-style is described in detail, further on.
-
-C++
----
-C++ was used in the early beginning and has been abandoned for various reasons.
-
-A summary of those reasons is: Nearly nobody understands C++ in all its
-facettes and details. C++ has been designed and evolved to support any
-programming language paradigm and feature invented by programming
-language designers until the OO hype and beyond. This leads to mutual
-exclusive programming paradigms and styles in one language and basically
-destroys the simplicity and clarity of its ancestor C. The usual
-workaround in the C++ world is to stick to certain C++ subsets, like only using
-one calling convention, not using exceptions, not using STL but using libstdc++
-etc.
-
-It took quite a while for some of us to realize that C++ leads to more complex
-software in general, because it provides the feature richness to do so. This is
-especially dangerous if average programmers are involved in a project. In our
-experience it is much more likely that a C++ project driven by average
-programmers will fail, than a C project. The reason for this is simple: C++ is
-hard to deal with when used in all its feature richness.
-
-We don't argue that C++ software performs better or worse than software written
-in C. However we argue that in general C++ software performs poorer than
-software written in C, because of its tendency to complexity and its hidden
-pitfalls like expensive function calls in loops or too many inlines.
-
-All these problems do not happen with C, because C is too simple to be
-misused in our opinion.
-
-So the second rule of this style guide concludes:
-
-* We use C as our primary programming language because it enforces clear and simple software.
-
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/community.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/community.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,99 @@
+COMMUNITY
+=========
+
+Mailing lists
+-------------
+
+* `dev_AT_suckless.org` - for dwm/wmii/st/... users, development discussion, bug reports, patches, and general discussion
+* `hackers_AT_suckless.org` - commit messages and diffs from all suckless projects are posted here, and can be replied to
+* `wiki_AT_suckless.org` - for discussion about wiki, also automatic wiki commit messages are posted here.
+
+### Best practice
+
+Please mention `dwm` or `wmii` in the subject when beginning a new discussion
+on the `dev_AT_suckless.org` mailing list, if your email is stricly `dwm` or
+`wmii` related only.
+
+### Mailing list commands
+
+Send a mail from your (not yet) subscribed email address to one of the
+following addresses to perform the described action.
+
+**After both subscribe and unsubscribe command, confirmation email will be send to you (So look into your spam bin)!**
+
+**Note, replace `MAILHOST` with `suckless.org`**
+
+### `dev_AT_suckless.org`
+
+* `dev+subscribe_AT_MAILHOST` - subscribe to the mailing list
+* `dev+subscribe-digest_AT_MAILHOST` - subscribe to the digest version of the mailing list
+* `dev+subscribe-nomail_AT_MAILHOST` - subscribe without receiving e-mails from the mailing list
+* `dev+unsubscribe_AT_MAILHOST` - unsubscribe from the mailing list
+* `dev+unsubscribe-digest_AT_MAILHOST` - unsubscribe from the digest version
+* `dev+unsubscribe-nomail_AT_MAILHOST` - receive e-mails from the maing list
+* `dev+get-N_AT_MAILHOST` - retrieve message number N
+* `dev+help_AT_MAILHOST` - receive detailed description of the mailing list commands
+
+### `hackers_AT_suckless.org`
+
+* `hackers+subscribe_AT_MAILHOST` - subscribe to the mailing list
+* `hackers+subscribe-digest_AT_MAILHOST` - subscribe to the digest version of the mailing list
+* `hackers+subscribe-nomail_AT_MAILHOST` - subscribe without receiving e-mails from the mailing list
+* `hackers+unsubscribe_AT_MAILHOST` - unsubscribe from the mailing list
+* `hackers+unsubscribe-digest_AT_MAILHOST` - unsubscribe from the digest version
+* `hackers+unsubscribe-nomail_AT_MAILHOST` - receive e-mails from the maing list
+* `hackers+get-N_AT_MAILHOST` - retrieve message number N
+* `hackers+help_AT_MAILHOST` - receive detailed description of the mailing list commands
+
+### `wiki_AT_suckless.org`
+
+* `wiki+subscribe_AT_MAILHOST` - subscribe to the mailing list
+* `wiki+subscribe-digest_AT_MAILHOST` - subscribe to the digest version of the mailing list
+* `wiki+subscribe-nomail_AT_MAILHOST` - subscribe without receiving e-mails from the mailing list
+* `wiki+unsubscribe_AT_MAILHOST` - unsubscribe from the mailing list
+* `wiki+unsubscribe-digest_AT_MAILHOST` - unsubscribe from the digest version
+* `wiki+unsubscribe-nomail_AT_MAILHOST` - receive e-mails from the maing list
+* `wiki+get-N_AT_MAILHOST` - retrieve message number N
+* `wiki+help_AT_MAILHOST` - receive detailed description of the mailing list commands
+
+
+Mailing lists web archive
+-------------------------
+
+Archive of all mails posted to mailing lists is accessible via [http://lists.suckless.org/](http://lists.suckless.org/)
+
+* [dev mailing list archive][devarchive]
+* [hackers mailing list archive][hackersarchive]
+* [wiki mailing list archive][wikiarchive]
+
+Old
+---
+* [dwm mailing list archive][dwmarchive]
+* [wmii mailing list archive][wmiiarchive]
+
+Related lists
+-------------
+
+* [9fans](http://plan9.bell-labs.com/wiki/plan9/mailing_lists/#9fans) - Fans of the [Plan 9 from Bell Labs](http://9fans.net) operating system.
+* [inferno-list](http://plan9.bell-labs.com/wiki/plan9/mailing_lists/#INFERNO-LIST) - Inferno users and developers
+
+IRC
+---
+
+The channels are in the [OFTC](http://www.oftc.net) IRC network: [irc.oftc.net](irc://irc.oftc.net/)
+
+Official channel of suckless.org projects:
+
+* [#suckless](irc://irc.oftc.net/#suckless)
+
+Other popular channels:
+
+* [#acme](irc://irc.oftc.net/#acme)
+* [#plan9](irc://irc.freenode.net/#plan9)
+* [#inferno](irc://irc.freenode.net/#inferno)
+
+[devarchive]: http://lists.suckless.org/dev/
+[dwmarchive]: http://lists.suckless.org/dwm/
+[hackersarchive]: http://lists.suckless.org/hackers/
+[wikiarchive]: http://lists.suckless.org/wiki/
+[wmiiarchive]: http://lists.suckless.org/wmii/
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/devel/bugs.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/devel/bugs.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,28 @@
+BUGS
+====
+
+Debugging
+---------
+If you find any crashes, please send a full backtrace to the dedicated mailing list.
+You can create backtraces with `gdb`:
+
+Before starting a program, you may have to allow core file creation. It is
+recommended that you put this in your profile:
+
+    $ ulimit -c unlimited
+
+Then start the program as usual.
+
+After the program crashes, do the following:
+
+    $ gdb --quiet `which program` /path/to/core
+    gdb> bt full
+
+If you encounter freezes (no crash at all) of the program, you can debug as follows:
+
+    $ gdb --quiet `which program` --attach `pgrep -o  program`
+    gdb> bt full
+
+Send the output of that command to the mailing list along with the output of
+`program -v`! Thank you!
+
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/devel/faq.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/devel/faq.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,9 @@
+FAQ
+===
+Why don't you use autoconf, et al.?
+-----------------------------------
+We don't use auto*hell for various reasons, start here:
+
+* [&#8220;Stop the autoconf insanity! Why we need a new build system.&#8221;](http://freshmeat.net/articles/view/889/)
+* [&#8220;Why autoconf, automake and libtool fail&#8221;](http://www.ohse.de/uwe/articles/aal.html)
+* [&#8220;[9fans] configure misery&#8221;](http://lists.cse.psu.edu/archives/9fans/2003-November/029714.html)
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/devel/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/devel/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,3 @@
+Development
+===========
+This section contains general information about our software development.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/devel/patches.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/devel/patches.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,28 @@
+PATCHES
+=======
+
+diff generation
+---------------
+For mercurial users:
+
+    cd program-directory
+    hg diff > program-X.Y-yourpatchname.diff
+
+For tarballs:
+    
+    cd modified-program-directory/..
+    diff -up original-program-directory modified-program-directory > program-X.Y-yourpatchname.diff
+
+where `X.Y` is a wmii tag name or version number.
+
+patch program
+-------------
+For mercurial users:
+    
+    cd program-directory
+    hg patch path/to/patch.diff
+
+For tarballs:
+
+    cd program-directory
+    patch -p1 < path/to/patch.diff
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/devel/style_guide.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/devel/style_guide.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,49 @@
+Style guide of code hosted on suckless.org
+==========================================
+When it comes to code style questions, it is very likely that individual
+programmers will disagree. It is absolutely fine to use an individual style for
+individual projects, especially if only one developer is involved. However, if
+there are two or more programmers involved in a project, guidelines become
+handy in order to meet the first basic rule we follow:
+
+* Code developed by different individuals should follow a common style among those to found a consistent base.
+
+Thus consistency in the code style being used is more important than any
+particular detail of the style itself. Due to the fact that most of the software of
+suckless.org has been developed by more than one individual, some sort of
+common style found in the code appeared during the past years. This common
+style is described in detail, further on.
+
+C++
+---
+C++ was used in the early beginning and has been abandoned for various reasons.
+
+A summary of those reasons is: Nearly nobody understands C++ in all its
+facettes and details. C++ has been designed and evolved to support any
+programming language paradigm and feature invented by programming
+language designers until the OO hype and beyond. This leads to mutual
+exclusive programming paradigms and styles in one language and basically
+destroys the simplicity and clarity of its ancestor C. The usual
+workaround in the C++ world is to stick to certain C++ subsets, like only using
+one calling convention, not using exceptions, not using STL but using libstdc++
+etc.
+
+It took quite a while for some of us to realize that C++ leads to more complex
+software in general, because it provides the feature richness to do so. This is
+especially dangerous if average programmers are involved in a project. In our
+experience it is much more likely that a C++ project driven by average
+programmers will fail, than a C project. The reason for this is simple: C++ is
+hard to deal with when used in all its feature richness.
+
+We don't argue that C++ software performs better or worse than software written
+in C. However we argue that in general C++ software performs poorer than
+software written in C, because of its tendency to complexity and its hidden
+pitfalls like expensive function calls in loops or too many inlines.
+
+All these problems do not happen with C, because C is too simple to be
+misused in our opinion.
+
+So the second rule of this style guide concludes:
+
+* We use C as our primary programming language because it enforces clear and simple software.
+
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/donations.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/donations.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,35 @@
+DONATIONS
+=========
+We thank all people who have donated or are donating in one way or another
+to a suckless.org related project. We kindly ask to continue donating to the
+suckless.org project. As the project grows and grows, there are plans to get
+in touch with the [GSoC](http://code.google.com/soc/2008/) in 2009 to sponsor
+more less sucking projects we have in mind.
+
+Present
+-------
+Following people are currently donating in one or another way to the suckless.org project:
+
+* Jason Thigpen donates a slicehost server, which hosts the source code and the tarballs of our projects.
+* Anselm R Garbe donates all other servers currently in use.
+* John V. Turek donated <b> 10 EUR</b>
+
+Past
+----
+Following people have donated to the [wmii](/wmii) resp. [dwm](/dwm) project
+certain amounts of money, which have been used for the dedicated server rent
+in the past:
+
+* Filippo Negroni donated <b> 10 GBP </b>
+* Markus Schnalke donated <b> 10 EUR</b>
+* Sebastian Noack donated <b> 50 EUR </b>
+* Jason Thigpen donated <b> 100 USD </b>
+* Markus Schnalke donated <b> 20 EUR </b>
+* Enno 'Gottox' Boland donated <b>50 EUR</b>
+* Ivan F. Villanueva B. donated <b>20 EUR</b>
+* Alexandre Dulaunoy donated <b>100 EUR</b>
+* Alexis Hildebrandt donated <b>100 EUR</b>
+* Al Wong (aka alvin) donated <b>100 USD</b>
+* Heiko Schlichting (aka rundstutzen) donated <b>100 EUR</b>
+
+
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/manifest/dynamic_window_management.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/manifest/dynamic_window_management.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,42 @@
+DYNAMIC WINDOW MANAGEMENT
+=========================
+
+We think that static window management as seen in Ion or wmi-10 is a far too
+rigid and inflexible working environment. In [acme](http://acme.cat-v.org),
+larswm, and oberon, dynamic window management frees the user from these
+limitations. The user can start as many applications and windows as he likes,
+and easily arrange them in a useful way, helped by the window manager - the
+working environment changes with the tasks the user is performing. The
+experience is very fluid and natural.  Similar concepts have been introduced in
+wmii and dwm.
+
+Dynamic window management states that it is the window manager's job to manage
+windows - and not the user's job to have to set up some specialized layout that
+will only work for one specific work scenario. This has been the larswm motto
+for a long time. In contrast to static window management, the user rarely has
+to think about how to organize windows, no matter what he is doing or how many
+applications are running at the same time. The window manager adapts to the
+current environment and helps the user manage and mold it to his needs, rather
+than forcing it to use a preset, fixed layout and trying to shoehorn all
+windows and applications into it.
+
+Dynamic window management has many advantages - you can create and tear down
+whole working environments in a matter of seconds rather than spending time
+fine-tuning a fixed layout that cannot work well in all cases. The number and
+nature of windows you work with changes all the time, and a dynamic window
+manager lets you adapt to that and always efficiently use your precious screen
+real estate.
+
+Some will argue that you should setup a different static workspace for each of
+the tasks you perform (one for web browsing, one for email reading, one for
+coding, etc.), but that is just a workaround for the limitations of static
+window management, and it doesn't account for the many sub-usage patterns each
+main task has.
+
+For example: the layout you use during debugging would probably be quite
+different to the one used during refactoring, you might want to have a patch
+someone emailed you in view while you look at some code, or edit a
+configuration file while you look at a man page or website. Dynamic window
+management lets you mix and match on the fly to always have the windows you
+need in view, and only the windows you need, without the need to reserve extra
+space which you may or may not end up using.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/manifest/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/manifest/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,59 @@
+SUCK LESS PHILOSOPHY
+====================
+
+Background
+----------
+We are the home of quality software such as [dwm](http://dwm.suckless.org),
+[dmenu](http://tools.suckless.org), [libixp](http://libs.suckless.org/libixp),
+[wmii](http://wmii.suckless.org) and plenty of other [tools](http://tools.suckless.org), with
+a focus on simplicity, clarity and frugality. Our philosophy is
+about keeping things simple, minimal and usable. We believe this should become
+the mainstream philosophy in the IT sector. Unfortunately, the tendency for
+complex, error-prone and slow software seems to be prevalent in the present-day
+software industry. We intend to prove the opposite with our software projects.
+
+Our project focuses on advanced and experienced computer users. In contrast
+with the usual proprietary software world or many mainstream open source
+projects that focus more on average and non-technical end users, we think that
+experienced users are mostly ignored. This is particularly true for user
+interfaces, such as graphical environments on desktop computers, on mobile
+devices, and in so-called Web applications. We believe that the market of
+experienced users is growing continuously, with each user looking for more
+appropriate solutions for his/her work style.
+
+Designing simple and elegant software is far more difficult than letting ad-hoc
+or over-ambitious features obscure the code over time. However one has to pay
+this price to achieve reliability and maintainability. Furthermore, minimalism
+results in reasonable and attainable goals. We strive to maintain minimalism and
+clarity to drive development to completion.
+
+Manifest
+--------
+Many (open source) hackers are proud if they achieve large amounts of code,
+because they believe the more lines of code they've written, the more progress
+they have made. The more progress they have made, the more skilled they are.
+This is simply a delusion.
+
+Most hackers actually don't care much about code quality. Thus, if they get
+something working which seems to solve a problem, they stick with it. If this
+kind of software development is applied to the same source code throughout its
+entire life-cycle, we're left with large amounts of code, a totally screwed
+code structure, and a flawed system design. This is because of a lack of
+conceptual clarity and integrity in the development process.
+
+Code complexity is the mother of bloated, hard to use, and totally inconsistent
+software. With complex code, problems are solved in suboptimal ways, valuable
+resources are endlessly tied up, performance slows to a halt, and
+vulnerabilities become a commonplace. The only solution is to scrap the entire
+project and rewrite it from scratch.
+
+The bad news: quality rewrites rarely happen, because hackers are proud of
+large amounts of code. They think they understand the complexity in the code,
+thus there's no need to rewrite it. They think of themselves as masterminds,
+understanding what others can never hope to grasp. To these types, complex
+software is the ideal.
+
+Ingenious ideas are simple. Ingenious software is simple. Simplicity is the
+heart of the Unix philosophy. The more code lines you have removed, the more
+progress you have made. As the number of lines of code in your software
+shrinks, the more skilled you have become and the less your software sucks.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/misc/broken_programs.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/misc/broken_programs.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,50 @@
+BROKEN PROGRAMS
+===============
+
+There are many broken X programs. Go bug the developers of these
+broken programs to fix them. Here are some of the main causes of this
+brokenness:
+
+* The program assumes a specific window management model, i.e.
+  assumes you are using a WIMP-window manager like those found in KDE
+  or Gnome. This assumption breaks the [ICCCM conventions](http://tronche.com/gui/x/icccm/).
+* The application uses a fixed size - this limitation does not fit
+  into the world of tiling window managers very well,
+  and can also be seen as breaking the ICCCM conventions, because a
+  fixed sized window assumes a specific window management model as
+  well (though the ICCCM does not forbid fixed-size windows). In any
+  case, the ICCCM requests that clients accept any size the window
+  manager proposes to them.
+* The program is based on strange non-standard window manager
+  hints that only work properly with a window manager supporting
+  these extensions - this simply breaks the ICCCM as well. E.g. trash
+  icon programs.
+* The program does not conform to ICCCM due to some missing or
+  improperly set hints.
+
+WORKAROUND
+----------
+
+If you still need some program which expects a floating WM, use it in
+floating mode.
+
+The following programs are broken (see [cool programs](/common/cool_programs.html) for saner alternatives):
+
+* beep-media-player
+* [Firefox](http://www.mozilla.org/products/firefox) (doesn't set the
+  TRANSIENT_FOR hint correctly on its download dialog)
+* [GIMP](http://www.gimp.org/) (GIMP expects a float environment to
+  be useable)
+* gqview
+* gthumb
+* mplayer with GUI (assumes special window management model. It works
+  without the GUI)
+* Xchat
+* xine (same as xmms)
+* XMMS (assumes fixed size, doesn't set transient_for hint properly)
+
+
+SEE ALSO
+--------
+
+The [list of harmful software](http://harmful.cat-v.org/software/) at [cat-v.org](http://cat-v.org).
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/misc/cool_programs.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/misc/cool_programs.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,100 @@
+COOL PROGRAMS
+=============
+
+Some programs work well with wmii or dwm. Some general rules of thumb
+for judging a programs as usable are:
+
+* The program will accept any window size
+* The program consists of a single window (There are no nested windows, such as in Xpdf)
+
+This covers most console-based programs and programs from [plan9port][].
+
+Text Editors
+------------
+* [acme][acme] - [Rob Pike][rob]'s framing text editor for Plan 9. Included in [plan9port][].
+* [nvi](http://www.bostic.com/vi/) - A small, multiple file vi-alike.
+* [sam](http://sam.cat-v.org/) - An editor by [Rob Pike][rob] with inspiration from ed.
+* [traditional vi](http://ex-vi.sourceforge.net/) - A fixed version of the original vi.
+* [vim](http://www.vim.org) (With the GUI, use `:set go+=c` to kill popup dialogs)
+* [wily](http://www.cs.yorku.ca/~oz/wily/) - An acme clone for POSIX.
+
+Audio Players
+-------------
+* [cmus](http://onion.dynserv.net/~timo/cmus.html)
+* [cplay](http://mask.tf.hut.fi/~flu/hacks/cplay/)
+* [moc](http://moc.daper.net/)
+* [mpd](http://www.musicpd.org/) - A client/server based music player with console and graphical front-ends.
+* [mpg123](http://www.mpg123.de/) - A console mpg player which doesn't use auto*hell, or extra libraries.
+* [mpg321](http://mpg321.sourceforge.net)
+* [PyTone](http://www.luga.de/pytone/) - PyTone is a music jukebox written in Python with a curses based GUI. It provides features like crossfading and multiple players, special emphasis is put on ease of use.
+* [vorbis-tools](http://www.xiph.org/) (Ogg/FLAC) - Command-line tools to play Ogg and FLAC files.
+
+Media Players
+-------------
+* [mplayer](http://www.mplayerhq.hu/) (without GUI) - You know mplayer, but you may not know that it works well without the GUI.
+* smplayer
+
+Utilities
+---------
+* [9menu](http://www.freshports.org/x11/9menu/) - A menu program based on the Blit-style menus so prevalent in Plan 9.
+	  A take on it is included with wmii.
+* [dmenu](/programs/dmenu.html) - Obvious
+
+Image Viewers
+-------------
+* [feh](http://linuxbrit.co.uk/feh/)
+* [jpg/gif/bmp/png][plan9port] - Simple programs from Plan 9 to display images in no-frills windows. Included with plan9port.
+* [page][plan9port] - Plan 9's image/document viewer program. Included with plan9port.
+* [qiv](http://www.klografx.net/qiv/)
+* [xli](http://pantransit.reptiles.org/prog/)
+* [xzgv](http://sourceforge.net/projects/xzgv)
+
+IRC Clients
+-----------
+* [acme:SAC](http://caerwyn.com/acme/index.html)
+* [ii](/programs/ii.html) - A FIFO based IRC client which is part of the suckless.org project.
+* [ircc](http://www.r-36.net/ircc.tgz) - A no-frills, ncurses free, console-based IRC client.
+* [Irc](http://swtch.com/irc/)
+* [ircrc](http://plan9.bell-labs.com/sources/contrib/fgb/rc/ircrc) - An rc-based IRC client similar to ircc. Needs minor modification to run on UNIX.
+* [irssi](http://www.irssi.org/)
+* [sic](/programs/sic.html) - Another suckless.org IRC client. Similar to ircc.
+
+Mail Clients
+------------
+* [heirloom-mailx](http://heirloom.sourceforge.net/mailx.html) - A mail client based on the original Berkeley Mail 8.1 with many new features.
+* [Mail][plan9port] - A mail client for [acme][acme]. Included with plan9port.
+* [mutt](http://www.mutt.org/)
+* [muttator](http://vimperator.org/) - A Thunderbird extension to make it keyboard friendly and mutt/Vim-like.
+* [nmh](http://www.nongnu.org/nmh/)
+* Sylpheed claws
+
+Instant Messaging Clients
+-------------------------
+* [bitlbee](http://www.bitlbee.org/) - A program to translate IM protocols to IRC. You can now IM from your IRC client, and you don't even need to install anything.
+* [centericq](http://konst.org.ua/centericq/)
+* [centerim](http://www.centerim.org/) - A centericq fork.
+* [climm](http://www.climm.org/)
+* [mcabber](http://www.lilotux.net/~mikael/mcabber/) - A console jabber client.
+* [ysm](http://ysmv7.sourceforge.net/)
+
+Web Browsers
+------------
+* [Vimperator](http://vimperator.org/) - An extension to make Firefox keyboard friendly and Vim-like.
+	Developed in part by wmii's maintainer.
+* [Conkeror](http://www.conkeror.org/) - A Gecko based browser, imparting it Emacs style key bindings, appearances, and behaviors.
+* [Dillo](http://www.dillo.org/) (try the i18n version)
+* [ELinks](http://elinks.or.cz/)
+* [links2](http://links.twibright.com/)
+* [Lynx](http://lynx.isc.org/)
+* [w3m](http://w3m.sf.net/)
+* [edbrowse](http://edbrowse.sourceforge.net/)
+* [uzbl](http://uzbl.org/)
+
+Web Servers (httpd)
+------------
+* [Nostromo](http://www.nazgul.ch/dev_nostromo.html)
+
+[rob]: http://herpolhode.com/rob/
+[plan9port]: http://swtch.com/plan9port/
+[acme]: http://acme.cat-v.org
+
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/misc/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/misc/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,3 @@
+MISC
+====
+This section contains information that has no particular category.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/other_projects.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/other_projects.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,11 @@
+OTHER PROJECTS
+==============
+There are several other projects which are inspired by the spirit of suckless.
+
+* [dietline](http://news.nopcode.org/dietline.c)
+* [dvtm](http://www.brain-dump.org/projects/dvtm/)
+* [dzen](http://dzen.geekmode.org/)
+* [kelp](http://kelp.sf.net)
+* [sltar](http://s01.de/~gottox/index.cgi/proj_sltar)
+* [smu](http://s01.de/~gottox/index.cgi/proj_smu)
+* [bgs](http://s01.de/~gottox/index.cgi/proj_bgs)
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/people/Pancake.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/people/Pancake.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,6 @@
+pancake
+=======
+
+Developer of various minimal tools and main author of [radare](http://www.radare.org).
+
+* See also other projects: <http://hg.youterm.com/>
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/project_ideas.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/project_ideas.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,181 @@
+PROJECT IDEAS FOR FUTURE GSOCs
+==============================
+We applied as a mentoring organization for [Google Summer of Code 2009](http://code.google.com/soc/), but were rejected this time. Perhaps we will apply in 2010 again.
+
+Please read our [philosophy](/manifest) for background information.
+
+Mentors
+-------
+We intend that each student will be the project leader of his/her particular
+project and the only individual with commit privilege for the repository.
+
+There will be one mentor and one backup mentor per project. In addition, the
+suckless.org community will act as a rigid external reviewer of the
+student's progress, as well as of the mentor's.
+
+General ideas
+-------------
+Our project ideas in general intended to focus on:
+
+* Graphical user interfaces for expert users (such as more advanced
+  concepts for mail clients, messaging clients, music players, text editors)
+* Web applications for expert users following our GUI concepts
+* Mobile applications for expert users following our GUI concepts
+* General userland enhancements to Unix-like operating systems, in particular
+  GNU/Linux
+* Audio applications
+* Image/Streaming/Gallery desktop and web applications
+* Foundations of a new windowing system for Unix-like operating systems
+  (based on xorg drivers, but no X11- or XServer-dependency)
+* Improvements of our existing software projects
+
+Concrete ideas
+--------------
+The listed ideas generally require good knowledge of C and experience with
+Unix-like operating systems. The difficulty ranges from medium to high.
+An academic background in computer science is desirable but not essential.
+
+### Unix utilities
+
+Projects like [dmenu](http://tools.suckless.org/dmenu) prove that it's possible
+to bring the Unix philosophy onto the desktop and into the land of graphical
+applications. We believe that there is big potential for doing similar things
+for other purposes such as managing contacts, bookmarks, browsing
+files/directories, reading/managing mails, organizing/viewing images/videos and
+listening to music, all in a very elegant and Unix-like way. We believe that such
+tools should have a GUI but communicate via standard I/O and be very flexible in
+the combination of their purposes.
+
+***Requirements:*** Good knowledge of the Unix userland, C and of the Xlib is essential.
+
+### Port dwm to different platforms
+
+Many dwm users who have to use Microsoft Windows regularly have requested a
+port of dwm to Microsoft Windows. There are several tiling window managers, but
+unfortunately the majority are proprietary software and can't keep up with dwm.
+
+Similarly we believe that porting dwm to Mac OS X, or onto mobile devices (with
+certain constraints) might create a new paradigm of future window management
+concepts in mainstream software.
+
+There might also be the opportunity to make dwm itself more friendly with
+well-established desktop environments, to integrate well with Gnome or KDE in
+order to prove that dynamic and tiled window management should be the default
+in future window management concepts.
+
+***Requirements:*** Good knowledge of the Xlib and C is desirable. Also good
+knowledge of the specific target platform, such as Cocoa/Quartz on Max OS X,
+ resp. Win32 API on Windows would be desirable.
+
+### ddm
+
+There is no suckless display manager for X11 at the moment, thus a new
+dynamic display manager (ddm) should be designed and implemented.
+
+***Requirements:*** Good knowledge of the Xlib and C is desirable.
+
+### stm
+
+There seems to be a need for a suckless ticket management system, as this
+is a common task in today's daily activity in business and private time
+management. This task includes the design and implementation of a suckless
+system that solves the problems of TTS (Trouble Ticket System), ARS (Action
+Request System) and IRS (Incident Response System) all together.
+
+***Requirements:*** Good knowledge of web technologies are essential, good knowledge of C is desirable.
+
+### Lightweight volume manager alternative
+
+We'd like to see a lightweight and simple alternative to gnome-volume-manager
+and similar programs.
+
+There's one such project already available at <http://tools.suckless.org/skvm>.
+
+***Requirements:*** Good C knowledge and knowledge of DBUS and similar techniques are essential.
+
+### Yet another less sucking editor
+
+Although vi(m) does its job, it has become a monster over the years. We
+believe there is a gap between [ed](http://man.cat-v.org/plan_9/1/ed), [sam](http://sam.cat-v.org), [acme](http://acme.cat-v.org) and vim which must be filled with
+a completely new, less-sucking editor.
+
+***Requirements:*** Good C knowledge and knowledge of I/O APIs is essential.
+
+### Less sucking C99 subset spec
+
+Although sufficient, C99 is not a perfect programming language. It suffers from
+legacy syntax and semantics and lacks features that make designing libraries
+and developing abstractions much easier. To address these shortcomings the
+student should survey the problems of C, evaluate possible solutions and
+enhance the language as a subset of C99.
+
+***Requirements:*** Very good C knowledge is essential.
+
+### Modern libc
+
+The standard libc is full of awkward and legacy concepts. We believe that
+recent approaches such as Google's bionic libc are a step into the right
+direction, though not radical enough. We think there is a great opportunity to
+implement a completely new libc which abstracts a very nice standard
+environment which can be implemented on modern OS platforms in a straightforward manner. 
+Our goal would be to realize an initial proposal on Linux.
+
+***Requirements:*** Very good C knowledge is essential.
+
+### Improve tcc
+
+We'd like to see [tcc](http://bellard.org/tcc/) being continued and improved.  gcc is too slow and too
+focused on language-agnostics and particularly focused on its C++ support. We
+have the impression that most open source software is written in C and makes no
+use of C++, so we desire an improved tcc.
+
+We are also concerned about recent attempts to implement the C front-end of gcc
+in C++. We believe that is a bad decision in general (due to demanding C++ as
+bootstrapping environment) and would like to get rid of the gcc dependency
+for these reasons.
+
+We'd like the improved tcc to be able to build all suckless projects
+and perhaps the modern libc replacement.
+
+***Requirements:*** Very good C knowledge is essential as well as knowledge of x86 assembler and executable formats.
+
+### Comprehensive code audit
+
+All software hosted at suckless.org should undergo a comprehensive
+code audit. This includes search for vulnerabilities, verification of
+all algorithms, proof-reading of the documentation and possibly a code
+clean-up. The result has to be a report on all found errors and maybe some
+advice for the project maintainers. This task requires experience in this
+field.
+
+***Requirements:*** Good C knowledge is essential.
+
+### Improve sltar
+
+[sltar](http://s01.de/~gottox/index.cgi/proj_sltar) is a simplified tar
+implementation which lacks gzip and bzip2 integration. The task requires to
+extend sltar with these and to also write a test suite for it.
+
+***Requirements:*** Good C knowledge would be desirable.
+
+### Write a decent mailing list Web archive system
+
+All web archive systems such as hypermail, pipermail, etc. have plenty
+drawbacks and are quite out-dated. This task requires to write a completely new
+web mailing list archiving tool that follows the thread view concepts found in
+the mutt MUA and which is designed with low footprint and efficiency in mind.
+
+We expect this tool as a stand-alone Unix tool written in C or shell.
+
+***Requirements:*** Good C/Shell/HTML5 knowledge would be desirable.
+
+### Extend werc with a repository browser
+
+This task requires to extend [werc](http://werc.cat-v.org) with a source
+browser for VCS repositories including support for
+[subversion](http://subversion.tigris.org/),
+[mercurial](http://www.selenic.com/mercurial/) and [git](http://git-scm.com).
+
+***Requirements:*** Good knowledge of the [rc](http://en.wikipedia.org/wiki/Rc) shell
+and the [Plan 9 userland for Unix](http://plan9.us) is essential. Good C
+knowledge for the helper tools would be desirable.
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox.md
--- a/suckless.org/wiki/sandbox.md	Thu Aug 27 12:57:08 2009 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
_AT_@ -1,19 +0,0 @@
-SANDBOX
-=========
-This is a test sandbox, to show all features of markdown.
-
-Topic
------
-[a link](http://suckless.org)
-
-	a bold text
-
-*italics*
-
-Blah blah
-
-
-Comment
------
-Please add all possibilities of markdown, I had no time for reviewing the code. -- Zwansch
-
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,19 @@
+SANDBOX
+=========
+This is a test sandbox, to show all features of markdown.
+
+Topic
+-----
+[a link](http://suckless.org)
+
+	a bold text
+
+*italics*
+
+Blah blah
+
+
+Comment
+-----
+Please add all possibilities of markdown, I had no time for reviewing the code. -- Zwansch
+
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu1/subsubmenu1/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu1/subsubmenu1/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu1/subsubmenu2/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu1/subsubmenu2/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu1/subsubmenu3/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu1/subsubmenu3/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu1/subsubmenu4/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu1/subsubmenu4/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu2/subsubmenu1/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu2/subsubmenu1/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu2/subsubmenu2/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu2/subsubmenu2/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu2/subsubmenu3/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu2/subsubmenu3/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu3/subsubmenu1/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu3/subsubmenu1/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 suckless.org/wiki/sandbox/submenu3/subsubmenu2/index.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/suckless.org/wiki/sandbox/submenu3/subsubmenu2/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,1 @@
+test
diff -r 9960091a4124 -r 358b27c0da93 surf.suckless.org/_werc/config
--- a/surf.suckless.org/_werc/config	Thu Aug 27 12:57:08 2009 -0400
+++ b/surf.suckless.org/_werc/config	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,3 +1,4 @@
 masterSite=default.suckless.org
 siteTitle='surf'
-siteSubTitle='surf browser, a WebKit based browser'
+siteImage='/surf.png'
+siteSubTitle='a WebKit based browser'
diff -r 9960091a4124 -r 358b27c0da93 surf.suckless.org/_werc/lib/top_bar.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/surf.suckless.org/_werc/lib/top_bar.inc	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+    <ul>
+      <li><a href="http://suckless.org">home/</a></li>
+      <li><a href="http://hg.suckless.org">code</a></li>
+      <li><a href="http://dl.suckless.org">download</a></li>
+      <li><a href="http://man.suckless.org">man/</a></li>
+      <li><a href="http://dwm.suckless.org">dwm/</a></li>
+      <li><a href="http://libs.suckless.org">libs/</a></li>
+      <li><a href="http://st.suckless.org">st</a></li>
+      <li class="thisPage"><a href="http://surf.suckless.org">surf</a></li>
+      <li><a href="http://tools.suckless.org">tools/</a></li>
+      <li><a href="http://wmii.suckless.org">wmii/</a></li>
+      <li><a href="http://wmi.suckless.org">wmi/</a></li>
+    </ul>
diff -r 9960091a4124 -r 358b27c0da93 surf.suckless.org/index.md
--- a/surf.suckless.org/index.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/surf.suckless.org/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,10 +1,3 @@
-![surf](surf.gif)
-
-SURF
-====
-
-Description
------------
 surf is a simple web browser based on WebKit/GTK+. It is able
 to display websites and follow links. It supports the XEmbed protocol
 which makes it possible to embed it in another application. Furthermore,
_AT_@ -13,13 +6,14 @@
 
 Links
 -----
-* [Man page](http://hg.suckless.org/surf/raw-file/tip/LICENSE)
+* [Man page](http://man.suckless.org/surf/1/surf)
 * Mailing List: `dev+subscribe_AT_suckless.org` ([Archives](http://lists.suckless.org/dev))
 * IRC channel: #suckless at irc.oftc.net
 
 Download
 --------
 * [MIT/X Consortium license](http://hg.suckless.org/surf/raw-file/tip/LICENSE)
+* [surf 0.1.2](http://dl.suckless.org/surf/surf-0.1.2.tar.gz) (7.6kb) (20090910)
 * See also [dmenu](http://tools.suckless.org/dmenu)
 
 Development
diff -r 9960091a4124 -r 358b27c0da93 surf.suckless.org/surf.gif
Binary file surf.suckless.org/surf.gif has changed
diff -r 9960091a4124 -r 358b27c0da93 surf.suckless.org/surf.png
Binary file surf.suckless.org/surf.png has changed
diff -r 9960091a4124 -r 358b27c0da93 tools.suckless.org/9base.md
--- a/tools.suckless.org/9base.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/tools.suckless.org/9base.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -8,13 +8,17 @@
 * awk
 * basename
 * bc
+* cal
 * cat
 * cleanname
 * date
 * dc
+* du
 * echo
 * grep
+* hoc
 * ls
+* mk
 * rc
 * read
 * sed
_AT_@ -25,19 +29,19 @@
 * test
 * touch
 * tr
+* troff
 * uniq
 * yacc
 
 It also contains the Plan 9 libc, libbio, libregexp, libfmt and libutf.
-The overall SLOC is about 36kSLOC, so this userland + all libs is much smaller as for example bash (duh!).
+The overall SLOC is about 40kSLOC, so this userland + all libs is much smaller as for example bash (duh!).
 
 
 Download
 --------
-* [9base-3](http://dl.suckless.org/tools/9base-3.tar.gz) (20090803)
+* [9base-4](http://dl.suckless.org/tools/9base-4.tar.gz) (20090827)
 * <code>hg clone [http://hg.suckless.org/9base](http://hg.suckless.org/9base)</code>
 
 Usage
 -----
 9base can be used to run [werc](http://werc.cat-v.org) instead of the full blown [plan9port](http://swtch.com/plan9port).
-
diff -r 9960091a4124 -r 358b27c0da93 tools.suckless.org/_werc/lib/top_bar.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools.suckless.org/_werc/lib/top_bar.inc	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+    <ul>
+      <li><a href="http://suckless.org">home/</a></li>
+      <li><a href="http://hg.suckless.org">code</a></li>
+      <li><a href="http://dl.suckless.org">download</a></li>
+      <li><a href="http://man.suckless.org">man/</a></li>
+      <li><a href="http://dwm.suckless.org">dwm/</a></li>
+      <li><a href="http://libs.suckless.org">libs/</a></li>
+      <li><a href="http://st.suckless.org">st</a></li>
+      <li><a href="http://surf.suckless.org">surf</a></li>
+      <li class="thisPage"><a href="http://tools.suckless.org">tools/</a></li>
+      <li><a href="http://wmii.suckless.org">wmii/</a></li>
+      <li><a href="http://wmi.suckless.org">wmi/</a></li>
+    </ul>
diff -r 9960091a4124 -r 358b27c0da93 tools.suckless.org/dmenu.md
--- a/tools.suckless.org/dmenu.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/tools.suckless.org/dmenu.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -12,143 +12,6 @@
 ------------
 * `dev+subscribe_AT_suckless.org` ([Archives](http://lists.suckless.org/dev/)) ([Old Archives](http://lists.suckless.org/dwm/)) (see [community](http://suckless.org/common/community/) for details)
 
-<H2>SYNOPSIS</H2>
-
-<B>dmenu</B>
-
-[<B>-i</B>]
-
-[<B>-b</B>]
-
-[<B>-fn</B> &lt;font&gt;]
-
-[<B>-nb</B> &lt;color&gt;]
-
-[<B>-nf</B> &lt;color&gt;]
-
-[<B>-p</B> &lt;prompt&gt;]
-
-[<B>-sb</B> &lt;color&gt;]
-
-[<B>-sf</B> &lt;color&gt;]
-
-[<B>-v</B>]
-
-<A NAME="lbAD">&nbsp;</A>
-<H2>DESCRIPTION</H2>
-
-<A NAME="lbAE">&nbsp;</A>
-<H3>Overview</H3>
-
-dmenu is a generic menu for X, originally designed for
-<B>dwm</B>(1).
-
-It manages huge amounts (up to 10.000 and more) of user defined menu items
-efficiently.
-<A NAME="lbAF">&nbsp;</A>
-<H3>Options</H3>
-
-<DL COMPACT>
-<DT><B>-i</B>
-
-<DD>
-makes dmenu match menu entries case insensitively.
-<DT><B>-b</B>
-
-<DD>
-defines that dmenu appears at the bottom.
-<DT><B>-fn &lt;font&gt;</B>
-
-<DD>
-defines the font.
-<DT><B>-nb &lt;color&gt;</B>
-
-<DD>
-defines the normal background color (#RGB, #RRGGBB, and color names are supported).
-<DT><B>-nf &lt;color&gt;</B>
-
-<DD>
-defines the normal foreground color (#RGB, #RRGGBB, and color names are supported).
-<DT><B>-p &lt;prompt&gt;</B>
-
-<DD>
-defines a prompt to be displayed before the input area.
-<DT><B>-sb &lt;color&gt;</B>
-
-<DD>
-defines the selected background color (#RGB, #RRGGBB, and color names are supported).
-<DT><B>-sf &lt;color&gt;</B>
-
-<DD>
-defines the selected foreground color (#RGB, #RRGGBB, and color names are supported).
-<DT><B>-v</B>
-
-<DD>
-prints version information to standard output, then exits.
-</DL>
-<A NAME="lbAG">&nbsp;</A>
-<H2>USAGE</H2>
-
-dmenu reads a list of newline-separated items from standard input and creates a
-menu.  When the user selects an item or enters any text and presses Return, his/her
-choice is printed to standard output and dmenu terminates.
-<P>
-
-dmenu is completely controlled by the keyboard. The following keys are recognized:
-<DL COMPACT>
-<DT><B>Any printable character</B>
-
-<DD>
-Appends the character to the text in the input field.  This works as a filter:
-only items containing this text will be displayed.
-<DT><B>Left/Right (Mod1-h/Mod1-l)</B>
-
-<DD>
-Select the previous/next item.
-<DT><B>PageUp/PageDown (Mod1-k/Mod1-j)</B>
-
-<DD>
-Select the first item of the previous/next 'page' of items.
-<DT><B>Home/End (Mod1-g/Mod1-G)</B>
-
-<DD>
-Select the first/last item.
-<DT><B>Tab (Control-i)</B>
-
-<DD>
-Copy the selected item to the input field.
-<DT><B>Return (Control-j)</B>
-
-<DD>
-Confirm selection and quit (print the selected item to standard output). Returns
-<B>0</B>
-
-on termination.
-<DT><B>Shift-Return (Control-Shift-j)</B>
-
-<DD>
-Confirm selection and quit (print the text in the input field to standard output).
-Returns
-<B>0</B>
-
-on termination.
-<DT><B>Escape (Control-bracketleft)</B>
-
-<DD>
-Quit without selecting an item. Returns
-<B>1</B>
-
-on termination.
-<DT><B>Backspace (Control-h)</B>
-
-<DD>
-Remove a character from the input field.
-<DT><B>Control-u</B>
-
-<DD>
-Remove all characters from the input field.
-<DT><B>Control-w</B>
-
-<DD>
-Remove all characters of current word from the input field.
-</DL>
+Links
+-----
+* [Man page](http://man.suckless.org/tools/1/dmenu)
diff -r 9960091a4124 -r 358b27c0da93 tools.suckless.org/ii.md
--- a/tools.suckless.org/ii.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/tools.suckless.org/ii.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -26,7 +26,7 @@
     |-- out
     `-- in
 
-It consists of <= 500 lines of code and is the big brother of [sic](/programs/sic.html)
+It consists of <= 500 lines of code and is the big brother of [sic](/sic)
 
 Download
 --------
diff -r 9960091a4124 -r 358b27c0da93 tools.suckless.org/sic.md
--- a/tools.suckless.org/sic.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/tools.suckless.org/sic.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,6 +1,6 @@
 SIMPLE IRC CLIENT
 =================
-sic is an extremely simple IRC client. It consists of lesser than 250 lines of code. It is the little brother of [irc it](/ii).
+sic is an extremely simple IRC client. It consists of less than 250 lines of code. It is the little brother of [irc it](/ii).
 
 Download
 --------
_AT_@ -8,79 +8,10 @@
 
 Development
 -----------
-You can [browse](http://hg.suckless.org/sic) its source code repository or get a copy using [Mercurial](http://www.selenic.com/mercurial/) with following command:
+You can [browse](http://hg.suckless.org/sic) its source code repository or get a copy using [Mercurial](http://www.selenic.com/mercurial/) with the following command:
 
 	hg clone http://hg.suckless.org/sic
 
-
-<H2>SYNOPSIS</H2>
-
-<B>sic</B>
-
-[<B>-h</B> &lt;host&gt;]
-
-[<B>-p</B> &lt;port&gt;]
-
-[<B>-n</B> &lt;nick&gt;]
-
-[<B>-k</B> &lt;keyword&gt;]
-
-[<B>-v</B>]
-
-<A NAME="lbAD">&nbsp;</A>
-<H2>DESCRIPTION</H2>
-
-<B>sic</B>
-
-is an extremely fast, small and simple irc client.  It reads commands from
-standard input and prints all server output to standard output. It multiplexes
-also all channel traffic into one output, that you don't have to switch
-different channel buffers, that's actually a feature.
-<A NAME="lbAE">&nbsp;</A>
-<H2>OPTIONS</H2>
-
-<DL COMPACT>
-<DT><B>-h &lt;host&gt;</B>
-
-<DD>
-Overrides the default host (irc.oftc.net)
-<DT><B>-p &lt;port&gt;</B>
-
-<DD>
-Overrides the default port (6667)
-<DT><B>-n &lt;nickname&gt;</B>
-
-<DD>
-Override the default nick ($USER)
-<DT><B>-k &lt;keyword&gt;</B>
-
-<DD>
-Specifies the keyword to authenticate your nick on the host
-<DT><B>-v</B>
-
-<DD>
-Prints version information to standard output, then exits.
-</DL>
-<A NAME="lbAF">&nbsp;</A>
-<H2>COMMANDS</H2>
-
-<DL COMPACT>
-<DT><B>:j #channel</B>
-
-<DD>
-Join a channel
-<DT><B>:l #channel</B>
-
-<DD>
-Leave a channel
-<DT><B>:m #channel/user msg</B>
-
-<DD>
-Write a message to #channel/user
-<DT><B>:s #channel/user</B>
-
-<DD>
-Set default channel/user
-<DT>Everything which is not a command is simply send the server.<DD>
-<P>
-</DL>
+Links
+-----
+* [Man page](http://man.suckless.org/tools/1/sic)
diff -r 9960091a4124 -r 358b27c0da93 tools.suckless.org/slock.md
--- a/tools.suckless.org/slock.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/tools.suckless.org/slock.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,7 +1,7 @@
 SLOCK
 =====
-Simple X display locker. Really this is the simplest X screen locker we are
-aware of. It is stable and quite a lot people in this community are using it
+Simple X display locker. This is the simplest X screen locker we are
+aware of. It is stable and quite a lot of people in our community are using it
 every day when they are out with friends or fetching some food from the local
 pub.
 
diff -r 9960091a4124 -r 358b27c0da93 wmi.suckless.org/_werc/lib/top_bar.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wmi.suckless.org/_werc/lib/top_bar.inc	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+    <ul>
+      <li><a href="http://suckless.org">home/</a></li>
+      <li><a href="http://hg.suckless.org">code</a></li>
+      <li><a href="http://dl.suckless.org">download</a></li>
+      <li><a href="http://man.suckless.org">man/</a></li>
+      <li><a href="http://dwm.suckless.org">dwm/</a></li>
+      <li><a href="http://libs.suckless.org">libs/</a></li>
+      <li><a href="http://st.suckless.org">st</a></li>
+      <li><a href="http://surf.suckless.org">surf</a></li>
+      <li><a href="http://tools.suckless.org">tools/</a></li>
+      <li><a href="http://wmii.suckless.org">wmii/</a></li>
+      <li class="thisPage"><a href="http://wmi.suckless.org">wmi/</a></li>
+    </ul>
diff -r 9960091a4124 -r 358b27c0da93 wmi.suckless.org/index.md
--- a/wmi.suckless.org/index.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/wmi.suckless.org/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,19 +1,20 @@
-WMI
-===
-wmi was the initial project which became popular, though [wmii](/wmii/) is the
+wmi was the initial project which became popular, though [wmii](http://wmii.suckless.org) is the
 successor of wmi. The last release of wmi happened back in 2004. There are still
-some occasional users of wmi. If you like to check how the good old days felt,
-check it out, though its code sucks more unfortunately than our more
-recent projects.
+some occasional users of wmi. If you would like to experience the good old days,
+please check it out; though, its code sucks more unfortunately than our recent projects.
+
+*UPDATE* There will be a wmi-11 release in Sep 2009 very soon!
 
 ->[![Screenshot](screenshots/wmi-20080718s.png)](screenshots/wmi-20080718.png)<-
 
 Download
 --------
-You can download the historic copy of
-[wmi-10](http://dl.suckless.org/misc/wmi-10.tar.gz). Unfortunately there
-is no associated repository anymore. There used to be a subversion repository
-in the older days.
+You can download an historic copy of
+[wmi-10](http://dl.suckless.org/misc/wmi-10.tar.gz). You can also [browse](http://hg.suckless.org/wmi) its source code repository or get a copy using [Mercurial](http://www.selenic.com/mercurial/) with the following command:
+
+	hg clone http://hg.suckless.org/wmi
+
+(The repository contains the source code of the upcoming wmi-11 release!!!)
 
 Build
 -----
_AT_@ -21,8 +22,12 @@
 years ago, you will need to apply [this
 patch](wmi-10_compile_fixes.diff) by Sergey Dolgov.
 
+The upcoming wmi-11 version from the source repository just builds fine with current systems.
+
 Issues
 ------
 If you want to contact the author of wmi, use his proper email address
 [garbeam_AT_gmail.com](mailto:garbeam_AT_gmail.com) -- the email address presented in
-the wmi-10 source isn't valid anymore.
+the wmi-10 source isn't valid anymore. Though that's fixed in the upcoming wmi-11 release.
+
+Have fun!
diff -r 9960091a4124 -r 358b27c0da93 wmii.suckless.org/_werc/config
--- a/wmii.suckless.org/_werc/config	Thu Aug 27 12:57:08 2009 -0400
+++ b/wmii.suckless.org/_werc/config	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,3 +1,4 @@
 masterSite=default.suckless.org
 siteTitle='wmii'
+siteImage='/wmii.png'
 siteSubTitle='window manager improved 2'
diff -r 9960091a4124 -r 358b27c0da93 wmii.suckless.org/_werc/lib/top_bar.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wmii.suckless.org/_werc/lib/top_bar.inc	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -0,0 +1,13 @@
+    <ul>
+      <li><a href="http://suckless.org">home/</a></li>
+      <li><a href="http://hg.suckless.org">code</a></li>
+      <li><a href="http://dl.suckless.org">download</a></li>
+      <li><a href="http://man.suckless.org">man/</a></li>
+      <li><a href="http://dwm.suckless.org">dwm/</a></li>
+      <li><a href="http://libs.suckless.org">libs/</a></li>
+      <li><a href="http://st.suckless.org">st</a></li>
+      <li><a href="http://surf.suckless.org">surf</a></li>
+      <li><a href="http://tools.suckless.org">tools/</a></li>
+      <li class="thisPage"><a href="http://wmii.suckless.org">wmii/</a></li>
+      <li><a href="http://wmi.suckless.org">wmi/</a></li>
+    </ul>
diff -r 9960091a4124 -r 358b27c0da93 wmii.suckless.org/index.md
--- a/wmii.suckless.org/index.md	Thu Aug 27 12:57:08 2009 -0400
+++ b/wmii.suckless.org/index.md	Thu Sep 17 10:17:04 2009 -0400
_AT_@ -1,8 +1,3 @@
-![wmii](wmii.gif)
-
-WINDOW MANAGER IMPROVED 2
-=========================
-
 wmii is a small, dynamic window manager for X11. It is scriptable, has a 9p
 filesystem interface and supports classic and tiling (acme-like) window
 management. It aims to maintain a small and clean (read hackable and beautiful)
diff -r 9960091a4124 -r 358b27c0da93 wmii.suckless.org/wmii.gif
Binary file wmii.suckless.org/wmii.gif has changed
diff -r 9960091a4124 -r 358b27c0da93 wmii.suckless.org/wmii.png
Binary file wmii.suckless.org/wmii.png has changed
Received on Thu Sep 17 2009 - 16:17:08 CEST

This archive was generated by hypermail 2.3.0 : Thu Sep 13 2012 - 19:30:50 CEST