/*
 * 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 _WIDGET_OPTIONS_INTERNAL
#include "widget_options.h"

static int displayPrivateIndex;

static CompMetadata widgetOptionsMetadata;

static CompPluginVTable *widgetPluginVTable = NULL;
CompPluginVTable widgetOptionsVTable;

#define GET_WIDGET_OPTIONS_DISPLAY(d) \
        ((WidgetOptionsDisplay *) (d)->privates[displayPrivateIndex].ptr)

#define WIDGET_OPTIONS_DISPLAY(d) \
        WidgetOptionsDisplay *od = GET_WIDGET_OPTIONS_DISPLAY (d)

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

#define WIDGET_OPTIONS_SCREEN(s) \
        WidgetOptionsScreen *os = GET_WIDGET_OPTIONS_SCREEN (s, GET_WIDGET_OPTIONS_DISPLAY (s->display))

typedef struct _WidgetOptionsDisplay
{
    int screenPrivateIndex;

    CompOption opt[WidgetDisplayOptionNum];
    widgetDisplayOptionChangeNotifyProc notify[WidgetDisplayOptionNum];
} WidgetOptionsDisplay;

typedef struct _WidgetOptionsScreen
{
    CompOption opt[WidgetScreenOptionNum];
    widgetScreenOptionChangeNotifyProc notify[WidgetScreenOptionNum];
} WidgetOptionsScreen;

CompAction * widgetGetToggle (CompDisplay *d)
{
    WIDGET_OPTIONS_DISPLAY(d);
    return &od->opt[WidgetDisplayOptionToggle].value.action;
}

void widgetSetToggleInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    WIDGET_OPTIONS_DISPLAY(d);
    od->opt[WidgetDisplayOptionToggle].value.action.initiate = init;
}

void widgetSetToggleTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    WIDGET_OPTIONS_DISPLAY(d);
    od->opt[WidgetDisplayOptionToggle].value.action.terminate = term;
}

CompOption * widgetGetToggleOption (CompDisplay *d)
{
    WIDGET_OPTIONS_DISPLAY(d);
    return &od->opt[WidgetDisplayOptionToggle];
}

void widgetSetToggleNotify (CompDisplay *d, widgetDisplayOptionChangeNotifyProc notify)
{
    WIDGET_OPTIONS_DISPLAY(d);
    od->notify[WidgetDisplayOptionToggle] = notify;
}

CompMatch * widgetGetMatch (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[WidgetScreenOptionMatch].value.match;
}

CompOption * widgetGetMatchOption (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[WidgetScreenOptionMatch];
}

void widgetSetMatchNotify (CompScreen *s, widgetScreenOptionChangeNotifyProc notify)
{
    WIDGET_OPTIONS_SCREEN(s);
    os->notify[WidgetScreenOptionMatch] = notify;
}

Bool widgetGetEndOnClick (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return os->opt[WidgetScreenOptionEndOnClick].value.b;
}

CompOption * widgetGetEndOnClickOption (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[WidgetScreenOptionEndOnClick];
}

void widgetSetEndOnClickNotify (CompScreen *s, widgetScreenOptionChangeNotifyProc notify)
{
    WIDGET_OPTIONS_SCREEN(s);
    os->notify[WidgetScreenOptionEndOnClick] = notify;
}

float widgetGetFadeTime (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return os->opt[WidgetScreenOptionFadeTime].value.f;
}

CompOption * widgetGetFadeTimeOption (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[WidgetScreenOptionFadeTime];
}

void widgetSetFadeTimeNotify (CompScreen *s, widgetScreenOptionChangeNotifyProc notify)
{
    WIDGET_OPTIONS_SCREEN(s);
    os->notify[WidgetScreenOptionFadeTime] = notify;
}

int widgetGetBgBrightness (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return os->opt[WidgetScreenOptionBgBrightness].value.i;
}

CompOption * widgetGetBgBrightnessOption (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[WidgetScreenOptionBgBrightness];
}

void widgetSetBgBrightnessNotify (CompScreen *s, widgetScreenOptionChangeNotifyProc notify)
{
    WIDGET_OPTIONS_SCREEN(s);
    os->notify[WidgetScreenOptionBgBrightness] = notify;
}

int widgetGetBgSaturation (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return os->opt[WidgetScreenOptionBgSaturation].value.i;
}

CompOption * widgetGetBgSaturationOption (CompScreen *s)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[WidgetScreenOptionBgSaturation];
}

void widgetSetBgSaturationNotify (CompScreen *s, widgetScreenOptionChangeNotifyProc notify)
{
    WIDGET_OPTIONS_SCREEN(s);
    os->notify[WidgetScreenOptionBgSaturation] = notify;
}

CompOption * widgetGetDisplayOption (CompDisplay *d, WidgetDisplayOptions num)
{
    WIDGET_OPTIONS_DISPLAY(d);
    return &od->opt[num];
}

CompOption * widgetGetScreenOption (CompScreen *s, WidgetScreenOptions num)
{
    WIDGET_OPTIONS_SCREEN(s);
    return &os->opt[num];
}

static const CompMetadataOptionInfo widgetOptionsDisplayOptionInfo[] = {
    { "toggle", "action", 0, 0, 0 },
};

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

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

    if (!o)
        return FALSE;

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

static CompOption * widgetOptionsGetDisplayOptions (CompPlugin *plugin, CompDisplay *d, int *count)
{
    WIDGET_OPTIONS_DISPLAY(d);
    *count = WidgetDisplayOptionNum;
    return od->opt;
}

static const CompMetadataOptionInfo widgetOptionsScreenOptionInfo[] = {
    { "match", "match", 0, 0, 0 },
    { "end_on_click", "bool", 0, 0, 0 },
    { "fade_time", "float", "<min>0</min><max>10</max>", 0, 0 },
    { "bg_brightness", "int", "<min>0</min><max>100</max>", 0, 0 },
    { "bg_saturation", "int", "<min>0</min><max>100</max>", 0, 0 },
};

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

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

    if (!o)
        return FALSE;

    switch (index)
    {
     case WidgetScreenOptionMatch:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[WidgetScreenOptionMatch])
                (*os->notify[WidgetScreenOptionMatch]) (s, o, WidgetScreenOptionMatch);
            return TRUE;
        }
        break;
     case WidgetScreenOptionEndOnClick:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[WidgetScreenOptionEndOnClick])
                (*os->notify[WidgetScreenOptionEndOnClick]) (s, o, WidgetScreenOptionEndOnClick);
            return TRUE;
        }
        break;
     case WidgetScreenOptionFadeTime:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[WidgetScreenOptionFadeTime])
                (*os->notify[WidgetScreenOptionFadeTime]) (s, o, WidgetScreenOptionFadeTime);
            return TRUE;
        }
        break;
     case WidgetScreenOptionBgBrightness:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[WidgetScreenOptionBgBrightness])
                (*os->notify[WidgetScreenOptionBgBrightness]) (s, o, WidgetScreenOptionBgBrightness);
            return TRUE;
        }
        break;
     case WidgetScreenOptionBgSaturation:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[WidgetScreenOptionBgSaturation])
                (*os->notify[WidgetScreenOptionBgSaturation]) (s, o, WidgetScreenOptionBgSaturation);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * widgetOptionsGetScreenOptions (CompPlugin *plugin, CompScreen *s, int *count)
{
    WIDGET_OPTIONS_SCREEN(s);
    *count = WidgetScreenOptionNum;
    return os->opt;
}

static Bool widgetOptionsInitScreen (CompPlugin *p, CompScreen *s)
{
    WidgetOptionsScreen *os;
    
    WIDGET_OPTIONS_DISPLAY (s->display);

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

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

    if (!compInitScreenOptionsFromMetadata (s, &widgetOptionsMetadata, widgetOptionsScreenOptionInfo, os->opt, WidgetScreenOptionNum))
    {
        free (os);
        return FALSE;
    }
    if (widgetPluginVTable && widgetPluginVTable->initScreen)
        return widgetPluginVTable->initScreen (p, s);
    return TRUE;
}

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

    WIDGET_OPTIONS_SCREEN (s);


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

    free (os);
}

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

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

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

    if (!compInitDisplayOptionsFromMetadata (d, &widgetOptionsMetadata, widgetOptionsDisplayOptionInfo, od->opt, WidgetDisplayOptionNum))
    {
        free (od);
        return FALSE;
    }
    if (widgetPluginVTable && widgetPluginVTable->initDisplay)
        return widgetPluginVTable->initDisplay (p, d);
    return TRUE;
}

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

    WIDGET_OPTIONS_DISPLAY (d);

    freeScreenPrivateIndex(d, od->screenPrivateIndex);

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

    free (od);
}

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

    if (!compInitPluginMetadataFromInfo (&widgetOptionsMetadata, "widget",widgetOptionsDisplayOptionInfo, WidgetDisplayOptionNum, widgetOptionsScreenOptionInfo, WidgetScreenOptionNum))
        return FALSE;

    compAddMetadataFromFile (&widgetOptionsMetadata, "widget");
    if (widgetPluginVTable && widgetPluginVTable->init)
        return widgetPluginVTable->init (p);
    return TRUE;
}

static void widgetOptionsFini (CompPlugin *p)
{
    if (widgetPluginVTable && widgetPluginVTable->fini)
        return widgetPluginVTable->fini (p);

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

    compFiniMetadata (&widgetOptionsMetadata);
}

static CompMetadata *
widgetOptionsGetMetadata (CompPlugin *plugin)
{
    return &widgetOptionsMetadata;
}

CompPluginVTable *getCompPluginInfo (void)
{
    if (!widgetPluginVTable)
    {
        widgetPluginVTable = widgetOptionsGetCompPluginInfo ();
        memcpy(&widgetOptionsVTable, widgetPluginVTable, sizeof(CompPluginVTable));
        widgetOptionsVTable.getMetadata = widgetOptionsGetMetadata;
        widgetOptionsVTable.init = widgetOptionsInit;
        widgetOptionsVTable.fini = widgetOptionsFini;
        widgetOptionsVTable.initDisplay = widgetOptionsInitDisplay;
        widgetOptionsVTable.finiDisplay = widgetOptionsFiniDisplay;
        widgetOptionsVTable.initScreen = widgetOptionsInitScreen;
        widgetOptionsVTable.finiScreen = widgetOptionsFiniScreen;
        widgetOptionsVTable.getDisplayOptions = widgetOptionsGetDisplayOptions;
	widgetOptionsVTable.setDisplayOption = widgetOptionsSetDisplayOption;
	widgetOptionsVTable.getScreenOptions = widgetOptionsGetScreenOptions;
	widgetOptionsVTable.setScreenOption = widgetOptionsSetScreenOption;
	
    }
    return &widgetOptionsVTable;
}



syntax highlighted by Code2HTML, v. 0.9.1