xserver-multidpi/Xext/panoramiXprocs.c

2453 lines
67 KiB
C
Raw Normal View History

2003-11-14 16:54:54 +01:00
/*****************************************************************
Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Digital Equipment Corporation
shall not be used in advertising or otherwise to promote the sale, use or other
dealings in this Software without prior written authorization from Digital
Equipment Corporation.
******************************************************************/
2003-11-14 17:49:22 +01:00
/* Massively rewritten by Mark Vojkovich <markv@valinux.com> */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
2003-11-14 16:54:54 +01:00
#include <stdio.h>
#include <X11/X.h>
#include <X11/Xproto.h>
2003-11-14 16:54:54 +01:00
#include "windowstr.h"
#include "dixfontstr.h"
#include "gcstruct.h"
#include "colormapst.h"
#include "scrnintstr.h"
#include "opaque.h"
#include "inputstr.h"
#include "migc.h"
#include "misc.h"
2003-11-14 16:54:54 +01:00
#include "dixstruct.h"
#include "panoramiX.h"
2003-11-14 17:49:22 +01:00
#include "panoramiXsrv.h"
#include "resource.h"
#include "panoramiXh.h"
2003-11-14 17:49:22 +01:00
#define XINERAMA_IMAGE_BUFSIZE (256*1024)
#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
CWDontPropagate | CWOverrideRedirect | CWCursor )
2003-11-14 16:54:54 +01:00
/* Various of the DIX function interfaces were not designed to allow
* the client->errorValue to be set on BadValue and other errors.
* Rather than changing interfaces and breaking untold code we introduce
* a new global that dispatch can use.
*/
2003-11-14 17:49:22 +01:00
extern XID clientErrorValue; /* XXX this is a kludge */
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
int PanoramiXCreateWindow(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *parent, *newWin;
PanoramiXRes *backPix = NULL;
PanoramiXRes *bordPix = NULL;
PanoramiXRes *cmap = NULL;
2003-11-14 16:54:54 +01:00
REQUEST(xCreateWindowReq);
2003-11-14 17:49:22 +01:00
int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
int result, len, j;
2003-11-14 17:49:22 +01:00
int orig_x, orig_y;
XID orig_visual, tmp;
Bool parentIsRoot;
2003-11-14 16:54:54 +01:00
REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
2003-11-14 17:49:22 +01:00
if (Ones(stuff->mask) != len)
return BadLength;
2003-11-14 16:54:54 +01:00
result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
if(stuff->class == CopyFromParent)
stuff->class = parent->u.win.class;
if((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK)))
return BadMatch;
if ((Mask)stuff->mask & CWBackPixmap) {
2003-11-14 16:54:54 +01:00
pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1));
2003-11-14 17:49:22 +01:00
tmp = *((CARD32 *) &stuff[1] + pback_offset);
if ((tmp != None) && (tmp != ParentRelative)) {
result = dixLookupResourceByType((pointer *)&backPix, tmp,
XRT_PIXMAP, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->mask & CWBorderPixmap) {
2003-11-14 16:54:54 +01:00
pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1));
2003-11-14 17:49:22 +01:00
tmp = *((CARD32 *) &stuff[1] + pbord_offset);
if (tmp != CopyFromParent) {
result = dixLookupResourceByType((pointer *)&bordPix, tmp,
XRT_PIXMAP, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->mask & CWColormap) {
2003-11-14 16:54:54 +01:00
cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1));
2003-11-14 17:49:22 +01:00
tmp = *((CARD32 *) &stuff[1] + cmap_offset);
if ((tmp != CopyFromParent) && (tmp != None)) {
result = dixLookupResourceByType((pointer *)&cmap, tmp,
XRT_COLORMAP, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if(!(newWin = xalloc(sizeof(PanoramiXRes))))
2003-11-14 17:49:22 +01:00
return BadAlloc;
newWin->type = XRT_WINDOW;
newWin->u.win.visibility = VisibilityNotViewable;
newWin->u.win.class = stuff->class;
newWin->u.win.root = FALSE;
2003-11-14 17:49:22 +01:00
newWin->info[0].id = stuff->wid;
for(j = 1; j < PanoramiXNumScreens; j++)
newWin->info[j].id = FakeClientID(client->index);
if (stuff->class == InputOnly)
stuff->visual = CopyFromParent;
orig_visual = stuff->visual;
2003-11-14 16:54:54 +01:00
orig_x = stuff->x;
orig_y = stuff->y;
parentIsRoot = (stuff->parent == WindowTable[0]->drawable.id) ||
(stuff->parent == savedScreenInfo[0].wid);
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->wid = newWin->info[j].id;
stuff->parent = parent->info[j].id;
if (parentIsRoot) {
2003-11-14 16:54:54 +01:00
stuff->x = orig_x - panoramiXdataPtr[j].x;
stuff->y = orig_y - panoramiXdataPtr[j].y;
}
2003-11-14 17:49:22 +01:00
if (backPix)
*((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
if (bordPix)
*((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
if (cmap)
*((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
if ( orig_visual != CopyFromParent )
stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
2003-11-14 17:49:22 +01:00
result = (*SavedProcVector[X_CreateWindow])(client);
if(result != Success) break;
}
if (result == Success)
AddResource(newWin->info[0].id, XRT_WINDOW, newWin);
else
xfree(newWin);
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXChangeWindowAttributes(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
PanoramiXRes *backPix = NULL;
PanoramiXRes *bordPix = NULL;
PanoramiXRes *cmap = NULL;
2003-11-14 16:54:54 +01:00
REQUEST(xChangeWindowAttributesReq);
2003-11-14 17:49:22 +01:00
int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
int result, len, j;
2003-11-14 17:49:22 +01:00
XID tmp;
2003-11-14 16:54:54 +01:00
REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
2003-11-14 17:49:22 +01:00
len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
2003-11-14 17:49:22 +01:00
if (Ones(stuff->valueMask) != len)
return BadLength;
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if((win->u.win.class == InputOnly) &&
(stuff->valueMask & (~INPUTONLY_LEGAL_MASK)))
return BadMatch;
if ((Mask)stuff->valueMask & CWBackPixmap) {
2003-11-14 16:54:54 +01:00
pback_offset = Ones((Mask)stuff->valueMask & (CWBackPixmap - 1));
2003-11-14 17:49:22 +01:00
tmp = *((CARD32 *) &stuff[1] + pback_offset);
if ((tmp != None) && (tmp != ParentRelative)) {
result = dixLookupResourceByType((pointer *)&backPix, tmp,
XRT_PIXMAP, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->valueMask & CWBorderPixmap) {
2003-11-14 16:54:54 +01:00
pbord_offset = Ones((Mask)stuff->valueMask & (CWBorderPixmap - 1));
2003-11-14 17:49:22 +01:00
tmp = *((CARD32 *) &stuff[1] + pbord_offset);
if (tmp != CopyFromParent) {
result = dixLookupResourceByType((pointer *)&bordPix, tmp,
XRT_PIXMAP, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->valueMask & CWColormap) {
2003-11-14 16:54:54 +01:00
cmap_offset = Ones((Mask)stuff->valueMask & (CWColormap - 1));
2003-11-14 17:49:22 +01:00
tmp = *((CARD32 *) &stuff[1] + cmap_offset);
if ((tmp != CopyFromParent) && (tmp != None)) {
result = dixLookupResourceByType((pointer *)&cmap, tmp,
XRT_COLORMAP, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->window = win->info[j].id;
if (backPix)
*((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
if (bordPix)
*((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
if (cmap)
*((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
result = (*SavedProcVector[X_ChangeWindowAttributes])(client);
}
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXDestroyWindow(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
client, DixDestroyAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->id = win->info[j].id;
result = (*SavedProcVector[X_DestroyWindow])(client);
if(result != Success) break;
}
/* Since ProcDestroyWindow is using FreeResource, it will free
our resource for us on the last pass through the loop above */
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXDestroySubwindows(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
client, DixDestroyAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->id = win->info[j].id;
result = (*SavedProcVector[X_DestroySubwindows])(client);
if(result != Success) break;
}
/* DestroySubwindows is using FreeResource which will free
our resources for us on the last pass through the loop above */
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXChangeSaveSet(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xChangeSaveSetReq);
REQUEST_SIZE_MATCH(xChangeSaveSetReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->window = win->info[j].id;
result = (*SavedProcVector[X_ChangeSaveSet])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXReparentWindow(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win, *parent;
int result, j;
2003-11-14 17:49:22 +01:00
int x, y;
Bool parentIsRoot;
2003-11-14 16:54:54 +01:00
REQUEST(xReparentWindowReq);
REQUEST_SIZE_MATCH(xReparentWindowReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
x = stuff->x;
y = stuff->y;
parentIsRoot = (stuff->parent == WindowTable[0]->drawable.id) ||
(stuff->parent == savedScreenInfo[0].wid);
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->window = win->info[j].id;
stuff->parent = parent->info[j].id;
if(parentIsRoot) {
stuff->x = x - panoramiXdataPtr[j].x;
stuff->y = y - panoramiXdataPtr[j].y;
}
2003-11-14 16:54:54 +01:00
result = (*SavedProcVector[X_ReparentWindow])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXMapWindow(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->id,
XRT_WINDOW, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j) {
stuff->id = win->info[j].id;
result = (*SavedProcVector[X_MapWindow])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXMapSubwindows(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->id,
XRT_WINDOW, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j) {
stuff->id = win->info[j].id;
2003-11-14 16:54:54 +01:00
result = (*SavedProcVector[X_MapSubwindows])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXUnmapWindow(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->id,
XRT_WINDOW, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j) {
stuff->id = win->info[j].id;
result = (*SavedProcVector[X_UnmapWindow])(client);
if(result != Success) break;
}
return (result);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
int PanoramiXUnmapSubwindows(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->id,
XRT_WINDOW, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j) {
stuff->id = win->info[j].id;
2003-11-14 16:54:54 +01:00
result = (*SavedProcVector[X_UnmapSubwindows])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
return (result);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
int PanoramiXConfigureWindow(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
PanoramiXRes *sib = NULL;
WindowPtr pWin;
int result, j, len, sib_offset = 0, x = 0, y = 0;
2003-11-14 17:49:22 +01:00
int x_offset = -1;
int y_offset = -1;
2003-11-14 16:54:54 +01:00
REQUEST(xConfigureWindowReq);
REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
2003-11-14 17:49:22 +01:00
len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
2003-11-14 17:49:22 +01:00
if (Ones(stuff->mask) != len)
return BadLength;
/* because we need the parent */
result = dixLookupResourceByType((pointer *)&pWin, stuff->window,
RT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->mask & CWSibling) {
XID tmp;
sib_offset = Ones((Mask)stuff->mask & (CWSibling - 1));
if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) {
result = dixLookupResourceByType((pointer *)&sib, tmp, XRT_WINDOW,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
}
}
if(pWin->parent && ((pWin->parent == WindowTable[0]) ||
(pWin->parent->drawable.id == savedScreenInfo[0].wid)))
{
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->mask & CWX) {
x_offset = 0;
x = *((CARD32 *)&stuff[1]);
}
if ((Mask)stuff->mask & CWY) {
y_offset = (x_offset == -1) ? 0 : 1;
y = *((CARD32 *) &stuff[1] + y_offset);
}
}
/* have to go forward or you get expose events before
ConfigureNotify events */
FOR_NSCREENS_FORWARD(j) {
stuff->window = win->info[j].id;
if(sib)
*((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id;
if(x_offset >= 0)
*((CARD32 *) &stuff[1] + x_offset) = x - panoramiXdataPtr[j].x;
if(y_offset >= 0)
*((CARD32 *) &stuff[1] + y_offset) = y - panoramiXdataPtr[j].y;
result = (*SavedProcVector[X_ConfigureWindow])(client);
if(result != Success) break;
}
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXCirculateWindow(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xCirculateWindowReq);
REQUEST_SIZE_MATCH(xCirculateWindowReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j) {
stuff->window = win->info[j].id;
2003-11-14 16:54:54 +01:00
result = (*SavedProcVector[X_CirculateWindow])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXGetGeometry(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
xGetGeometryReply rep;
2003-11-14 17:49:22 +01:00
DrawablePtr pDraw;
int rc;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess);
if (rc != Success)
return rc;
2003-11-14 16:54:54 +01:00
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
2003-11-14 17:49:22 +01:00
rep.root = WindowTable[0]->drawable.id;
2003-11-14 16:54:54 +01:00
rep.depth = pDraw->depth;
2003-11-14 17:49:22 +01:00
rep.width = pDraw->width;
rep.height = pDraw->height;
rep.x = rep.y = rep.borderWidth = 0;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if (stuff->id == rep.root) {
2003-11-14 16:54:54 +01:00
xWindowRoot *root = (xWindowRoot *)
(ConnectionInfo + connBlockScreenStart);
rep.width = root->pixWidth;
rep.height = root->pixHeight;
2003-11-14 17:49:22 +01:00
} else
if ((pDraw->type == UNDRAWABLE_WINDOW) || (pDraw->type == DRAWABLE_WINDOW))
{
WindowPtr pWin = (WindowPtr)pDraw;
2003-11-14 16:54:54 +01:00
rep.x = pWin->origin.x - wBorderWidth (pWin);
rep.y = pWin->origin.y - wBorderWidth (pWin);
if((pWin->parent == WindowTable[0]) ||
(pWin->parent->drawable.id == savedScreenInfo[0].wid))
{
2003-11-14 17:49:22 +01:00
rep.x += panoramiXdataPtr[0].x;
rep.y += panoramiXdataPtr[0].y;
}
2003-11-14 16:54:54 +01:00
rep.borderWidth = pWin->borderWidth;
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
return (client->noClientException);
}
2003-11-14 17:49:22 +01:00
int PanoramiXTranslateCoords(ClientPtr client)
{
INT16 x, y;
REQUEST(xTranslateCoordsReq);
int rc;
WindowPtr pWin, pDst;
2003-11-14 17:49:22 +01:00
xTranslateCoordsReply rep;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
REQUEST_SIZE_MATCH(xTranslateCoordsReq);
rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess);
if (rc != Success)
return rc;
rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess);
if (rc != Success)
return rc;
2003-11-14 17:49:22 +01:00
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.sameScreen = xTrue;
rep.child = None;
2003-11-14 16:54:54 +01:00
if((pWin == WindowTable[0]) ||
(pWin->drawable.id == savedScreenInfo[0].wid))
{
2003-11-14 17:49:22 +01:00
x = stuff->srcX - panoramiXdataPtr[0].x;
y = stuff->srcY - panoramiXdataPtr[0].y;
} else {
x = pWin->drawable.x + stuff->srcX;
y = pWin->drawable.y + stuff->srcY;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
pWin = pDst->firstChild;
while (pWin) {
BoxRec box;
if ((pWin->mapped) &&
(x >= pWin->drawable.x - wBorderWidth (pWin)) &&
(x < pWin->drawable.x + (int)pWin->drawable.width +
wBorderWidth (pWin)) &&
(y >= pWin->drawable.y - wBorderWidth (pWin)) &&
(y < pWin->drawable.y + (int)pWin->drawable.height +
wBorderWidth (pWin))
/* When a window is shaped, a further check
* is made to see if the point is inside
* borderSize
*/
&& (!wBoundingShape(pWin) ||
POINT_IN_REGION(pWin->drawable.pScreen,
wBoundingShape(pWin),
x - pWin->drawable.x,
y - pWin->drawable.y, &box))
)
{
rep.child = pWin->drawable.id;
pWin = (WindowPtr) NULL;
}
else
pWin = pWin->nextSib;
}
rep.dstX = x - pDst->drawable.x;
rep.dstY = y - pDst->drawable.y;
if((pDst == WindowTable[0]) ||
(pDst->drawable.id == savedScreenInfo[0].wid))
{
2003-11-14 17:49:22 +01:00
rep.dstX += panoramiXdataPtr[0].x;
rep.dstY += panoramiXdataPtr[0].y;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
return(client->noClientException);
}
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
int PanoramiXCreatePixmap(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *refDraw, *newPix;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xCreatePixmapReq);
REQUEST_SIZE_MATCH(xCreatePixmapReq);
client->errorValue = stuff->pid;
result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
XRC_DRAWABLE, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(!(newPix = xalloc(sizeof(PanoramiXRes))))
2003-11-14 17:49:22 +01:00
return BadAlloc;
newPix->type = XRT_PIXMAP;
newPix->u.pix.shared = FALSE;
newPix->info[0].id = stuff->pid;
for(j = 1; j < PanoramiXNumScreens; j++)
newPix->info[j].id = FakeClientID(client->index);
FOR_NSCREENS_BACKWARD(j) {
stuff->pid = newPix->info[j].id;
stuff->drawable = refDraw->info[j].id;
result = (*SavedProcVector[X_CreatePixmap])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
if (result == Success)
AddResource(newPix->info[0].id, XRT_PIXMAP, newPix);
else
xfree(newPix);
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXFreePixmap(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *pix;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->id;
result = dixLookupResourceByType((pointer *)&pix, stuff->id, XRT_PIXMAP,
client, DixDestroyAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->id = pix->info[j].id;
result = (*SavedProcVector[X_FreePixmap])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
/* Since ProcFreePixmap is using FreeResource, it will free
our resource for us on the last pass through the loop above */
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXCreateGC(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *refDraw;
PanoramiXRes *newGC;
PanoramiXRes *stip = NULL;
PanoramiXRes *tile = NULL;
PanoramiXRes *clip = NULL;
2003-11-14 16:54:54 +01:00
REQUEST(xCreateGCReq);
2003-11-14 17:49:22 +01:00
int tile_offset = 0, stip_offset = 0, clip_offset = 0;
int result, len, j;
2003-11-14 17:49:22 +01:00
XID tmp;
2003-11-14 16:54:54 +01:00
REQUEST_AT_LEAST_SIZE(xCreateGCReq);
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
client->errorValue = stuff->gc;
len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
2003-11-14 17:49:22 +01:00
if (Ones(stuff->mask) != len)
return BadLength;
result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
XRC_DRAWABLE, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->mask & GCTile) {
2003-11-14 16:54:54 +01:00
tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
2003-11-14 17:49:22 +01:00
if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
if ((Mask)stuff->mask & GCStipple) {
stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
2003-11-14 17:49:22 +01:00
if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
if ((Mask)stuff->mask & GCClipMask) {
clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
2003-11-14 17:49:22 +01:00
if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if(!(newGC = xalloc(sizeof(PanoramiXRes))))
2003-11-14 17:49:22 +01:00
return BadAlloc;
newGC->type = XRT_GC;
newGC->info[0].id = stuff->gc;
for(j = 1; j < PanoramiXNumScreens; j++)
newGC->info[j].id = FakeClientID(client->index);
FOR_NSCREENS_BACKWARD(j) {
stuff->gc = newGC->info[j].id;
stuff->drawable = refDraw->info[j].id;
if (tile)
*((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
if (stip)
*((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
if (clip)
*((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
result = (*SavedProcVector[X_CreateGC])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
if (result == Success)
AddResource(newGC->info[0].id, XRT_GC, newGC);
else
xfree(newGC);
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXChangeGC(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc;
PanoramiXRes *stip = NULL;
PanoramiXRes *tile = NULL;
PanoramiXRes *clip = NULL;
2003-11-14 16:54:54 +01:00
REQUEST(xChangeGCReq);
2003-11-14 17:49:22 +01:00
int tile_offset = 0, stip_offset = 0, clip_offset = 0;
int result, len, j;
2003-11-14 17:49:22 +01:00
XID tmp;
2003-11-14 16:54:54 +01:00
REQUEST_AT_LEAST_SIZE(xChangeGCReq);
2003-11-14 17:49:22 +01:00
len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
2003-11-14 17:49:22 +01:00
if (Ones(stuff->mask) != len)
return BadLength;
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if ((Mask)stuff->mask & GCTile) {
tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
if ((Mask)stuff->mask & GCStipple) {
2003-11-14 17:49:22 +01:00
stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
if ((Mask)stuff->mask & GCClipMask) {
2003-11-14 17:49:22 +01:00
clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadPixmap : result;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->gc = gc->info[j].id;
if (tile)
*((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
if (stip)
*((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
if (clip)
*((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
result = (*SavedProcVector[X_ChangeGC])(client);
if(result != Success) break;
}
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXCopyGC(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *srcGC, *dstGC;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xCopyGCReq);
REQUEST_SIZE_MATCH(xCopyGCReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&srcGC, stuff->srcGC, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&dstGC, stuff->dstGC, XRT_GC,
client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS(j) {
stuff->srcGC = srcGC->info[j].id;
stuff->dstGC = dstGC->info[j].id;
result = (*SavedProcVector[X_CopyGC])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXSetDashes(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xSetDashesReq);
REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->gc = gc->info[j].id;
result = (*SavedProcVector[X_SetDashes])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXSetClipRectangles(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xSetClipRectanglesReq);
REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->gc = gc->info[j].id;
result = (*SavedProcVector[X_SetClipRectangles])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXFreeGC(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&gc, stuff->id, XRT_GC,
client, DixDestroyAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->id = gc->info[j].id;
result = (*SavedProcVector[X_FreeGC])(client);
if(result != Success) break;
}
/* Since ProcFreeGC is using FreeResource, it will free
our resource for us on the last pass through the loop above */
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXClearToBackground(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *win;
int result, j, x, y;
2003-11-14 17:49:22 +01:00
Bool isRoot;
2003-11-14 16:54:54 +01:00
REQUEST(xClearAreaReq);
REQUEST_SIZE_MATCH(xClearAreaReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
x = stuff->x;
y = stuff->y;
isRoot = win->u.win.root;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->window = win->info[j].id;
if(isRoot) {
stuff->x = x - panoramiXdataPtr[j].x;
stuff->y = y - panoramiXdataPtr[j].y;
2003-11-14 16:54:54 +01:00
}
result = (*SavedProcVector[X_ClearArea])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
/*
For Window to Pixmap copies you're screwed since each screen's
pixmap will look like what it sees on its screen. Unless the
screens overlap and the window lies on each, the two copies
will be out of sync. To remedy this we do a GetImage and PutImage
in place of the copy. Doing this as a single Image isn't quite
correct since it will include the obscured areas but we will
have to fix this later. (MArk).
*/
2003-11-14 16:54:54 +01:00
int PanoramiXCopyArea(ClientPtr client)
{
int j, result, srcx, srcy, dstx, dsty;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *src, *dst;
Bool srcIsRoot = FALSE;
Bool dstIsRoot = FALSE;
Bool srcShared, dstShared;
2003-11-14 16:54:54 +01:00
REQUEST(xCopyAreaReq);
REQUEST_SIZE_MATCH(xCopyAreaReq);
result = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
XRC_DRAWABLE, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
srcShared = IS_SHARED_PIXMAP(src);
result = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
dstShared = IS_SHARED_PIXMAP(dst);
if(dstShared && srcShared)
return (* SavedProcVector[X_CopyArea])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
if((dst->type == XRT_WINDOW) && dst->u.win.root)
2003-11-14 17:49:22 +01:00
dstIsRoot = TRUE;
if((src->type == XRT_WINDOW) && src->u.win.root)
2003-11-14 17:49:22 +01:00
srcIsRoot = TRUE;
srcx = stuff->srcX; srcy = stuff->srcY;
dstx = stuff->dstX; dsty = stuff->dstY;
if((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
DrawablePtr drawables[MAXSCREENS];
DrawablePtr pDst;
GCPtr pGC;
char *data;
int pitch, rc;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS(j) {
rc = dixLookupDrawable(drawables+j, src->info[j].id, client, 0,
DixGetAttrAccess);
if (rc != Success)
return rc;
}
2003-11-14 17:49:22 +01:00
pitch = PixmapBytePad(stuff->width, drawables[0]->depth);
if(!(data = xcalloc(1, stuff->height * pitch)))
return BadAlloc;
XineramaGetImageData(drawables, srcx, srcy,
stuff->width, stuff->height, ZPixmap, ~0, data, pitch,
srcIsRoot);
FOR_NSCREENS_BACKWARD(j) {
stuff->gc = gc->info[j].id;
VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess);
2003-11-14 17:49:22 +01:00
if(drawables[0]->depth != pDst->depth) {
client->errorValue = stuff->dstDrawable;
xfree(data);
return (BadMatch);
}
(*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty,
stuff->width, stuff->height,
0, ZPixmap, data);
if(dstShared) break;
}
xfree(data);
result = Success;
2003-11-14 16:54:54 +01:00
} else {
2003-11-14 17:49:22 +01:00
DrawablePtr pDst = NULL, pSrc = NULL;
GCPtr pGC = NULL;
RegionPtr pRgn[MAXSCREENS];
int rc;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->dstDrawable = dst->info[j].id;
stuff->srcDrawable = src->info[j].id;
stuff->gc = gc->info[j].id;
if (srcIsRoot) {
stuff->srcX = srcx - panoramiXdataPtr[j].x;
stuff->srcY = srcy - panoramiXdataPtr[j].y;
}
if (dstIsRoot) {
stuff->dstX = dstx - panoramiXdataPtr[j].x;
stuff->dstY = dsty - panoramiXdataPtr[j].y;
}
VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
2003-11-14 17:49:22 +01:00
if (stuff->dstDrawable != stuff->srcDrawable) {
rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
DixReadAccess);
if (rc != Success)
return rc;
2003-11-14 17:49:22 +01:00
if ((pDst->pScreen != pSrc->pScreen) ||
(pDst->depth != pSrc->depth)) {
client->errorValue = stuff->dstDrawable;
return (BadMatch);
}
} else
pSrc = pDst;
pRgn[j] = (*pGC->ops->CopyArea)(pSrc, pDst, pGC,
stuff->srcX, stuff->srcY,
stuff->width, stuff->height,
stuff->dstX, stuff->dstY);
if(dstShared) {
while(j--) pRgn[j] = NULL;
break;
}
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
if(pGC->graphicsExposures) {
ScreenPtr pScreen = pDst->pScreen;
RegionRec totalReg;
Bool overlap;
REGION_NULL(pScreen, &totalReg);
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
if(pRgn[j]) {
if(srcIsRoot) {
REGION_TRANSLATE(pScreen, pRgn[j],
panoramiXdataPtr[j].x, panoramiXdataPtr[j].y);
}
REGION_APPEND(pScreen, &totalReg, pRgn[j]);
REGION_DESTROY(pScreen, pRgn[j]);
}
}
REGION_VALIDATE(pScreen, &totalReg, &overlap);
(*pScreen->SendGraphicsExpose)(
client, &totalReg, stuff->dstDrawable, X_CopyArea, 0);
REGION_UNINIT(pScreen, &totalReg);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
result = client->noClientException;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
int PanoramiXCopyPlane(ClientPtr client)
{
int j, srcx, srcy, dstx, dsty, rc;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *src, *dst;
Bool srcIsRoot = FALSE;
Bool dstIsRoot = FALSE;
Bool srcShared, dstShared;
DrawablePtr psrcDraw, pdstDraw = NULL;
GCPtr pGC = NULL;
RegionPtr pRgn[MAXSCREENS];
2003-11-14 16:54:54 +01:00
REQUEST(xCopyPlaneReq);
REQUEST_SIZE_MATCH(xCopyPlaneReq);
rc = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
XRC_DRAWABLE, client, DixReadAccess);
if (rc != Success)
return (rc == BadValue) ? BadDrawable : rc;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
srcShared = IS_SHARED_PIXMAP(src);
2003-11-14 16:54:54 +01:00
rc = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (rc != Success)
return (rc == BadValue) ? BadDrawable : rc;
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
dstShared = IS_SHARED_PIXMAP(dst);
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if(dstShared && srcShared)
return (* SavedProcVector[X_CopyPlane])(client);
rc = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (rc != Success)
return (rc == BadValue) ? BadGC : rc;
2003-11-14 17:49:22 +01:00
if((dst->type == XRT_WINDOW) && dst->u.win.root)
2003-11-14 17:49:22 +01:00
dstIsRoot = TRUE;
if((src->type == XRT_WINDOW) && src->u.win.root)
2003-11-14 17:49:22 +01:00
srcIsRoot = TRUE;
srcx = stuff->srcX; srcy = stuff->srcY;
dstx = stuff->dstX; dsty = stuff->dstY;
FOR_NSCREENS_BACKWARD(j) {
stuff->dstDrawable = dst->info[j].id;
stuff->srcDrawable = src->info[j].id;
stuff->gc = gc->info[j].id;
if (srcIsRoot) {
stuff->srcX = srcx - panoramiXdataPtr[j].x;
stuff->srcY = srcy - panoramiXdataPtr[j].y;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
if (dstIsRoot) {
stuff->dstX = dstx - panoramiXdataPtr[j].x;
stuff->dstY = dsty - panoramiXdataPtr[j].y;
}
VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
2003-11-14 17:49:22 +01:00
if (stuff->dstDrawable != stuff->srcDrawable) {
rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
DixReadAccess);
if (rc != Success)
return rc;
2003-11-14 17:49:22 +01:00
if (pdstDraw->pScreen != psrcDraw->pScreen) {
client->errorValue = stuff->dstDrawable;
return (BadMatch);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
} else
psrcDraw = pdstDraw;
if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
(stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) {
client->errorValue = stuff->bitPlane;
return(BadValue);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
pRgn[j] = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC,
stuff->srcX, stuff->srcY,
stuff->width, stuff->height,
stuff->dstX, stuff->dstY, stuff->bitPlane);
if(dstShared) {
while(j--) pRgn[j] = NULL;
break;
2003-11-14 16:54:54 +01:00
}
}
2003-11-14 17:49:22 +01:00
if(pGC->graphicsExposures) {
ScreenPtr pScreen = pdstDraw->pScreen;
RegionRec totalReg;
Bool overlap;
REGION_NULL(pScreen, &totalReg);
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
if(pRgn[j]) {
REGION_APPEND(pScreen, &totalReg, pRgn[j]);
REGION_DESTROY(pScreen, pRgn[j]);
}
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
REGION_VALIDATE(pScreen, &totalReg, &overlap);
(*pScreen->SendGraphicsExpose)(
client, &totalReg, stuff->dstDrawable, X_CopyPlane, 0);
REGION_UNINIT(pScreen, &totalReg);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolyPoint(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
int result, npoint, j;
2003-11-14 16:54:54 +01:00
xPoint *origPts;
2003-11-14 17:49:22 +01:00
Bool isRoot;
2003-11-14 16:54:54 +01:00
REQUEST(xPolyPointReq);
REQUEST_AT_LEAST_SIZE(xPolyPointReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyPoint])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
2003-11-14 16:54:54 +01:00
if (npoint > 0) {
origPts = xalloc(npoint * sizeof(xPoint));
2003-11-14 16:54:54 +01:00
memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xPoint *pnts = (xPoint*)&stuff[1];
int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
while(i--) {
pnts->x -= x_off;
pnts->y -= y_off;
pnts++;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolyPoint])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origPts);
2003-11-14 16:54:54 +01:00
return (result);
2003-11-14 17:49:22 +01:00
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolyLine(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
int result, npoint, j;
2003-11-14 16:54:54 +01:00
xPoint *origPts;
2003-11-14 17:49:22 +01:00
Bool isRoot;
2003-11-14 16:54:54 +01:00
REQUEST(xPolyLineReq);
REQUEST_AT_LEAST_SIZE(xPolyLineReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyLine])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
2003-11-14 16:54:54 +01:00
if (npoint > 0){
origPts = xalloc(npoint * sizeof(xPoint));
2003-11-14 16:54:54 +01:00
memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xPoint *pnts = (xPoint*)&stuff[1];
int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
while(i--) {
pnts->x -= x_off;
pnts->y -= y_off;
pnts++;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolyLine])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origPts);
2003-11-14 16:54:54 +01:00
return (result);
2003-11-14 17:49:22 +01:00
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolySegment(ClientPtr client)
{
int result, nsegs, i, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
2003-11-14 16:54:54 +01:00
xSegment *origSegs;
2003-11-14 17:49:22 +01:00
Bool isRoot;
2003-11-14 16:54:54 +01:00
REQUEST(xPolySegmentReq);
REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolySegment])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
2003-11-14 17:49:22 +01:00
if(nsegs & 4) return BadLength;
2003-11-14 16:54:54 +01:00
nsegs >>= 3;
if (nsegs > 0) {
origSegs = xalloc(nsegs * sizeof(xSegment));
2003-11-14 17:49:22 +01:00
memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment));
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xSegment *segs = (xSegment*)&stuff[1];
for (i = nsegs; i--; segs++) {
segs->x1 -= x_off;
segs->x2 -= x_off;
segs->y1 -= y_off;
segs->y2 -= y_off;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolySegment])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origSegs);
2003-11-14 17:49:22 +01:00
return (result);
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolyRectangle(ClientPtr client)
{
int result, nrects, i, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
2003-11-14 16:54:54 +01:00
xRectangle *origRecs;
REQUEST(xPolyRectangleReq);
REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyRectangle])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
2003-11-14 17:49:22 +01:00
if(nrects & 4) return BadLength;
2003-11-14 16:54:54 +01:00
nrects >>= 3;
if (nrects > 0){
origRecs = xalloc(nrects * sizeof(xRectangle));
2003-11-14 17:49:22 +01:00
memcpy((char *)origRecs,(char *)&stuff[1],nrects * sizeof(xRectangle));
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xRectangle *rects = (xRectangle *) &stuff[1];
for (i = nrects; i--; rects++) {
rects->x -= x_off;
rects->y -= y_off;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolyRectangle])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origRecs);
2003-11-14 17:49:22 +01:00
return (result);
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolyArc(ClientPtr client)
{
int result, narcs, i, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
2003-11-14 16:54:54 +01:00
xArc *origArcs;
REQUEST(xPolyArcReq);
REQUEST_AT_LEAST_SIZE(xPolyArcReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyArc])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
2003-11-14 17:49:22 +01:00
if(narcs % sizeof(xArc)) return BadLength;
2003-11-14 16:54:54 +01:00
narcs /= sizeof(xArc);
if (narcs > 0){
origArcs = xalloc(narcs * sizeof(xArc));
2003-11-14 17:49:22 +01:00
memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xArc *arcs = (xArc *) &stuff[1];
for (i = narcs; i--; arcs++) {
arcs->x -= x_off;
arcs->y -= y_off;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolyArc])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origArcs);
2003-11-14 17:49:22 +01:00
return (result);
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXFillPoly(ClientPtr client)
{
int result, count, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
2003-11-14 16:54:54 +01:00
DDXPointPtr locPts;
REQUEST(xFillPolyReq);
REQUEST_AT_LEAST_SIZE(xFillPolyReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_FillPoly])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
2003-11-14 16:54:54 +01:00
if (count > 0){
locPts = xalloc(count * sizeof(DDXPointRec));
2003-11-14 17:49:22 +01:00
memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec));
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
DDXPointPtr pnts = (DDXPointPtr)&stuff[1];
int i = (stuff->coordMode==CoordModePrevious) ? 1 : count;
while(i--) {
pnts->x -= x_off;
pnts->y -= y_off;
pnts++;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_FillPoly])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(locPts);
2003-11-14 17:49:22 +01:00
return (result);
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolyFillRectangle(ClientPtr client)
{
int result, things, i, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
xRectangle *origRects;
2003-11-14 16:54:54 +01:00
REQUEST(xPolyFillRectangleReq);
REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyFillRectangle])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
2003-11-14 17:49:22 +01:00
if(things & 4) return BadLength;
2003-11-14 16:54:54 +01:00
things >>= 3;
if (things > 0){
origRects = xalloc(things * sizeof(xRectangle));
2003-11-14 17:49:22 +01:00
memcpy((char*)origRects,(char*)&stuff[1], things * sizeof(xRectangle));
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origRects, things * sizeof(xRectangle));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xRectangle *rects = (xRectangle *) &stuff[1];
for (i = things; i--; rects++) {
rects->x -= x_off;
rects->y -= y_off;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolyFillRectangle])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origRects);
2003-11-14 17:49:22 +01:00
return (result);
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
int PanoramiXPolyFillArc(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
int result, narcs, i, j;
2003-11-14 16:54:54 +01:00
xArc *origArcs;
REQUEST(xPolyFillArcReq);
REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyFillArc])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
IF_RETURN((narcs % sizeof(xArc)), BadLength);
narcs /= sizeof(xArc);
if (narcs > 0) {
origArcs = xalloc(narcs * sizeof(xArc));
2003-11-14 17:49:22 +01:00
memcpy((char *) origArcs, (char *)&stuff[1], narcs * sizeof(xArc));
FOR_NSCREENS_FORWARD(j){
if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
if (isRoot) {
int x_off = panoramiXdataPtr[j].x;
int y_off = panoramiXdataPtr[j].y;
if(x_off || y_off) {
xArc *arcs = (xArc *) &stuff[1];
for (i = narcs; i--; arcs++) {
arcs->x -= x_off;
arcs->y -= y_off;
}
}
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PolyFillArc])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
xfree(origArcs);
2003-11-14 17:49:22 +01:00
return (result);
} else
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
2003-11-14 17:49:22 +01:00
int PanoramiXPutImage(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
int j, result, orig_x, orig_y;
2003-11-14 16:54:54 +01:00
REQUEST(xPutImageReq);
REQUEST_AT_LEAST_SIZE(xPutImageReq);
2003-11-14 17:49:22 +01:00
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PutImage])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
orig_x = stuff->dstX;
orig_y = stuff->dstY;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
if (isRoot) {
2003-11-14 16:54:54 +01:00
stuff->dstX = orig_x - panoramiXdataPtr[j].x;
stuff->dstY = orig_y - panoramiXdataPtr[j].y;
2003-11-14 17:49:22 +01:00
}
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
result = (* SavedProcVector[X_PutImage])(client);
if(result != Success) break;
}
return (result);
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
int PanoramiXGetImage(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
DrawablePtr drawables[MAXSCREENS];
DrawablePtr pDraw;
PanoramiXRes *draw;
2003-11-14 16:54:54 +01:00
xGetImageReply xgi;
2003-11-14 17:49:22 +01:00
Bool isRoot;
char *pBuf;
int i, x, y, w, h, format, rc;
2003-11-14 17:49:22 +01:00
Mask plane = 0, planemask;
int linesDone, nlines, linesPerBuf;
long widthBytesLine, length;
2003-11-14 16:54:54 +01:00
REQUEST(xGetImageReq);
REQUEST_SIZE_MATCH(xGetImageReq);
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
client->errorValue = stuff->format;
return(BadValue);
}
2003-11-14 17:49:22 +01:00
rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (rc != Success)
return (rc == BadValue) ? BadDrawable : rc;
2003-11-14 17:49:22 +01:00
if(draw->type == XRT_PIXMAP)
return (*SavedProcVector[X_GetImage])(client);
rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
DixReadAccess);
if (rc != Success)
return rc;
2003-11-14 17:49:22 +01:00
if(!((WindowPtr)pDraw)->realized)
return(BadMatch);
x = stuff->x;
y = stuff->y;
w = stuff->width;
h = stuff->height;
format = stuff->format;
planemask = stuff->planeMask;
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
if(isRoot) {
if( /* check for being onscreen */
x < 0 || x + w > PanoramiXPixWidth ||
y < 0 || y + h > PanoramiXPixHeight )
2003-11-14 16:54:54 +01:00
return(BadMatch);
} else {
2003-11-14 17:49:22 +01:00
if( /* check for being onscreen */
panoramiXdataPtr[0].x + pDraw->x + x < 0 ||
panoramiXdataPtr[0].x + pDraw->x + x + w > PanoramiXPixWidth ||
panoramiXdataPtr[0].y + pDraw->y + y < 0 ||
panoramiXdataPtr[0].y + pDraw->y + y + h > PanoramiXPixHeight ||
/* check for being inside of border */
x < - wBorderWidth((WindowPtr)pDraw) ||
x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
y < -wBorderWidth((WindowPtr)pDraw) ||
y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height)
2003-11-14 16:54:54 +01:00
return(BadMatch);
}
2003-11-14 17:49:22 +01:00
drawables[0] = pDraw;
for(i = 1; i < PanoramiXNumScreens; i++) {
rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0,
DixGetAttrAccess);
if (rc != Success)
return rc;
}
2003-11-14 17:49:22 +01:00
xgi.visual = wVisual (((WindowPtr) pDraw));
2003-11-14 16:54:54 +01:00
xgi.type = X_Reply;
xgi.sequenceNumber = client->sequence;
xgi.depth = pDraw->depth;
2003-11-14 17:49:22 +01:00
if(format == ZPixmap) {
widthBytesLine = PixmapBytePad(w, pDraw->depth);
length = widthBytesLine * h;
2003-11-14 16:54:54 +01:00
} else {
2003-11-14 17:49:22 +01:00
widthBytesLine = BitmapBytePad(w);
2003-11-14 16:54:54 +01:00
plane = ((Mask)1) << (pDraw->depth - 1);
/* only planes asked for */
2003-11-14 17:49:22 +01:00
length = widthBytesLine * h *
Ones(planemask & (plane | (plane - 1)));
2003-11-14 16:54:54 +01:00
}
xgi.length = bytes_to_int32(length);
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if (widthBytesLine == 0 || h == 0)
2003-11-14 16:54:54 +01:00
linesPerBuf = 0;
2003-11-14 17:49:22 +01:00
else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE)
2003-11-14 16:54:54 +01:00
linesPerBuf = 1;
2003-11-14 17:49:22 +01:00
else {
linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine;
if (linesPerBuf > h)
linesPerBuf = h;
2003-11-14 16:54:54 +01:00
}
length = linesPerBuf * widthBytesLine;
2003-11-14 17:49:22 +01:00
if(!(pBuf = xalloc(length)))
return (BadAlloc);
2003-11-14 16:54:54 +01:00
WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
if (linesPerBuf == 0) {
2003-11-14 17:49:22 +01:00
/* nothing to do */
}
else if (format == ZPixmap) {
2003-11-14 16:54:54 +01:00
linesDone = 0;
2003-11-14 17:49:22 +01:00
while (h - linesDone > 0) {
nlines = min(linesPerBuf, h - linesDone);
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
if(pDraw->depth == 1)
bzero(pBuf, nlines * widthBytesLine);
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
XineramaGetImageData(drawables, x, y + linesDone, w, nlines,
format, planemask, pBuf, widthBytesLine, isRoot);
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
(void)WriteToClient(client,
(int)(nlines * widthBytesLine),
pBuf);
2003-11-14 16:54:54 +01:00
linesDone += nlines;
}
2003-11-14 17:49:22 +01:00
} else { /* XYPixmap */
2003-11-14 16:54:54 +01:00
for (; plane; plane >>= 1) {
2003-11-14 17:49:22 +01:00
if (planemask & plane) {
2003-11-14 16:54:54 +01:00
linesDone = 0;
2003-11-14 17:49:22 +01:00
while (h - linesDone > 0) {
nlines = min(linesPerBuf, h - linesDone);
2003-11-14 16:54:54 +01:00
2003-11-14 17:49:22 +01:00
bzero(pBuf, nlines * widthBytesLine);
XineramaGetImageData(drawables, x, y + linesDone, w,
nlines, format, plane, pBuf,
widthBytesLine, isRoot);
(void)WriteToClient(client,
(int)(nlines * widthBytesLine),
pBuf);
2003-11-14 16:54:54 +01:00
linesDone += nlines;
}
}
}
}
2003-11-14 17:49:22 +01:00
xfree(pBuf);
2003-11-14 16:54:54 +01:00
return (client->noClientException);
}
2003-11-14 17:49:22 +01:00
/* The text stuff should be rewritten so that duplication happens
at the GlyphBlt level. That is, loading the font and getting
the glyphs should only happen once */
2003-11-14 16:54:54 +01:00
int
2003-11-14 17:49:22 +01:00
PanoramiXPolyText8(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
int result, j;
2003-11-14 17:49:22 +01:00
int orig_x, orig_y;
2003-11-14 16:54:54 +01:00
REQUEST(xPolyTextReq);
2003-11-14 17:49:22 +01:00
REQUEST_AT_LEAST_SIZE(xPolyTextReq);
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyText8])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
orig_x = stuff->x;
orig_y = stuff->y;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
if (isRoot) {
2003-11-14 16:54:54 +01:00
stuff->x = orig_x - panoramiXdataPtr[j].x;
stuff->y = orig_y - panoramiXdataPtr[j].y;
}
result = (*SavedProcVector[X_PolyText8])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
int
2003-11-14 17:49:22 +01:00
PanoramiXPolyText16(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
int result, j;
2003-11-14 17:49:22 +01:00
int orig_x, orig_y;
2003-11-14 16:54:54 +01:00
REQUEST(xPolyTextReq);
2003-11-14 17:49:22 +01:00
REQUEST_AT_LEAST_SIZE(xPolyTextReq);
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_PolyText16])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
orig_x = stuff->x;
orig_y = stuff->y;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
if (isRoot) {
2003-11-14 16:54:54 +01:00
stuff->x = orig_x - panoramiXdataPtr[j].x;
stuff->y = orig_y - panoramiXdataPtr[j].y;
}
result = (*SavedProcVector[X_PolyText16])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
int PanoramiXImageText8(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
2003-11-14 16:54:54 +01:00
int orig_x, orig_y;
REQUEST(xImageTextReq);
2003-11-14 17:49:22 +01:00
REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_ImageText8])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
orig_x = stuff->x;
orig_y = stuff->y;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
if (isRoot) {
2003-11-14 16:54:54 +01:00
stuff->x = orig_x - panoramiXdataPtr[j].x;
stuff->y = orig_y - panoramiXdataPtr[j].y;
}
result = (*SavedProcVector[X_ImageText8])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
int PanoramiXImageText16(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *gc, *draw;
Bool isRoot;
2003-11-14 16:54:54 +01:00
int orig_x, orig_y;
REQUEST(xImageTextReq);
2003-11-14 17:49:22 +01:00
REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
XRC_DRAWABLE, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadDrawable : result;
2003-11-14 17:49:22 +01:00
if(IS_SHARED_PIXMAP(draw))
return (*SavedProcVector[X_ImageText16])(client);
result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadGC : result;
2003-11-14 17:49:22 +01:00
isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
2003-11-14 17:49:22 +01:00
2003-11-14 16:54:54 +01:00
orig_x = stuff->x;
orig_y = stuff->y;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->drawable = draw->info[j].id;
stuff->gc = gc->info[j].id;
if (isRoot) {
2003-11-14 16:54:54 +01:00
stuff->x = orig_x - panoramiXdataPtr[j].x;
stuff->y = orig_y - panoramiXdataPtr[j].y;
}
result = (*SavedProcVector[X_ImageText16])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXCreateColormap(ClientPtr client)
{
PanoramiXRes *win, *newCmap;
int result, j, orig_visual;
2003-11-14 16:54:54 +01:00
REQUEST(xCreateColormapReq);
REQUEST_SIZE_MATCH(xCreateColormapReq);
result = dixLookupResourceByType((pointer *)&win, stuff->window,
XRT_WINDOW, client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadWindow : result;
2003-11-14 17:49:22 +01:00
if(!(newCmap = xalloc(sizeof(PanoramiXRes))))
2003-11-14 17:49:22 +01:00
return BadAlloc;
newCmap->type = XRT_COLORMAP;
newCmap->info[0].id = stuff->mid;
for(j = 1; j < PanoramiXNumScreens; j++)
newCmap->info[j].id = FakeClientID(client->index);
2003-11-14 16:54:54 +01:00
orig_visual = stuff->visual;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->mid = newCmap->info[j].id;
stuff->window = win->info[j].id;
stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_CreateColormap])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
if (result == Success)
AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
else
xfree(newCmap);
2003-11-14 16:54:54 +01:00
return (result);
}
int PanoramiXFreeColormap(ClientPtr client)
{
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
int result, j;
2003-11-14 16:54:54 +01:00
REQUEST(xResourceReq);
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->id;
result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
client, DixDestroyAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->id = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_FreeColormap])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
/* Since ProcFreeColormap is using FreeResource, it will free
our resource for us on the last pass through the loop above */
return (result);
}
int
PanoramiXCopyColormapAndFree(ClientPtr client)
{
PanoramiXRes *cmap, *newCmap;
int result, j;
2003-11-14 17:49:22 +01:00
REQUEST(xCopyColormapAndFreeReq);
REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
client->errorValue = stuff->srcCmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->srcCmap,
XRT_COLORMAP, client,
DixReadAccess | DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
if(!(newCmap = xalloc(sizeof(PanoramiXRes))))
2003-11-14 17:49:22 +01:00
return BadAlloc;
newCmap->type = XRT_COLORMAP;
newCmap->info[0].id = stuff->mid;
for(j = 1; j < PanoramiXNumScreens; j++)
newCmap->info[j].id = FakeClientID(client->index);
FOR_NSCREENS_BACKWARD(j){
stuff->srcCmap = cmap->info[j].id;
stuff->mid = newCmap->info[j].id;
result = (* SavedProcVector[X_CopyColormapAndFree])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
2003-11-14 17:49:22 +01:00
if (result == Success)
AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
else
xfree(newCmap);
2003-11-14 16:54:54 +01:00
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXInstallColormap(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
REQUEST(xResourceReq);
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
2003-11-14 16:54:54 +01:00
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->id;
result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->id = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_InstallColormap])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXUninstallColormap(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
REQUEST(xResourceReq);
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
2003-11-14 16:54:54 +01:00
REQUEST_SIZE_MATCH(xResourceReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->id;
result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
client, DixReadAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->id = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_UninstallColormap])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
int PanoramiXAllocColor(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
2003-11-14 16:54:54 +01:00
REQUEST(xAllocColorReq);
REQUEST_SIZE_MATCH(xAllocColorReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->cmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->cmap = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_AllocColor])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
int PanoramiXAllocNamedColor(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
2003-11-14 16:54:54 +01:00
REQUEST(xAllocNamedColorReq);
REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->cmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->cmap = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_AllocNamedColor])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
int PanoramiXAllocColorCells(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
2003-11-14 16:54:54 +01:00
REQUEST(xAllocColorCellsReq);
REQUEST_SIZE_MATCH(xAllocColorCellsReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->cmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->cmap = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_AllocColorCells])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}
2003-11-14 17:49:22 +01:00
int PanoramiXAllocColorPlanes(ClientPtr client)
2003-11-14 16:54:54 +01:00
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
REQUEST(xAllocColorPlanesReq);
REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
client->errorValue = stuff->cmap;
2003-11-14 16:54:54 +01:00
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->cmap = cmap->info[j].id;
result = (* SavedProcVector[X_AllocColorPlanes])(client);
if(result != Success) break;
}
return (result);
}
int PanoramiXFreeColors(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
REQUEST(xFreeColorsReq);
2003-11-14 16:54:54 +01:00
REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->cmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j) {
stuff->cmap = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_FreeColors])(client);
}
return (result);
}
int PanoramiXStoreColors(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
2003-11-14 16:54:54 +01:00
REQUEST(xStoreColorsReq);
REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
2003-11-14 17:49:22 +01:00
client->errorValue = stuff->cmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->cmap = cmap->info[j].id;
2003-11-14 16:54:54 +01:00
result = (* SavedProcVector[X_StoreColors])(client);
2003-11-14 17:49:22 +01:00
if(result != Success) break;
}
return (result);
}
int PanoramiXStoreNamedColor(ClientPtr client)
{
int result, j;
2003-11-14 17:49:22 +01:00
PanoramiXRes *cmap;
REQUEST(xStoreNamedColorReq);
REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
client->errorValue = stuff->cmap;
result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
XRT_COLORMAP, client, DixWriteAccess);
if (result != Success)
return (result == BadValue) ? BadColor : result;
2003-11-14 17:49:22 +01:00
FOR_NSCREENS_BACKWARD(j){
stuff->cmap = cmap->info[j].id;
result = (* SavedProcVector[X_StoreNamedColor])(client);
if(result != Success) break;
2003-11-14 16:54:54 +01:00
}
return (result);
}