/*
 * This file is autogenerated with bcop:
 * The Compiz option code generator
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <compiz.h>

#define _FIREPAINT_OPTIONS_INTERNAL
#include "firepaint_options.h"

static int displayPrivateIndex;

static CompMetadata firepaintOptionsMetadata;

static CompPluginVTable *firepaintPluginVTable = NULL;
CompPluginVTable firepaintOptionsVTable;

#define GET_FIREPAINT_OPTIONS_DISPLAY(d) \
        ((FirepaintOptionsDisplay *) (d)->privates[displayPrivateIndex].ptr)

#define FIREPAINT_OPTIONS_DISPLAY(d) \
        FirepaintOptionsDisplay *od = GET_FIREPAINT_OPTIONS_DISPLAY (d)

#define GET_FIREPAINT_OPTIONS_SCREEN(s, od) \
        ((FirepaintOptionsScreen *) (s)->privates[(od)->screenPrivateIndex].ptr)

#define FIREPAINT_OPTIONS_SCREEN(s) \
        FirepaintOptionsScreen *os = GET_FIREPAINT_OPTIONS_SCREEN (s, GET_FIREPAINT_OPTIONS_DISPLAY (s->display))

typedef struct _FirepaintOptionsDisplay
{
    int screenPrivateIndex;

    CompOption opt[FirepaintDisplayOptionNum];
    firepaintDisplayOptionChangeNotifyProc notify[FirepaintDisplayOptionNum];
} FirepaintOptionsDisplay;

typedef struct _FirepaintOptionsScreen
{
    CompOption opt[FirepaintScreenOptionNum];
    firepaintScreenOptionChangeNotifyProc notify[FirepaintScreenOptionNum];
} FirepaintOptionsScreen;

CompAction * firepaintGetInitiate (CompDisplay *d)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    return &od->opt[FirepaintDisplayOptionInitiate].value.action;
}

void firepaintSetInitiateInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    od->opt[FirepaintDisplayOptionInitiate].value.action.initiate = init;
}

void firepaintSetInitiateTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    od->opt[FirepaintDisplayOptionInitiate].value.action.terminate = term;
}

CompOption * firepaintGetInitiateOption (CompDisplay *d)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    return &od->opt[FirepaintDisplayOptionInitiate];
}

void firepaintSetInitiateNotify (CompDisplay *d, firepaintDisplayOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    od->notify[FirepaintDisplayOptionInitiate] = notify;
}

CompAction * firepaintGetClear (CompDisplay *d)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    return &od->opt[FirepaintDisplayOptionClear].value.action;
}

void firepaintSetClearInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    od->opt[FirepaintDisplayOptionClear].value.action.initiate = init;
}

void firepaintSetClearTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    od->opt[FirepaintDisplayOptionClear].value.action.terminate = term;
}

CompOption * firepaintGetClearOption (CompDisplay *d)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    return &od->opt[FirepaintDisplayOptionClear];
}

void firepaintSetClearNotify (CompDisplay *d, firepaintDisplayOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    od->notify[FirepaintDisplayOptionClear] = notify;
}

int firepaintGetNumParticles (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionNumParticles].value.i;
}

CompOption * firepaintGetNumParticlesOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionNumParticles];
}

void firepaintSetNumParticlesNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionNumParticles] = notify;
}

float firepaintGetFireSize (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireSize].value.f;
}

CompOption * firepaintGetFireSizeOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionFireSize];
}

void firepaintSetFireSizeNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionFireSize] = notify;
}

float firepaintGetFireSlowdown (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireSlowdown].value.f;
}

CompOption * firepaintGetFireSlowdownOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionFireSlowdown];
}

void firepaintSetFireSlowdownNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionFireSlowdown] = notify;
}

float firepaintGetFireLife (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireLife].value.f;
}

CompOption * firepaintGetFireLifeOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionFireLife];
}

void firepaintSetFireLifeNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionFireLife] = notify;
}

unsigned short * firepaintGetFireColor (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireColor].value.c;
}

unsigned short firepaintGetFireColorRed (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireColor].value.c[0];
}

unsigned short firepaintGetFireColorGreen (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireColor].value.c[1];
}

unsigned short firepaintGetFireColorBlue (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireColor].value.c[2];
}

unsigned short firepaintGetFireColorAlpha (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireColor].value.c[3];
}

CompOption * firepaintGetFireColorOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionFireColor];
}

void firepaintSetFireColorNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionFireColor] = notify;
}

Bool firepaintGetFireMystical (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionFireMystical].value.b;
}

CompOption * firepaintGetFireMysticalOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionFireMystical];
}

void firepaintSetFireMysticalNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionFireMystical] = notify;
}

int firepaintGetBgBrightness (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return os->opt[FirepaintScreenOptionBgBrightness].value.i;
}

CompOption * firepaintGetBgBrightnessOption (CompScreen *s)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[FirepaintScreenOptionBgBrightness];
}

void firepaintSetBgBrightnessNotify (CompScreen *s, firepaintScreenOptionChangeNotifyProc notify)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    os->notify[FirepaintScreenOptionBgBrightness] = notify;
}

CompOption * firepaintGetDisplayOption (CompDisplay *d, FirepaintDisplayOptions num)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    return &od->opt[num];
}

CompOption * firepaintGetScreenOption (CompScreen *s, FirepaintScreenOptions num)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    return &os->opt[num];
}

static const CompMetadataOptionInfo firepaintOptionsDisplayOptionInfo[] = {
    { "initiate", "action", 0, 0, 0 },
    { "clear", "action", 0, 0, 0 },
};

static Bool firepaintOptionsSetDisplayOption (CompPlugin *plugin, CompDisplay *d, char *name, CompOptionValue *value)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    CompOption *o;
    int        index;

    o = compFindOption (od->opt, FirepaintDisplayOptionNum, name, &index);

    if (!o)
        return FALSE;

    switch (index)
    {
     case FirepaintDisplayOptionInitiate:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[FirepaintDisplayOptionInitiate])
                (*od->notify[FirepaintDisplayOptionInitiate]) (d, o, FirepaintDisplayOptionInitiate);
            return TRUE;
        }
        break;
     case FirepaintDisplayOptionClear:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[FirepaintDisplayOptionClear])
                (*od->notify[FirepaintDisplayOptionClear]) (d, o, FirepaintDisplayOptionClear);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * firepaintOptionsGetDisplayOptions (CompPlugin *plugin, CompDisplay *d, int *count)
{
    FIREPAINT_OPTIONS_DISPLAY(d);
    *count = FirepaintDisplayOptionNum;
    return od->opt;
}

static const CompMetadataOptionInfo firepaintOptionsScreenOptionInfo[] = {
    { "num_Particles", "int", "<min>100</min><max>20000</max>", 0, 0 },
    { "fire_size", "float", "<min>0.1</min><max>40</max>", 0, 0 },
    { "fire_slowdown", "float", "<min>0.1</min><max>10</max>", 0, 0 },
    { "fire_life", "float", "<min>0.1</min><max>0.95</max>", 0, 0 },
    { "fire_color", "color", 0, 0, 0 },
    { "fire_mystical", "bool", 0, 0, 0 },
    { "bg_brightness", "int", "<min>0</min><max>100</max>", 0, 0 },
};

static Bool firepaintOptionsSetScreenOption (CompPlugin *plugin, CompScreen *s, char *name, CompOptionValue *value)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    CompOption *o;
    int        index;

    o = compFindOption (os->opt, FirepaintScreenOptionNum, name, &index);

    if (!o)
        return FALSE;

    switch (index)
    {
     case FirepaintScreenOptionNumParticles:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionNumParticles])
                (*os->notify[FirepaintScreenOptionNumParticles]) (s, o, FirepaintScreenOptionNumParticles);
            return TRUE;
        }
        break;
     case FirepaintScreenOptionFireSize:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionFireSize])
                (*os->notify[FirepaintScreenOptionFireSize]) (s, o, FirepaintScreenOptionFireSize);
            return TRUE;
        }
        break;
     case FirepaintScreenOptionFireSlowdown:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionFireSlowdown])
                (*os->notify[FirepaintScreenOptionFireSlowdown]) (s, o, FirepaintScreenOptionFireSlowdown);
            return TRUE;
        }
        break;
     case FirepaintScreenOptionFireLife:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionFireLife])
                (*os->notify[FirepaintScreenOptionFireLife]) (s, o, FirepaintScreenOptionFireLife);
            return TRUE;
        }
        break;
     case FirepaintScreenOptionFireColor:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionFireColor])
                (*os->notify[FirepaintScreenOptionFireColor]) (s, o, FirepaintScreenOptionFireColor);
            return TRUE;
        }
        break;
     case FirepaintScreenOptionFireMystical:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionFireMystical])
                (*os->notify[FirepaintScreenOptionFireMystical]) (s, o, FirepaintScreenOptionFireMystical);
            return TRUE;
        }
        break;
     case FirepaintScreenOptionBgBrightness:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[FirepaintScreenOptionBgBrightness])
                (*os->notify[FirepaintScreenOptionBgBrightness]) (s, o, FirepaintScreenOptionBgBrightness);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * firepaintOptionsGetScreenOptions (CompPlugin *plugin, CompScreen *s, int *count)
{
    FIREPAINT_OPTIONS_SCREEN(s);
    *count = FirepaintScreenOptionNum;
    return os->opt;
}

static Bool firepaintOptionsInitScreen (CompPlugin *p, CompScreen *s)
{
    FirepaintOptionsScreen *os;
    
    FIREPAINT_OPTIONS_DISPLAY (s->display);

    os = calloc (1, sizeof(FirepaintOptionsScreen));
    if (!os)
        return FALSE;

    s->privates[od->screenPrivateIndex].ptr = os;

    if (!compInitScreenOptionsFromMetadata (s, &firepaintOptionsMetadata, firepaintOptionsScreenOptionInfo, os->opt, FirepaintScreenOptionNum))
    {
        free (os);
        return FALSE;
    }
    if (firepaintPluginVTable && firepaintPluginVTable->initScreen)
        return firepaintPluginVTable->initScreen (p, s);
    return TRUE;
}

static void firepaintOptionsFiniScreen (CompPlugin *p, CompScreen *s)
{
    if (firepaintPluginVTable && firepaintPluginVTable->finiScreen)
        return firepaintPluginVTable->finiScreen (p, s);

    FIREPAINT_OPTIONS_SCREEN (s);


    compFiniScreenOptions (s, os->opt, FirepaintScreenOptionNum);

    free (os);
}

static Bool firepaintOptionsInitDisplay (CompPlugin *p, CompDisplay *d)
{
    FirepaintOptionsDisplay *od;
   
    
    od = calloc (1, sizeof(FirepaintOptionsDisplay));
    if (!od)
        return FALSE;

    od->screenPrivateIndex = allocateScreenPrivateIndex(d);
    if (od->screenPrivateIndex < 0)
    {
        free(od);
        return FALSE;
    }

    d->privates[displayPrivateIndex].ptr = od;

    if (!compInitDisplayOptionsFromMetadata (d, &firepaintOptionsMetadata, firepaintOptionsDisplayOptionInfo, od->opt, FirepaintDisplayOptionNum))
    {
        free (od);
        return FALSE;
    }
    if (firepaintPluginVTable && firepaintPluginVTable->initDisplay)
        return firepaintPluginVTable->initDisplay (p, d);
    return TRUE;
}

static void firepaintOptionsFiniDisplay (CompPlugin *p, CompDisplay *d)
{
    if (firepaintPluginVTable && firepaintPluginVTable->finiDisplay)
        return firepaintPluginVTable->finiDisplay (p, d);

    FIREPAINT_OPTIONS_DISPLAY (d);

    freeScreenPrivateIndex(d, od->screenPrivateIndex);

    compFiniDisplayOptions (d, od->opt, FirepaintDisplayOptionNum);

    free (od);
}

static Bool firepaintOptionsInit (CompPlugin *p)
{
    displayPrivateIndex = allocateDisplayPrivateIndex();
    if (displayPrivateIndex < 0)
        return FALSE;

    if (!compInitPluginMetadataFromInfo (&firepaintOptionsMetadata, "firepaint",firepaintOptionsDisplayOptionInfo, FirepaintDisplayOptionNum, firepaintOptionsScreenOptionInfo, FirepaintScreenOptionNum))
        return FALSE;

    compAddMetadataFromFile (&firepaintOptionsMetadata, "firepaint");
    if (firepaintPluginVTable && firepaintPluginVTable->init)
        return firepaintPluginVTable->init (p);
    return TRUE;
}

static void firepaintOptionsFini (CompPlugin *p)
{
    if (firepaintPluginVTable && firepaintPluginVTable->fini)
        return firepaintPluginVTable->fini (p);

    if (displayPrivateIndex >= 0)
        freeDisplayPrivateIndex(displayPrivateIndex);

    compFiniMetadata (&firepaintOptionsMetadata);
}

static CompMetadata *
firepaintOptionsGetMetadata (CompPlugin *plugin)
{
    return &firepaintOptionsMetadata;
}

CompPluginVTable *getCompPluginInfo (void)
{
    if (!firepaintPluginVTable)
    {
        firepaintPluginVTable = firepaintOptionsGetCompPluginInfo ();
        memcpy(&firepaintOptionsVTable, firepaintPluginVTable, sizeof(CompPluginVTable));
        firepaintOptionsVTable.getMetadata = firepaintOptionsGetMetadata;
        firepaintOptionsVTable.init = firepaintOptionsInit;
        firepaintOptionsVTable.fini = firepaintOptionsFini;
        firepaintOptionsVTable.initDisplay = firepaintOptionsInitDisplay;
        firepaintOptionsVTable.finiDisplay = firepaintOptionsFiniDisplay;
        firepaintOptionsVTable.initScreen = firepaintOptionsInitScreen;
        firepaintOptionsVTable.finiScreen = firepaintOptionsFiniScreen;
        firepaintOptionsVTable.getDisplayOptions = firepaintOptionsGetDisplayOptions;
	firepaintOptionsVTable.setDisplayOption = firepaintOptionsSetDisplayOption;
	firepaintOptionsVTable.getScreenOptions = firepaintOptionsGetScreenOptions;
	firepaintOptionsVTable.setScreenOption = firepaintOptionsSetScreenOption;
	
    }
    return &firepaintOptionsVTable;
}



syntax highlighted by Code2HTML, v. 0.9.1