You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1050 lines
24 KiB

/*
* Copyright © 2005 Novell, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without
* fee, provided that the above copyright notice appear in all copies
* and that both that copyright notice and this permission notice
* appear in supporting documentation, and that the name of
* Novell, Inc. not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
* Novell, Inc. makes no representations about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
* NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
* NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: David Reveman <davidr@novell.com>
*/
#include <stdlib.h>
#include <string.h>
#include <compiz-core.h>
static CompMetadata fadeMetadata;
static int displayPrivateIndex;
typedef struct _FadeDisplay {
int screenPrivateIndex;
HandleEventProc handleEvent;
MatchExpHandlerChangedProc matchExpHandlerChanged;
int displayModals;
Bool suppressMinimizeOpenClose;
CompMatch alwaysFadeWindowMatch;
} FadeDisplay;
#define FADE_SCREEN_OPTION_FADE_MODE 0
#define FADE_SCREEN_OPTION_FADE_SPEED 1
#define FADE_SCREEN_OPTION_FADE_TIME 2
#define FADE_SCREEN_OPTION_WINDOW_MATCH 3
#define FADE_SCREEN_OPTION_VISUAL_BELL 4
#define FADE_SCREEN_OPTION_FULLSCREEN_VISUAL_BELL 5
#define FADE_SCREEN_OPTION_MINIMIZE_OPEN_CLOSE 6
#define FADE_SCREEN_OPTION_DIM_UNRESPONSIVE 7
#define FADE_SCREEN_OPTION_UNRESPONSIVE_BRIGHTNESS 8
#define FADE_SCREEN_OPTION_UNRESPONSIVE_SATURATION 9
#define FADE_SCREEN_OPTION_NUM 10
#define FADE_MODE_CONSTANTSPEED 0
#define FADE_MODE_CONSTANTTIME 1
#define FADE_MODE_MAX FADE_MODE_CONSTANTTIME
typedef struct _FadeScreen {
int windowPrivateIndex;
int fadeTime;
CompOption opt[FADE_SCREEN_OPTION_NUM];
PreparePaintScreenProc preparePaintScreen;
PaintWindowProc paintWindow;
DamageWindowRectProc damageWindowRect;
FocusWindowProc focusWindow;
WindowResizeNotifyProc windowResizeNotify;
CompMatch match;
} FadeScreen;
typedef struct _FadeWindow {
GLushort opacity;
GLushort brightness;
GLushort saturation;
int dModal;
int destroyCnt;
int unmapCnt;
Bool shaded;
Bool alive;
Bool fadeOut;
int steps;
int fadeTime;
int opacityDiff;
int brightnessDiff;
int saturationDiff;
GLushort targetOpacity;
GLushort targetBrightness;
GLushort targetSaturation;
} FadeWindow;
#define GET_FADE_DISPLAY(d) \
((FadeDisplay *) (d)->base.privates[displayPrivateIndex].ptr)
#define FADE_DISPLAY(d) \
FadeDisplay *fd = GET_FADE_DISPLAY (d)
#define GET_FADE_SCREEN(s, fd) \
((FadeScreen *) (s)->base.privates[(fd)->screenPrivateIndex].ptr)
#define FADE_SCREEN(s) \
FadeScreen *fs = GET_FADE_SCREEN (s, GET_FADE_DISPLAY (s->display))
#define GET_FADE_WINDOW(w, fs) \
((FadeWindow *) (w)->base.privates[(fs)->windowPrivateIndex].ptr)
#define FADE_WINDOW(w) \
FadeWindow *fw = GET_FADE_WINDOW (w, \
GET_FADE_SCREEN (w->screen, \
GET_FADE_DISPLAY (w->screen->display)))
#define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption))
static void
fadeUpdateWindowFadeMatch (CompDisplay *display,
CompOptionValue *value,
CompMatch *match)
{
matchFini (match);
matchInit (match);
matchAddFromString (match, "!type=desktop");
matchAddGroup (match, MATCH_OP_AND_MASK, &value->match);
matchUpdate (display, match);
}
static CompOption *
fadeGetScreenOptions (CompPlugin *plugin,
CompScreen *screen,
int *count)
{
FADE_SCREEN (screen);
*count = NUM_OPTIONS (fs);
return fs->opt;
}
static Bool
fadeSetScreenOption (CompPlugin *plugin,
CompScreen *screen,
const char *name,
CompOptionValue *value)
{
CompOption *o;
int index;
FADE_SCREEN (screen);
o = compFindOption (fs->opt, NUM_OPTIONS (fs), name, &index);
if (!o)
return FALSE;
switch (index) {
case FADE_SCREEN_OPTION_FADE_SPEED:
if (compSetFloatOption (o, value))
{
fs->fadeTime = 1000.0f / o->value.f;
return TRUE;
}
break;
case FADE_SCREEN_OPTION_WINDOW_MATCH:
if (compSetMatchOption (o, value))
{
fadeUpdateWindowFadeMatch (screen->display, &o->value, &fs->match);
return TRUE;
}
break;
default:
if (compSetOption (o, value))
return TRUE;
break;
}
return FALSE;
}
static void
fadePreparePaintScreen (CompScreen *s,
int msSinceLastPaint)
{
CompWindow *w;
int steps;
FADE_SCREEN (s);
switch (fs->opt[FADE_SCREEN_OPTION_FADE_MODE].value.i) {
case FADE_MODE_CONSTANTSPEED:
steps = (msSinceLastPaint * OPAQUE) / fs->fadeTime;
if (steps < 12)
steps = 12;
for (w = s->windows; w; w = w->next)
{
FadeWindow *fw = GET_FADE_WINDOW (w, fs);
fw->steps = steps;
fw->fadeTime = 0;
}
break;
case FADE_MODE_CONSTANTTIME:
for (w = s->windows; w; w = w->next)
{
FadeWindow *fw = GET_FADE_WINDOW (w, fs);
if (fw->fadeTime)
{
fw->steps = 1;
fw->fadeTime -= msSinceLastPaint;
if (fw->fadeTime < 0)
fw->fadeTime = 0;
}
else
{
fw->steps = 0;
}
}
break;
}
UNWRAP (fs, s, preparePaintScreen);
(*s->preparePaintScreen) (s, msSinceLastPaint);
WRAP (fs, s, preparePaintScreen, fadePreparePaintScreen);
}
static void
fadeWindowStop (CompWindow *w)
{
FADE_WINDOW (w);
while (fw->unmapCnt)
{
unmapWindow (w);
fw->unmapCnt--;
}
while (fw->destroyCnt)
{
destroyWindow (w);
fw->destroyCnt--;
}
}
static Bool
fadePaintWindow (CompWindow *w,
const WindowPaintAttrib *attrib,
const CompTransform *transform,
Region region,
unsigned int mask)
{
CompScreen *s = w->screen;
Bool status;
FADE_DISPLAY (s->display);
FADE_SCREEN (s);
FADE_WINDOW (w);
if (!w->screen->canDoSlightlySaturated)
fw->saturation = attrib->saturation;
if (!w->alive ||
fw->destroyCnt ||
fw->unmapCnt ||
fw->opacity != attrib->opacity ||
fw->brightness != attrib->brightness ||
fw->saturation != attrib->saturation ||
fd->displayModals)
{
WindowPaintAttrib fAttrib = *attrib;
int mode = fs->opt[FADE_SCREEN_OPTION_FADE_MODE].value.i;
if (!w->alive && fs->opt[FADE_SCREEN_OPTION_DIM_UNRESPONSIVE].value.b)
{
GLuint value;
value = fs->opt[FADE_SCREEN_OPTION_UNRESPONSIVE_BRIGHTNESS].value.i;
if (value != 100)
fAttrib.brightness = fAttrib.brightness * value / 100;
value = fs->opt[FADE_SCREEN_OPTION_UNRESPONSIVE_SATURATION].value.i;
if (value != 100 && s->canDoSlightlySaturated)
fAttrib.saturation = fAttrib.saturation * value / 100;
}
else if (fd->displayModals && !fw->dModal)
{
fAttrib.brightness = 0xa8a8;
fAttrib.saturation = 0;
}
if (fw->fadeOut)
fAttrib.opacity = 0;
if (mode == FADE_MODE_CONSTANTTIME)
{
if (fAttrib.opacity != fw->targetOpacity ||
fAttrib.brightness != fw->targetBrightness ||
fAttrib.saturation != fw->targetSaturation)
{
fw->fadeTime = fs->opt[FADE_SCREEN_OPTION_FADE_TIME].value.i;
fw->steps = 1;
fw->opacityDiff = fAttrib.opacity - fw->opacity;
fw->brightnessDiff = fAttrib.brightness - fw->brightness;
fw->saturationDiff = fAttrib.saturation - fw->saturation;
fw->targetOpacity = fAttrib.opacity;
fw->targetBrightness = fAttrib.brightness;
fw->targetSaturation = fAttrib.saturation;
}
}
if (fw->steps)
{
GLint opacity = OPAQUE;
GLint brightness = BRIGHT;
GLint saturation = COLOR;
if (mode == FADE_MODE_CONSTANTSPEED)
{
opacity = fw->opacity;
if (fAttrib.opacity > fw->opacity)
{
opacity = fw->opacity + fw->steps;
if (opacity > fAttrib.opacity)
opacity = fAttrib.opacity;
}
else if (fAttrib.opacity < fw->opacity)
{
opacity = fw->opacity - fw->steps;
if (opacity < fAttrib.opacity)
opacity = fAttrib.opacity;
}
brightness = fw->brightness;
if (fAttrib.brightness > fw->brightness)
{
brightness = fw->brightness + (fw->steps / 12);
if (brightness > fAttrib.brightness)
brightness = fAttrib.brightness;
}
else if (fAttrib.brightness < fw->brightness)
{
brightness = fw->brightness - (fw->steps / 12);
if (brightness < fAttrib.brightness)
brightness = fAttrib.brightness;
}
saturation = fw->saturation;
if (fAttrib.saturation > fw->saturation)
{
saturation = fw->saturation + (fw->steps / 6);
if (saturation > fAttrib.saturation)
saturation = fAttrib.saturation;
}
else if (fAttrib.saturation < fw->saturation)
{
saturation = fw->saturation - (fw->steps / 6);
if (saturation < fAttrib.saturation)
saturation = fAttrib.saturation;
}
}
else if (mode == FADE_MODE_CONSTANTTIME)
{
int fadeTime = fs->opt[FADE_SCREEN_OPTION_FADE_TIME].value.i;
opacity = fAttrib.opacity -
(fw->opacityDiff * fw->fadeTime / fadeTime);
brightness = fAttrib.brightness -
(fw->brightnessDiff * fw->fadeTime / fadeTime);
saturation = fAttrib.saturation -
(fw->saturationDiff * fw->fadeTime / fadeTime);
}
fw->steps = 0;
if (opacity > 0)
{
fw->opacity = opacity;
fw->brightness = brightness;
fw->saturation = saturation;
if (opacity != fAttrib.opacity ||
brightness != fAttrib.brightness ||
saturation != fAttrib.saturation)
addWindowDamage (w);
}
else
{
fw->opacity = 0;
fadeWindowStop (w);
}
}
fAttrib.opacity = fw->opacity;
fAttrib.brightness = fw->brightness;
fAttrib.saturation = fw->saturation;
UNWRAP (fs, s, paintWindow);
status = (*s->paintWindow) (w, &fAttrib, transform, region, mask);
WRAP (fs, s, paintWindow, fadePaintWindow);
}
else
{
UNWRAP (fs, s, paintWindow);
status = (*s->paintWindow) (w, attrib, transform, region, mask);
WRAP (fs, s, paintWindow, fadePaintWindow);
}
return status;
}
static void
fadeAddDisplayModal (CompDisplay *d,
CompWindow *w)
{
FADE_DISPLAY (d);
FADE_WINDOW (w);
if (!(w->state & CompWindowStateDisplayModalMask))
return;
if (fw->dModal)
return;
fw->dModal = 1;
fd->displayModals++;
if (fd->displayModals == 1)
{
CompScreen *s;
for (s = d->screens; s; s = s->next)
damageScreen (s);
}
}
static void
fadeRemoveDisplayModal (CompDisplay *d,
CompWindow *w)
{
FADE_DISPLAY (d);
FADE_WINDOW (w);
if (!fw->dModal)
return;
fw->dModal = 0;
fd->displayModals--;
if (fd->displayModals == 0)
{
CompScreen *s;
for (s = d->screens; s; s = s->next)
damageScreen (s);
}
}
/* Returns whether this window should be faded
* on open and close events. */
static Bool
isFadeWinForOpenClose (CompWindow *w)
{
FADE_DISPLAY (w->screen->display);
FADE_SCREEN (w->screen);
if (fs->opt[FADE_SCREEN_OPTION_MINIMIZE_OPEN_CLOSE].value.b &&
!fd->suppressMinimizeOpenClose)
{
return TRUE;
}
return matchEval (&fd->alwaysFadeWindowMatch, w);
}
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_SCREEN (w->screen);
if (w->texture->pixmap && isFadeWinForOpenClose (w) &&
matchEval (&fs->match, w))
{
FADE_WINDOW (w);
if (fw->opacity == 0xffff)
fw->opacity = 0xfffe;
fw->destroyCnt++;
w->destroyRefCnt++;
fw->fadeOut = TRUE;
addWindowDamage (w);
}
fadeRemoveDisplayModal (d, w);
}
break;
case UnmapNotify:
w = findWindowAtDisplay (d, event->xunmap.window);
if (w)
{
FADE_SCREEN (w->screen);
FADE_WINDOW (w);
fw->shaded = w->shaded;
if (fs->opt[FADE_SCREEN_OPTION_MINIMIZE_OPEN_CLOSE].value.b &&
!fd->suppressMinimizeOpenClose &&
!fw->shaded && w->texture->pixmap &&
matchEval (&fs->match, w))
{
if (fw->opacity == 0xffff)
fw->opacity = 0xfffe;
fw->unmapCnt++;
w->unmapRefCnt++;
fw->fadeOut = TRUE;
addWindowDamage (w);
}
fadeRemoveDisplayModal (d, w);
}
break;
case MapNotify:
w = findWindowAtDisplay (d, event->xmap.window);
if (w)
{
FADE_SCREEN (w->screen);
if (fs->opt[FADE_SCREEN_OPTION_MINIMIZE_OPEN_CLOSE].value.b &&
!fd->suppressMinimizeOpenClose)
{
fadeWindowStop (w);
}
if (w->state & CompWindowStateDisplayModalMask)
fadeAddDisplayModal (d, w);
}
break;
default:
if (event->type == d->xkbEvent)
{
XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event;
if (xkbEvent->xkb_type == XkbBellNotify)
{
XkbBellNotifyEvent *xkbBellEvent = (XkbBellNotifyEvent *)
xkbEvent;
w = findWindowAtDisplay (d, xkbBellEvent->window);
if (!w)
w = findWindowAtDisplay (d, d->activeWindow);
if (w)
{
CompScreen *s = w->screen;
FADE_SCREEN (s);
if (fs->opt[FADE_SCREEN_OPTION_VISUAL_BELL].value.b)
{
int option;
option = FADE_SCREEN_OPTION_FULLSCREEN_VISUAL_BELL;
if (fs->opt[option].value.b)
{
for (w = s->windows; w; w = w->next)
{
if (w->destroyed)
continue;
if (w->attrib.map_state != IsViewable)
continue;
if (w->damaged)
{
FADE_WINDOW (w);
fw->brightness = w->paint.brightness / 2;
}
}
damageScreen (s);
}
else
{
FADE_WINDOW (w);
fw->brightness = w->paint.brightness / 2;
addWindowDamage (w);
}
}
}
}
}
break;
}
UNWRAP (fd, d, handleEvent);
(*d->handleEvent) (d, event);
WRAP (fd, d, handleEvent, fadeHandleEvent);
switch (event->type) {
case PropertyNotify:
if (event->xproperty.atom == d->winStateAtom)
{
w = findWindowAtDisplay (d, event->xproperty.window);
if (w && w->attrib.map_state == IsViewable)
{
if (w->state & CompWindowStateDisplayModalMask)
fadeAddDisplayModal (d, w);
else
fadeRemoveDisplayModal (d, w);
}
}
break;
case ClientMessage:
if (event->xclient.message_type == d->wmProtocolsAtom &&
event->xclient.data.l[0] == d->wmPingAtom)
{
w = findWindowAtDisplay (d, event->xclient.data.l[2]);
if (w)
{
FADE_WINDOW (w);
if (w->alive != fw->alive)
{
addWindowDamage (w);
fw->alive = w->alive;
}
}
}
}
}
static Bool
fadeDamageWindowRect (CompWindow *w,
Bool initial,
BoxPtr rect)
{
Bool status;
FADE_SCREEN (w->screen);
if (initial)
{
FADE_WINDOW (w);
fw->fadeOut = FALSE;
if (fw->shaded)
{
fw->shaded = w->shaded;
}
else if (matchEval (&fs->match, w))
{
if (isFadeWinForOpenClose (w))
{
fw->opacity = 0;
fw->targetOpacity = 0;
}
}
}
UNWRAP (fs, w->screen, damageWindowRect);
status = (*w->screen->damageWindowRect) (w, initial, rect);
WRAP (fs, w->screen, damageWindowRect, fadeDamageWindowRect);
return status;
}
static Bool
fadeFocusWindow (CompWindow *w)
{
Bool status;
FADE_SCREEN (w->screen);
FADE_WINDOW (w);
if (fw->destroyCnt || fw->unmapCnt)
return FALSE;
UNWRAP (fs, w->screen, focusWindow);
status = (*w->screen->focusWindow) (w);
WRAP (fs, w->screen, focusWindow, fadeFocusWindow);
return status;
}
static void
fadeWindowResizeNotify (CompWindow *w,
int dx,
int dy,
int dwidth,
int dheight)
{
FADE_SCREEN (w->screen);
if (!w->mapNum)
fadeWindowStop (w);
UNWRAP (fs, w->screen, windowResizeNotify);
(*w->screen->windowResizeNotify) (w, dx, dy, dwidth, dheight);
WRAP (fs, w->screen, windowResizeNotify, fadeWindowResizeNotify);
}
static void
fadeMatchExpHandlerChanged (CompDisplay *d)
{
CompScreen *s;
FADE_DISPLAY (d);
for (s = d->screens; s; s = s->next)
matchUpdate (d, &GET_FADE_SCREEN (s,fd)->match);
UNWRAP (fd, d, matchExpHandlerChanged);
(*d->matchExpHandlerChanged) (d);
WRAP (fd, d, matchExpHandlerChanged, fadeMatchExpHandlerChanged);
}
static Bool
fadeInitDisplay (CompPlugin *p,
CompDisplay *d)
{
FadeDisplay *fd;
if (!checkPluginABI ("core", CORE_ABIVERSION))
return FALSE;
fd = malloc (sizeof (FadeDisplay));
if (!fd)
return FALSE;
fd->screenPrivateIndex = allocateScreenPrivateIndex (d);
if (fd->screenPrivateIndex < 0)
{
free (fd);
return FALSE;
}
fd->displayModals = 0;
fd->suppressMinimizeOpenClose = (findActivePlugin ("animation") != NULL);
/* Always fade opening and closing of screen-dimming layer of
logout window and gksu. */
matchInit (&fd->alwaysFadeWindowMatch);
matchAddExp (&fd->alwaysFadeWindowMatch, 0, "title=gksu");
matchAddExp (&fd->alwaysFadeWindowMatch, 0, "title=x-session-manager");
matchAddExp (&fd->alwaysFadeWindowMatch, 0, "title=gnome-session");
matchUpdate (d, &fd->alwaysFadeWindowMatch);
WRAP (fd, d, handleEvent, fadeHandleEvent);
WRAP (fd, d, matchExpHandlerChanged, fadeMatchExpHandlerChanged);
d->base.privates[displayPrivateIndex].ptr = fd;
return TRUE;
}
static void
fadeFiniDisplay (CompPlugin *p,
CompDisplay *d)
{
FADE_DISPLAY (d);
freeScreenPrivateIndex (d, fd->screenPrivateIndex);
matchFini (&fd->alwaysFadeWindowMatch);
UNWRAP (fd, d, handleEvent);
UNWRAP (fd, d, matchExpHandlerChanged);
free (fd);
}
static const CompMetadataOptionInfo fadeScreenOptionInfo[] = {
{ "fade_mode", "int", RESTOSTRING (0, FADE_MODE_MAX), 0, 0 },
{ "fade_speed", "float", "<min>0.1</min>", 0, 0 },
{ "fade_time", "int", "<min>1</min>", 0, 0 },
{ "window_match", "match", "<helper>true</helper>", 0, 0 },
{ "visual_bell", "bool", 0, 0, 0 },
{ "fullscreen_visual_bell", "bool", 0, 0, 0 },
{ "minimize_open_close", "bool", 0, 0, 0 },
{ "dim_unresponsive", "bool", 0, 0, 0 },
{ "unresponsive_brightness", "int", "<min>0</min><max>100</max>", 0, 0 },
{ "unresponsive_saturation", "int", "<min>0</min><max>100</max>", 0, 0 }
};
static Bool
fadeInitScreen (CompPlugin *p,
CompScreen *s)
{
FadeScreen *fs;
FADE_DISPLAY (s->display);
fs = malloc (sizeof (FadeScreen));
if (!fs)
return FALSE;
if (!compInitScreenOptionsFromMetadata (s,
&fadeMetadata,
fadeScreenOptionInfo,
fs->opt,
FADE_SCREEN_OPTION_NUM))
{
free (fs);
return FALSE;
}
fs->windowPrivateIndex = allocateWindowPrivateIndex (s);
if (fs->windowPrivateIndex < 0)
{
compFiniScreenOptions (s, fs->opt, FADE_SCREEN_OPTION_NUM);
free (fs);
return FALSE;
}
fs->fadeTime = 1000.0f / fs->opt[FADE_SCREEN_OPTION_FADE_SPEED].value.f;
matchInit (&fs->match);
fadeUpdateWindowFadeMatch (s->display,
&fs->opt[FADE_SCREEN_OPTION_WINDOW_MATCH].value,
&fs->match);
WRAP (fs, s, preparePaintScreen, fadePreparePaintScreen);
WRAP (fs, s, paintWindow, fadePaintWindow);
WRAP (fs, s, damageWindowRect, fadeDamageWindowRect);
WRAP (fs, s, focusWindow, fadeFocusWindow);
WRAP (fs, s, windowResizeNotify, fadeWindowResizeNotify);
s->base.privates[fd->screenPrivateIndex].ptr = fs;
return TRUE;
}
static void
fadeFiniScreen (CompPlugin *p,
CompScreen *s)
{
FADE_SCREEN (s);
matchFini (&fs->match);
freeWindowPrivateIndex (s, fs->windowPrivateIndex);
UNWRAP (fs, s, preparePaintScreen);
UNWRAP (fs, s, paintWindow);
UNWRAP (fs, s, damageWindowRect);
UNWRAP (fs, s, focusWindow);
UNWRAP (fs, s, windowResizeNotify);
compFiniScreenOptions (s, fs->opt, FADE_SCREEN_OPTION_NUM);
free (fs);
}
static Bool
fadeInitWindow (CompPlugin *p,
CompWindow *w)
{
FadeWindow *fw;
FADE_SCREEN (w->screen);
fw = malloc (sizeof (FadeWindow));
if (!fw)
return FALSE;
fw->opacity = w->paint.opacity;
fw->brightness = w->paint.brightness;
fw->saturation = w->paint.saturation;
fw->targetOpacity = fw->opacity;
fw->targetBrightness = fw->brightness;
fw->targetSaturation = fw->saturation;
fw->opacityDiff = 0;
fw->brightnessDiff = 0;
fw->saturationDiff = 0;
fw->dModal = 0;
fw->destroyCnt = 0;
fw->unmapCnt = 0;
fw->shaded = w->shaded;
fw->fadeOut = FALSE;
fw->alive = w->alive;
fw->steps = 0;
fw->fadeTime = 0;
w->base.privates[fs->windowPrivateIndex].ptr = fw;
if (w->attrib.map_state == IsViewable)
{
if (w->state & CompWindowStateDisplayModalMask)
fadeAddDisplayModal (w->screen->display, w);
}
return TRUE;
}
static void
fadeFiniWindow (CompPlugin *p,
CompWindow *w)
{
FADE_WINDOW (w);
fadeRemoveDisplayModal (w->screen->display, w);
fadeWindowStop (w);
free (fw);
}
static CompBool
fadeInitObject (CompPlugin *p,
CompObject *o)
{
static InitPluginObjectProc dispTab[] = {
(InitPluginObjectProc) 0, /* InitCore */
(InitPluginObjectProc) fadeInitDisplay,
(InitPluginObjectProc) fadeInitScreen,
(InitPluginObjectProc) fadeInitWindow
};
RETURN_DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), TRUE, (p, o));
}
static void
fadeFiniObject (CompPlugin *p,
CompObject *o)
{
static FiniPluginObjectProc dispTab[] = {
(FiniPluginObjectProc) 0, /* FiniCore */
(FiniPluginObjectProc) fadeFiniDisplay,
(FiniPluginObjectProc) fadeFiniScreen,
(FiniPluginObjectProc) fadeFiniWindow
};
DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), (p, o));
}
static CompOption *
fadeGetObjectOptions (CompPlugin *plugin,
CompObject *object,
int *count)
{
static GetPluginObjectOptionsProc dispTab[] = {
(GetPluginObjectOptionsProc) 0, /* GetCoreOptions */
(GetPluginObjectOptionsProc) 0, /* GetDisplayOptions */
(GetPluginObjectOptionsProc) fadeGetScreenOptions
};
*count = 0;
RETURN_DISPATCH (object, dispTab, ARRAY_SIZE (dispTab),
(void *) count, (plugin, object, count));
}
static CompBool
fadeSetObjectOption (CompPlugin *plugin,
CompObject *object,
const char *name,
CompOptionValue *value)
{
static SetPluginObjectOptionProc dispTab[] = {
(SetPluginObjectOptionProc) 0, /* SetCoreOption */
(SetPluginObjectOptionProc) 0, /* SetDisplayOption */
(SetPluginObjectOptionProc) fadeSetScreenOption
};
RETURN_DISPATCH (object, dispTab, ARRAY_SIZE (dispTab), FALSE,
(plugin, object, name, value));
}
static Bool
fadeInit (CompPlugin *p)
{
if (!compInitPluginMetadataFromInfo (&fadeMetadata, p->vTable->name, 0, 0,
fadeScreenOptionInfo,
FADE_SCREEN_OPTION_NUM))
return FALSE;
displayPrivateIndex = allocateDisplayPrivateIndex ();
if (displayPrivateIndex < 0)
{
compFiniMetadata (&fadeMetadata);
return FALSE;
}
compAddMetadataFromFile (&fadeMetadata, p->vTable->name);
return TRUE;
}
static void
fadeFini (CompPlugin *p)
{
freeDisplayPrivateIndex (displayPrivateIndex);
compFiniMetadata (&fadeMetadata);
}
static CompMetadata *
fadeGetMetadata (CompPlugin *plugin)
{
return &fadeMetadata;
}
static CompPluginVTable fadeVTable = {
"fade",
fadeGetMetadata,
fadeInit,
fadeFini,
fadeInitObject,
fadeFiniObject,
fadeGetObjectOptions,
fadeSetObjectOption
};
CompPluginVTable *
getCompPluginInfo20070830 (void)
{
return &fadeVTable;
}