/*
 * 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 _PUT_OPTIONS_INTERNAL
#include "put_options.h"

static int displayPrivateIndex;

static CompMetadata putOptionsMetadata;

static CompPluginVTable *putPluginVTable = NULL;
CompPluginVTable putOptionsVTable;

#define GET_PUT_OPTIONS_DISPLAY(d) \
        ((PutOptionsDisplay *) (d)->privates[displayPrivateIndex].ptr)

#define PUT_OPTIONS_DISPLAY(d) \
        PutOptionsDisplay *od = GET_PUT_OPTIONS_DISPLAY (d)

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

#define PUT_OPTIONS_SCREEN(s) \
        PutOptionsScreen *os = GET_PUT_OPTIONS_SCREEN (s, GET_PUT_OPTIONS_DISPLAY (s->display))

typedef struct _PutOptionsDisplay
{
    int screenPrivateIndex;

    CompOption opt[PutDisplayOptionNum];
    putDisplayOptionChangeNotifyProc notify[PutDisplayOptionNum];
} PutOptionsDisplay;

typedef struct _PutOptionsScreen
{
    CompOption opt[PutScreenOptionNum];
    putScreenOptionChangeNotifyProc notify[PutScreenOptionNum];
} PutOptionsScreen;

CompAction * putGetPutViewport (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport].value.action;
}

void putSetPutViewportInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport].value.action.initiate = init;
}

void putSetPutViewportTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport].value.action.terminate = term;
}

CompOption * putGetPutViewportOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport];
}

void putSetPutViewportNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport] = notify;
}

CompAction * putGetPutViewport1 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport1].value.action;
}

void putSetPutViewport1Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport1].value.action.initiate = init;
}

void putSetPutViewport1Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport1].value.action.terminate = term;
}

CompOption * putGetPutViewport1Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport1];
}

void putSetPutViewport1Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport1] = notify;
}

CompAction * putGetPutViewport2 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport2].value.action;
}

void putSetPutViewport2Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport2].value.action.initiate = init;
}

void putSetPutViewport2Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport2].value.action.terminate = term;
}

CompOption * putGetPutViewport2Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport2];
}

void putSetPutViewport2Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport2] = notify;
}

CompAction * putGetPutViewport3 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport3].value.action;
}

void putSetPutViewport3Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport3].value.action.initiate = init;
}

void putSetPutViewport3Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport3].value.action.terminate = term;
}

CompOption * putGetPutViewport3Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport3];
}

void putSetPutViewport3Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport3] = notify;
}

CompAction * putGetPutViewport4 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport4].value.action;
}

void putSetPutViewport4Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport4].value.action.initiate = init;
}

void putSetPutViewport4Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport4].value.action.terminate = term;
}

CompOption * putGetPutViewport4Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport4];
}

void putSetPutViewport4Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport4] = notify;
}

CompAction * putGetPutViewport5 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport5].value.action;
}

void putSetPutViewport5Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport5].value.action.initiate = init;
}

void putSetPutViewport5Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport5].value.action.terminate = term;
}

CompOption * putGetPutViewport5Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport5];
}

void putSetPutViewport5Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport5] = notify;
}

CompAction * putGetPutViewport6 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport6].value.action;
}

void putSetPutViewport6Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport6].value.action.initiate = init;
}

void putSetPutViewport6Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport6].value.action.terminate = term;
}

CompOption * putGetPutViewport6Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport6];
}

void putSetPutViewport6Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport6] = notify;
}

CompAction * putGetPutViewport7 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport7].value.action;
}

void putSetPutViewport7Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport7].value.action.initiate = init;
}

void putSetPutViewport7Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport7].value.action.terminate = term;
}

CompOption * putGetPutViewport7Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport7];
}

void putSetPutViewport7Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport7] = notify;
}

CompAction * putGetPutViewport8 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport8].value.action;
}

void putSetPutViewport8Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport8].value.action.initiate = init;
}

void putSetPutViewport8Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport8].value.action.terminate = term;
}

CompOption * putGetPutViewport8Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport8];
}

void putSetPutViewport8Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport8] = notify;
}

CompAction * putGetPutViewport9 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport9].value.action;
}

void putSetPutViewport9Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport9].value.action.initiate = init;
}

void putSetPutViewport9Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport9].value.action.terminate = term;
}

CompOption * putGetPutViewport9Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport9];
}

void putSetPutViewport9Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport9] = notify;
}

CompAction * putGetPutViewport10 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport10].value.action;
}

void putSetPutViewport10Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport10].value.action.initiate = init;
}

void putSetPutViewport10Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport10].value.action.terminate = term;
}

CompOption * putGetPutViewport10Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport10];
}

void putSetPutViewport10Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport10] = notify;
}

CompAction * putGetPutViewport11 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport11].value.action;
}

void putSetPutViewport11Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport11].value.action.initiate = init;
}

void putSetPutViewport11Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport11].value.action.terminate = term;
}

CompOption * putGetPutViewport11Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport11];
}

void putSetPutViewport11Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport11] = notify;
}

CompAction * putGetPutViewport12 (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport12].value.action;
}

void putSetPutViewport12Initiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport12].value.action.initiate = init;
}

void putSetPutViewport12Terminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewport12].value.action.terminate = term;
}

CompOption * putGetPutViewport12Option (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewport12];
}

void putSetPutViewport12Notify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewport12] = notify;
}

CompAction * putGetPutViewportLeft (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportLeft].value.action;
}

void putSetPutViewportLeftInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportLeft].value.action.initiate = init;
}

void putSetPutViewportLeftTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportLeft].value.action.terminate = term;
}

CompOption * putGetPutViewportLeftOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportLeft];
}

void putSetPutViewportLeftNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewportLeft] = notify;
}

CompAction * putGetPutViewportRight (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportRight].value.action;
}

void putSetPutViewportRightInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportRight].value.action.initiate = init;
}

void putSetPutViewportRightTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportRight].value.action.terminate = term;
}

CompOption * putGetPutViewportRightOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportRight];
}

void putSetPutViewportRightNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewportRight] = notify;
}

CompAction * putGetPutViewportUp (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportUp].value.action;
}

void putSetPutViewportUpInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportUp].value.action.initiate = init;
}

void putSetPutViewportUpTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportUp].value.action.terminate = term;
}

CompOption * putGetPutViewportUpOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportUp];
}

void putSetPutViewportUpNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewportUp] = notify;
}

CompAction * putGetPutViewportDown (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportDown].value.action;
}

void putSetPutViewportDownInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportDown].value.action.initiate = init;
}

void putSetPutViewportDownTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutViewportDown].value.action.terminate = term;
}

CompOption * putGetPutViewportDownOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutViewportDown];
}

void putSetPutViewportDownNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutViewportDown] = notify;
}

CompAction * putGetPutCenter (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutCenter].value.action;
}

void putSetPutCenterInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutCenter].value.action.initiate = init;
}

void putSetPutCenterTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutCenter].value.action.terminate = term;
}

CompOption * putGetPutCenterOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutCenter];
}

void putSetPutCenterNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutCenter] = notify;
}

CompAction * putGetPutLeft (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutLeft].value.action;
}

void putSetPutLeftInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutLeft].value.action.initiate = init;
}

void putSetPutLeftTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutLeft].value.action.terminate = term;
}

CompOption * putGetPutLeftOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutLeft];
}

void putSetPutLeftNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutLeft] = notify;
}

CompAction * putGetPutRight (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutRight].value.action;
}

void putSetPutRightInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutRight].value.action.initiate = init;
}

void putSetPutRightTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutRight].value.action.terminate = term;
}

CompOption * putGetPutRightOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutRight];
}

void putSetPutRightNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutRight] = notify;
}

CompAction * putGetPutTop (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutTop].value.action;
}

void putSetPutTopInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutTop].value.action.initiate = init;
}

void putSetPutTopTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutTop].value.action.terminate = term;
}

CompOption * putGetPutTopOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutTop];
}

void putSetPutTopNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutTop] = notify;
}

CompAction * putGetPutBottom (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutBottom].value.action;
}

void putSetPutBottomInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutBottom].value.action.initiate = init;
}

void putSetPutBottomTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutBottom].value.action.terminate = term;
}

CompOption * putGetPutBottomOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutBottom];
}

void putSetPutBottomNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutBottom] = notify;
}

CompAction * putGetPutTopleft (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutTopleft].value.action;
}

void putSetPutTopleftInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutTopleft].value.action.initiate = init;
}

void putSetPutTopleftTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutTopleft].value.action.terminate = term;
}

CompOption * putGetPutTopleftOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutTopleft];
}

void putSetPutTopleftNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutTopleft] = notify;
}

CompAction * putGetPutTopright (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutTopright].value.action;
}

void putSetPutToprightInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutTopright].value.action.initiate = init;
}

void putSetPutToprightTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutTopright].value.action.terminate = term;
}

CompOption * putGetPutToprightOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutTopright];
}

void putSetPutToprightNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutTopright] = notify;
}

CompAction * putGetPutBottomleft (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutBottomleft].value.action;
}

void putSetPutBottomleftInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutBottomleft].value.action.initiate = init;
}

void putSetPutBottomleftTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutBottomleft].value.action.terminate = term;
}

CompOption * putGetPutBottomleftOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutBottomleft];
}

void putSetPutBottomleftNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutBottomleft] = notify;
}

CompAction * putGetPutBottomright (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutBottomright].value.action;
}

void putSetPutBottomrightInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutBottomright].value.action.initiate = init;
}

void putSetPutBottomrightTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutBottomright].value.action.terminate = term;
}

CompOption * putGetPutBottomrightOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutBottomright];
}

void putSetPutBottomrightNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutBottomright] = notify;
}

CompAction * putGetPutRestore (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutRestore].value.action;
}

void putSetPutRestoreInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutRestore].value.action.initiate = init;
}

void putSetPutRestoreTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutRestore].value.action.terminate = term;
}

CompOption * putGetPutRestoreOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutRestore];
}

void putSetPutRestoreNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutRestore] = notify;
}

CompAction * putGetPutPointer (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutPointer].value.action;
}

void putSetPutPointerInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutPointer].value.action.initiate = init;
}

void putSetPutPointerTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutPointer].value.action.terminate = term;
}

CompOption * putGetPutPointerOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutPointer];
}

void putSetPutPointerNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutPointer] = notify;
}

CompAction * putGetPutExact (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutExact].value.action;
}

void putSetPutExactInitiate (CompDisplay *d, CompActionCallBackProc init)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutExact].value.action.initiate = init;
}

void putSetPutExactTerminate (CompDisplay *d, CompActionCallBackProc term)
{
    PUT_OPTIONS_DISPLAY(d);
    od->opt[PutDisplayOptionPutExact].value.action.terminate = term;
}

CompOption * putGetPutExactOption (CompDisplay *d)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[PutDisplayOptionPutExact];
}

void putSetPutExactNotify (CompDisplay *d, putDisplayOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_DISPLAY(d);
    od->notify[PutDisplayOptionPutExact] = notify;
}

int putGetPadLeft (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionPadLeft].value.i;
}

CompOption * putGetPadLeftOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionPadLeft];
}

void putSetPadLeftNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionPadLeft] = notify;
}

int putGetPadRight (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionPadRight].value.i;
}

CompOption * putGetPadRightOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionPadRight];
}

void putSetPadRightNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionPadRight] = notify;
}

int putGetPadTop (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionPadTop].value.i;
}

CompOption * putGetPadTopOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionPadTop];
}

void putSetPadTopNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionPadTop] = notify;
}

int putGetPadBottom (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionPadBottom].value.i;
}

CompOption * putGetPadBottomOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionPadBottom];
}

void putSetPadBottomNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionPadBottom] = notify;
}

Bool putGetUnfocusWindow (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionUnfocusWindow].value.b;
}

CompOption * putGetUnfocusWindowOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionUnfocusWindow];
}

void putSetUnfocusWindowNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionUnfocusWindow] = notify;
}

Bool putGetWindowCenter (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionWindowCenter].value.b;
}

CompOption * putGetWindowCenterOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionWindowCenter];
}

void putSetWindowCenterNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionWindowCenter] = notify;
}

Bool putGetAvoidOffscreen (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionAvoidOffscreen].value.b;
}

CompOption * putGetAvoidOffscreenOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionAvoidOffscreen];
}

void putSetAvoidOffscreenNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionAvoidOffscreen] = notify;
}

float putGetSpeed (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionSpeed].value.f;
}

CompOption * putGetSpeedOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionSpeed];
}

void putSetSpeedNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionSpeed] = notify;
}

float putGetTimestep (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return os->opt[PutScreenOptionTimestep].value.f;
}

CompOption * putGetTimestepOption (CompScreen *s)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[PutScreenOptionTimestep];
}

void putSetTimestepNotify (CompScreen *s, putScreenOptionChangeNotifyProc notify)
{
    PUT_OPTIONS_SCREEN(s);
    os->notify[PutScreenOptionTimestep] = notify;
}

CompOption * putGetDisplayOption (CompDisplay *d, PutDisplayOptions num)
{
    PUT_OPTIONS_DISPLAY(d);
    return &od->opt[num];
}

CompOption * putGetScreenOption (CompScreen *s, PutScreenOptions num)
{
    PUT_OPTIONS_SCREEN(s);
    return &os->opt[num];
}

static const CompMetadataOptionInfo putOptionsDisplayOptionInfo[] = {
    { "put_viewport", "action", 0, 0, 0 },
    { "put_viewport_1", "action", 0, 0, 0 },
    { "put_viewport_2", "action", 0, 0, 0 },
    { "put_viewport_3", "action", 0, 0, 0 },
    { "put_viewport_4", "action", 0, 0, 0 },
    { "put_viewport_5", "action", 0, 0, 0 },
    { "put_viewport_6", "action", 0, 0, 0 },
    { "put_viewport_7", "action", 0, 0, 0 },
    { "put_viewport_8", "action", 0, 0, 0 },
    { "put_viewport_9", "action", 0, 0, 0 },
    { "put_viewport_10", "action", 0, 0, 0 },
    { "put_viewport_11", "action", 0, 0, 0 },
    { "put_viewport_12", "action", 0, 0, 0 },
    { "put_viewport_left", "action", 0, 0, 0 },
    { "put_viewport_right", "action", 0, 0, 0 },
    { "put_viewport_up", "action", 0, 0, 0 },
    { "put_viewport_down", "action", 0, 0, 0 },
    { "put_center", "action", 0, 0, 0 },
    { "put_left", "action", 0, 0, 0 },
    { "put_right", "action", 0, 0, 0 },
    { "put_top", "action", 0, 0, 0 },
    { "put_bottom", "action", 0, 0, 0 },
    { "put_topleft", "action", 0, 0, 0 },
    { "put_topright", "action", 0, 0, 0 },
    { "put_bottomleft", "action", 0, 0, 0 },
    { "put_bottomright", "action", 0, 0, 0 },
    { "put_restore", "action", 0, 0, 0 },
    { "put_pointer", "action", 0, 0, 0 },
    { "put_exact", "action", 0, 0, 0 },
};

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

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

    if (!o)
        return FALSE;

    switch (index)
    {
     case PutDisplayOptionPutViewport:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport])
                (*od->notify[PutDisplayOptionPutViewport]) (d, o, PutDisplayOptionPutViewport);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport1:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport1])
                (*od->notify[PutDisplayOptionPutViewport1]) (d, o, PutDisplayOptionPutViewport1);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport2:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport2])
                (*od->notify[PutDisplayOptionPutViewport2]) (d, o, PutDisplayOptionPutViewport2);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport3:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport3])
                (*od->notify[PutDisplayOptionPutViewport3]) (d, o, PutDisplayOptionPutViewport3);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport4:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport4])
                (*od->notify[PutDisplayOptionPutViewport4]) (d, o, PutDisplayOptionPutViewport4);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport5:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport5])
                (*od->notify[PutDisplayOptionPutViewport5]) (d, o, PutDisplayOptionPutViewport5);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport6:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport6])
                (*od->notify[PutDisplayOptionPutViewport6]) (d, o, PutDisplayOptionPutViewport6);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport7:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport7])
                (*od->notify[PutDisplayOptionPutViewport7]) (d, o, PutDisplayOptionPutViewport7);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport8:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport8])
                (*od->notify[PutDisplayOptionPutViewport8]) (d, o, PutDisplayOptionPutViewport8);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport9:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport9])
                (*od->notify[PutDisplayOptionPutViewport9]) (d, o, PutDisplayOptionPutViewport9);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport10:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport10])
                (*od->notify[PutDisplayOptionPutViewport10]) (d, o, PutDisplayOptionPutViewport10);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport11:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport11])
                (*od->notify[PutDisplayOptionPutViewport11]) (d, o, PutDisplayOptionPutViewport11);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewport12:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewport12])
                (*od->notify[PutDisplayOptionPutViewport12]) (d, o, PutDisplayOptionPutViewport12);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewportLeft:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewportLeft])
                (*od->notify[PutDisplayOptionPutViewportLeft]) (d, o, PutDisplayOptionPutViewportLeft);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewportRight:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewportRight])
                (*od->notify[PutDisplayOptionPutViewportRight]) (d, o, PutDisplayOptionPutViewportRight);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewportUp:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewportUp])
                (*od->notify[PutDisplayOptionPutViewportUp]) (d, o, PutDisplayOptionPutViewportUp);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutViewportDown:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutViewportDown])
                (*od->notify[PutDisplayOptionPutViewportDown]) (d, o, PutDisplayOptionPutViewportDown);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutCenter:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutCenter])
                (*od->notify[PutDisplayOptionPutCenter]) (d, o, PutDisplayOptionPutCenter);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutLeft:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutLeft])
                (*od->notify[PutDisplayOptionPutLeft]) (d, o, PutDisplayOptionPutLeft);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutRight:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutRight])
                (*od->notify[PutDisplayOptionPutRight]) (d, o, PutDisplayOptionPutRight);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutTop:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutTop])
                (*od->notify[PutDisplayOptionPutTop]) (d, o, PutDisplayOptionPutTop);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutBottom:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutBottom])
                (*od->notify[PutDisplayOptionPutBottom]) (d, o, PutDisplayOptionPutBottom);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutTopleft:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutTopleft])
                (*od->notify[PutDisplayOptionPutTopleft]) (d, o, PutDisplayOptionPutTopleft);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutTopright:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutTopright])
                (*od->notify[PutDisplayOptionPutTopright]) (d, o, PutDisplayOptionPutTopright);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutBottomleft:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutBottomleft])
                (*od->notify[PutDisplayOptionPutBottomleft]) (d, o, PutDisplayOptionPutBottomleft);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutBottomright:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutBottomright])
                (*od->notify[PutDisplayOptionPutBottomright]) (d, o, PutDisplayOptionPutBottomright);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutRestore:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutRestore])
                (*od->notify[PutDisplayOptionPutRestore]) (d, o, PutDisplayOptionPutRestore);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutPointer:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutPointer])
                (*od->notify[PutDisplayOptionPutPointer]) (d, o, PutDisplayOptionPutPointer);
            return TRUE;
        }
        break;
     case PutDisplayOptionPutExact:
        if (compSetDisplayOption (d, o, value))
        {
            if (od->notify[PutDisplayOptionPutExact])
                (*od->notify[PutDisplayOptionPutExact]) (d, o, PutDisplayOptionPutExact);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * putOptionsGetDisplayOptions (CompPlugin *plugin, CompDisplay *d, int *count)
{
    PUT_OPTIONS_DISPLAY(d);
    *count = PutDisplayOptionNum;
    return od->opt;
}

static const CompMetadataOptionInfo putOptionsScreenOptionInfo[] = {
    { "pad_left", "int", "<min>0</min><max>500</max>", 0, 0 },
    { "pad_right", "int", "<min>0</min><max>500</max>", 0, 0 },
    { "pad_top", "int", "<min>0</min><max>500</max>", 0, 0 },
    { "pad_bottom", "int", "<min>0</min><max>500</max>", 0, 0 },
    { "unfocus_window", "bool", 0, 0, 0 },
    { "window_center", "bool", 0, 0, 0 },
    { "avoid_offscreen", "bool", 0, 0, 0 },
    { "speed", "float", "<min>0.1</min><max>50.0</max>", 0, 0 },
    { "timestep", "float", "<min>0.1</min><max>50.0</max>", 0, 0 },
};

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

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

    if (!o)
        return FALSE;

    switch (index)
    {
     case PutScreenOptionPadLeft:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionPadLeft])
                (*os->notify[PutScreenOptionPadLeft]) (s, o, PutScreenOptionPadLeft);
            return TRUE;
        }
        break;
     case PutScreenOptionPadRight:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionPadRight])
                (*os->notify[PutScreenOptionPadRight]) (s, o, PutScreenOptionPadRight);
            return TRUE;
        }
        break;
     case PutScreenOptionPadTop:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionPadTop])
                (*os->notify[PutScreenOptionPadTop]) (s, o, PutScreenOptionPadTop);
            return TRUE;
        }
        break;
     case PutScreenOptionPadBottom:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionPadBottom])
                (*os->notify[PutScreenOptionPadBottom]) (s, o, PutScreenOptionPadBottom);
            return TRUE;
        }
        break;
     case PutScreenOptionUnfocusWindow:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionUnfocusWindow])
                (*os->notify[PutScreenOptionUnfocusWindow]) (s, o, PutScreenOptionUnfocusWindow);
            return TRUE;
        }
        break;
     case PutScreenOptionWindowCenter:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionWindowCenter])
                (*os->notify[PutScreenOptionWindowCenter]) (s, o, PutScreenOptionWindowCenter);
            return TRUE;
        }
        break;
     case PutScreenOptionAvoidOffscreen:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionAvoidOffscreen])
                (*os->notify[PutScreenOptionAvoidOffscreen]) (s, o, PutScreenOptionAvoidOffscreen);
            return TRUE;
        }
        break;
     case PutScreenOptionSpeed:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionSpeed])
                (*os->notify[PutScreenOptionSpeed]) (s, o, PutScreenOptionSpeed);
            return TRUE;
        }
        break;
     case PutScreenOptionTimestep:
        if (compSetScreenOption (s, o, value))
        {
            if (os->notify[PutScreenOptionTimestep])
                (*os->notify[PutScreenOptionTimestep]) (s, o, PutScreenOptionTimestep);
            return TRUE;
        }
        break;
    default:
        break;
    }
    return FALSE;
}

static CompOption * putOptionsGetScreenOptions (CompPlugin *plugin, CompScreen *s, int *count)
{
    PUT_OPTIONS_SCREEN(s);
    *count = PutScreenOptionNum;
    return os->opt;
}

static Bool putOptionsInitScreen (CompPlugin *p, CompScreen *s)
{
    PutOptionsScreen *os;
    
    PUT_OPTIONS_DISPLAY (s->display);

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

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

    if (!compInitScreenOptionsFromMetadata (s, &putOptionsMetadata, putOptionsScreenOptionInfo, os->opt, PutScreenOptionNum))
    {
        free (os);
        return FALSE;
    }
    if (putPluginVTable && putPluginVTable->initScreen)
        return putPluginVTable->initScreen (p, s);
    return TRUE;
}

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

    PUT_OPTIONS_SCREEN (s);


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

    free (os);
}

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

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

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

    if (!compInitDisplayOptionsFromMetadata (d, &putOptionsMetadata, putOptionsDisplayOptionInfo, od->opt, PutDisplayOptionNum))
    {
        free (od);
        return FALSE;
    }
    if (putPluginVTable && putPluginVTable->initDisplay)
        return putPluginVTable->initDisplay (p, d);
    return TRUE;
}

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

    PUT_OPTIONS_DISPLAY (d);

    freeScreenPrivateIndex(d, od->screenPrivateIndex);

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

    free (od);
}

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

    if (!compInitPluginMetadataFromInfo (&putOptionsMetadata, "put",putOptionsDisplayOptionInfo, PutDisplayOptionNum, putOptionsScreenOptionInfo, PutScreenOptionNum))
        return FALSE;

    compAddMetadataFromFile (&putOptionsMetadata, "put");
    if (putPluginVTable && putPluginVTable->init)
        return putPluginVTable->init (p);
    return TRUE;
}

static void putOptionsFini (CompPlugin *p)
{
    if (putPluginVTable && putPluginVTable->fini)
        return putPluginVTable->fini (p);

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

    compFiniMetadata (&putOptionsMetadata);
}

static CompMetadata *
putOptionsGetMetadata (CompPlugin *plugin)
{
    return &putOptionsMetadata;
}

CompPluginVTable *getCompPluginInfo (void)
{
    if (!putPluginVTable)
    {
        putPluginVTable = putOptionsGetCompPluginInfo ();
        memcpy(&putOptionsVTable, putPluginVTable, sizeof(CompPluginVTable));
        putOptionsVTable.getMetadata = putOptionsGetMetadata;
        putOptionsVTable.init = putOptionsInit;
        putOptionsVTable.fini = putOptionsFini;
        putOptionsVTable.initDisplay = putOptionsInitDisplay;
        putOptionsVTable.finiDisplay = putOptionsFiniDisplay;
        putOptionsVTable.initScreen = putOptionsInitScreen;
        putOptionsVTable.finiScreen = putOptionsFiniScreen;
        putOptionsVTable.getDisplayOptions = putOptionsGetDisplayOptions;
	putOptionsVTable.setDisplayOption = putOptionsSetDisplayOption;
	putOptionsVTable.getScreenOptions = putOptionsGetScreenOptions;
	putOptionsVTable.setScreenOption = putOptionsSetScreenOption;
	
    }
    return &putOptionsVTable;
}



syntax highlighted by Code2HTML, v. 0.9.1