/*
 * 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 _SHIFT_OPTIONS_INTERNAL
#include "shift_options.h"

static int displayPrivateIndex;

static CompMetadata shiftOptionsMetadata;

static CompPluginVTable *shiftPluginVTable = NULL;
CompPluginVTable shiftOptionsVTable;

#define GET_SHIFT_OPTIONS_DISPLAY(d) \
        ((ShiftOptionsDisplay *) (d)->privates[displayPrivateIndex].ptr)

#define SHIFT_OPTIONS_DISPLAY(d) \
        ShiftOptionsDisplay *od = GET_SHIFT_OPTIONS_DISPLAY (d)

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

#define SHIFT_OPTIONS_SCREEN(s) \
        ShiftOptionsScreen *os = GET_SHIFT_OPTIONS_SCREEN (s, GET_SHIFT_OPTIONS_DISPLAY (s->display))

typedef struct _ShiftOptionsDisplay
{
    int screenPrivateIndex;

    CompOption opt[ShiftDisplayOptionNum];
    shiftDisplayOptionChangeNotifyProc notify[ShiftDisplayOptionNum];
} ShiftOptionsDisplay;

typedef struct _ShiftOptionsScreen
{
    CompOption opt[ShiftScreenOptionNum];
    shiftScreenOptionChangeNotifyProc notify[ShiftScreenOptionNum];
} ShiftOptionsScreen;

CompAction * shiftGetInitiate (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionInitiate].value.action;
}

void shiftSetInitiateInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionInitiate].value.action.initiate = init;
}

void shiftSetInitiateTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionInitiate].value.action.terminate = term;
}

CompOption * shiftGetInitiateOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionInitiate];
}

void shiftSetInitiateNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionInitiate] = notify;
}

CompAction * shiftGetInitiateAll (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionInitiateAll].value.action;
}

void shiftSetInitiateAllInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionInitiateAll].value.action.initiate = init;
}

void shiftSetInitiateAllTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionInitiateAll].value.action.terminate = term;
}

CompOption * shiftGetInitiateAllOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionInitiateAll];
}

void shiftSetInitiateAllNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionInitiateAll] = notify;
}

CompAction * shiftGetNext (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionNext].value.action;
}

void shiftSetNextInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionNext].value.action.initiate = init;
}

void shiftSetNextTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionNext].value.action.terminate = term;
}

CompOption * shiftGetNextOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionNext];
}

void shiftSetNextNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionNext] = notify;
}

CompAction * shiftGetPrev (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionPrev].value.action;
}

void shiftSetPrevInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionPrev].value.action.initiate = init;
}

void shiftSetPrevTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionPrev].value.action.terminate = term;
}

CompOption * shiftGetPrevOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionPrev];
}

void shiftSetPrevNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionPrev] = notify;
}

CompAction * shiftGetNextAll (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionNextAll].value.action;
}

void shiftSetNextAllInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionNextAll].value.action.initiate = init;
}

void shiftSetNextAllTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionNextAll].value.action.terminate = term;
}

CompOption * shiftGetNextAllOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionNextAll];
}

void shiftSetNextAllNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionNextAll] = notify;
}

CompAction * shiftGetPrevAll (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionPrevAll].value.action;
}

void shiftSetPrevAllInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionPrevAll].value.action.initiate = init;
}

void shiftSetPrevAllTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionPrevAll].value.action.terminate = term;
}

CompOption * shiftGetPrevAllOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionPrevAll];
}

void shiftSetPrevAllNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionPrevAll] = notify;
}

CompAction * shiftGetNextGroup (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionNextGroup].value.action;
}

void shiftSetNextGroupInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionNextGroup].value.action.initiate = init;
}

void shiftSetNextGroupTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionNextGroup].value.action.terminate = term;
}

CompOption * shiftGetNextGroupOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionNextGroup];
}

void shiftSetNextGroupNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionNextGroup] = notify;
}

CompAction * shiftGetPrevGroup (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionPrevGroup].value.action;
}

void shiftSetPrevGroupInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionPrevGroup].value.action.initiate = init;
}

void shiftSetPrevGroupTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->opt[ShiftDisplayOptionPrevGroup].value.action.terminate = term;
}

CompOption * shiftGetPrevGroupOption (CompDisplay *d)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[ShiftDisplayOptionPrevGroup];
}

void shiftSetPrevGroupNotify (CompDisplay *d, shiftDisplayOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_DISPLAY(d);
    od->notify[ShiftDisplayOptionPrevGroup] = notify;
}

float shiftGetSpeed (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionSpeed].value.f;
}

CompOption * shiftGetSpeedOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionSpeed];
}

void shiftSetSpeedNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionSpeed] = notify;
}

float shiftGetShiftSpeed (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionShiftSpeed].value.f;
}

CompOption * shiftGetShiftSpeedOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionShiftSpeed];
}

void shiftSetShiftSpeedNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionShiftSpeed] = notify;
}

float shiftGetTimestep (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTimestep].value.f;
}

CompOption * shiftGetTimestepOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionTimestep];
}

void shiftSetTimestepNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionTimestep] = notify;
}

CompMatch * shiftGetWindowMatch (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionWindowMatch].value.match;
}

CompOption * shiftGetWindowMatchOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionWindowMatch];
}

void shiftSetWindowMatchNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionWindowMatch] = notify;
}

Bool shiftGetMinimized (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionMinimized].value.b;
}

CompOption * shiftGetMinimizedOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionMinimized];
}

void shiftSetMinimizedNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionMinimized] = notify;
}

float shiftGetMouseSpeed (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionMouseSpeed].value.f;
}

CompOption * shiftGetMouseSpeedOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionMouseSpeed];
}

void shiftSetMouseSpeedNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionMouseSpeed] = notify;
}

int shiftGetClickDuration (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionClickDuration].value.i;
}

CompOption * shiftGetClickDurationOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionClickDuration];
}

void shiftSetClickDurationNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionClickDuration] = notify;
}

int shiftGetMode (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionMode].value.i;
}

CompOption * shiftGetModeOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionMode];
}

void shiftSetModeNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionMode] = notify;
}

int shiftGetSize (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionSize].value.i;
}

CompOption * shiftGetSizeOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionSize];
}

void shiftSetSizeNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionSize] = notify;
}

float shiftGetBackgroundIntensity (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionBackgroundIntensity].value.f;
}

CompOption * shiftGetBackgroundIntensityOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionBackgroundIntensity];
}

void shiftSetBackgroundIntensityNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionBackgroundIntensity] = notify;
}

Bool shiftGetHideAll (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionHideAll].value.b;
}

CompOption * shiftGetHideAllOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionHideAll];
}

void shiftSetHideAllNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionHideAll] = notify;
}

Bool shiftGetReflection (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionReflection].value.b;
}

CompOption * shiftGetReflectionOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionReflection];
}

void shiftSetReflectionNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionReflection] = notify;
}

unsigned short * shiftGetGroundColor1 (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor1].value.c;
}

unsigned short shiftGetGroundColor1Red (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor1].value.c[0];
}

unsigned short shiftGetGroundColor1Green (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor1].value.c[1];
}

unsigned short shiftGetGroundColor1Blue (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor1].value.c[2];
}

unsigned short shiftGetGroundColor1Alpha (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor1].value.c[3];
}

CompOption * shiftGetGroundColor1Option (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionGroundColor1];
}

void shiftSetGroundColor1Notify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionGroundColor1] = notify;
}

unsigned short * shiftGetGroundColor2 (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor2].value.c;
}

unsigned short shiftGetGroundColor2Red (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor2].value.c[0];
}

unsigned short shiftGetGroundColor2Green (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor2].value.c[1];
}

unsigned short shiftGetGroundColor2Blue (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor2].value.c[2];
}

unsigned short shiftGetGroundColor2Alpha (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundColor2].value.c[3];
}

CompOption * shiftGetGroundColor2Option (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionGroundColor2];
}

void shiftSetGroundColor2Notify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionGroundColor2] = notify;
}

float shiftGetGroundSize (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionGroundSize].value.f;
}

CompOption * shiftGetGroundSizeOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionGroundSize];
}

void shiftSetGroundSizeNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionGroundSize] = notify;
}

float shiftGetIntensity (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionIntensity].value.f;
}

CompOption * shiftGetIntensityOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionIntensity];
}

void shiftSetIntensityNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionIntensity] = notify;
}

int shiftGetFlipRotation (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionFlipRotation].value.i;
}

CompOption * shiftGetFlipRotationOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionFlipRotation];
}

void shiftSetFlipRotationNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionFlipRotation] = notify;
}

float shiftGetCoverOffset (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionCoverOffset].value.f;
}

CompOption * shiftGetCoverOffsetOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionCoverOffset];
}

void shiftSetCoverOffsetNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionCoverOffset] = notify;
}

int shiftGetOverlayIcon (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionOverlayIcon].value.i;
}

CompOption * shiftGetOverlayIconOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionOverlayIcon];
}

void shiftSetOverlayIconNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionOverlayIcon] = notify;
}

Bool shiftGetMipmaps (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionMipmaps].value.b;
}

CompOption * shiftGetMipmapsOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionMipmaps];
}

void shiftSetMipmapsNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionMipmaps] = notify;
}

int shiftGetMultioutputMode (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionMultioutputMode].value.i;
}

CompOption * shiftGetMultioutputModeOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionMultioutputMode];
}

void shiftSetMultioutputModeNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionMultioutputMode] = notify;
}

Bool shiftGetWindowTitle (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionWindowTitle].value.b;
}

CompOption * shiftGetWindowTitleOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionWindowTitle];
}

void shiftSetWindowTitleNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionWindowTitle] = notify;
}

Bool shiftGetTitleFontBold (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontBold].value.b;
}

CompOption * shiftGetTitleFontBoldOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionTitleFontBold];
}

void shiftSetTitleFontBoldNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionTitleFontBold] = notify;
}

int shiftGetTitleFontSize (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontSize].value.i;
}

CompOption * shiftGetTitleFontSizeOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionTitleFontSize];
}

void shiftSetTitleFontSizeNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionTitleFontSize] = notify;
}

unsigned short * shiftGetTitleBackColor (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleBackColor].value.c;
}

unsigned short shiftGetTitleBackColorRed (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleBackColor].value.c[0];
}

unsigned short shiftGetTitleBackColorGreen (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleBackColor].value.c[1];
}

unsigned short shiftGetTitleBackColorBlue (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleBackColor].value.c[2];
}

unsigned short shiftGetTitleBackColorAlpha (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleBackColor].value.c[3];
}

CompOption * shiftGetTitleBackColorOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionTitleBackColor];
}

void shiftSetTitleBackColorNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionTitleBackColor] = notify;
}

unsigned short * shiftGetTitleFontColor (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontColor].value.c;
}

unsigned short shiftGetTitleFontColorRed (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontColor].value.c[0];
}

unsigned short shiftGetTitleFontColorGreen (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontColor].value.c[1];
}

unsigned short shiftGetTitleFontColorBlue (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontColor].value.c[2];
}

unsigned short shiftGetTitleFontColorAlpha (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleFontColor].value.c[3];
}

CompOption * shiftGetTitleFontColorOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionTitleFontColor];
}

void shiftSetTitleFontColorNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionTitleFontColor] = notify;
}

int shiftGetTitleTextPlacement (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return os->opt[ShiftScreenOptionTitleTextPlacement].value.i;
}

CompOption * shiftGetTitleTextPlacementOption (CompScreen *s)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[ShiftScreenOptionTitleTextPlacement];
}

void shiftSetTitleTextPlacementNotify (CompScreen *s, shiftScreenOptionChangeNotifyProc notify)
{
    SHIFT_OPTIONS_SCREEN(s);
    os->notify[ShiftScreenOptionTitleTextPlacement] = notify;
}

CompOption * shiftGetDisplayOption (CompDisplay *d, ShiftDisplayOptions num)
{
    SHIFT_OPTIONS_DISPLAY(d);
    return &od->opt[num];
}

CompOption * shiftGetScreenOption (CompScreen *s, ShiftScreenOptions num)
{
    SHIFT_OPTIONS_SCREEN(s);
    return &os->opt[num];
}

static const CompMetadataOptionInfo shiftOptionsDisplayOptionInfo[] = {
    { "initiate", "action", 0, 0, 0 },
    { "initiate_all", "action", 0, 0, 0 },
    { "next", "action", 0, 0, 0 },
    { "prev", "action", 0, 0, 0 },
    { "next_all", "action", 0, 0, 0 },
    { "prev_all", "action", 0, 0, 0 },
    { "next_group", "action", 0, 0, 0 },
    { "prev_group", "action", 0, 0, 0 },
};

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

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

    if (!o)
        return FALSE;

    switch (index)
    {
     case ShiftDisplayOptionInitiate:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionInitiate])
                (*od->notify[ShiftDisplayOptionInitiate]) (d, o, ShiftDisplayOptionInitiate);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionInitiateAll:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionInitiateAll])
                (*od->notify[ShiftDisplayOptionInitiateAll]) (d, o, ShiftDisplayOptionInitiateAll);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionNext:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionNext])
                (*od->notify[ShiftDisplayOptionNext]) (d, o, ShiftDisplayOptionNext);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionPrev:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionPrev])
                (*od->notify[ShiftDisplayOptionPrev]) (d, o, ShiftDisplayOptionPrev);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionNextAll:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionNextAll])
                (*od->notify[ShiftDisplayOptionNextAll]) (d, o, ShiftDisplayOptionNextAll);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionPrevAll:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionPrevAll])
                (*od->notify[ShiftDisplayOptionPrevAll]) (d, o, ShiftDisplayOptionPrevAll);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionNextGroup:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionNextGroup])
                (*od->notify[ShiftDisplayOptionNextGroup]) (d, o, ShiftDisplayOptionNextGroup);
            return TRUE;
        }
        break;
     case ShiftDisplayOptionPrevGroup:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[ShiftDisplayOptionPrevGroup])
                (*od->notify[ShiftDisplayOptionPrevGroup]) (d, o, ShiftDisplayOptionPrevGroup);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * shiftOptionsGetDisplayOptions (CompPlugin *plugin, CompDisplay *d, int *count)
{
    SHIFT_OPTIONS_DISPLAY(d);
    *count = ShiftDisplayOptionNum;
    return od->opt;
}

static const CompMetadataOptionInfo shiftOptionsScreenOptionInfo[] = {
    { "speed", "float", "<min>0.1</min><max>10.0</max>", 0, 0 },
    { "shift_speed", "float", "<min>0.1</min><max>5.0</max>", 0, 0 },
    { "timestep", "float", "<min>0.1</min><max>50.0</max>", 0, 0 },
    { "window_match", "match", 0, 0, 0 },
    { "minimized", "bool", 0, 0, 0 },
    { "mouse_speed", "float", "<min>0.1</min><max>50.0</max>", 0, 0 },
    { "click_duration", "int", "<min>10</min><max>2000</max>", 0, 0 },
    { "mode", "int", "<min>0</min><max>1</max>", 0, 0 },
    { "size", "int", "<min>1</min><max>100</max>", 0, 0 },
    { "background_intensity", "float", "<min>0.0</min><max>1.0</max>", 0, 0 },
    { "hide_all", "bool", 0, 0, 0 },
    { "reflection", "bool", 0, 0, 0 },
    { "ground_color1", "color", 0, 0, 0 },
    { "ground_color2", "color", 0, 0, 0 },
    { "ground_size", "float", "<min>0.0</min><max>1.0</max>", 0, 0 },
    { "intensity", "float", "<min>0.0</min><max>1.0</max>", 0, 0 },
    { "flip_rotation", "int", "<min>-80</min><max>80</max>", 0, 0 },
    { "cover_offset", "float", "<min>-0.4</min><max>0.4</max>", 0, 0 },
    { "overlay_icon", "int", "<min>0</min><max>2</max>", 0, 0 },
    { "mipmaps", "bool", 0, 0, 0 },
    { "multioutput_mode", "int", "<min>0</min><max>2</max>", 0, 0 },
    { "window_title", "bool", 0, 0, 0 },
    { "title_font_bold", "bool", 0, 0, 0 },
    { "title_font_size", "int", "<min>6</min><max>96</max>", 0, 0 },
    { "title_back_color", "color", 0, 0, 0 },
    { "title_font_color", "color", 0, 0, 0 },
    { "title_text_placement", "int", "<min>0</min><max>2</max>", 0, 0 },
};

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

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

    if (!o)
        return FALSE;

    switch (index)
    {
     case ShiftScreenOptionSpeed:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionSpeed])
                (*os->notify[ShiftScreenOptionSpeed]) (s, o, ShiftScreenOptionSpeed);
            return TRUE;
        }
        break;
     case ShiftScreenOptionShiftSpeed:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionShiftSpeed])
                (*os->notify[ShiftScreenOptionShiftSpeed]) (s, o, ShiftScreenOptionShiftSpeed);
            return TRUE;
        }
        break;
     case ShiftScreenOptionTimestep:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionTimestep])
                (*os->notify[ShiftScreenOptionTimestep]) (s, o, ShiftScreenOptionTimestep);
            return TRUE;
        }
        break;
     case ShiftScreenOptionWindowMatch:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionWindowMatch])
                (*os->notify[ShiftScreenOptionWindowMatch]) (s, o, ShiftScreenOptionWindowMatch);
            return TRUE;
        }
        break;
     case ShiftScreenOptionMinimized:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionMinimized])
                (*os->notify[ShiftScreenOptionMinimized]) (s, o, ShiftScreenOptionMinimized);
            return TRUE;
        }
        break;
     case ShiftScreenOptionMouseSpeed:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionMouseSpeed])
                (*os->notify[ShiftScreenOptionMouseSpeed]) (s, o, ShiftScreenOptionMouseSpeed);
            return TRUE;
        }
        break;
     case ShiftScreenOptionClickDuration:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionClickDuration])
                (*os->notify[ShiftScreenOptionClickDuration]) (s, o, ShiftScreenOptionClickDuration);
            return TRUE;
        }
        break;
     case ShiftScreenOptionMode:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionMode])
                (*os->notify[ShiftScreenOptionMode]) (s, o, ShiftScreenOptionMode);
            return TRUE;
        }
        break;
     case ShiftScreenOptionSize:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionSize])
                (*os->notify[ShiftScreenOptionSize]) (s, o, ShiftScreenOptionSize);
            return TRUE;
        }
        break;
     case ShiftScreenOptionBackgroundIntensity:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionBackgroundIntensity])
                (*os->notify[ShiftScreenOptionBackgroundIntensity]) (s, o, ShiftScreenOptionBackgroundIntensity);
            return TRUE;
        }
        break;
     case ShiftScreenOptionHideAll:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionHideAll])
                (*os->notify[ShiftScreenOptionHideAll]) (s, o, ShiftScreenOptionHideAll);
            return TRUE;
        }
        break;
     case ShiftScreenOptionReflection:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionReflection])
                (*os->notify[ShiftScreenOptionReflection]) (s, o, ShiftScreenOptionReflection);
            return TRUE;
        }
        break;
     case ShiftScreenOptionGroundColor1:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionGroundColor1])
                (*os->notify[ShiftScreenOptionGroundColor1]) (s, o, ShiftScreenOptionGroundColor1);
            return TRUE;
        }
        break;
     case ShiftScreenOptionGroundColor2:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionGroundColor2])
                (*os->notify[ShiftScreenOptionGroundColor2]) (s, o, ShiftScreenOptionGroundColor2);
            return TRUE;
        }
        break;
     case ShiftScreenOptionGroundSize:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionGroundSize])
                (*os->notify[ShiftScreenOptionGroundSize]) (s, o, ShiftScreenOptionGroundSize);
            return TRUE;
        }
        break;
     case ShiftScreenOptionIntensity:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionIntensity])
                (*os->notify[ShiftScreenOptionIntensity]) (s, o, ShiftScreenOptionIntensity);
            return TRUE;
        }
        break;
     case ShiftScreenOptionFlipRotation:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionFlipRotation])
                (*os->notify[ShiftScreenOptionFlipRotation]) (s, o, ShiftScreenOptionFlipRotation);
            return TRUE;
        }
        break;
     case ShiftScreenOptionCoverOffset:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionCoverOffset])
                (*os->notify[ShiftScreenOptionCoverOffset]) (s, o, ShiftScreenOptionCoverOffset);
            return TRUE;
        }
        break;
     case ShiftScreenOptionOverlayIcon:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionOverlayIcon])
                (*os->notify[ShiftScreenOptionOverlayIcon]) (s, o, ShiftScreenOptionOverlayIcon);
            return TRUE;
        }
        break;
     case ShiftScreenOptionMipmaps:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionMipmaps])
                (*os->notify[ShiftScreenOptionMipmaps]) (s, o, ShiftScreenOptionMipmaps);
            return TRUE;
        }
        break;
     case ShiftScreenOptionMultioutputMode:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionMultioutputMode])
                (*os->notify[ShiftScreenOptionMultioutputMode]) (s, o, ShiftScreenOptionMultioutputMode);
            return TRUE;
        }
        break;
     case ShiftScreenOptionWindowTitle:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionWindowTitle])
                (*os->notify[ShiftScreenOptionWindowTitle]) (s, o, ShiftScreenOptionWindowTitle);
            return TRUE;
        }
        break;
     case ShiftScreenOptionTitleFontBold:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionTitleFontBold])
                (*os->notify[ShiftScreenOptionTitleFontBold]) (s, o, ShiftScreenOptionTitleFontBold);
            return TRUE;
        }
        break;
     case ShiftScreenOptionTitleFontSize:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionTitleFontSize])
                (*os->notify[ShiftScreenOptionTitleFontSize]) (s, o, ShiftScreenOptionTitleFontSize);
            return TRUE;
        }
        break;
     case ShiftScreenOptionTitleBackColor:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionTitleBackColor])
                (*os->notify[ShiftScreenOptionTitleBackColor]) (s, o, ShiftScreenOptionTitleBackColor);
            return TRUE;
        }
        break;
     case ShiftScreenOptionTitleFontColor:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionTitleFontColor])
                (*os->notify[ShiftScreenOptionTitleFontColor]) (s, o, ShiftScreenOptionTitleFontColor);
            return TRUE;
        }
        break;
     case ShiftScreenOptionTitleTextPlacement:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[ShiftScreenOptionTitleTextPlacement])
                (*os->notify[ShiftScreenOptionTitleTextPlacement]) (s, o, ShiftScreenOptionTitleTextPlacement);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * shiftOptionsGetScreenOptions (CompPlugin *plugin, CompScreen *s, int *count)
{
    SHIFT_OPTIONS_SCREEN(s);
    *count = ShiftScreenOptionNum;
    return os->opt;
}

static Bool shiftOptionsInitScreen (CompPlugin *p, CompScreen *s)
{
    ShiftOptionsScreen *os;
    
    SHIFT_OPTIONS_DISPLAY (s->display);

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

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

    if (!compInitScreenOptionsFromMetadata (s, &shiftOptionsMetadata, shiftOptionsScreenOptionInfo, os->opt, ShiftScreenOptionNum))
    {
        free (os);
        return FALSE;
    }
    if (shiftPluginVTable && shiftPluginVTable->initScreen)
        return shiftPluginVTable->initScreen (p, s);
    return TRUE;
}

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

    SHIFT_OPTIONS_SCREEN (s);


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

    free (os);
}

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

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

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

    if (!compInitDisplayOptionsFromMetadata (d, &shiftOptionsMetadata, shiftOptionsDisplayOptionInfo, od->opt, ShiftDisplayOptionNum))
    {
        free (od);
        return FALSE;
    }
    if (shiftPluginVTable && shiftPluginVTable->initDisplay)
        return shiftPluginVTable->initDisplay (p, d);
    return TRUE;
}

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

    SHIFT_OPTIONS_DISPLAY (d);

    freeScreenPrivateIndex(d, od->screenPrivateIndex);

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

    free (od);
}

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

    if (!compInitPluginMetadataFromInfo (&shiftOptionsMetadata, "shift",shiftOptionsDisplayOptionInfo, ShiftDisplayOptionNum, shiftOptionsScreenOptionInfo, ShiftScreenOptionNum))
        return FALSE;

    compAddMetadataFromFile (&shiftOptionsMetadata, "shift");
    if (shiftPluginVTable && shiftPluginVTable->init)
        return shiftPluginVTable->init (p);
    return TRUE;
}

static void shiftOptionsFini (CompPlugin *p)
{
    if (shiftPluginVTable && shiftPluginVTable->fini)
        return shiftPluginVTable->fini (p);

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

    compFiniMetadata (&shiftOptionsMetadata);
}

static CompMetadata *
shiftOptionsGetMetadata (CompPlugin *plugin)
{
    return &shiftOptionsMetadata;
}

CompPluginVTable *getCompPluginInfo (void)
{
    if (!shiftPluginVTable)
    {
        shiftPluginVTable = shiftOptionsGetCompPluginInfo ();
        memcpy(&shiftOptionsVTable, shiftPluginVTable, sizeof(CompPluginVTable));
        shiftOptionsVTable.getMetadata = shiftOptionsGetMetadata;
        shiftOptionsVTable.init = shiftOptionsInit;
        shiftOptionsVTable.fini = shiftOptionsFini;
        shiftOptionsVTable.initDisplay = shiftOptionsInitDisplay;
        shiftOptionsVTable.finiDisplay = shiftOptionsFiniDisplay;
        shiftOptionsVTable.initScreen = shiftOptionsInitScreen;
        shiftOptionsVTable.finiScreen = shiftOptionsFiniScreen;
        shiftOptionsVTable.getDisplayOptions = shiftOptionsGetDisplayOptions;
	shiftOptionsVTable.setDisplayOption = shiftOptionsSetDisplayOption;
	shiftOptionsVTable.getScreenOptions = shiftOptionsGetScreenOptions;
	shiftOptionsVTable.setScreenOption = shiftOptionsSetScreenOption;
	
    }
    return &shiftOptionsVTable;
}



syntax highlighted by Code2HTML, v. 0.9.1