/*
 * 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 _NEG_OPTIONS_INTERNAL
#include "neg_options.h"

static int displayPrivateIndex;

static CompMetadata negOptionsMetadata;

static CompPluginVTable *negPluginVTable = NULL;
CompPluginVTable negOptionsVTable;

#define GET_NEG_OPTIONS_DISPLAY(d) \
        ((NegOptionsDisplay *) (d)->privates[displayPrivateIndex].ptr)

#define NEG_OPTIONS_DISPLAY(d) \
        NegOptionsDisplay *od = GET_NEG_OPTIONS_DISPLAY (d)

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

#define NEG_OPTIONS_SCREEN(s) \
        NegOptionsScreen *os = GET_NEG_OPTIONS_SCREEN (s, GET_NEG_OPTIONS_DISPLAY (s->display))

typedef struct _NegOptionsDisplay
{
    int screenPrivateIndex;

    CompOption opt[NegDisplayOptionNum];
    negDisplayOptionChangeNotifyProc notify[NegDisplayOptionNum];
} NegOptionsDisplay;

typedef struct _NegOptionsScreen
{
    CompOption opt[NegScreenOptionNum];
    negScreenOptionChangeNotifyProc notify[NegScreenOptionNum];
} NegOptionsScreen;

CompAction * negGetWindowToggle (CompDisplay *d)
{
    NEG_OPTIONS_DISPLAY(d);
    return &od->opt[NegDisplayOptionWindowToggle].value.action;
}

void negSetWindowToggleInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    NEG_OPTIONS_DISPLAY(d);
    od->opt[NegDisplayOptionWindowToggle].value.action.initiate = init;
}

void negSetWindowToggleTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    NEG_OPTIONS_DISPLAY(d);
    od->opt[NegDisplayOptionWindowToggle].value.action.terminate = term;
}

CompOption * negGetWindowToggleOption (CompDisplay *d)
{
    NEG_OPTIONS_DISPLAY(d);
    return &od->opt[NegDisplayOptionWindowToggle];
}

void negSetWindowToggleNotify (CompDisplay *d, negDisplayOptionChangeNotifyProc notify)
{
    NEG_OPTIONS_DISPLAY(d);
    od->notify[NegDisplayOptionWindowToggle] = notify;
}

CompAction * negGetScreenToggle (CompDisplay *d)
{
    NEG_OPTIONS_DISPLAY(d);
    return &od->opt[NegDisplayOptionScreenToggle].value.action;
}

void negSetScreenToggleInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    NEG_OPTIONS_DISPLAY(d);
    od->opt[NegDisplayOptionScreenToggle].value.action.initiate = init;
}

void negSetScreenToggleTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    NEG_OPTIONS_DISPLAY(d);
    od->opt[NegDisplayOptionScreenToggle].value.action.terminate = term;
}

CompOption * negGetScreenToggleOption (CompDisplay *d)
{
    NEG_OPTIONS_DISPLAY(d);
    return &od->opt[NegDisplayOptionScreenToggle];
}

void negSetScreenToggleNotify (CompDisplay *d, negDisplayOptionChangeNotifyProc notify)
{
    NEG_OPTIONS_DISPLAY(d);
    od->notify[NegDisplayOptionScreenToggle] = notify;
}

CompMatch * negGetNegMatch (CompScreen *s)
{
    NEG_OPTIONS_SCREEN(s);
    return &os->opt[NegScreenOptionNegMatch].value.match;
}

CompOption * negGetNegMatchOption (CompScreen *s)
{
    NEG_OPTIONS_SCREEN(s);
    return &os->opt[NegScreenOptionNegMatch];
}

void negSetNegMatchNotify (CompScreen *s, negScreenOptionChangeNotifyProc notify)
{
    NEG_OPTIONS_SCREEN(s);
    os->notify[NegScreenOptionNegMatch] = notify;
}

CompMatch * negGetExcludeMatch (CompScreen *s)
{
    NEG_OPTIONS_SCREEN(s);
    return &os->opt[NegScreenOptionExcludeMatch].value.match;
}

CompOption * negGetExcludeMatchOption (CompScreen *s)
{
    NEG_OPTIONS_SCREEN(s);
    return &os->opt[NegScreenOptionExcludeMatch];
}

void negSetExcludeMatchNotify (CompScreen *s, negScreenOptionChangeNotifyProc notify)
{
    NEG_OPTIONS_SCREEN(s);
    os->notify[NegScreenOptionExcludeMatch] = notify;
}

CompOption * negGetDisplayOption (CompDisplay *d, NegDisplayOptions num)
{
    NEG_OPTIONS_DISPLAY(d);
    return &od->opt[num];
}

CompOption * negGetScreenOption (CompScreen *s, NegScreenOptions num)
{
    NEG_OPTIONS_SCREEN(s);
    return &os->opt[num];
}

static const CompMetadataOptionInfo negOptionsDisplayOptionInfo[] = {
    { "window_toggle", "action", 0, 0, 0 },
    { "screen_toggle", "action", 0, 0, 0 },
};

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

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

    if (!o)
        return FALSE;

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

static CompOption * negOptionsGetDisplayOptions (CompPlugin *plugin, CompDisplay *d, int *count)
{
    NEG_OPTIONS_DISPLAY(d);
    *count = NegDisplayOptionNum;
    return od->opt;
}

static const CompMetadataOptionInfo negOptionsScreenOptionInfo[] = {
    { "neg_match", "match", 0, 0, 0 },
    { "exclude_match", "match", 0, 0, 0 },
};

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

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

    if (!o)
        return FALSE;

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

static CompOption * negOptionsGetScreenOptions (CompPlugin *plugin, CompScreen *s, int *count)
{
    NEG_OPTIONS_SCREEN(s);
    *count = NegScreenOptionNum;
    return os->opt;
}

static Bool negOptionsInitScreen (CompPlugin *p, CompScreen *s)
{
    NegOptionsScreen *os;
    
    NEG_OPTIONS_DISPLAY (s->display);

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

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

    if (!compInitScreenOptionsFromMetadata (s, &negOptionsMetadata, negOptionsScreenOptionInfo, os->opt, NegScreenOptionNum))
    {
        free (os);
        return FALSE;
    }
    if (negPluginVTable && negPluginVTable->initScreen)
        return negPluginVTable->initScreen (p, s);
    return TRUE;
}

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

    NEG_OPTIONS_SCREEN (s);


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

    free (os);
}

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

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

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

    if (!compInitDisplayOptionsFromMetadata (d, &negOptionsMetadata, negOptionsDisplayOptionInfo, od->opt, NegDisplayOptionNum))
    {
        free (od);
        return FALSE;
    }
    if (negPluginVTable && negPluginVTable->initDisplay)
        return negPluginVTable->initDisplay (p, d);
    return TRUE;
}

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

    NEG_OPTIONS_DISPLAY (d);

    freeScreenPrivateIndex(d, od->screenPrivateIndex);

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

    free (od);
}

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

    if (!compInitPluginMetadataFromInfo (&negOptionsMetadata, "neg",negOptionsDisplayOptionInfo, NegDisplayOptionNum, negOptionsScreenOptionInfo, NegScreenOptionNum))
        return FALSE;

    compAddMetadataFromFile (&negOptionsMetadata, "neg");
    if (negPluginVTable && negPluginVTable->init)
        return negPluginVTable->init (p);
    return TRUE;
}

static void negOptionsFini (CompPlugin *p)
{
    if (negPluginVTable && negPluginVTable->fini)
        return negPluginVTable->fini (p);

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

    compFiniMetadata (&negOptionsMetadata);
}

static CompMetadata *
negOptionsGetMetadata (CompPlugin *plugin)
{
    return &negOptionsMetadata;
}

CompPluginVTable *getCompPluginInfo (void)
{
    if (!negPluginVTable)
    {
        negPluginVTable = negOptionsGetCompPluginInfo ();
        memcpy(&negOptionsVTable, negPluginVTable, sizeof(CompPluginVTable));
        negOptionsVTable.getMetadata = negOptionsGetMetadata;
        negOptionsVTable.init = negOptionsInit;
        negOptionsVTable.fini = negOptionsFini;
        negOptionsVTable.initDisplay = negOptionsInitDisplay;
        negOptionsVTable.finiDisplay = negOptionsFiniDisplay;
        negOptionsVTable.initScreen = negOptionsInitScreen;
        negOptionsVTable.finiScreen = negOptionsFiniScreen;
        negOptionsVTable.getDisplayOptions = negOptionsGetDisplayOptions;
	negOptionsVTable.setDisplayOption = negOptionsSetDisplayOption;
	negOptionsVTable.getScreenOptions = negOptionsGetScreenOptions;
	negOptionsVTable.setScreenOption = negOptionsSetScreenOption;
	
    }
    return &negOptionsVTable;
}



syntax highlighted by Code2HTML, v. 0.9.1