rendered paste bodydiff --git a/group.c b/group.c
index 6721266..2d3c5a0 100644
--- a/group.c
+++ b/group.c
@@ -1330,7 +1330,15 @@ void groupHandleEvent(CompDisplay * d, XEvent * event)
GROUP_WINDOW(w);
if (gw->group && gw->group->tabBar && IS_TOP_TAB(w, gw->group) && gw->group->inputPrevention)
- groupUpdateInputPreventionWindow(gw->group);
+ {
+ XWindowChanges xwc;
+
+ xwc.stack_mode = Above;
+ xwc.sibling = w->id;
+
+ XConfigureWindow (w->screen->display->display, gw->group->inputPrevention,
+ CWSibling | CWStackMode, &xwc);
+ }
}
break;
@@ -1490,14 +1498,12 @@ groupWindowMoveNotify(CompWindow * w, int dx, int dy, Bool immediate)
GroupTabBarSlot *slot;
GroupTabBar *bar = gw->group->tabBar;
- if (groupGetSpringModelOnMove(w->screen))
- XOffsetRegion (bar->region, 0, dy);
- else
- XOffsetRegion (bar->region, dx, dy);
-
bar->rightSpringX += dx;
bar->leftSpringX += dx;
+ groupMoveTabBarRegion (gw->group,
+ (groupGetSpringModelOnMove (w->screen)) ? 0 : dx, dy);
+
for(slot = bar->slots; slot; slot = slot->next) {
if (groupGetSpringModelOnMove(w->screen))
XOffsetRegion (slot->region, 0, dy);
@@ -1506,8 +1512,6 @@ groupWindowMoveNotify(CompWindow * w, int dx, int dy, Bool immediate)
slot->springX += dx;
}
- groupUpdateInputPreventionWindow(gw->group);
-
return;
}
diff --git a/group.h b/group.h
index eb2e659..948b8a9 100644
--- a/group.h
+++ b/group.h
@@ -507,7 +507,7 @@ void groupUnhookTabBarSlot(GroupTabBar *bar, GroupTabBarSlot *slot, Bool tempora
void groupDeleteTabBarSlot(GroupTabBar *bar, GroupTabBarSlot *slot);
void groupCreateSlot(GroupSelection *group, CompWindow *w);
void groupApplyForces(CompScreen *s, GroupTabBar *bar, GroupTabBarSlot* draggedSlot);
-void groupApplySpeeds(CompScreen* s, GroupTabBar* bar, int msSinceLastRepaint);
+void groupApplySpeeds(CompScreen* s, GroupSelection *group, int msSinceLastRepaint);
void groupInitTabBar(GroupSelection *group, CompWindow* topTab);
void groupDeleteTabBar(GroupSelection *group);
void groupStartTabbingAnimation(GroupSelection *group, Bool tab);
@@ -517,11 +517,13 @@ Bool groupInitTab(CompDisplay * d, CompAction * action, CompActionState state, C
Bool groupChangeTab(GroupTabBarSlot* topTab, ChangeTabAnimationDirection direction);
Bool groupChangeTabLeft(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption);
Bool groupChangeTabRight(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption);
-void groupUpdateInputPreventionWindow(GroupSelection* group);
void groupSwitchTopTabInput(GroupSelection *group, Bool enable);
void groupCreateInputPreventionWindow(GroupSelection* group);
void groupDestroyInputPreventionWindow(GroupSelection* group);
Region groupGetClippingRegion(CompWindow *w);
+void groupMoveTabBarRegion (GroupSelection *group, int dx, int dy);
+void groupResizeTabBarRegion (GroupSelection *group, XRectangle *box);
+void groupDamageTabBarRegion (GroupSelection *group);
/*
* paint.c
diff --git a/paint.c b/paint.c
index cb7cc85..6e3e356 100644
--- a/paint.c
+++ b/paint.c
@@ -104,8 +104,6 @@ void groupPaintThumb(GroupSelection *group, GroupTabBarSlot *slot, const CompTra
PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK);
glPopMatrix();
-
- addWindowDamage(w);
}
w->screen->addWindowGeometry = oldAddWindowGeometry;
@@ -896,7 +894,7 @@ void groupPreparePaintScreen(CompScreen * s, int msSinceLastPaint)
continue;
groupApplyForces(s, bar, (gs->dragged)? gs->draggedSlot: NULL);
- groupApplySpeeds(s, bar, msSinceLastPaint);
+ groupApplySpeeds(s, group, msSinceLastPaint);
groupHandleHoverDetection(group);
groupHandleTabBarFade(group, msSinceLastPaint);
@@ -1038,8 +1036,23 @@ void groupDonePaintScreen(CompScreen * s)
if (group->changeState != PaintOff)
damageScreen(s);
- if (group->tabBar && group->tabBar->state != PaintOff)
- damageScreenRegion(s, group->tabBar->region);
+ if (group->tabBar)
+ {
+ if ((group->tabBar->state == PaintFadeIn) ||
+ (group->tabBar->state == PaintFadeOut))
+ {
+ groupDamageTabBarRegion (group);
+ }
+
+ if (group->tabBar->textLayer)
+ {
+ if ((group->tabBar->textLayer->state == PaintFadeIn) ||
+ (group->tabBar->textLayer->state == PaintFadeOut))
+ {
+ groupDamageTabBarRegion (group);
+ }
+ }
+ }
}
}
diff --git a/tab.c b/tab.c
index fd87912..d2a45dd 100644
--- a/tab.c
+++ b/tab.c
@@ -249,7 +249,6 @@ groupShowDelayTimeout(void *data)
groupRecalcTabBarPos(group, mouseX, WIN_REAL_X(topTab),
WIN_REAL_X(topTab) + WIN_REAL_WIDTH(topTab));
- addWindowDamage(topTab);
groupTabSetVisibility(group, TRUE, 0);
@@ -1947,11 +1946,7 @@ void groupRecalcTabBarPos(GroupSelection *group, int middleX, int minX1, int max
Bool isDraggedSlotGroup = FALSE;
GROUP_SCREEN(group->screen);
- /* first damage the old region to make sure it is updated */
- damageScreenRegion (group->screen, bar->region);
-
int space = groupGetThumbSpace(group->screen);
- int old_width = bar->region->extents.x2 - bar->region->extents.x1;
int bar_width;
int currentSlot;
XRectangle box;
@@ -2003,8 +1998,7 @@ void groupRecalcTabBarPos(GroupSelection *group, int middleX, int minX1, int max
box.width = bar_width;
box.height = space * 2 + tabs_height;
- EMPTY_REGION(bar->region);
- XUnionRectWithRegion(&box, bar->region, bar->region);
+ groupResizeTabBarRegion (group, &box);
// recalc every slot region
currentSlot = 0;
@@ -2032,14 +2026,72 @@ void groupRecalcTabBarPos(GroupSelection *group, int middleX, int minX1, int max
bar->rightMsSinceLastMove = 0;
bar->leftMsSinceLastMove = 0;
-
- groupUpdateInputPreventionWindow(group);
+}
- // size changed rebuild TabBar
- if (box.width != old_width && bar->bgLayer) {
- bar->bgLayer = groupRebuildCairoLayer(group->screen, bar->bgLayer, box.width + space + thumb_size, box.height);
- bar->oldWidth = 0; // trigger repaint
- }
+void
+groupDamageTabBarRegion (GroupSelection *group)
+{
+ REGION reg;
+
+ reg.rects = ®.extents;
+ reg.numRects = 1;
+
+ reg.extents = group->tabBar->region->extents;
+ reg.extents.x1 -= 5;
+ reg.extents.x2 += 5;
+ reg.extents.y1 -= 5;
+ reg.extents.y2 += 5;
+ damageScreenRegion (group->screen, ®);
+}
+
+void
+groupMoveTabBarRegion (GroupSelection *group, int dx, int dy)
+{
+ groupDamageTabBarRegion (group);
+
+ XOffsetRegion (group->tabBar->region, dx, dy);
+
+ XMoveWindow (group->screen->display->display, group->inputPrevention,
+ group->tabBar->leftSpringX, group->tabBar->region->extents.y1);
+
+ groupDamageTabBarRegion (group);
+}
+
+void
+groupResizeTabBarRegion (GroupSelection *group, XRectangle *box)
+{
+ XWindowChanges xwc;
+
+ groupDamageTabBarRegion (group);
+
+ if ((group->tabBar->bgLayer &&
+ (group->tabBar->region->extents.x2 - group->tabBar->region->extents.x1) != box->width))
+ {
+ group->tabBar->bgLayer =
+ groupRebuildCairoLayer (group->screen,
+ group->tabBar->bgLayer,
+ box->width +
+ groupGetThumbSpace (group->screen) +
+ groupGetThumbSize (group->screen),
+ box->height);
+ }
+
+ EMPTY_REGION (group->tabBar->region);
+ XUnionRectWithRegion(box, group->tabBar->region, group->tabBar->region);
+
+ xwc.x = box->x;
+ xwc.y = box->y;
+ xwc.width = box->width;
+ xwc.height = box->height;
+
+ xwc.stack_mode = Above;
+
+ xwc.sibling = HAS_TOP_WIN(group) ? TOP_TAB(group)->id : None;
+
+ XConfigureWindow (group->screen->display->display, group->inputPrevention,
+ CWSibling | CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc);
+
+ groupDamageTabBarRegion (group);
}
/*
@@ -2425,8 +2477,9 @@ void groupApplyForces(CompScreen *s, GroupTabBar *bar, GroupTabBarSlot* draggedS
* groupApplySpeeds
*
*/
-void groupApplySpeeds(CompScreen* s, GroupTabBar* bar, int msSinceLastRepaint)
+void groupApplySpeeds(CompScreen* s, GroupSelection *group, int msSinceLastRepaint)
{
+ GroupTabBar *bar = group->tabBar;
GroupTabBarSlot* slot;
int move;
XRectangle box;
@@ -2491,10 +2544,7 @@ void groupApplySpeeds(CompScreen* s, GroupTabBar* bar, int msSinceLastRepaint)
bar->rightMsSinceLastMove = 0;
if(updateTabBar)
- {
- EMPTY_REGION(bar->region);
- XUnionRectWithRegion(&box, bar->region, bar->region);
- }
+ groupResizeTabBarRegion (group, &box);
for(slot = bar->slots; slot; slot = slot->next)
{
@@ -2713,36 +2763,6 @@ groupSwitchTopTabInput(GroupSelection *group, Bool enable)
}
/*
- * groupUpdateInputPreventionWindow
- *
- */
-void
-groupUpdateInputPreventionWindow(GroupSelection *group)
-{
- XWindowChanges xwc;
-
- if(!group->tabBar || !HAS_TOP_WIN(group))
- return;
-
- if (!group->inputPrevention)
- groupCreateInputPreventionWindow(group);
-
- CompWindow *w = TOP_TAB(group);
-
- xwc.x = group->tabBar->leftSpringX;
- xwc.y = group->tabBar->region->extents.y1;
- xwc.width = group->tabBar->rightSpringX - group->tabBar->leftSpringX;
- xwc.height = group->tabBar->region->extents.y2 - group->tabBar->region->extents.y1;
-
- xwc.stack_mode = Above;
-
- xwc.sibling = w->id;
-
- XConfigureWindow(group->screen->display->display, group->inputPrevention,
- CWSibling | CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc);
-}
-
-/*
* groupCreateInputPreventionWindow
*
*/