static void
fadeHandleEvent (CompDisplay *d,
		 XEvent      *event)
{
    CompWindow *w;

    FADE_DISPLAY (d);

    switch (event->type) {
    case DestroyNotify:
	w = findWindowAtDisplay (d, event->xdestroywindow.window);
	if (w)
	{
	    FADE_WINDOW (w);

	    if (!fw->direction)
		fw->opacity = OPAQUE - 1;

	    fw->direction = -1;
	    fw->destroyed = 1;

	    addWindowDamage (w);
	    return;
	}
	break;
    case UnmapNotify:
	w = findWindowAtDisplay (d, event->xunmap.window);
	if (w)
	{
	    FADE_WINDOW (w);

	    if (!fw->direction)
		fw->opacity = OPAQUE - 1;

	    fw->direction = -1;

	    addWindowDamage (w);
	    return;
	}
	break;
    case MapNotify:
	w = findWindowAtDisplay (d, event->xunmap.window);
	if (w)
	{
	    FADE_WINDOW (w);

	    /* make sure any pending unmap are processed */
	    if (fw->direction < 0)
		unmapWindow (w);
	}
    default:
	break;
    }

    UNWRAP (fd, d, handleEvent);
    (*d->handleEvent) (d, event);
    WRAP (fd, d, handleEvent, fadeHandleEvent);
}
Exemple #2
0
static void minFiniWindow(CompPlugin * p, CompWindow * w)
{
	MIN_WINDOW(w);

	mw->ignoreDamage = TRUE;
	while (mw->unmapCnt--)
		unmapWindow(w);
	mw->ignoreDamage = FALSE;

	if (mw->region)
		XDestroyRegion(mw->region);

	free(mw);
}
Exemple #3
0
static void
fadeWindowStop(CompWindow *w)
{
   FADE_WINDOW(w);

   while (fw->unmapCnt)
     {
        unmapWindow(w);
        fw->unmapCnt--;
     }

   while (fw->destroyCnt)
     {
        destroyWindow(w);
        fw->destroyCnt--;
     }
}
Exemple #4
0
static void
minHandleEvent (XEvent      *event)
{
	CompWindow *w;

	MIN_DISPLAY (&display);

	switch (event->type) {
	case MapNotify:
		w = findWindowAtDisplay (event->xmap.window);
		if (w)
		{
			MIN_WINDOW (w);

			if (mw->adjust)
				mw->state = mw->newState;

			if (mw->region)
				w->height = 0;

			mw->ignoreDamage = TRUE;
			while (mw->unmapCnt)
			{
				unmapWindow (w);
				mw->unmapCnt--;
			}
			mw->ignoreDamage = FALSE;
		}
		break;
	case UnmapNotify:
		w = findWindowAtDisplay (event->xunmap.window);
		if (w)
		{
			MIN_SCREEN (w->screen);

			if (w->pendingUnmaps && onCurrentDesktop (w)) /* Normal -> Iconic */
			{
				MIN_WINDOW (w);

				if (w->shaded)
				{
					if (!mw->region)
						mw->region = XCreateRegion ();

					if (mw->region && ms->shadeStep)
					{
						XSubtractRegion (w->region, &emptyRegion, mw->region);
						XOffsetRegion (mw->region, -w->attrib.x,
						           w->attrib.height +
						           w->attrib.border_width * 2 -
						           w->height - w->attrib.y);

						mw->shade = w->height;

						mw->adjust     = FALSE;
						ms->moreAdjust = TRUE;

						mw->unmapCnt++;
						w->unmapRefCnt++;

						addWindowDamage (w);
					}
				}
				else if (!w->invisible && matchEval (&ms->match, w))
				{
					if (w->iconGeometrySet)
					{
						mw->newState = IconicState;

						mw->xScale = w->paint.xScale;
						mw->yScale = w->paint.yScale;
						mw->tx     = w->attrib.x - w->serverX;
						mw->ty     = w->attrib.y - w->serverY;

						if (mw->region)
						{
							XDestroyRegion (mw->region);
							mw->region = NULL;
						}

						mw->shade = MAXSHORT;

						mw->adjust     = TRUE;
						ms->moreAdjust = TRUE;

						mw->unmapCnt++;
						w->unmapRefCnt++;

						addWindowDamage (w);
					}
				}
			}
			else  /* X -> Withdrawn */
			{
				MIN_WINDOW (w);

				if (mw->adjust)
				{
					mw->adjust = FALSE;
					mw->xScale = mw->yScale = 1.0f;
					mw->tx = mw->ty = 0.0f;
					mw->xVelocity = mw->yVelocity = 0.0f;
					mw->xScaleVelocity = mw->yScaleVelocity = 1.0f;
					mw->shade = MAXSHORT;

					if (mw->region)
					{
						XDestroyRegion (mw->region);
						mw->region = NULL;
					}
				}

				mw->state = NormalState;
			}
		}
	default:
		break;
	}

	UNWRAP (md, &display, handleEvent);
	(*display.handleEvent) (event);
	WRAP (md, &display, handleEvent, minHandleEvent);

	switch (event->type) {
	case MapRequest:
		w = findWindowAtDisplay (event->xmaprequest.window);
		if (w && w->hints && w->hints->initial_state == IconicState)
		{
			MIN_WINDOW (w);
			mw->newState = mw->state = IconicState;
		}
		break;
	default:
		break;
	}
}
Exemple #5
0
static void
minPreparePaintScreen (CompScreen *s,
                       int        msSinceLastPaint)
{
	MIN_SCREEN (s);

	if (ms->moreAdjust)
	{
		CompWindow *w;
		int        steps, h;
		float      amount, chunk;

		const BananaValue *
		option_speed = bananaGetOption (bananaIndex, "speed", s->screenNum);

		amount = msSinceLastPaint * 0.05f * option_speed->f;

		const BananaValue *
		option_timestep = bananaGetOption (bananaIndex,
		                                   "timestep",
		                                   s->screenNum);

		steps  = amount / (0.5f * option_timestep->f);
		if (!steps) steps = 1;
		chunk  = amount / (float) steps;

		while (steps--)
		{
			ms->moreAdjust = 0;

			for (w = s->windows; w; w = w->next)
			{
				MIN_WINDOW (w);

				if (mw->adjust)
				{
					mw->adjust = adjustMinVelocity (w);

					ms->moreAdjust |= mw->adjust;

					mw->tx += mw->xVelocity * chunk;
					mw->ty += mw->yVelocity * chunk;
					mw->xScale += mw->xScaleVelocity * chunk;
					mw->yScale += mw->yScaleVelocity * chunk;

					if (!mw->adjust)
					{
						mw->state = mw->newState;

						mw->ignoreDamage = TRUE;
						while (mw->unmapCnt)
						{
							unmapWindow (w);
							mw->unmapCnt--;
						}
						mw->ignoreDamage = FALSE;
					}
				}
				else if (mw->region && w->damaged)
				{
					if (w->shaded)
					{
						if (mw->shade > 0)
						{
							mw->shade -= (chunk * ms->shadeStep) + 1;

							if (mw->shade > 0)
							{
								ms->moreAdjust = TRUE;
							}
							else
							{
								mw->shade = 0;

								mw->ignoreDamage = TRUE;
								while (mw->unmapCnt)
								{
									unmapWindow (w);
									mw->unmapCnt--;
								}
								mw->ignoreDamage = FALSE;
							}
						}
					}
					else
					{
						h = w->attrib.height + w->attrib.border_width * 2;
						if (mw->shade < h)
						{
							mw->shade += (chunk * ms->shadeStep) + 1;

							if (mw->shade < h)
							{
								ms->moreAdjust = TRUE;
							}
							else
							{
								mw->shade = MAXSHORT;

								minSetShade (w, h);

								XDestroyRegion (mw->region);
								mw->region = NULL;

								addWindowDamage (w);
							}
						}
					}
				}
			}

			if (!ms->moreAdjust)
				break;
		}

		if (ms->moreAdjust)
		{
			for (w = s->windows; w; w = w->next)
			{
				MIN_WINDOW (w);

				if (mw->adjust)
				{
					addWindowDamage (w);
				}
				else if (mw->region && w->damaged)
				{
					h = w->attrib.height + w->attrib.border_width * 2;
					if (mw->shade && mw->shade < h)
					{
						minSetShade (w, mw->shade);
						addWindowDamage (w);
					}
				}
			}
		}
	}

	UNWRAP (ms, s, preparePaintScreen);
	(*s->preparePaintScreen) (s, msSinceLastPaint);
	WRAP (ms, s, preparePaintScreen, minPreparePaintScreen);
}
Exemple #6
0
void XImlib2Caption::mouseOffEffect()
{
    if (captionOnHover)
        unmapWindow();
}
static Bool
fadePaintWindow (CompWindow		 *w,
		 const WindowPaintAttrib *attrib,
		 Region			 region,
		 unsigned int		 mask)
{
    CompScreen *s = w->screen;
    Bool       status;

    FADE_SCREEN (s);
    FADE_WINDOW (w);

    if (fw->opacity < OPAQUE)
    {
	GLint opacity;

	opacity = fw->opacity + fs->steps * fw->direction;
	if (opacity > 0)
	{
	    if (opacity < OPAQUE)
	    {
		WindowPaintAttrib fAttrib = *attrib;

		fAttrib.opacity = MULTIPLY_USHORT (opacity, attrib->opacity);

		UNWRAP (fs, s, paintWindow);
		status = (*s->paintWindow) (w, &fAttrib, region, mask);
		WRAP (fs, s, paintWindow, fadePaintWindow);

		if (status)
		{
		    fw->opacity = opacity;

		    addWindowDamage (w);
		}
	    }
	    else
	    {
		UNWRAP (fs, s, paintWindow);
		status = (*s->paintWindow) (w, attrib, region, mask);
		WRAP (fs, s, paintWindow, fadePaintWindow);

		if (status)
		{
		    fw->opacity   = OPAQUE;
		    fw->direction = 0;
		}
	    }
	}
	else
	{
	    fw->opacity   = 0;
	    fw->direction = 0;

	    if (fw->destroyed)
		destroyWindow (w);
	    else
		unmapWindow (w);

	    return (mask & PAINT_WINDOW_SOLID_MASK) ? FALSE : TRUE;
	}
    }
    else
    {
	UNWRAP (fs, s, paintWindow);
	status = (*s->paintWindow) (w, attrib, region, mask);
	WRAP (fs, s, paintWindow, fadePaintWindow);
    }

    return status;
}