#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <stdlib.h>
#include <X11/X.h>
#include "scrnintstr.h"
#include "windowstr.h"
#include "afb.h"
#include "mistruct.h"
#include "regionstr.h"
#include "maskbits.h"
Bool
afbCreateWindow(pWin)
register WindowPtr pWin;
{
register afbPrivWin *pPrivWin;
pPrivWin = (afbPrivWin *)(pWin->devPrivates[afbWindowPrivateIndex].ptr);
pPrivWin->pRotatedBorder = NullPixmap;
pPrivWin->pRotatedBackground = NullPixmap;
pPrivWin->fastBackground = FALSE;
pPrivWin->fastBorder = FALSE;
#ifdef PIXMAP_PER_WINDOW
pWin->devPrivates[frameWindowPrivateIndex].ptr =
pWin->pDrawable.pScreen->devPrivates[afbScreenPrivateIndex].ptr;
#endif
return (TRUE);
}
Bool
afbDestroyWindow(pWin)
WindowPtr pWin;
{
register afbPrivWin *pPrivWin;
pPrivWin = (afbPrivWin *)(pWin->devPrivates[afbWindowPrivateIndex].ptr);
if (pPrivWin->pRotatedBorder)
(*pWin->drawable.pScreen->DestroyPixmap)(pPrivWin->pRotatedBorder);
if (pPrivWin->pRotatedBackground)
(*pWin->drawable.pScreen->DestroyPixmap)(pPrivWin->pRotatedBackground);
return (TRUE);
}
Bool
afbMapWindow(pWindow)
WindowPtr pWindow;
{
return (TRUE);
}
Bool
afbPositionWindow(pWin, x, y)
WindowPtr pWin;
int x, y;
{
register afbPrivWin *pPrivWin;
int reset = 0;
pPrivWin = (afbPrivWin *)(pWin->devPrivates[afbWindowPrivateIndex].ptr);
if (pWin->backgroundState == BackgroundPixmap && pPrivWin->fastBackground) {
afbXRotatePixmap(pPrivWin->pRotatedBackground,
pWin->drawable.x - pPrivWin->oldRotate.x);
afbYRotatePixmap(pPrivWin->pRotatedBackground,
pWin->drawable.y - pPrivWin->oldRotate.y);
reset = 1;
}
if (!pWin->borderIsPixel && pPrivWin->fastBorder) {
while (pWin->backgroundState == ParentRelative)
pWin = pWin->parent;
afbXRotatePixmap(pPrivWin->pRotatedBorder,
pWin->drawable.x - pPrivWin->oldRotate.x);
afbYRotatePixmap(pPrivWin->pRotatedBorder,
pWin->drawable.y - pPrivWin->oldRotate.y);
reset = 1;
}
if (reset) {
pPrivWin->oldRotate.x = pWin->drawable.x;
pPrivWin->oldRotate.y = pWin->drawable.y;
}
pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
return (TRUE);
}
Bool
afbUnmapWindow(pWindow)
WindowPtr pWindow;
{
return (TRUE);
}
void
afbCopyWindow(pWin, ptOldOrg, prgnSrc)
WindowPtr pWin;
DDXPointRec ptOldOrg;
RegionPtr prgnSrc;
{
DDXPointPtr pptSrc;
register DDXPointPtr ppt;
RegionPtr prgnDst;
register BoxPtr pbox;
register int dx, dy;
register int i, nbox;
WindowPtr pwinRoot;
pwinRoot = WindowTable[pWin->drawable.pScreen->myNum];
prgnDst = REGION_CREATE(pWin->drawable.pScreen, NULL, 1);
dx = ptOldOrg.x - pWin->drawable.x;
dy = ptOldOrg.y - pWin->drawable.y;
REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
REGION_INTERSECT(pWin->drawable.pScreen, prgnDst, &pWin->borderClip,
prgnSrc);
pbox = REGION_RECTS(prgnDst);
nbox = REGION_NUM_RECTS(prgnDst);
if(!(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec))))
return;
ppt = pptSrc;
for (i=nbox; --i >= 0; ppt++, pbox++) {
ppt->x = pbox->x1 + dx;
ppt->y = pbox->y1 + dy;
}
afbDoBitblt((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot, GXcopy, prgnDst,
pptSrc, ~0);
DEALLOCATE_LOCAL(pptSrc);
REGION_DESTROY(pWin->drawable.pScreen, prgnDst);
}
Bool
afbChangeWindowAttributes(pWin, mask)
register WindowPtr pWin;
register unsigned long mask;
{
register unsigned long index;
register afbPrivWin *pPrivWin;
WindowPtr pBgWin;
pPrivWin = (afbPrivWin *)(pWin->devPrivates[afbWindowPrivateIndex].ptr);
if (mask & (CWBackPixmap | CWBackPixel) &&
pWin->backgroundState != ParentRelative && pPrivWin->fastBorder &&
(pPrivWin->oldRotate.x != pWin->drawable.x ||
pPrivWin->oldRotate.y != pWin->drawable.y)) {
afbXRotatePixmap(pPrivWin->pRotatedBorder,
pWin->drawable.x - pPrivWin->oldRotate.x);
afbYRotatePixmap(pPrivWin->pRotatedBorder,
pWin->drawable.y - pPrivWin->oldRotate.y);
pPrivWin->oldRotate.x = pWin->drawable.x;
pPrivWin->oldRotate.y = pWin->drawable.y;
}
while(mask) {
index = lowbit (mask);
mask &= ~index;
switch(index) {
case CWBackPixmap:
if (pWin->backgroundState == None)
pPrivWin->fastBackground = FALSE;
else if (pWin->backgroundState == ParentRelative) {
pPrivWin->fastBackground = FALSE;
if (pPrivWin->pRotatedBorder) {
for (pBgWin = pWin->parent;
pBgWin->backgroundState == ParentRelative;
pBgWin = pBgWin->parent);
afbXRotatePixmap(pPrivWin->pRotatedBorder,
pBgWin->drawable.x - pPrivWin->oldRotate.x);
afbYRotatePixmap(pPrivWin->pRotatedBorder,
pBgWin->drawable.y - pPrivWin->oldRotate.y);
pPrivWin->oldRotate.x = pBgWin->drawable.x;
pPrivWin->oldRotate.y = pBgWin->drawable.y;
}
} else if ((pWin->background.pixmap->drawable.width <= PPW) &&
!(pWin->background.pixmap->drawable.width &
(pWin->background.pixmap->drawable.width - 1))) {
afbCopyRotatePixmap(pWin->background.pixmap,
&pPrivWin->pRotatedBackground,
pWin->drawable.x, pWin->drawable.y);
if (pPrivWin->pRotatedBackground) {
pPrivWin->fastBackground = TRUE;
pPrivWin->oldRotate.x = pWin->drawable.x;
pPrivWin->oldRotate.y = pWin->drawable.y;
} else
pPrivWin->fastBackground = FALSE;
} else
pPrivWin->fastBackground = FALSE;
break;
case CWBackPixel:
pPrivWin->fastBackground = FALSE;
break;
case CWBorderPixmap:
if ((pWin->border.pixmap->drawable.width <= PPW) &&
!(pWin->border.pixmap->drawable.width &
(pWin->border.pixmap->drawable.width - 1))) {
for (pBgWin = pWin;
pBgWin->backgroundState == ParentRelative;
pBgWin = pBgWin->parent);
afbCopyRotatePixmap(pWin->border.pixmap,
&pPrivWin->pRotatedBorder,
pBgWin->drawable.x, pBgWin->drawable.y);
if (pPrivWin->pRotatedBorder) {
pPrivWin->fastBorder = TRUE;
pPrivWin->oldRotate.x = pBgWin->drawable.x;
pPrivWin->oldRotate.y = pBgWin->drawable.y;
} else
pPrivWin->fastBorder = FALSE;
} else
pPrivWin->fastBorder = FALSE;
break;
case CWBorderPixel:
pPrivWin->fastBorder = FALSE;
break;
}
}
return (TRUE);
}