--- switcher.c.orig	2009-11-30 21:35:00.000000000 -0800
+++ switcher.c	2009-12-01 00:49:11.000000000 -0800
@@ -109,8 +109,9 @@
     float zoom;
 
     int grabIndex;
 
+    Bool minimized;
     Bool switching;
     Bool zooming;
     int  zoomMask;
 
@@ -399,8 +400,9 @@
     ss->pos  = ((count >> 1) - ss->nWindows) * WIDTH;
     ss->move = 0;
 
     ss->selectedWindow = ss->windows[0];
+    ss->minimized = ss->windows[0]->minimized;
 
     x = s->outputDev[s->currentOutputDev].region.extents.x1 +
 	s->outputDev[s->currentOutputDev].width / 2;
     y = s->outputDev[s->currentOutputDev].region.extents.y1 +
@@ -469,8 +471,9 @@
 
     if (w)
     {
 	CompWindow *old = ss->selectedWindow;
+	Bool minimized = ss->minimized;
 
 	if (ss->selection == AllViewports &&
 	    ss->opt[SWITCH_SCREEN_OPTION_AUTO_ROTATE].value.b)
 	{
@@ -498,8 +501,9 @@
 	}
 
 	ss->lastActiveNum  = w->activeNum;
 	ss->selectedWindow = w;
+	ss->minimized = w->minimized;
 
 	if (!ss->zoomedWindow)
 	    ss->zoomedWindow = ss->selectedWindow;
 
@@ -523,12 +527,19 @@
 
 	    setSelectedWindowHint (s);
 	}
 
+	sendWindowActivationRequest (s, w->id);
 	addWindowDamage (w);
 
 	if (old && !old->destroyed)
+	{
+	    if (minimized)
+	    {
+	        minimizeWindow(old);
+	    }
 	    addWindowDamage (old);
+	}
     }
 }
 
 static int
@@ -1025,8 +1036,9 @@
 	if (old != ss->selectedWindow)
 	{
 	    ss->zoomedWindow = ss->selectedWindow;
 
+	    sendWindowActivationRequest (ss->selectedWindow->screen, ss->selectedWindow->id);
 	    addWindowDamage (ss->selectedWindow);
 	    addWindowDamage (w);
 
 	    if (old && !old->destroyed)
@@ -1116,8 +1128,30 @@
     (*d->handleEvent) (d, event);
     WRAP (sd, d, handleEvent, switchHandleEvent);
 
     switch (event->type) {
+    case MapNotify:
+        {
+	    SWITCH_SCREEN (w->screen);
+	    w = findWindowAtDisplay (d, event->xmap.window);
+	    if (ss->switching && (w != ss->selectedWindow)) {
+	        // Where is our FocusIn event?
+	        moveInputFocusToWindow (ss->selectedWindow);
+
+		if (isSwitchWin (w))
+		{
+		    CompOption o;
+
+		    o.type    = CompOptionTypeInt;
+		    o.name    = "root";
+		    o.value.i = w->screen->root;
+
+		    switchTerminate (d, NULL, 0, &o, 1);
+		    switchInitiate (w->screen, ss->selection, ss->popupWindow ? TRUE : FALSE);
+		}
+	    }
+	}
+	break;
     case UnmapNotify:
 	w = findWindowAtDisplay (d, event->xunmap.window);
 	switchWindowRemove (d, w);
 	break;
@@ -1733,8 +1767,12 @@
 	if (!(ss->zoomMask & zoomType))
 	    return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ?
 		FALSE : TRUE;
 
+	if (w->minimized) {
+	    unminimizeWindow (w);
+	}
+
 	UNWRAP (ss, s, paintWindow);
 	status = (*s->paintWindow) (w, attrib, transform, region, mask);
 	WRAP (ss, s, paintWindow, switchPaintWindow);
     }
