Example #1
0
static void minFiniDisplay(CompPlugin * p, CompDisplay * d)
{
	MIN_DISPLAY(d);

	freeScreenPrivateIndex(d, md->screenPrivateIndex);

	UNWRAP(md, d, handleEvent);

	free(md);
}
Example #2
0
static Bool
minInitScreen (CompPlugin *p,
               CompScreen *s)
{
	MinScreen *ms;

	MIN_DISPLAY (&display);

	ms = malloc (sizeof (MinScreen));
	if (!ms)
		return FALSE;

	ms->windowPrivateIndex = allocateWindowPrivateIndex (s);
	if (ms->windowPrivateIndex < 0)
	{
		free (ms);
		return FALSE;
	}

	ms->moreAdjust = FALSE;

	const BananaValue *
	option_shade_resistance = bananaGetOption (bananaIndex,
	                                           "shade_resistance",
	                                           s->screenNum);

	ms->shadeStep  = 100 - option_shade_resistance->i + 1;

	const BananaValue *
	option_window_match = bananaGetOption (bananaIndex,
	                                       "window_match",
	                                       s->screenNum);

	matchInit (&ms->match);
	matchAddFromString (&ms->match, option_window_match->s);
	matchUpdate (&ms->match);

	WRAP (ms, s, preparePaintScreen, minPreparePaintScreen);
	WRAP (ms, s, donePaintScreen, minDonePaintScreen);
	WRAP (ms, s, paintOutput, minPaintOutput);
	WRAP (ms, s, paintWindow, minPaintWindow);
	WRAP (ms, s, damageWindowRect, minDamageWindowRect);
	WRAP (ms, s, focusWindow, minFocusWindow);

	s->privates[md->screenPrivateIndex].ptr = ms;

	return TRUE;
}
Example #3
0
static Bool minInitScreen(CompPlugin * p, CompScreen * s)
{
	MinScreen *ms;

	MIN_DISPLAY(s->display);

	ms = malloc(sizeof(MinScreen));
	if (!ms)
		return FALSE;

	if (!compInitScreenOptionsFromMetadata(s,
					       &minMetadata,
					       minScreenOptionInfo,
					       ms->opt,
					       MIN_SCREEN_OPTION_NUM)) {
		free(ms);
		return FALSE;
	}

	ms->windowPrivateIndex = allocateWindowPrivateIndex(s);
	if (ms->windowPrivateIndex < 0) {
		compFiniScreenOptions(s, ms->opt, MIN_SCREEN_OPTION_NUM);
		free(ms);
		return FALSE;
	}

	ms->moreAdjust = FALSE;
	ms->shadeStep = ms->opt[MIN_SCREEN_OPTION_SHADE_RESISTANCE].rest.i.max -
	    ms->opt[MIN_SCREEN_OPTION_SHADE_RESISTANCE].value.i + 1;

	WRAP(ms, s, preparePaintScreen, minPreparePaintScreen);
	WRAP(ms, s, donePaintScreen, minDonePaintScreen);
	WRAP(ms, s, paintOutput, minPaintOutput);
	WRAP(ms, s, paintWindow, minPaintWindow);
	WRAP(ms, s, damageWindowRect, minDamageWindowRect);
	WRAP(ms, s, focusWindow, minFocusWindow);

	s->base.privates[md->screenPrivateIndex].ptr = ms;

	return TRUE;
}
Example #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;
	}
}