rendered paste bodyIndex: src/group/group.h
===================================================================
--- src/group/group.h (Revision 3911)
+++ src/group/group.h (Arbeitskopie)
@@ -324,7 +324,8 @@
GroupTabBarSlot *revSlots;
int nSlots;
- GroupTabBarSlot *lastHoveredSlot;
+ GroupTabBarSlot *hoveredSlot;
+ GroupTabBarSlot *textSlot;
GroupCairoLayer *textLayer;
GroupCairoLayer *bgLayer;
Index: src/group/debug.c
===================================================================
--- src/group/debug.c (Revision 3911)
+++ src/group/debug.c (Arbeitskopie)
@@ -153,7 +153,8 @@
printf("DEBUG: Debugging tab bar (%p)...\n", bar);
if (DEBUG_LEVEL >= DEBUG_IMPORTANT ) {
- printf("lastHoveredSlot => %p\n", bar->lastHoveredSlot);
+ printf("hoveredSlot => %p\n", bar->hoveredSlot);
+ printf("textSlot => %p\n", bar->textSlot);
//printf("mouseOver => %s\n", (bar->mouseOver ? "TRUE" : "FALSE"));
printf("state => %i\n", bar->state);
printf("timeoutHandle => %i\n", bar->timeoutHandle);
Index: src/group/tab.c
===================================================================
--- src/group/tab.c (Revision 3911)
+++ src/group/tab.c (Arbeitskopie)
@@ -1596,8 +1596,20 @@
if(IS_PREV_TOP_TAB(w, gw->group) && !temporary)
gw->group->prevTopTab = NULL;
- if (slot == bar->lastHoveredSlot)
- bar->lastHoveredSlot = NULL;
+ if (slot == bar->hoveredSlot)
+ bar->hoveredSlot = NULL;
+
+ if (slot == bar->textSlot)
+ {
+ bar->textSlot = NULL;
+
+ if (bar->textLayer->state == PaintFadeIn || bar->textLayer->state == PaintOn)
+ {
+ bar->textLayer->animationTime = (gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME].value.f * 1000)
+ - bar->textLayer->animationTime;
+ bar->textLayer->state = PaintFadeOut;
+ }
+ }
//Moving bar->region->extents.x1 / x2 as minX1 / maxX2 will work,
//because the tab-bar got thiner now, so (bar->region->extents.x1 + bar->region->extents.x2) / 2
@@ -1964,7 +1976,8 @@
bar->textLayer = NULL;
bar->bgLayer = NULL;
bar->selectionLayer = NULL;
- bar->lastHoveredSlot = NULL;
+ bar->hoveredSlot = NULL;
+ bar->textSlot = NULL;
group->tabBar = bar;
bar->region = XCreateRegion();
@@ -2187,9 +2200,9 @@
group->inputPrevention = None;
}
-
- if (group->tabBar)
- group->tabBar->lastHoveredSlot = NULL;
+//
+// if (group->tabBar)
+// group->tabBar->lastHoveredSlot = NULL;
}
Index: src/group/paint.c
===================================================================
--- src/group/paint.c (Revision 3911)
+++ src/group/paint.c (Arbeitskopie)
@@ -227,8 +227,8 @@
int font_size = gs->opt[GROUP_SCREEN_OPTION_TABBAR_FONTSIZE].value.i;
- if (bar->lastHoveredSlot && bar->lastHoveredSlot->name)
- title = bar->lastHoveredSlot->name;
+ if (bar->textSlot && bar->textSlot->name)
+ title = bar->textSlot->name;
else
title = " ";
@@ -312,65 +312,49 @@
/* FIXME: remove this after finding out how to get move notifies for input only windows */
#if 1
if (bar->state != PaintOff) { // Tab-bar is visible.
- Bool hasText = FALSE;
- Bool animation = FALSE;
int mouseX, mouseY;
Bool mouseOnScreen;
mouseOnScreen = groupGetCurrentMousePosition(s, &mouseX, &mouseY);
- if (mouseOnScreen && !(bar->lastHoveredSlot &&
- XPointInRegion(bar->lastHoveredSlot->region, mouseX, mouseY)))
+ if (mouseOnScreen && !(bar->hoveredSlot && XPointInRegion(bar->hoveredSlot->region, mouseX, mouseY)))
{
- if (bar->textLayer->state == PaintOn || bar->textLayer->state == PaintFadeIn) {
- bar->textLayer->state = PaintFadeOut;
- bar->textLayer->animationTime = (gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME].value.f * 1000) - bar->textLayer->animationTime;
- animation = TRUE;
- } else if (bar->textLayer->state == PaintFadeOut) {
- animation = TRUE;
- }
+ bar->hoveredSlot = NULL;
+
+ Region clip;
+ clip = groupGetClippingRegion(topTab);
- Region clip = XCreateRegion();
-
- // don't waste resources on this :P
- if (!animation) {
- clip = groupGetClippingRegion(topTab);
- }
-
- for (slot = bar->slots; slot; slot = slot->next) {
-
- if (animation) // we don't want a change yet
- break;
-
- if (slot == bar->lastHoveredSlot)
- continue;
-
+ for (slot = bar->slots; slot; slot = slot->next)
+ {
Region reg = XCreateRegion();
XSubtractRegion(slot->region, clip, reg);
- if (XPointInRegion(reg, mouseX, mouseY)) {
- hasText = TRUE;
- bar->lastHoveredSlot = slot;
-
- groupRenderWindowTitle(group);
-
- bar->textLayer->animationTime = (gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME].value.f * 1000)
- - bar->textLayer->animationTime;
- bar->textLayer->state = PaintFadeIn;
+ if (XPointInRegion(reg, mouseX, mouseY))
+ {
+ bar->hoveredSlot = slot;
+
break;
}
XDestroyRegion(reg);
}
- if (clip)
- XDestroyRegion(clip);
+ XDestroyRegion(clip);
+ }
- if (!animation && !hasText && bar->lastHoveredSlot) {
- bar->lastHoveredSlot = NULL;
- groupRenderWindowTitle(group);
- }
+ if ((bar->textLayer->state == PaintFadeIn || bar->textLayer->state == PaintOn) &&
+ bar->hoveredSlot != bar->textSlot)
+ {
+ bar->textLayer->animationTime = (gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME].value.f * 1000)
+ - bar->textLayer->animationTime;
+ bar->textLayer->state = PaintFadeOut;
}
+ else if (bar->textLayer->state == PaintFadeOut && bar->hoveredSlot == bar->textSlot && bar->hoveredSlot)
+ {
+ bar->textLayer->animationTime = (gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME].value.f * 1000)
+ - bar->textLayer->animationTime;
+ bar->textLayer->state = PaintFadeIn;
+ }
}
#endif
@@ -591,11 +575,13 @@
(*s->preparePaintScreen) (s, msSinceLastPaint);
WRAP(gs, s, preparePaintScreen, groupPreparePaintScreen);
- for(group = gs->groups; group; group = group->next)
+ for (group = gs->groups; group; group = group->next)
{
if (group->changeState != PaintOff)
group->changeAnimationTime -= msSinceLastPaint;
-
+
+ // Tab-bar animation.
+
if(!group->tabBar)
continue;
@@ -604,50 +590,81 @@
if (((group->tabBar->state == PaintFadeIn) ||
(group->tabBar->state == PaintFadeOut)) &&
- group->tabBar->animationTime > 0) {
+ group->tabBar->animationTime > 0)
+ {
group->tabBar->animationTime -= msSinceLastPaint;
+
if (group->tabBar->animationTime < 0)
group->tabBar->animationTime = 0;
if (group->tabBar->animationTime == 0) {
- if (group->tabBar->state == PaintFadeIn) {
+ if (group->tabBar->state == PaintFadeIn)
+ {
group->tabBar->state = PaintOn;
changedTabBarState = TRUE;
- } else if (group->tabBar->state == PaintFadeOut) {
+ }
+
+ else if (group->tabBar->state == PaintFadeOut)
+ {
group->tabBar->state = PaintOff;
changedTabBarState = TRUE;
if (group->tabBar->textLayer) {
+ // Tab-bar is no longer painted, clean up text animation variables.
+
group->tabBar->textLayer->animationTime = 0;
group->tabBar->textLayer->state = PaintOff;
+ group->tabBar->textSlot = group->tabBar->hoveredSlot = NULL;
+
+ groupRenderWindowTitle(group);
}
}
}
}
+
+ // Text animation.
if (!group->tabBar->textLayer)
continue;
- if (group->tabBar->textLayer->state == PaintOn ||
- group->tabBar->textLayer->state == PaintOff) {
- if (group->tabBar->textLayer->animationTime != 0) // clear up if needed
- group->tabBar->textLayer->animationTime = 0;
- }
-
- if(((group->tabBar->textLayer->state == PaintFadeIn) ||
- (group->tabBar->textLayer->state == PaintFadeOut)) &&
- group->tabBar->textLayer->animationTime > 0)
+ if ( (group->tabBar->textLayer->state == PaintFadeIn ||
+ group->tabBar->textLayer->state == PaintFadeOut) &&
+ group->tabBar->textLayer->animationTime > 0)
{
group->tabBar->textLayer->animationTime -= msSinceLastPaint;
+
if (group->tabBar->textLayer->animationTime < 0)
group->tabBar->textLayer->animationTime = 0;
-
- if (group->tabBar->textLayer->animationTime == 0) {
+
+ if (group->tabBar->textLayer->animationTime == 0)
+ {
if (group->tabBar->textLayer->state == PaintFadeIn)
- group->tabBar->textLayer->state = PaintOn;
+ group->tabBar->state = PaintOn;
+
else if (group->tabBar->textLayer->state == PaintFadeOut)
- group->tabBar->textLayer->state = PaintOff;
- }
+ group->tabBar->state = PaintOff;
+ }
}
+
+ if (group->tabBar->textLayer->state == PaintOff && group->tabBar->hoveredSlot)
+ {
+ // Start text animation for the new hovered slot.
+
+ group->tabBar->textSlot = group->tabBar->hoveredSlot;
+ groupRenderWindowTitle(group);
+
+ group->tabBar->textLayer->state = PaintFadeIn;
+ group->tabBar->textLayer->animationTime =
+ (gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME].value.f * 1000);
+
+ }
+
+ else if (group->tabBar->textLayer->state == PaintOff && group->tabBar->textSlot)
+ {
+ // Clean Up.
+ group->tabBar->textSlot = NULL;
+
+ groupRenderWindowTitle(group);
+ }
}
if (changedTabBarState)