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, ®); - 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 = ®.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, ®); } -#undef SIZE_AND_DAMAGE_REGION - void groupMoveTabBarRegion (GroupSelection *group, int dx, int dy, Bool syncIPW) {