diff -ru evilwm-0.99.23.orig/Makefile evilwm-0.99.23/Makefile
--- evilwm-0.99.23.orig/Makefile	Thu Feb  2 15:51:50 2006
+++ evilwm-0.99.23/Makefile	Fri Feb 17 00:43:37 2006
@@ -4,6 +4,7 @@
 # Edit this line if you don't want evilwm to install under /usr.
 # Note that $(DESTDIR) is used by the Debian build process.
 prefix = $(DESTDIR)/usr
+prefix = $(HOME)/usr/local
 
 XROOT    = /usr/X11R6
 INCLUDES = -I$(XROOT)/include
@@ -84,10 +85,10 @@
 
 install: evilwm
 	if [ -f evilwm.exe ]; then mv evilwm.exe evilwm; fi
-	mkdir -p $(prefix)/bin $(prefix)/share/man/man1
+	mkdir -p $(prefix)/bin $(prefix)/man/man1
 	install -s evilwm $(prefix)/bin
-	install evilwm.1 $(prefix)/share/man/man1
-	#gzip -9 $(prefix)/share/man/man1/evilwm.1
+	install evilwm.1 $(prefix)/man/man1
+	#gzip -9 $(prefix)/man/man1/evilwm.1
 
 dist:
 	darcs dist --dist-name $(distname)
diff -ru evilwm-0.99.23.orig/client.c evilwm-0.99.23/client.c
--- evilwm-0.99.23.orig/client.c	Wed Jan 18 13:22:12 2006
+++ evilwm-0.99.23/client.c	Thu Feb 16 23:47:42 2006
@@ -219,6 +219,9 @@
 			bpixel = c == newcurrent ? c->screen->fc.pixel : c->screen->bg.pixel;
 		else
 #endif
+		if (c->hidden)
+			bpixel = c == newcurrent ? c->screen->hc.pixel : c->screen->bg.pixel;
+		else
 			bpixel = c == newcurrent ? c->screen->fg.pixel : c->screen->bg.pixel;
 		XSetWindowBorder(dpy, c->parent, bpixel);
 	}
diff -ru evilwm-0.99.23.orig/events.c evilwm-0.99.23/events.c
--- evilwm-0.99.23.orig/events.c	Mon Feb  6 02:19:30 2006
+++ evilwm-0.99.23/events.c	Mon Feb 20 12:23:04 2006
@@ -22,6 +22,7 @@
 
 static void handle_key_event(XKeyEvent *e) {
 	Client *c = find_client(e->window);
+	static Client *curr = NULL;
 	KeySym key = XKeycodeToKeysym(dpy,e->keycode,0);
 
 	if (!c)
@@ -37,6 +38,8 @@
 			} else {
 				c->x -= 16;
 			}
+			if (opt_snap)
+				snap_client(c);
 			goto move_client;
 		case KEY_DOWN:
 			if (e->state & altmask) {
@@ -45,6 +48,8 @@
 			} else {
 				c->y += 16;
 			}
+			if (opt_snap)
+				snap_client(c);
 			goto move_client;
 		case KEY_UP:
 			if (e->state & altmask) {
@@ -53,6 +58,8 @@
 			} else {
 				c->y -= 16;
 			}
+			if (opt_snap)
+				snap_client(c);
 			goto move_client;
 		case KEY_RIGHT:
 			if (e->state & altmask) {
@@ -61,6 +68,8 @@
 			} else {
 				c->x += 16;
 			}
+			if (opt_snap)
+				snap_client(c);
 			goto move_client;
 		case KEY_TOPLEFT:
 			c->x = c->border;
@@ -102,37 +111,86 @@
 			fix_client(c);
 			break;
 #endif
+		case KEY_HIDE:
+			if(!curr || !curr->temp_shown)
+				curr = c;
+			hide(c);
+			c->hidden = 1;
+			c->temp_shown = 0;
+			break;
+		case KEY_UNHIDE:
+			curr = NULL;
+			c->hidden = 0;
+			c->temp_shown = 0;
+			client_update_current(c, current);
+			break;
+		case KEY_RAISE:
+			XRaiseWindow(dpy, c->parent);
+			break;
 		}
 	}
 	switch(key) {
 		case KEY_NEW:
 			spawn(opt_term);
 			break;
+		case KEY_HIDDENNEXT:
+			if (curr) {
+				if (curr->temp_shown) {
+					hide(curr);
+					curr->temp_shown = 0;
+					next(1);
+				} else {
+					unhide(curr, RAISE);
+					select_client(curr);
+					setmouse(curr->window, 0, 0);
+					setmouse(curr->window, curr->width + curr->border - 1,
+							curr->height + curr->border - 1);
+					discard_enter_events();
+				}
+			} else
+				next(1);
+			if (current && current->hidden)
+				current->temp_shown = 1;
 		case KEY_NEXT:
-			next();
+			if(key == KEY_NEXT)
+				next(0);
 			if (XGrabKeyboard(dpy, e->root, False, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) {
 				XEvent ev;
 				do {
 					XMaskEvent(dpy, KeyPressMask|KeyReleaseMask, &ev);
-					if (ev.type == KeyPress && XKeycodeToKeysym(dpy,ev.xkey.keycode,0) == KEY_NEXT)
-						next();
-				} while (ev.type == KeyPress || XKeycodeToKeysym(dpy,ev.xkey.keycode,0) == KEY_NEXT);
+					if (ev.type == KeyPress && XKeycodeToKeysym(dpy,ev.xkey.keycode,0) == key) {
+						if (key == KEY_HIDDENNEXT && current && current->hidden) {
+							hide(current);
+							current->temp_shown = 0;
+						}
+						next(key == KEY_HIDDENNEXT);
+						if (key == KEY_HIDDENNEXT && current && current->hidden)
+							current->temp_shown = 1;
+					}
+				} while (ev.type == KeyPress || XKeycodeToKeysym(dpy,ev.xkey.keycode,0) == key);
 				XUngrabKeyboard(dpy, CurrentTime);
 			}
 			current_to_head();
+			if (key == KEY_HIDDENNEXT && current && current->hidden) {
+				curr = current;
+				curr->temp_shown = 1;
+			}
 			break;
 #ifdef VWM
 		case XK_1: case XK_2: case XK_3: case XK_4:
 		case XK_5: case XK_6: case XK_7: case XK_8:
 			switch_vdesk(KEY_TO_VDESK(key));
+			curr = NULL;
 			break;
 		case KEY_PREVDESK:
 			if (vdesk > KEY_TO_VDESK(XK_1))
 				switch_vdesk(vdesk - 1);
+			curr = NULL;
 			break;
 		case KEY_NEXTDESK:
 			if (vdesk < KEY_TO_VDESK(XK_8))
 				switch_vdesk(vdesk + 1);
+			curr = NULL;
 			break;
 #endif
 	}
diff -ru evilwm-0.99.23.orig/evilwm.1 evilwm-0.99.23/evilwm.1
--- evilwm-0.99.23.orig/evilwm.1	Mon Feb  6 12:55:15 2006
+++ evilwm-0.99.23/evilwm.1	Fri Feb 17 00:24:33 2006
@@ -14,6 +14,8 @@
 .I fixed colour
 .B ] [ \-bg
 .I background colour
+.B ] [ \-hc
+.I hidden colour
 .B ] [ \-bw
 .I borderwidth
 .B ] [ \-snap
@@ -31,6 +33,7 @@
 .B ] [ \-v
 .I vdesk
 .B ] [ \-s
+.B ] [ \-nc
 .B ] ]... [ \-V ]
 .SH DESCRIPTION
 .B evilwm
@@ -59,8 +62,10 @@
 Spawn new terminal.
 .IP Escape
 Delete current window.  Hold Shift as well to force kill a client.
-.IP Insert
+.IP 9
 Lower current window.
+.IP 0
+Raise current window.
 .IP "H, J, K, L"
 Move window left, down, up or right (16 pixels).  Holding Shift resizes the
 window instead.
@@ -69,23 +74,27 @@
 bottom-right of screen.
 .IP I
 Show information about current window.
-.IP Equals
+.IP Minus
 Maximise current window vertically (toggle).
-.IP X
+.IP Equals
 Maximise current window (toggle).
 .PP
 If compiled with virtual desktop support, these functions are also available: 
 .IP F
 Fix or unfix current window.
+.IP O
+Hide current window.
+.IP P
+Unhide temporarily shown window.
 .IP "1--8"
 Switch virtual desktop.
-.IP Left
+.IP Comma
 Previous virtual desktop.
-.IP Right
+.IP Period
 Next virtual desktop.
 .PP
 In addition to the above, Alt+Tab can be used to cycle through windows
-on screen.
+on screen. Alt+Backslash is used to switch between hidden windows.
 .PP
 To make 
 .B evilwm
@@ -104,6 +113,8 @@
 frame colour of active fixed windows.
 .IP "\-bg background colour"
 frame colour of inactive windows.
+.IP "\-hc hidden colour"
+frame colour of hidden windows shown temporarily.
 .IP "\-bw borderwidth"
 width of window borders in pixels.
 .IP "\-snap num"
@@ -142,6 +153,8 @@
 Note that desktops are numbered from 0.
 .IP "\-s"
 specify that application is to start with a sticky client window.
+.IP "\-nc"
+make applications matching the last -app not appear in Alt+Tab cycle.
 .IP "\-V"
 print version number.
 .SH BUGS
diff -ru evilwm-0.99.23.orig/evilwm.h evilwm-0.99.23/evilwm.h
--- evilwm-0.99.23.orig/evilwm.h	Wed Jan 25 16:03:54 2006
+++ evilwm-0.99.23/evilwm.h	Fri Feb 17 00:41:38 2006
@@ -37,6 +37,7 @@
 #define DEF_BG          "grey50"
 #define DEF_BW          1
 #define DEF_FC          "blue"
+#define DEF_HC		"red"
 #define SPACE           3
 #ifdef DEBIAN
 #define DEF_TERM        "x-terminal-emulator"
@@ -47,7 +48,7 @@
 /* readability stuff */
 
 #define KEY_TO_VDESK(key) ((key) - XK_1)
-#define valid_vdesk(v) ((unsigned)(v) < KEY_TO_VDESK(XK_8))
+#define valid_vdesk(v) ((unsigned)(v) <= KEY_TO_VDESK(XK_8))
 
 #define RAISE           1
 #define NO_RAISE        0       /* for unhide() */
@@ -111,9 +112,9 @@
 	Colormap def_cmap;
 	GC invert_gc;
 #ifdef VWM
-	XColor fg, bg, fc;
+	XColor fg, bg, hc, fc;
 #else
-	XColor fg, bg;
+	XColor fg, bg, hc;
 #endif
 	char *display;
 };
@@ -151,6 +152,9 @@
 	int             bounding_shaped;
 #endif
 	int             remove;  /* set when client needs to be removed */
+	int		not_in_cycle;
+	int		hidden;
+	int		temp_shown;
 };
 
 typedef struct Application Application;
@@ -164,6 +168,7 @@
 	int vdesk;
 	int sticky;
 #endif
+	int not_in_cycle;
 	Application *next;
 };
 
@@ -190,6 +195,7 @@
 extern const char       *opt_fc;
 extern int              vdesk;
 #endif
+extern const char	*opt_hc;
 #ifdef SNAP
 extern int              opt_snap;
 #endif
@@ -264,12 +270,13 @@
 void show_info(Client *c, KeySym key);
 void sweep(Client *c);
 void unhide(Client *c, int raise_win);
-void next(void);
+void next(int hidden);
 #ifdef VWM
 void hide(Client *c);
 void switch_vdesk(int v);
 #endif /* def VWM */
 ScreenInfo *find_screen(Window root);
+void snap_client(Client *c);
 
 /* ewmh.c */
 
diff -ru evilwm-0.99.23.orig/keymap.h evilwm-0.99.23/keymap.h
--- evilwm-0.99.23.orig/keymap.h	Mon Feb  6 02:19:30 2006
+++ evilwm-0.99.23/keymap.h	Fri Feb 17 00:05:51 2006
@@ -25,4 +25,20 @@
 #define KEY_KILL	XK_Escape
 #endif
 
+#define KEY_HIDE	XK_o
+#define KEY_UNHIDE	XK_p
+#define KEY_HIDDENNEXT	XK_backslash
+#define KEY_RAISE	XK_0
+
+#undef KEY_LOWER
+#undef KEY_MAXVERT
+#undef KEY_MAX
+#undef KEY_PREVDESK
+#undef KEY_NEXTDESK
+#define KEY_LOWER	XK_9
+#define KEY_MAXVERT	XK_minus
+#define KEY_MAX		XK_equal
+#define KEY_PREVDESK	XK_comma
+#define KEY_NEXTDESK	XK_period
+
 #endif
diff -ru evilwm-0.99.23.orig/main.c evilwm-0.99.23/main.c
--- evilwm-0.99.23.orig/main.c	Mon Feb  6 02:27:14 2006
+++ evilwm-0.99.23/main.c	Fri Feb 17 00:10:02 2006
@@ -31,6 +31,7 @@
 const char      *opt_fc = DEF_FC;
 int             vdesk = KEY_TO_VDESK(XK_1);
 #endif
+const char	*opt_hc = DEF_HC;
 #ifdef SNAP
 int             opt_snap = 0;
 #endif
@@ -77,6 +78,8 @@
 		else if (!strcmp(argv[i], "-fc") && i+1<argc)
 			opt_fc = argv[++i];
 #endif
+		else if (!strcmp(argv[i], "-hc") && i+1<argc)
+			opt_hc = argv[++i];
 		else if (!strcmp(argv[i], "-bw") && i+1<argc)
 			opt_bw = atoi(argv[++i]);
 		else if (!strcmp(argv[i], "-term") && i+1<argc) {
@@ -96,6 +99,7 @@
 			new->vdesk = -1;
 			new->sticky = 0;
 #endif
+			new->not_in_cycle = 0;
 			if ((tmp = strchr(argv[i], '/'))) {
 				*(tmp++) = 0;
 			}
@@ -125,6 +129,9 @@
 			if (head_app)
 				head_app->sticky = 1;
 #endif
+		} else if (!strcmp(argv[i], "-nc")) {
+			if (head_app)
+				head_app->not_in_cycle = 1;
 		} else if (!strcmp(argv[i], "-mask1") && i+1<argc) {
 			i++;
 			grabmask1 = parse_modifiers(argv[i]);
@@ -201,6 +208,7 @@
 		KEY_FIX, KEY_PREVDESK, KEY_NEXTDESK,
 		XK_1, XK_2, XK_3, XK_4, XK_5, XK_6, XK_7, XK_8,
 #endif
+		KEY_HIDE, KEY_UNHIDE, KEY_HIDDENNEXT, KEY_RAISE,
 		0
 	};
 	KeySym alt_keys_to_grab[] = {
@@ -309,6 +317,7 @@
 #ifdef VWM
 		XAllocNamedColor(dpy, DefaultColormap(dpy, i), opt_fc, &screens[i].fc, &dummy);
 #endif
+		XAllocNamedColor(dpy, DefaultColormap(dpy, i), opt_hc, &screens[i].hc, &dummy);
 
 		screens[i].invert_gc = XCreateGC(dpy, screens[i].root, GCFunction | GCSubwindowMode | GCLineWidth | GCFont, &gv);
 
diff -ru evilwm-0.99.23.orig/new.c evilwm-0.99.23/new.c
--- evilwm-0.99.23.orig/new.c	Mon Feb  6 03:17:30 2006
+++ evilwm-0.99.23/new.c	Fri Feb 17 00:11:33 2006
@@ -110,6 +110,10 @@
 	}
 #endif
 
+	c->not_in_cycle = 0;
+	c->hidden = 0;
+	c->temp_shown = 0;
+
 	/* Read instance/class information for client and check against list
 	 * built with -app options */
 	class = XAllocClassHint();
@@ -140,6 +144,7 @@
 				if (a->vdesk != -1) c->vdesk = a->vdesk;
 				c->sticky = a->sticky;
 #endif
+				c->not_in_cycle = a->not_in_cycle;
 			}
 			a = a->next;
 		}
diff -ru evilwm-0.99.23.orig/screen.c evilwm-0.99.23/screen.c
--- evilwm-0.99.23.orig/screen.c	Wed Jan 18 13:22:12 2006
+++ evilwm-0.99.23/screen.c	Mon Feb 20 10:54:28 2006
@@ -191,7 +191,7 @@
 	return b;
 }
 
-static void snap_client(Client *c) {
+void snap_client(Client *c) {
 	int dx, dy;
 	Client *ci;
 
@@ -206,7 +206,7 @@
 	/* snap to other windows */
 	dx = dy = opt_snap;
 	for (ci = head_client; ci; ci = ci->next) {
-		if (ci != c
+		if (ci != c && (!ci->hidden || ci->temp_shown)
 #ifdef VWM
 				&& (ci->vdesk == vdesk || is_sticky(ci))
 #endif
@@ -334,7 +334,9 @@
 	discard_enter_events();
 }
 
+/*
 #ifdef VWM
+*/
 void hide(Client *c) {
 	/* This will generate an unmap event.  Tell event handler
 	 * to ignore it. */
@@ -343,14 +345,16 @@
 	XUnmapWindow(dpy, c->parent);
 	set_wm_state(c, IconicState);
 }
+/*
 #endif
+*/
 
 void unhide(Client *c, int raise_win) {
 	raise_win ? XMapRaised(dpy, c->parent) : XMapWindow(dpy, c->parent);
 	set_wm_state(c, NormalState);
 }
 
-void next(void) {
+void next(int hidden) {
 	Client *newc = current;
 	do {
 		if (newc) {
@@ -362,14 +366,17 @@
 			newc = head_client;
 		if (!newc)
 			return;
-		if (newc == current)
+		if (newc == current) {
+			if (hidden && newc->hidden)
+				break;
 			return;
-	}
+		}
+	} while(newc->not_in_cycle || (hidden ? !newc->hidden :
+				newc->hidden && !newc->temp_shown)
 #ifdef VWM
-	while (newc->vdesk != vdesk && !is_sticky(newc));
-#else
-	while (0);
+	|| (newc->vdesk != vdesk && !is_sticky(newc))
 #endif
+	);
 	if (!newc)
 		return;
 	unhide(newc, RAISE);
@@ -403,7 +410,7 @@
 #ifdef DEBUG
 			hidden++;
 #endif
-		} else if (c->vdesk == v) {
+		} else if (c->vdesk == v && (!c->hidden || c->temp_shown)) {
 			unhide(c, NO_RAISE);
 #ifdef DEBUG
 			raised++;
