/* * groupPaintWindow * */ Bool groupPaintWindow(CompWindow * w, const WindowPaintAttrib * attrib, Region region, unsigned int mask) { Bool status; Bool doRotate; GROUP_SCREEN(w->screen); GROUP_WINDOW(w); WindowPaintAttrib gAttrib = *attrib; if (gw->inSelection) { int opacity = gs->opt[GROUP_SCREEN_OPTION_OPACITY].value.i; int saturation = gs->opt[GROUP_SCREEN_OPTION_SATURATION].value.i; int brightness = gs->opt[GROUP_SCREEN_OPTION_BRIGHTNESS].value.i; opacity = OPAQUE * opacity / 100; saturation = COLOR * saturation / 100; brightness = BRIGHT * brightness / 100; gAttrib.opacity = opacity; gAttrib.saturation = saturation; gAttrib.brightness = brightness; } else if (gw->group && gw->group->tabbingState != PaintOff && (gw->animateState & (IS_ANIMATED | FINISHED_ANIMATION))) { //fade the window out float opacity; int origDistanceX = (gw->orgPos.x - gw->destination.x); int origDistanceY = (gw->orgPos.y - gw->destination.y); float origDistance = sqrt(pow(origDistanceX, 2) + pow(origDistanceY,2)); float distanceX = (WIN_X(w) - gw->destination.x); float distanceY = (WIN_Y(w) - gw->destination.y); float distance = sqrt(pow(distanceX, 2) + pow(distanceY, 2)); if(distance > origDistance) opacity = 100.0f; else { if(!origDistanceX && !origDistanceY) { if (IS_TOP_TAB(w, gw->group) && (gw->group->tabbingState == PaintFadeIn)) opacity = 100.0f; else opacity = 0.0f; } else opacity = 100.0f * distance / origDistance; if (gw->group->tabbingState == PaintFadeOut) opacity = 100.0f - opacity; } gAttrib.opacity = gAttrib.opacity * opacity / 100; } doRotate = gw->group && (gw->group->changeState != PaintOff) && (IS_TOP_TAB(w, gw->group) || IS_PREV_TOP_TAB(w, gw->group)); if (doRotate) { float rotateAngle; float timeLeft = gw->group->changeAnimationTime; if(gw->group->changeState == PaintFadeIn) timeLeft += gs->opt[GROUP_SCREEN_OPTION_CHANGE_ANIMATION_TIME].value.f * 500.0f; double angle_factor; double flop_w, flop_h; double scale_w, scale_h; glPushMatrix(); /* i guess this is needed before i do a translating ?? */ rotateAngle = timeLeft * 180.0f / (gs->opt[GROUP_SCREEN_OPTION_CHANGE_ANIMATION_TIME].value.f * 1000.0f); if (IS_PREV_TOP_TAB(w, gw->group)) { rotateAngle += 180.0f; angle_factor = 1.0f - (rotateAngle > 180.0f ? rotateAngle - 180.0f : rotateAngle) / 180.0f; flop_w = WIN_WIDTH(gw->group->topTab->window); flop_h = WIN_HEIGHT(gw->group->topTab->window); scale_w = 1.0f + (flop_w/WIN_WIDTH(w) - 1.0f) * angle_factor; scale_h = 1.0f + (flop_h/WIN_HEIGHT(w) - 1.0f) * angle_factor; } else { angle_factor = 1.0f - (rotateAngle > 180.0f ? rotateAngle - 180.0f : rotateAngle) / 180.0f; flop_w = WIN_WIDTH(gw->group->prevTopTab->window); flop_h = WIN_HEIGHT(gw->group->prevTopTab->window); scale_w = flop_w/WIN_WIDTH(w) + (1.0f - flop_w/WIN_WIDTH(w)) * angle_factor; scale_h = flop_h/WIN_HEIGHT(w) + (1.0f - flop_h/WIN_HEIGHT(w)) * angle_factor; } if (gw->group->changeAnimationDirection < 0) rotateAngle *= -1.0f; // glPushMatrix(); /* FIXME this isnt exact, there is still a offset between the windows wich should overlap each other completely */ glTranslatef(((WIN_WIDTH(w)+flop_w) * (1.0-scale_w))/2.0, ((WIN_HEIGHT(w)+flop_h) * (1.0-scale_h))/2.0, 0.0f); //FIXME es wirkt so als wuerde der gesclalte context nochmal translated werden, wenn man hoch scaled hat die textur zu viel offset, und wenn runter dann zu wenig glScalef(scale_w*1.0f, scale_h*1.0f, 1.0f / w->screen->width); /* Why is no horizontal rotating allowed?? i really like it ;) */ glTranslatef(0.0f, WIN_Y(w) + WIN_HEIGHT(w)/2.0f, 0.0f); glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f); glTranslatef(0.0f, -WIN_Y(w) - WIN_HEIGHT(w)/2.0f, 0.0f); /* or even both?? looks great too ;) */ /* glTranslatef(WIN_X(w) + WIN_WIDTH(w)/2.0f, WIN_Y(w) + WIN_HEIGHT(w)/2.0f, 0.0f); glRotatef(rotateAngle, 1.0f, 1.0f, 0.0f); glTranslatef(-WIN_X(w) - WIN_WIDTH(w)/2.0f, -WIN_Y(w) - WIN_HEIGHT(w)/2.0f, 0.0f); */ /* glTranslatef(WIN_X(w) + WIN_WIDTH(w)/2.0f, 0.0f, 0.0f); glRotatef(rotateAngle, 0.0f, 1.0f, 0.0f); glTranslatef(-WIN_X(w) - WIN_WIDTH(w)/2.0f, 0.0f, 0.0f); */ mask |= PAINT_WINDOW_TRANSFORMED_MASK; } UNWRAP(gs, w->screen, paintWindow); status = (*w->screen->paintWindow) (w, &gAttrib, region, mask); if (gw->group && gw->group->tabBar) { if (HAS_TOP_WIN(gw->group) && IS_TOP_TAB(w, gw->group)) { if ((gw->group->changeState == PaintOff) || (gw->group->changeState == PaintFadeOut)) groupPaintTabBar(gw->group, attrib, region); } else if (IS_PREV_TOP_TAB(w, gw->group)) { if (gw->group->changeState == PaintFadeIn) groupPaintTabBar(gw->group, attrib, region); } } WRAP(gs, w->screen, paintWindow, groupPaintWindow); if(doRotate) glPopMatrix(); return status; }