/*
 * Xephyr - A kdrive X server thats runs in a host X window.
 *          Authored by Matthew Allum <mallum@o-hand.com>
 * 
 * Copyright � 2004 Nokia 
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of Nokia not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission. Nokia makes no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _EPHYR_H_
#define _EPHYR_H_
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <libgen.h>

#include "os.h"  		/* for OsSignal() */
#include "kdrive.h"
#include "hostx.h"
#include "exa.h"

#ifdef RANDR
#include "randrstr.h"
#endif

#include "damage.h"

typedef struct _ephyrPriv {
    CARD8	*base;
    int		bytes_per_line;
} EphyrPriv;

typedef struct _ephyrFakexaPriv {
    ExaDriverPtr exa;
    Bool is_synced;

    /* The following are arguments and other information from Prepare* calls
     * which are stored for use in the inner calls.
     */
    int op;
    PicturePtr pSrcPicture, pMaskPicture, pDstPicture;
    void *saved_ptrs[3];
    PixmapPtr pDst, pSrc, pMask;
    GCPtr pGC;
} EphyrFakexaPriv;

typedef struct _ephyrScrPriv {
    Rotation	randr;
    Bool	shadow;
    DamagePtr   pDamage;
    EphyrFakexaPriv *fakexa;
} EphyrScrPriv;

extern KdCardFuncs ephyrFuncs;
extern KdKeyboardInfo *ephyrKbd;
extern KdPointerInfo *ephyrMouse;

extern miPointerScreenFuncRec ephyrPointerScreenFuncs;

Bool
ephyrInitialize (KdCardInfo *card, EphyrPriv *priv);

Bool
ephyrCardInit (KdCardInfo *card);

Bool
ephyrScreenInit (KdScreenInfo *screen);

Bool
ephyrScreenInitialize (KdScreenInfo *screen, EphyrScrPriv *scrpriv);
    
Bool
ephyrInitScreen (ScreenPtr pScreen);

Bool
ephyrFinishInitScreen (ScreenPtr pScreen);

Bool
ephyrCreateResources (ScreenPtr pScreen);

void
ephyrPreserve (KdCardInfo *card);

Bool
ephyrEnable (ScreenPtr pScreen);

Bool
ephyrDPMS (ScreenPtr pScreen, int mode);

void
ephyrDisable (ScreenPtr pScreen);

void
ephyrRestore (KdCardInfo *card);

void
ephyrScreenFini (KdScreenInfo *screen);

void
ephyrCardFini (KdCardInfo *card);

void
ephyrGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs);

void
ephyrPutColors (ScreenPtr pScreen, int n, xColorItem *pdefs);

Bool
ephyrMapFramebuffer (KdScreenInfo *screen);

void *
ephyrWindowLinear (ScreenPtr	pScreen,
		   CARD32	row,
		   CARD32	offset,
		   int		mode,
		   CARD32	*size,
		   void		*closure);

void
ephyrSetScreenSizes (ScreenPtr pScreen);

Bool
ephyrUnmapFramebuffer (KdScreenInfo *screen);

void
ephyrUnsetInternalDamage (ScreenPtr pScreen);

Bool
ephyrSetInternalDamage (ScreenPtr pScreen);

Bool
ephyrCreateColormap (ColormapPtr pmap);

void
ephyrPoll(void);
    
#ifdef RANDR
Bool
ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations);

Bool
ephyrRandRSetConfig (ScreenPtr		pScreen,
		     Rotation		randr,
		     int		rate,
		     RRScreenSizePtr	pSize);
Bool
ephyrRandRInit (ScreenPtr pScreen);

void 
ephyrShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);

#endif

void
ephyrUpdateModifierState(unsigned int state);

extern KdPointerDriver EphyrMouseDriver;

extern KdKeyboardDriver	EphyrKeyboardDriver;

extern KdOsFuncs   EphyrOsFuncs;

extern Bool ephyrCursorInit(ScreenPtr pScreen);

extern void ephyrCursorEnable(ScreenPtr pScreen);

extern int ephyrBufferHeight(KdScreenInfo *screen);

/* ephyr_draw.c */

Bool
ephyrDrawInit(ScreenPtr pScreen);

void
ephyrDrawEnable(ScreenPtr pScreen);

void
ephyrDrawDisable(ScreenPtr pScreen);

void
ephyrDrawFini(ScreenPtr pScreen);

/*ephyvideo.c*/

Bool ephyrInitVideo(ScreenPtr pScreen) ;

#endif