static void minFiniDisplay(CompPlugin * p, CompDisplay * d) { MIN_DISPLAY(d); freeScreenPrivateIndex(d, md->screenPrivateIndex); UNWRAP(md, d, handleEvent); free(md); }
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; }
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; }
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; } }