#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <string.h>
#include <X11/X.h>
#include <X11/Xproto.h>
#include <X11/Xmd.h>
#include "scrnintstr.h"
#include "pixmapstr.h"
#include "windowstr.h"
#include "resource.h"
#include "colormap.h"
#include "mfb.h"
#include "mistruct.h"
#include "dix.h"
#include "mi.h"
#include "mibstore.h"
#include "migc.h"
#include "servermd.h"
#ifdef PIXMAP_PER_WINDOW
int frameWindowPrivateIndex;
int frameGetWindowPrivateIndex(void) { return frameWindowPrivateIndex; }
#endif
int mfbWindowPrivateIndex;
int mfbGetWindowPrivateIndex(void) { return mfbWindowPrivateIndex; }
int mfbGCPrivateIndex;
int mfbGetGCPrivateIndex(void) { return mfbGCPrivateIndex; }
static unsigned long mfbGeneration = 0;
static VisualRec visual = {
0, StaticGray, 1, 2, 1, 0, 0, 0, 0, 0, 0
};
static VisualID VID;
static DepthRec depth = {
1, 1, &VID
};
BSFuncRec mfbBSFuncRec = {
mfbSaveAreas,
mfbRestoreAreas,
(BackingStoreSetClipmaskRgnProcPtr) 0,
(BackingStoreGetImagePixmapProcPtr) 0,
(BackingStoreGetSpansPixmapProcPtr) 0,
};
Bool
mfbAllocatePrivates(pScreen, pWinIndex, pGCIndex)
ScreenPtr pScreen;
int *pWinIndex, *pGCIndex;
{
if (mfbGeneration != serverGeneration)
{
#ifdef PIXMAP_PER_WINDOW
frameWindowPrivateIndex = AllocateWindowPrivateIndex();
#endif
mfbWindowPrivateIndex = AllocateWindowPrivateIndex();
mfbGCPrivateIndex = miAllocateGCPrivateIndex();
visual.vid = FakeClientID(0);
VID = visual.vid;
mfbGeneration = serverGeneration;
}
if (pWinIndex)
*pWinIndex = mfbWindowPrivateIndex;
if (pGCIndex)
*pGCIndex = mfbGCPrivateIndex;
pScreen->GetWindowPixmap = mfbGetWindowPixmap;
pScreen->SetWindowPixmap = mfbSetWindowPixmap;
return (AllocateWindowPrivate(pScreen, mfbWindowPrivateIndex,
sizeof(mfbPrivWin)) &&
AllocateGCPrivate(pScreen, mfbGCPrivateIndex, sizeof(mfbPrivGC)));
}
Bool
mfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
register ScreenPtr pScreen;
pointer pbits;
int xsize, ysize;
int dpix, dpiy;
int width;
{
if (!mfbAllocatePrivates(pScreen, (int *)NULL, (int *)NULL))
return FALSE;
pScreen->defColormap = (Colormap) FakeClientID(0);
pScreen->QueryBestSize = mfbQueryBestSize;
pScreen->GetImage = mfbGetImage;
pScreen->GetSpans = mfbGetSpans;
pScreen->CreateWindow = mfbCreateWindow;
pScreen->DestroyWindow = mfbDestroyWindow;
pScreen->PositionWindow = mfbPositionWindow;
pScreen->ChangeWindowAttributes = mfbChangeWindowAttributes;
pScreen->RealizeWindow = mfbMapWindow;
pScreen->UnrealizeWindow = mfbUnmapWindow;
pScreen->PaintWindowBackground = mfbPaintWindow;
pScreen->PaintWindowBorder = mfbPaintWindow;
pScreen->CopyWindow = mfbCopyWindow;
pScreen->CreatePixmap = mfbCreatePixmap;
pScreen->DestroyPixmap = mfbDestroyPixmap;
pScreen->RealizeFont = mfbRealizeFont;
pScreen->UnrealizeFont = mfbUnrealizeFont;
pScreen->CreateGC = mfbCreateGC;
pScreen->CreateColormap = mfbCreateColormap;
pScreen->DestroyColormap = mfbDestroyColormap;
pScreen->InstallColormap = mfbInstallColormap;
pScreen->UninstallColormap = mfbUninstallColormap;
pScreen->ListInstalledColormaps = mfbListInstalledColormaps;
pScreen->StoreColors = (StoreColorsProcPtr)NoopDDA;
pScreen->ResolveColor = mfbResolveColor;
pScreen->BitmapToRegion = mfbPixmapToRegion;
if (!miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
1, 1, &depth, VID, 1, &visual))
return FALSE;
pScreen->BackingStoreFuncs = mfbBSFuncRec;
return TRUE;
}
PixmapPtr
mfbGetWindowPixmap(pWin)
WindowPtr pWin;
{
#ifdef PIXMAP_PER_WINDOW
return (PixmapPtr)(pWin->devPrivates[frameWindowPrivateIndex].ptr);
#else
ScreenPtr pScreen = pWin->drawable.pScreen;
return (* pScreen->GetScreenPixmap)(pScreen);
#endif
}
void
mfbSetWindowPixmap(pWin, pPix)
WindowPtr pWin;
PixmapPtr pPix;
{
#ifdef PIXMAP_PER_WINDOW
pWin->devPrivates[frameWindowPrivateIndex].ptr = (pointer)pPix;
#else
(* pWin->drawable.pScreen->SetScreenPixmap)(pPix);
#endif
}
void mfbFillInScreen(ScreenPtr pScreen)
{
pScreen->ChangeWindowAttributes = mfbChangeWindowAttributes;
pScreen->RealizeWindow = mfbMapWindow;
pScreen->UnrealizeWindow = mfbUnmapWindow;
pScreen->DestroyPixmap = mfbDestroyPixmap;
pScreen->RealizeFont = mfbRealizeFont;
pScreen->UnrealizeFont = mfbUnrealizeFont;
pScreen->BitmapToRegion = mfbPixmapToRegion;
}