raveit 6472905
Author: Travis Watkins <amaranth@ubuntu.com>
raveit 6472905
Description: Change decoration plugin dock shadow drawing behavior
raveit 6472905
 change decoration plugin to draw dock shadows only on the
raveit 6472905
 desktop window instead of on top of all other windows
raveit 6472905
Origin: vendor, ubuntu (1:0.8.2-0ubuntu16)
raveit 6472905
--- a/plugins/decoration.c
raveit 6472905
+++ b/plugins/decoration.c
raveit 6472905
@@ -190,6 +190,11 @@ decorDrawWindow (CompWindow	      *w,
raveit 6472905
     status = (*w->screen->drawWindow) (w, transform, attrib, region, mask);
raveit 6472905
     WRAP (ds, w->screen, drawWindow, decorDrawWindow);
raveit 6472905
 
raveit 6472905
+    /* we wait to draw dock shadows until we get to the lowest
raveit 6472905
+       desktop window in the stack */
raveit 6472905
+    if (w->type & CompWindowTypeDockMask)
raveit 6472905
+	return status;
raveit 6472905
+
raveit 6472905
     if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
raveit 6472905
 	region = &infiniteRegion;
raveit 6472905
 
raveit 6472905
@@ -226,6 +231,65 @@ decorDrawWindow (CompWindow	      *w,
raveit 6472905
 					     attrib, mask);
raveit 6472905
     }
raveit 6472905
 
raveit 6472905
+    if (w->type & CompWindowTypeDesktopMask)
raveit 6472905
+    {
raveit 6472905
+	/* we only want to draw on the lowest desktop window, find it and see
raveit 6472905
+	   if we the window we have is it */
raveit 6472905
+	CompWindow *window = w->screen->windows;
raveit 6472905
+	for (window = w->screen->windows; window; window = window->next)
raveit 6472905
+	{
raveit 6472905
+	    if (window->type & CompWindowTypeDesktopMask)
raveit 6472905
+	    {
raveit 6472905
+		if (window == w)
raveit 6472905
+		    break;
raveit 6472905
+		else
raveit 6472905
+		    return status;
raveit 6472905
+	    }
raveit 6472905
+	}
raveit 6472905
+
raveit 6472905
+	/* drawing dock shadows now */
raveit 6472905
+	for (window = w->screen->windows; window; window = window->next)
raveit 6472905
+	{
raveit 6472905
+	    if (window->type & CompWindowTypeDockMask && !window->destroyed && !window->invisible)
raveit 6472905
+	    {
raveit 6472905
+		DECOR_WINDOW (window);
raveit 6472905
+
raveit 6472905
+		if (dw->wd && region->numRects)
raveit 6472905
+		{
raveit 6472905
+		    WindowDecoration *wd = dw->wd;
raveit 6472905
+		    REGION	     box;
raveit 6472905
+		    int		     i;
raveit 6472905
+
raveit 6472905
+		    mask |= PAINT_WINDOW_BLEND_MASK;
raveit 6472905
+
raveit 6472905
+		    box.rects	 = &box.extents;
raveit 6472905
+		    box.numRects = 1;
raveit 6472905
+
raveit 6472905
+		    window->vCount = window->indexCount = 0;
raveit 6472905
+
raveit 6472905
+		    for (i = 0; i < wd->nQuad; i++)
raveit 6472905
+		    {
raveit 6472905
+			box.extents = wd->quad[i].box;
raveit 6472905
+
raveit 6472905
+			if (box.extents.x1 < box.extents.x2 &&
raveit 6472905
+			    box.extents.y1 < box.extents.y2)
raveit 6472905
+			{
raveit 6472905
+			    (*window->screen->addWindowGeometry) (window,
raveit 6472905
+								  &wd->quad[i].matrix, 1,
raveit 6472905
+								  &box,
raveit 6472905
+								  region);
raveit 6472905
+			}
raveit 6472905
+		    }
raveit 6472905
+
raveit 6472905
+		    if (window->vCount)
raveit 6472905
+			(*window->screen->drawWindowTexture) (window,
raveit 6472905
+							      &wd->decor->texture->texture,
raveit 6472905
+							      attrib, mask);
raveit 6472905
+		}
raveit 6472905
+	    }
raveit 6472905
+	}
raveit 6472905
+    }
raveit 6472905
+
raveit 6472905
     return status;
raveit 6472905
 }
raveit 6472905