/*
 * 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 _MBLUR_OPTIONS_INTERNAL
#include "mblur_options.h"

static int displayPrivateIndex;

static CompMetadata mblurOptionsMetadata;

static CompPluginVTable *mblurPluginVTable = NULL;
CompPluginVTable mblurOptionsVTable;

#define GET_MBLUR_OPTIONS_DISPLAY(d) \
        ((MblurOptionsDisplay *) (d)->privates[displayPrivateIndex].ptr)

#define MBLUR_OPTIONS_DISPLAY(d) \
        MblurOptionsDisplay *od = GET_MBLUR_OPTIONS_DISPLAY (d)

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

#define MBLUR_OPTIONS_SCREEN(s) \
        MblurOptionsScreen *os = GET_MBLUR_OPTIONS_SCREEN (s, GET_MBLUR_OPTIONS_DISPLAY (s->display))

typedef struct _MblurOptionsDisplay
{
    int screenPrivateIndex;

    CompOption opt[MblurDisplayOptionNum];
    mblurDisplayOptionChangeNotifyProc notify[MblurDisplayOptionNum];
} MblurOptionsDisplay;

typedef struct _MblurOptionsScreen
{
    CompOption opt[MblurScreenOptionNum];
    mblurScreenOptionChangeNotifyProc notify[MblurScreenOptionNum];
} MblurOptionsScreen;

CompAction * mblurGetInitiate (CompDisplay *d)
{
    MBLUR_OPTIONS_DISPLAY(d);
    return &od->opt[MblurDisplayOptionInitiate].value.action;
}

void mblurSetInitiateInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    MBLUR_OPTIONS_DISPLAY(d);
    od->opt[MblurDisplayOptionInitiate].value.action.initiate = init;
}

void mblurSetInitiateTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    MBLUR_OPTIONS_DISPLAY(d);
    od->opt[MblurDisplayOptionInitiate].value.action.terminate = term;
}

CompOption * mblurGetInitiateOption (CompDisplay *d)
{
    MBLUR_OPTIONS_DISPLAY(d);
    return &od->opt[MblurDisplayOptionInitiate];
}

void mblurSetInitiateNotify (CompDisplay *d, mblurDisplayOptionChangeNotifyProc notify)
{
    MBLUR_OPTIONS_DISPLAY(d);
    od->notify[MblurDisplayOptionInitiate] = notify;
}

int mblurGetMode (CompScreen *s)
{
    MBLUR_OPTIONS_SCREEN(s);
    return os->opt[MblurScreenOptionMode].value.i;
}

CompOption * mblurGetModeOption (CompScreen *s)
{
    MBLUR_OPTIONS_SCREEN(s);
    return &os->opt[MblurScreenOptionMode];
}

void mblurSetModeNotify (CompScreen *s, mblurScreenOptionChangeNotifyProc notify)
{
    MBLUR_OPTIONS_SCREEN(s);
    os->notify[MblurScreenOptionMode] = notify;
}

float mblurGetStrength (CompScreen *s)
{
    MBLUR_OPTIONS_SCREEN(s);
    return os->opt[MblurScreenOptionStrength].value.f;
}

CompOption * mblurGetStrengthOption (CompScreen *s)
{
    MBLUR_OPTIONS_SCREEN(s);
    return &os->opt[MblurScreenOptionStrength];
}

void mblurSetStrengthNotify (CompScreen *s, mblurScreenOptionChangeNotifyProc notify)
{
    MBLUR_OPTIONS_SCREEN(s);
    os->notify[MblurScreenOptionStrength] = notify;
}

Bool mblurGetOnTransformedScreen (CompScreen *s)
{
    MBLUR_OPTIONS_SCREEN(s);
    return os->opt[MblurScreenOptionOnTransformedScreen].value.b;
}

CompOption * mblurGetOnTransformedScreenOption (CompScreen *s)
{
    MBLUR_OPTIONS_SCREEN(s);
    return &os->opt[MblurScreenOptionOnTransformedScreen];
}

void mblurSetOnTransformedScreenNotify (CompScreen *s, mblurScreenOptionChangeNotifyProc notify)
{
    MBLUR_OPTIONS_SCREEN(s);
    os->notify[MblurScreenOptionOnTransformedScreen] = notify;
}

CompOption * mblurGetDisplayOption (CompDisplay *d, MblurDisplayOptions num)
{
    MBLUR_OPTIONS_DISPLAY(d);
    return &od->opt[num];
}

CompOption * mblurGetScreenOption (CompScreen *s, MblurScreenOptions num)
{
    MBLUR_OPTIONS_SCREEN(s);
    return &os->opt[num];
}

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

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

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

    if (!o)
        return FALSE;

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

static CompOption * mblurOptionsGetDisplayOptions (CompPlugin *plugin, CompDisplay *d, int *count)
{
    MBLUR_OPTIONS_DISPLAY(d);
    *count = MblurDisplayOptionNum;
    return od->opt;
}

static const CompMetadataOptionInfo mblurOptionsScreenOptionInfo[] = {
    { "mode", "int", "<min>0</min><max>1</max>", 0, 0 },
    { "strength", "float", "<min>0.0</min><max>100.0</max>", 0, 0 },
    { "on_transformed_screen", "bool", 0, 0, 0 },
};

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

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

    if (!o)
        return FALSE;

    switch (index)
    {
     case MblurScreenOptionMode:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[MblurScreenOptionMode])
                (*os->notify[MblurScreenOptionMode]) (s, o, MblurScreenOptionMode);
            return TRUE;
        }
        break;
     case MblurScreenOptionStrength:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[MblurScreenOptionStrength])
                (*os->notify[MblurScreenOptionStrength]) (s, o, MblurScreenOptionStrength);
            return TRUE;
        }
        break;
     case MblurScreenOptionOnTransformedScreen:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[MblurScreenOptionOnTransformedScreen])
                (*os->notify[MblurScreenOptionOnTransformedScreen]) (s, o, MblurScreenOptionOnTransformedScreen);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * mblurOptionsGetScreenOptions (CompPlugin *plugin, CompScreen *s, int *count)
{
    MBLUR_OPTIONS_SCREEN(s);
    *count = MblurScreenOptionNum;
    return os->opt;
}

static Bool mblurOptionsInitScreen (CompPlugin *p, CompScreen *s)
{
    MblurOptionsScreen *os;
    
    MBLUR_OPTIONS_DISPLAY (s->display);

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

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

    if (!compInitScreenOptionsFromMetadata (s, &mblurOptionsMetadata, mblurOptionsScreenOptionInfo, os->opt, MblurScreenOptionNum))
    {
        free (os);
        return FALSE;
    }
    if (mblurPluginVTable && mblurPluginVTable->initScreen)
        return mblurPluginVTable->initScreen (p, s);
    return TRUE;
}

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

    MBLUR_OPTIONS_SCREEN (s);


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

    free (os);
}

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

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

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

    if (!compInitDisplayOptionsFromMetadata (d, &mblurOptionsMetadata, mblurOptionsDisplayOptionInfo, od->opt, MblurDisplayOptionNum))
    {
        free (od);
        return FALSE;
    }
    if (mblurPluginVTable && mblurPluginVTable->initDisplay)
        return mblurPluginVTable->initDisplay (p, d);
    return TRUE;
}

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

    MBLUR_OPTIONS_DISPLAY (d);

    freeScreenPrivateIndex(d, od->screenPrivateIndex);

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

    free (od);
}

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

    if (!compInitPluginMetadataFromInfo (&mblurOptionsMetadata, "mblur",mblurOptionsDisplayOptionInfo, MblurDisplayOptionNum, mblurOptionsScreenOptionInfo, MblurScreenOptionNum))
        return FALSE;

    compAddMetadataFromFile (&mblurOptionsMetadata, "mblur");
    if (mblurPluginVTable && mblurPluginVTable->init)
        return mblurPluginVTable->init (p);
    return TRUE;
}

static void mblurOptionsFini (CompPlugin *p)
{
    if (mblurPluginVTable && mblurPluginVTable->fini)
        return mblurPluginVTable->fini (p);

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

    compFiniMetadata (&mblurOptionsMetadata);
}

static CompMetadata *
mblurOptionsGetMetadata (CompPlugin *plugin)
{
    return &mblurOptionsMetadata;
}

CompPluginVTable *getCompPluginInfo (void)
{
    if (!mblurPluginVTable)
    {
        mblurPluginVTable = mblurOptionsGetCompPluginInfo ();
        memcpy(&mblurOptionsVTable, mblurPluginVTable, sizeof(CompPluginVTable));
        mblurOptionsVTable.getMetadata = mblurOptionsGetMetadata;
        mblurOptionsVTable.init = mblurOptionsInit;
        mblurOptionsVTable.fini = mblurOptionsFini;
        mblurOptionsVTable.initDisplay = mblurOptionsInitDisplay;
        mblurOptionsVTable.finiDisplay = mblurOptionsFiniDisplay;
        mblurOptionsVTable.initScreen = mblurOptionsInitScreen;
        mblurOptionsVTable.finiScreen = mblurOptionsFiniScreen;
        mblurOptionsVTable.getDisplayOptions = mblurOptionsGetDisplayOptions;
	mblurOptionsVTable.setDisplayOption = mblurOptionsSetDisplayOption;
	mblurOptionsVTable.getScreenOptions = mblurOptionsGetScreenOptions;
	mblurOptionsVTable.setScreenOption = mblurOptionsSetScreenOption;
	
    }
    return &mblurOptionsVTable;
}



syntax highlighted by Code2HTML, v. 0.9.1