All pastes #550313 Raw Edit

Untitled

public text v1 · immutable
·published 2007-06-08 11:48 UTC
rendered paste body
diff --git a/paint.c b/paint.c
index 7ca3bbb..d2b25bf 100644
--- a/paint.c
+++ b/paint.c
@@ -55,15 +55,20 @@ void groupPaintThumb(GroupSelection *group, GroupTabBarSlot *slot, const CompTra
 
 	sAttrib.opacity = sAttrib.opacity * targetOpacity / 0xffff;
 
-	if (w->mapNum) {
+	if (w->mapNum) 
+	{
+		int width, height;
+
+		width = w->width + w->output.left + w->output.right;
+		height = w->height + w->output.top + w->output.bottom;
 
-		if (WIN_WIDTH(w) > tw)
-			sAttrib.xScale = (float) tw / WIN_WIDTH(w);
+		if (width > tw)
+			sAttrib.xScale = (float) tw / width;
 		else
 			sAttrib.xScale = 1.0f;
 
-		if (WIN_HEIGHT(w) > th)
-			sAttrib.yScale = (float) tw / WIN_HEIGHT(w);
+		if (height > th)
+			sAttrib.yScale = (float) tw / height;
 		else
 			sAttrib.yScale = 1.0f;
 
@@ -82,8 +87,14 @@ void groupPaintThumb(GroupSelection *group, GroupTabBarSlot *slot, const CompTra
 		int vx, vy;
 		groupGetDrawOffsetForSlot(slot, &vx, &vy);
 
-		sAttrib.xTranslate = slot->region->extents.x1 - w->attrib.x + vx;
-		sAttrib.yTranslate = slot->region->extents.y1 - w->attrib.y + vy;
+		sAttrib.xTranslate = slot->region->extents.x1 +
+			                 ((slot->region->extents.x2 - slot->region->extents.x1) / 2) -
+							 (sAttrib.xScale * width / 2) +
+							 (w->output.left * sAttrib.xScale) -
+			                 w->attrib.x + vx;
+		sAttrib.yTranslate = slot->region->extents.y1 + 
+			                 (w->output.top * sAttrib.yScale) -
+			                 w->attrib.y + vy;
 
 		FragmentAttrib fragment;
 		CompTransform wTransform = *transform;
@@ -123,8 +134,8 @@ void groupRenderTopTabHighlight(GroupSelection *group)
 
 	bar = group->tabBar;
 
-	int width = group->topTab->region->extents.x2 - group->topTab->region->extents.x1 + 10;
-	int height = group->topTab->region->extents.y2 - group->topTab->region->extents.y1 + 10;
+	int width = group->topTab->region->extents.x2 - group->topTab->region->extents.x1;
+	int height = group->topTab->region->extents.y2 - group->topTab->region->extents.y1;
 
 	bar->selectionLayer = groupRebuildCairoLayer(group->screen, bar->selectionLayer, width, height);
 	if (!bar->selectionLayer)
@@ -677,10 +688,10 @@ void groupPaintTabBar(GroupSelection * group, const WindowPaintAttrib *wAttrib,
 					h_scale = 1.0f;
 					w_scale = 1.0f;
 
-					box.extents.x1 = group->topTab->region->extents.x1 - 5;
-					box.extents.x2 = group->topTab->region->extents.x2 + 5;
-					box.extents.y1 = group->topTab->region->extents.y1 - 5;
-					box.extents.y2 = group->topTab->region->extents.y2 + 5;
+					box.extents.x1 = group->topTab->region->extents.x1;
+					box.extents.x2 = group->topTab->region->extents.x2;
+					box.extents.y1 = group->topTab->region->extents.y1;
+					box.extents.y2 = group->topTab->region->extents.y2;
 				} else
 					layer = NULL;
 			break;
diff --git a/tab.c b/tab.c
index f30a500..c7fb9cd 100644
--- a/tab.c
+++ b/tab.c
@@ -2063,49 +2063,36 @@ void groupRecalcTabBarPos(GroupSelection *group, int middleX, int minX1, int max
 	bar->leftMsSinceLastMove = 0;
 }
 
-#define SIZE_AND_DAMAGE_REGION(s,reg) \
-    reg.extents.x1 -= 5; \
-    reg.extents.x2 += 5; \
-    reg.extents.y1 -= 5; \
-    reg.extents.y2 += 5; \
-    damageScreenRegion (s, &reg);
-
 void
 groupDamageTabBarRegion (GroupSelection *group)
 {
-/* FIXME: the commented code normally should be used, but the currently 
-   damaged region is too small if slots are outside the tab bar */
-#if 0
     REGION reg;
 
     reg.rects = &reg.extents;
     reg.numRects = 1;
 
-    reg.extents = group->tabBar->region->extents;
-	SIZE_AND_DAMAGE_REGION (group->screen, reg)
-
-	if (group->tabBar->slots)
-	{
-		reg.extents = group->tabBar->slots->region->extents;
-		SIZE_AND_DAMAGE_REGION (group->screen, reg)
-	}
-
-	if (group->tabBar->revSlots &&
-		(group->tabBar->revSlots != group->tabBar->slots))
-	{
-		reg.extents = group->tabBar->slots->region->extents;
-		SIZE_AND_DAMAGE_REGION (group->screen, reg)
-	}
-#else
-	if (HAS_TOP_WIN (group))
-		addWindowDamage (TOP_TAB (group));
-	else if (HAS_PREV_TOP_WIN (group))
-		addWindowDamage (PREV_TOP_TAB (group));
-#endif
+	/* we use 15 pixels as damage buffer here, as there is a 10 pixel wide
+	   border around the selected slot which also needs to be damaged 
+	   properly - however the best way would be if slot->region was 
+	   sized including the border */
+#define DAMAGE_BUFFER 20
+
+    reg.extents.x1 = MIN (group->tabBar->region->extents.x1,
+						  group->tabBar->slots->region->extents.x1) - 
+		             DAMAGE_BUFFER;
+	reg.extents.y1 = MIN (group->tabBar->region->extents.y1,
+						  group->tabBar->slots->region->extents.y1) -
+		             DAMAGE_BUFFER;
+    reg.extents.x2 = MAX (group->tabBar->region->extents.x2,
+						  group->tabBar->revSlots->region->extents.x2) + 
+		             DAMAGE_BUFFER;
+	reg.extents.y2 = MAX (group->tabBar->region->extents.y2,
+						  group->tabBar->revSlots->region->extents.y2) + 
+		             DAMAGE_BUFFER;
+
+	damageScreenRegion (group->screen, &reg);
 }
 
-#undef SIZE_AND_DAMAGE_REGION
-
 void
 groupMoveTabBarRegion (GroupSelection *group, int dx, int dy, Bool syncIPW)
 {