panoramiXprocs.c revision 35c4bbdf
105b261ecSmrg/***************************************************************** 205b261ecSmrgCopyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts. 305b261ecSmrgPermission is hereby granted, free of charge, to any person obtaining a copy 405b261ecSmrgof this software and associated documentation files (the "Software"), to deal 505b261ecSmrgin the Software without restriction, including without limitation the rights 605b261ecSmrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell 705b261ecSmrgcopies of the Software. 805b261ecSmrg 905b261ecSmrgThe above copyright notice and this permission notice shall be included in 1005b261ecSmrgall copies or substantial portions of the Software. 1105b261ecSmrg 1205b261ecSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1305b261ecSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1405b261ecSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1505b261ecSmrgDIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING, 1605b261ecSmrgBUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY, 1705b261ecSmrgWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 1805b261ecSmrgIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 1905b261ecSmrg 2005b261ecSmrgExcept as contained in this notice, the name of Digital Equipment Corporation 2105b261ecSmrgshall not be used in advertising or otherwise to promote the sale, use or other 2205b261ecSmrgdealings in this Software without prior written authorization from Digital 2305b261ecSmrgEquipment Corporation. 2405b261ecSmrg******************************************************************/ 2505b261ecSmrg 2605b261ecSmrg/* Massively rewritten by Mark Vojkovich <markv@valinux.com> */ 2705b261ecSmrg 2805b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 2905b261ecSmrg#include <dix-config.h> 3005b261ecSmrg#endif 3105b261ecSmrg 3205b261ecSmrg#include <stdio.h> 3305b261ecSmrg#include <X11/X.h> 3405b261ecSmrg#include <X11/Xproto.h> 3505b261ecSmrg#include "windowstr.h" 3605b261ecSmrg#include "dixfontstr.h" 3705b261ecSmrg#include "gcstruct.h" 3805b261ecSmrg#include "colormapst.h" 3905b261ecSmrg#include "scrnintstr.h" 4005b261ecSmrg#include "opaque.h" 4105b261ecSmrg#include "inputstr.h" 4205b261ecSmrg#include "migc.h" 4305b261ecSmrg#include "misc.h" 4405b261ecSmrg#include "dixstruct.h" 4505b261ecSmrg#include "panoramiX.h" 4605b261ecSmrg#include "panoramiXsrv.h" 4705b261ecSmrg#include "resource.h" 4805b261ecSmrg#include "panoramiXh.h" 4905b261ecSmrg 5005b261ecSmrg#define XINERAMA_IMAGE_BUFSIZE (256*1024) 5105b261ecSmrg#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \ 5205b261ecSmrg CWDontPropagate | CWOverrideRedirect | CWCursor ) 5305b261ecSmrg 5435c4bbdfSmrgint 5535c4bbdfSmrgPanoramiXCreateWindow(ClientPtr client) 5605b261ecSmrg{ 5705b261ecSmrg PanoramiXRes *parent, *newWin; 5805b261ecSmrg PanoramiXRes *backPix = NULL; 5905b261ecSmrg PanoramiXRes *bordPix = NULL; 6035c4bbdfSmrg PanoramiXRes *cmap = NULL; 6135c4bbdfSmrg 6205b261ecSmrg REQUEST(xCreateWindowReq); 6305b261ecSmrg int pback_offset = 0, pbord_offset = 0, cmap_offset = 0; 646747b715Smrg int result, len, j; 6505b261ecSmrg int orig_x, orig_y; 6605b261ecSmrg XID orig_visual, tmp; 6705b261ecSmrg Bool parentIsRoot; 6805b261ecSmrg 6905b261ecSmrg REQUEST_AT_LEAST_SIZE(xCreateWindowReq); 7035c4bbdfSmrg 716747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq)); 7205b261ecSmrg if (Ones(stuff->mask) != len) 7305b261ecSmrg return BadLength; 7405b261ecSmrg 7535c4bbdfSmrg result = dixLookupResourceByType((void **) &parent, stuff->parent, 7635c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 776747b715Smrg if (result != Success) 786747b715Smrg return result; 7905b261ecSmrg 8035c4bbdfSmrg if (stuff->class == CopyFromParent) 8135c4bbdfSmrg stuff->class = parent->u.win.class; 8205b261ecSmrg 8335c4bbdfSmrg if ((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK))) 8405b261ecSmrg return BadMatch; 8505b261ecSmrg 8635c4bbdfSmrg if ((Mask) stuff->mask & CWBackPixmap) { 8735c4bbdfSmrg pback_offset = Ones((Mask) stuff->mask & (CWBackPixmap - 1)); 8835c4bbdfSmrg tmp = *((CARD32 *) &stuff[1] + pback_offset); 8935c4bbdfSmrg if ((tmp != None) && (tmp != ParentRelative)) { 9035c4bbdfSmrg result = dixLookupResourceByType((void **) &backPix, tmp, 9135c4bbdfSmrg XRT_PIXMAP, client, DixReadAccess); 9235c4bbdfSmrg if (result != Success) 9335c4bbdfSmrg return result; 9435c4bbdfSmrg } 9535c4bbdfSmrg } 9635c4bbdfSmrg if ((Mask) stuff->mask & CWBorderPixmap) { 9735c4bbdfSmrg pbord_offset = Ones((Mask) stuff->mask & (CWBorderPixmap - 1)); 9835c4bbdfSmrg tmp = *((CARD32 *) &stuff[1] + pbord_offset); 9935c4bbdfSmrg if (tmp != CopyFromParent) { 10035c4bbdfSmrg result = dixLookupResourceByType((void **) &bordPix, tmp, 10135c4bbdfSmrg XRT_PIXMAP, client, DixReadAccess); 10235c4bbdfSmrg if (result != Success) 10335c4bbdfSmrg return result; 10435c4bbdfSmrg } 10535c4bbdfSmrg } 10635c4bbdfSmrg if ((Mask) stuff->mask & CWColormap) { 10735c4bbdfSmrg cmap_offset = Ones((Mask) stuff->mask & (CWColormap - 1)); 10835c4bbdfSmrg tmp = *((CARD32 *) &stuff[1] + cmap_offset); 10935c4bbdfSmrg if (tmp != CopyFromParent) { 11035c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, tmp, 11135c4bbdfSmrg XRT_COLORMAP, client, 11235c4bbdfSmrg DixReadAccess); 11335c4bbdfSmrg if (result != Success) 11435c4bbdfSmrg return result; 11535c4bbdfSmrg } 11635c4bbdfSmrg } 11735c4bbdfSmrg 11835c4bbdfSmrg if (!(newWin = malloc(sizeof(PanoramiXRes)))) 11905b261ecSmrg return BadAlloc; 12005b261ecSmrg 12105b261ecSmrg newWin->type = XRT_WINDOW; 12205b261ecSmrg newWin->u.win.visibility = VisibilityNotViewable; 12305b261ecSmrg newWin->u.win.class = stuff->class; 12405b261ecSmrg newWin->u.win.root = FALSE; 12535c4bbdfSmrg panoramix_setup_ids(newWin, client, stuff->wid); 12605b261ecSmrg 12705b261ecSmrg if (stuff->class == InputOnly) 12835c4bbdfSmrg stuff->visual = CopyFromParent; 12905b261ecSmrg orig_visual = stuff->visual; 13005b261ecSmrg orig_x = stuff->x; 13105b261ecSmrg orig_y = stuff->y; 13235c4bbdfSmrg parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) 13335c4bbdfSmrg || (stuff->parent == screenInfo.screens[0]->screensaver.wid); 13405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 13505b261ecSmrg stuff->wid = newWin->info[j].id; 13605b261ecSmrg stuff->parent = parent->info[j].id; 13735c4bbdfSmrg if (parentIsRoot) { 13835c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 13935c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 14035c4bbdfSmrg } 14135c4bbdfSmrg if (backPix) 14235c4bbdfSmrg *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id; 14335c4bbdfSmrg if (bordPix) 14435c4bbdfSmrg *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id; 14535c4bbdfSmrg if (cmap) 14635c4bbdfSmrg *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id; 14735c4bbdfSmrg if (orig_visual != CopyFromParent) 14835c4bbdfSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 14935c4bbdfSmrg result = (*SavedProcVector[X_CreateWindow]) (client); 15035c4bbdfSmrg if (result != Success) 15135c4bbdfSmrg break; 15205b261ecSmrg } 15305b261ecSmrg 15405b261ecSmrg if (result == Success) 15505b261ecSmrg AddResource(newWin->info[0].id, XRT_WINDOW, newWin); 15635c4bbdfSmrg else 1576747b715Smrg free(newWin); 15805b261ecSmrg 1596747b715Smrg return result; 16005b261ecSmrg} 16105b261ecSmrg 16235c4bbdfSmrgint 16335c4bbdfSmrgPanoramiXChangeWindowAttributes(ClientPtr client) 16405b261ecSmrg{ 16505b261ecSmrg PanoramiXRes *win; 16605b261ecSmrg PanoramiXRes *backPix = NULL; 16705b261ecSmrg PanoramiXRes *bordPix = NULL; 16835c4bbdfSmrg PanoramiXRes *cmap = NULL; 16935c4bbdfSmrg 17005b261ecSmrg REQUEST(xChangeWindowAttributesReq); 17105b261ecSmrg int pback_offset = 0, pbord_offset = 0, cmap_offset = 0; 1726747b715Smrg int result, len, j; 17305b261ecSmrg XID tmp; 17405b261ecSmrg 17505b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq); 17635c4bbdfSmrg 1776747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq)); 17805b261ecSmrg if (Ones(stuff->valueMask) != len) 17905b261ecSmrg return BadLength; 18005b261ecSmrg 18135c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 18235c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 1836747b715Smrg if (result != Success) 1846747b715Smrg return result; 18505b261ecSmrg 18635c4bbdfSmrg if ((win->u.win.class == InputOnly) && 18735c4bbdfSmrg (stuff->valueMask & (~INPUTONLY_LEGAL_MASK))) 18805b261ecSmrg return BadMatch; 18905b261ecSmrg 19035c4bbdfSmrg if ((Mask) stuff->valueMask & CWBackPixmap) { 19135c4bbdfSmrg pback_offset = Ones((Mask) stuff->valueMask & (CWBackPixmap - 1)); 19235c4bbdfSmrg tmp = *((CARD32 *) &stuff[1] + pback_offset); 19335c4bbdfSmrg if ((tmp != None) && (tmp != ParentRelative)) { 19435c4bbdfSmrg result = dixLookupResourceByType((void **) &backPix, tmp, 19535c4bbdfSmrg XRT_PIXMAP, client, DixReadAccess); 19635c4bbdfSmrg if (result != Success) 19735c4bbdfSmrg return result; 19835c4bbdfSmrg } 19935c4bbdfSmrg } 20035c4bbdfSmrg if ((Mask) stuff->valueMask & CWBorderPixmap) { 20135c4bbdfSmrg pbord_offset = Ones((Mask) stuff->valueMask & (CWBorderPixmap - 1)); 20235c4bbdfSmrg tmp = *((CARD32 *) &stuff[1] + pbord_offset); 20335c4bbdfSmrg if (tmp != CopyFromParent) { 20435c4bbdfSmrg result = dixLookupResourceByType((void **) &bordPix, tmp, 20535c4bbdfSmrg XRT_PIXMAP, client, DixReadAccess); 20635c4bbdfSmrg if (result != Success) 20735c4bbdfSmrg return result; 20835c4bbdfSmrg } 20935c4bbdfSmrg } 21035c4bbdfSmrg if ((Mask) stuff->valueMask & CWColormap) { 21135c4bbdfSmrg cmap_offset = Ones((Mask) stuff->valueMask & (CWColormap - 1)); 21235c4bbdfSmrg tmp = *((CARD32 *) &stuff[1] + cmap_offset); 21335c4bbdfSmrg if (tmp != CopyFromParent) { 21435c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, tmp, 21535c4bbdfSmrg XRT_COLORMAP, client, 21635c4bbdfSmrg DixReadAccess); 21735c4bbdfSmrg if (result != Success) 21835c4bbdfSmrg return result; 21935c4bbdfSmrg } 22005b261ecSmrg } 22105b261ecSmrg 22205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 22305b261ecSmrg stuff->window = win->info[j].id; 22435c4bbdfSmrg if (backPix) 22535c4bbdfSmrg *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id; 22635c4bbdfSmrg if (bordPix) 22735c4bbdfSmrg *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id; 22835c4bbdfSmrg if (cmap) 22935c4bbdfSmrg *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id; 23035c4bbdfSmrg result = (*SavedProcVector[X_ChangeWindowAttributes]) (client); 23105b261ecSmrg } 23205b261ecSmrg 2336747b715Smrg return result; 23405b261ecSmrg} 23505b261ecSmrg 23635c4bbdfSmrgint 23735c4bbdfSmrgPanoramiXDestroyWindow(ClientPtr client) 23805b261ecSmrg{ 23905b261ecSmrg PanoramiXRes *win; 24035c4bbdfSmrg int result, j; 24135c4bbdfSmrg 24205b261ecSmrg REQUEST(xResourceReq); 24305b261ecSmrg 24405b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 24505b261ecSmrg 24635c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->id, XRT_WINDOW, 24735c4bbdfSmrg client, DixDestroyAccess); 2486747b715Smrg if (result != Success) 24935c4bbdfSmrg return result; 25005b261ecSmrg 25105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 25235c4bbdfSmrg stuff->id = win->info[j].id; 25335c4bbdfSmrg result = (*SavedProcVector[X_DestroyWindow]) (client); 25435c4bbdfSmrg if (result != Success) 25535c4bbdfSmrg break; 25605b261ecSmrg } 25705b261ecSmrg 25805b261ecSmrg /* Since ProcDestroyWindow is using FreeResource, it will free 25935c4bbdfSmrg our resource for us on the last pass through the loop above */ 26035c4bbdfSmrg 2616747b715Smrg return result; 26205b261ecSmrg} 26305b261ecSmrg 26435c4bbdfSmrgint 26535c4bbdfSmrgPanoramiXDestroySubwindows(ClientPtr client) 26605b261ecSmrg{ 26705b261ecSmrg PanoramiXRes *win; 26835c4bbdfSmrg int result, j; 26935c4bbdfSmrg 27005b261ecSmrg REQUEST(xResourceReq); 27105b261ecSmrg 27205b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 27305b261ecSmrg 27435c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->id, XRT_WINDOW, 27535c4bbdfSmrg client, DixDestroyAccess); 2766747b715Smrg if (result != Success) 27735c4bbdfSmrg return result; 27805b261ecSmrg 27905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 28035c4bbdfSmrg stuff->id = win->info[j].id; 28135c4bbdfSmrg result = (*SavedProcVector[X_DestroySubwindows]) (client); 28235c4bbdfSmrg if (result != Success) 28335c4bbdfSmrg break; 28405b261ecSmrg } 28505b261ecSmrg 28605b261ecSmrg /* DestroySubwindows is using FreeResource which will free 28735c4bbdfSmrg our resources for us on the last pass through the loop above */ 28805b261ecSmrg 2896747b715Smrg return result; 29005b261ecSmrg} 29105b261ecSmrg 29235c4bbdfSmrgint 29335c4bbdfSmrgPanoramiXChangeSaveSet(ClientPtr client) 29405b261ecSmrg{ 29505b261ecSmrg PanoramiXRes *win; 29635c4bbdfSmrg int result, j; 29735c4bbdfSmrg 29805b261ecSmrg REQUEST(xChangeSaveSetReq); 29905b261ecSmrg 30005b261ecSmrg REQUEST_SIZE_MATCH(xChangeSaveSetReq); 30105b261ecSmrg 30235c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 30335c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 3046747b715Smrg if (result != Success) 30535c4bbdfSmrg return result; 30605b261ecSmrg 30705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 30835c4bbdfSmrg stuff->window = win->info[j].id; 30935c4bbdfSmrg result = (*SavedProcVector[X_ChangeSaveSet]) (client); 31035c4bbdfSmrg if (result != Success) 31135c4bbdfSmrg break; 31205b261ecSmrg } 31305b261ecSmrg 3146747b715Smrg return result; 31505b261ecSmrg} 31605b261ecSmrg 31735c4bbdfSmrgint 31835c4bbdfSmrgPanoramiXReparentWindow(ClientPtr client) 31905b261ecSmrg{ 32005b261ecSmrg PanoramiXRes *win, *parent; 32135c4bbdfSmrg int result, j; 32235c4bbdfSmrg int x, y; 32335c4bbdfSmrg Bool parentIsRoot; 32435c4bbdfSmrg 32505b261ecSmrg REQUEST(xReparentWindowReq); 32605b261ecSmrg 32705b261ecSmrg REQUEST_SIZE_MATCH(xReparentWindowReq); 32805b261ecSmrg 32935c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 33035c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 3316747b715Smrg if (result != Success) 33235c4bbdfSmrg return result; 33305b261ecSmrg 33435c4bbdfSmrg result = dixLookupResourceByType((void **) &parent, stuff->parent, 33535c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 3366747b715Smrg if (result != Success) 33735c4bbdfSmrg return result; 33805b261ecSmrg 33905b261ecSmrg x = stuff->x; 34005b261ecSmrg y = stuff->y; 34135c4bbdfSmrg parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) 34235c4bbdfSmrg || (stuff->parent == screenInfo.screens[0]->screensaver.wid); 34305b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 34435c4bbdfSmrg stuff->window = win->info[j].id; 34535c4bbdfSmrg stuff->parent = parent->info[j].id; 34635c4bbdfSmrg if (parentIsRoot) { 34735c4bbdfSmrg stuff->x = x - screenInfo.screens[j]->x; 34835c4bbdfSmrg stuff->y = y - screenInfo.screens[j]->y; 34935c4bbdfSmrg } 35035c4bbdfSmrg result = (*SavedProcVector[X_ReparentWindow]) (client); 35135c4bbdfSmrg if (result != Success) 35235c4bbdfSmrg break; 35305b261ecSmrg } 35405b261ecSmrg 3556747b715Smrg return result; 35605b261ecSmrg} 35705b261ecSmrg 35835c4bbdfSmrgint 35935c4bbdfSmrgPanoramiXMapWindow(ClientPtr client) 36005b261ecSmrg{ 36105b261ecSmrg PanoramiXRes *win; 36235c4bbdfSmrg int result, j; 36335c4bbdfSmrg 36405b261ecSmrg REQUEST(xResourceReq); 36505b261ecSmrg 36605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 36705b261ecSmrg 36835c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->id, 36935c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 3706747b715Smrg if (result != Success) 37135c4bbdfSmrg return result; 37205b261ecSmrg 37305b261ecSmrg FOR_NSCREENS_FORWARD(j) { 37435c4bbdfSmrg stuff->id = win->info[j].id; 37535c4bbdfSmrg result = (*SavedProcVector[X_MapWindow]) (client); 37635c4bbdfSmrg if (result != Success) 37735c4bbdfSmrg break; 37805b261ecSmrg } 37905b261ecSmrg 3806747b715Smrg return result; 38105b261ecSmrg} 38205b261ecSmrg 38335c4bbdfSmrgint 38435c4bbdfSmrgPanoramiXMapSubwindows(ClientPtr client) 38505b261ecSmrg{ 38605b261ecSmrg PanoramiXRes *win; 38735c4bbdfSmrg int result, j; 38835c4bbdfSmrg 38905b261ecSmrg REQUEST(xResourceReq); 39005b261ecSmrg 39105b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 39205b261ecSmrg 39335c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->id, 39435c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 3956747b715Smrg if (result != Success) 39635c4bbdfSmrg return result; 39705b261ecSmrg 39805b261ecSmrg FOR_NSCREENS_FORWARD(j) { 39935c4bbdfSmrg stuff->id = win->info[j].id; 40035c4bbdfSmrg result = (*SavedProcVector[X_MapSubwindows]) (client); 40135c4bbdfSmrg if (result != Success) 40235c4bbdfSmrg break; 40305b261ecSmrg } 40405b261ecSmrg 4056747b715Smrg return result; 40605b261ecSmrg} 40705b261ecSmrg 40835c4bbdfSmrgint 40935c4bbdfSmrgPanoramiXUnmapWindow(ClientPtr client) 41005b261ecSmrg{ 41105b261ecSmrg PanoramiXRes *win; 41235c4bbdfSmrg int result, j; 41335c4bbdfSmrg 41405b261ecSmrg REQUEST(xResourceReq); 41505b261ecSmrg 41605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 41705b261ecSmrg 41835c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->id, 41935c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 4206747b715Smrg if (result != Success) 42135c4bbdfSmrg return result; 42205b261ecSmrg 42305b261ecSmrg FOR_NSCREENS_FORWARD(j) { 42435c4bbdfSmrg stuff->id = win->info[j].id; 42535c4bbdfSmrg result = (*SavedProcVector[X_UnmapWindow]) (client); 42635c4bbdfSmrg if (result != Success) 42735c4bbdfSmrg break; 42805b261ecSmrg } 42905b261ecSmrg 4306747b715Smrg return result; 43105b261ecSmrg} 43205b261ecSmrg 43335c4bbdfSmrgint 43435c4bbdfSmrgPanoramiXUnmapSubwindows(ClientPtr client) 43505b261ecSmrg{ 43605b261ecSmrg PanoramiXRes *win; 43735c4bbdfSmrg int result, j; 43835c4bbdfSmrg 43905b261ecSmrg REQUEST(xResourceReq); 44005b261ecSmrg 44105b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 44205b261ecSmrg 44335c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->id, 44435c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 4456747b715Smrg if (result != Success) 44635c4bbdfSmrg return result; 44705b261ecSmrg 44805b261ecSmrg FOR_NSCREENS_FORWARD(j) { 44935c4bbdfSmrg stuff->id = win->info[j].id; 45035c4bbdfSmrg result = (*SavedProcVector[X_UnmapSubwindows]) (client); 45135c4bbdfSmrg if (result != Success) 45235c4bbdfSmrg break; 45305b261ecSmrg } 45405b261ecSmrg 4556747b715Smrg return result; 45605b261ecSmrg} 45705b261ecSmrg 45835c4bbdfSmrgint 45935c4bbdfSmrgPanoramiXConfigureWindow(ClientPtr client) 46005b261ecSmrg{ 46105b261ecSmrg PanoramiXRes *win; 46205b261ecSmrg PanoramiXRes *sib = NULL; 46335c4bbdfSmrg WindowPtr pWin; 46435c4bbdfSmrg int result, j, len, sib_offset = 0, x = 0, y = 0; 46535c4bbdfSmrg int x_offset = -1; 46635c4bbdfSmrg int y_offset = -1; 46735c4bbdfSmrg 46805b261ecSmrg REQUEST(xConfigureWindowReq); 46905b261ecSmrg 47005b261ecSmrg REQUEST_AT_LEAST_SIZE(xConfigureWindowReq); 47105b261ecSmrg 4726747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq)); 47305b261ecSmrg if (Ones(stuff->mask) != len) 47405b261ecSmrg return BadLength; 47505b261ecSmrg 47605b261ecSmrg /* because we need the parent */ 47735c4bbdfSmrg result = dixLookupResourceByType((void **) &pWin, stuff->window, 47835c4bbdfSmrg RT_WINDOW, client, DixWriteAccess); 47935c4bbdfSmrg if (result != Success) 48035c4bbdfSmrg return result; 48135c4bbdfSmrg 48235c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 48335c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 48435c4bbdfSmrg if (result != Success) 48535c4bbdfSmrg return result; 48635c4bbdfSmrg 48735c4bbdfSmrg if ((Mask) stuff->mask & CWSibling) { 48835c4bbdfSmrg XID tmp; 48935c4bbdfSmrg 49035c4bbdfSmrg sib_offset = Ones((Mask) stuff->mask & (CWSibling - 1)); 49135c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) { 49235c4bbdfSmrg result = dixLookupResourceByType((void **) &sib, tmp, XRT_WINDOW, 49335c4bbdfSmrg client, DixReadAccess); 49435c4bbdfSmrg if (result != Success) 49535c4bbdfSmrg return result; 49635c4bbdfSmrg } 49735c4bbdfSmrg } 49835c4bbdfSmrg 49935c4bbdfSmrg if (pWin->parent && ((pWin->parent == screenInfo.screens[0]->root) || 50035c4bbdfSmrg (pWin->parent->drawable.id == 50135c4bbdfSmrg screenInfo.screens[0]->screensaver.wid))) { 50235c4bbdfSmrg if ((Mask) stuff->mask & CWX) { 50335c4bbdfSmrg x_offset = 0; 50435c4bbdfSmrg x = *((CARD32 *) &stuff[1]); 50535c4bbdfSmrg } 50635c4bbdfSmrg if ((Mask) stuff->mask & CWY) { 50735c4bbdfSmrg y_offset = (x_offset == -1) ? 0 : 1; 50835c4bbdfSmrg y = *((CARD32 *) &stuff[1] + y_offset); 50935c4bbdfSmrg } 51035c4bbdfSmrg } 51135c4bbdfSmrg 51235c4bbdfSmrg /* have to go forward or you get expose events before 51335c4bbdfSmrg ConfigureNotify events */ 51405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 51535c4bbdfSmrg stuff->window = win->info[j].id; 51635c4bbdfSmrg if (sib) 51735c4bbdfSmrg *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id; 51835c4bbdfSmrg if (x_offset >= 0) 51935c4bbdfSmrg *((CARD32 *) &stuff[1] + x_offset) = x - screenInfo.screens[j]->x; 52035c4bbdfSmrg if (y_offset >= 0) 52135c4bbdfSmrg *((CARD32 *) &stuff[1] + y_offset) = y - screenInfo.screens[j]->y; 52235c4bbdfSmrg result = (*SavedProcVector[X_ConfigureWindow]) (client); 52335c4bbdfSmrg if (result != Success) 52435c4bbdfSmrg break; 52505b261ecSmrg } 52605b261ecSmrg 5276747b715Smrg return result; 52805b261ecSmrg} 52905b261ecSmrg 53035c4bbdfSmrgint 53135c4bbdfSmrgPanoramiXCirculateWindow(ClientPtr client) 53205b261ecSmrg{ 53305b261ecSmrg PanoramiXRes *win; 53435c4bbdfSmrg int result, j; 53535c4bbdfSmrg 53605b261ecSmrg REQUEST(xCirculateWindowReq); 53705b261ecSmrg 53805b261ecSmrg REQUEST_SIZE_MATCH(xCirculateWindowReq); 53905b261ecSmrg 54035c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 54135c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 5426747b715Smrg if (result != Success) 54335c4bbdfSmrg return result; 54405b261ecSmrg 54505b261ecSmrg FOR_NSCREENS_FORWARD(j) { 54635c4bbdfSmrg stuff->window = win->info[j].id; 54735c4bbdfSmrg result = (*SavedProcVector[X_CirculateWindow]) (client); 54835c4bbdfSmrg if (result != Success) 54935c4bbdfSmrg break; 55005b261ecSmrg } 55105b261ecSmrg 5526747b715Smrg return result; 55305b261ecSmrg} 55405b261ecSmrg 55535c4bbdfSmrgint 55635c4bbdfSmrgPanoramiXGetGeometry(ClientPtr client) 55705b261ecSmrg{ 55835c4bbdfSmrg xGetGeometryReply rep; 55905b261ecSmrg DrawablePtr pDraw; 56005b261ecSmrg int rc; 56135c4bbdfSmrg 56205b261ecSmrg REQUEST(xResourceReq); 56305b261ecSmrg 56405b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 5654642e01fSmrg rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess); 56605b261ecSmrg if (rc != Success) 56735c4bbdfSmrg return rc; 56805b261ecSmrg 56935c4bbdfSmrg rep = (xGetGeometryReply) { 57035c4bbdfSmrg .type = X_Reply, 57135c4bbdfSmrg .sequenceNumber = client->sequence, 57235c4bbdfSmrg .length = 0, 57335c4bbdfSmrg .root = screenInfo.screens[0]->root->drawable.id, 57435c4bbdfSmrg .depth = pDraw->depth, 57535c4bbdfSmrg .width = pDraw->width, 57635c4bbdfSmrg .height = pDraw->height, 57735c4bbdfSmrg .x = 0, 57835c4bbdfSmrg .y = 0, 57935c4bbdfSmrg .borderWidth = 0 58035c4bbdfSmrg }; 58105b261ecSmrg 58205b261ecSmrg if (stuff->id == rep.root) { 58335c4bbdfSmrg xWindowRoot *root = (xWindowRoot *) 58435c4bbdfSmrg (ConnectionInfo + connBlockScreenStart); 58535c4bbdfSmrg 58635c4bbdfSmrg rep.width = root->pixWidth; 58735c4bbdfSmrg rep.height = root->pixHeight; 58835c4bbdfSmrg } 58935c4bbdfSmrg else if (WindowDrawable(pDraw->type)) { 59035c4bbdfSmrg WindowPtr pWin = (WindowPtr) pDraw; 59135c4bbdfSmrg 59235c4bbdfSmrg rep.x = pWin->origin.x - wBorderWidth(pWin); 59335c4bbdfSmrg rep.y = pWin->origin.y - wBorderWidth(pWin); 59435c4bbdfSmrg if ((pWin->parent == screenInfo.screens[0]->root) || 59535c4bbdfSmrg (pWin->parent->drawable.id == 59635c4bbdfSmrg screenInfo.screens[0]->screensaver.wid)) { 59735c4bbdfSmrg rep.x += screenInfo.screens[0]->x; 59835c4bbdfSmrg rep.y += screenInfo.screens[0]->y; 59935c4bbdfSmrg } 60035c4bbdfSmrg rep.borderWidth = pWin->borderWidth; 60105b261ecSmrg } 60205b261ecSmrg 60305b261ecSmrg WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep); 6046747b715Smrg return Success; 60505b261ecSmrg} 60605b261ecSmrg 60735c4bbdfSmrgint 60835c4bbdfSmrgPanoramiXTranslateCoords(ClientPtr client) 60905b261ecSmrg{ 61005b261ecSmrg INT16 x, y; 61135c4bbdfSmrg 61205b261ecSmrg REQUEST(xTranslateCoordsReq); 61305b261ecSmrg int rc; 61405b261ecSmrg WindowPtr pWin, pDst; 61505b261ecSmrg xTranslateCoordsReply rep; 61605b261ecSmrg 61705b261ecSmrg REQUEST_SIZE_MATCH(xTranslateCoordsReq); 61805b261ecSmrg rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess); 61905b261ecSmrg if (rc != Success) 62005b261ecSmrg return rc; 62105b261ecSmrg rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess); 62205b261ecSmrg if (rc != Success) 62305b261ecSmrg return rc; 62435c4bbdfSmrg rep = (xTranslateCoordsReply) { 62535c4bbdfSmrg .type = X_Reply, 62635c4bbdfSmrg .sequenceNumber = client->sequence, 62735c4bbdfSmrg .length = 0, 62835c4bbdfSmrg .sameScreen = xTrue, 62935c4bbdfSmrg .child = None 63035c4bbdfSmrg }; 63135c4bbdfSmrg 63235c4bbdfSmrg if ((pWin == screenInfo.screens[0]->root) || 63335c4bbdfSmrg (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid)) { 63435c4bbdfSmrg x = stuff->srcX - screenInfo.screens[0]->x; 63535c4bbdfSmrg y = stuff->srcY - screenInfo.screens[0]->y; 63635c4bbdfSmrg } 63735c4bbdfSmrg else { 63835c4bbdfSmrg x = pWin->drawable.x + stuff->srcX; 63935c4bbdfSmrg y = pWin->drawable.y + stuff->srcY; 64005b261ecSmrg } 64105b261ecSmrg pWin = pDst->firstChild; 64205b261ecSmrg while (pWin) { 64335c4bbdfSmrg BoxRec box; 64435c4bbdfSmrg 64535c4bbdfSmrg if ((pWin->mapped) && 64635c4bbdfSmrg (x >= pWin->drawable.x - wBorderWidth(pWin)) && 64735c4bbdfSmrg (x < pWin->drawable.x + (int) pWin->drawable.width + 64835c4bbdfSmrg wBorderWidth(pWin)) && 64935c4bbdfSmrg (y >= pWin->drawable.y - wBorderWidth(pWin)) && 65035c4bbdfSmrg (y < pWin->drawable.y + (int) pWin->drawable.height + 65135c4bbdfSmrg wBorderWidth(pWin)) 65235c4bbdfSmrg /* When a window is shaped, a further check 65335c4bbdfSmrg * is made to see if the point is inside 65435c4bbdfSmrg * borderSize 65535c4bbdfSmrg */ 65635c4bbdfSmrg && (!wBoundingShape(pWin) || 65735c4bbdfSmrg RegionContainsPoint(wBoundingShape(pWin), 65835c4bbdfSmrg x - pWin->drawable.x, 65935c4bbdfSmrg y - pWin->drawable.y, &box)) 66035c4bbdfSmrg ) { 66135c4bbdfSmrg rep.child = pWin->drawable.id; 66235c4bbdfSmrg pWin = (WindowPtr) NULL; 66335c4bbdfSmrg } 66435c4bbdfSmrg else 66535c4bbdfSmrg pWin = pWin->nextSib; 66605b261ecSmrg } 66705b261ecSmrg rep.dstX = x - pDst->drawable.x; 66805b261ecSmrg rep.dstY = y - pDst->drawable.y; 66935c4bbdfSmrg if ((pDst == screenInfo.screens[0]->root) || 67035c4bbdfSmrg (pDst->drawable.id == screenInfo.screens[0]->screensaver.wid)) { 67135c4bbdfSmrg rep.dstX += screenInfo.screens[0]->x; 67235c4bbdfSmrg rep.dstY += screenInfo.screens[0]->y; 67305b261ecSmrg } 67405b261ecSmrg 67505b261ecSmrg WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep); 6766747b715Smrg return Success; 67705b261ecSmrg} 67805b261ecSmrg 67935c4bbdfSmrgint 68035c4bbdfSmrgPanoramiXCreatePixmap(ClientPtr client) 68105b261ecSmrg{ 68205b261ecSmrg PanoramiXRes *refDraw, *newPix; 6836747b715Smrg int result, j; 68435c4bbdfSmrg 68505b261ecSmrg REQUEST(xCreatePixmapReq); 68605b261ecSmrg 68705b261ecSmrg REQUEST_SIZE_MATCH(xCreatePixmapReq); 68805b261ecSmrg client->errorValue = stuff->pid; 68905b261ecSmrg 69035c4bbdfSmrg result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable, 69135c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 6926747b715Smrg if (result != Success) 69335c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 69405b261ecSmrg 69535c4bbdfSmrg if (!(newPix = malloc(sizeof(PanoramiXRes)))) 69635c4bbdfSmrg return BadAlloc; 69705b261ecSmrg 69805b261ecSmrg newPix->type = XRT_PIXMAP; 69905b261ecSmrg newPix->u.pix.shared = FALSE; 70035c4bbdfSmrg panoramix_setup_ids(newPix, client, stuff->pid); 70135c4bbdfSmrg 70205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 70335c4bbdfSmrg stuff->pid = newPix->info[j].id; 70435c4bbdfSmrg stuff->drawable = refDraw->info[j].id; 70535c4bbdfSmrg result = (*SavedProcVector[X_CreatePixmap]) (client); 70635c4bbdfSmrg if (result != Success) 70735c4bbdfSmrg break; 70805b261ecSmrg } 70905b261ecSmrg 71005b261ecSmrg if (result == Success) 71135c4bbdfSmrg AddResource(newPix->info[0].id, XRT_PIXMAP, newPix); 71235c4bbdfSmrg else 71335c4bbdfSmrg free(newPix); 71405b261ecSmrg 7156747b715Smrg return result; 71605b261ecSmrg} 71705b261ecSmrg 71835c4bbdfSmrgint 71935c4bbdfSmrgPanoramiXFreePixmap(ClientPtr client) 72005b261ecSmrg{ 72105b261ecSmrg PanoramiXRes *pix; 72235c4bbdfSmrg int result, j; 72335c4bbdfSmrg 72405b261ecSmrg REQUEST(xResourceReq); 72505b261ecSmrg 72605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 72705b261ecSmrg 72805b261ecSmrg client->errorValue = stuff->id; 72905b261ecSmrg 73035c4bbdfSmrg result = dixLookupResourceByType((void **) &pix, stuff->id, XRT_PIXMAP, 73135c4bbdfSmrg client, DixDestroyAccess); 7326747b715Smrg if (result != Success) 73335c4bbdfSmrg return result; 73405b261ecSmrg 73505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 73635c4bbdfSmrg stuff->id = pix->info[j].id; 73735c4bbdfSmrg result = (*SavedProcVector[X_FreePixmap]) (client); 73835c4bbdfSmrg if (result != Success) 73935c4bbdfSmrg break; 74005b261ecSmrg } 74105b261ecSmrg 74205b261ecSmrg /* Since ProcFreePixmap is using FreeResource, it will free 74335c4bbdfSmrg our resource for us on the last pass through the loop above */ 74435c4bbdfSmrg 7456747b715Smrg return result; 74605b261ecSmrg} 74705b261ecSmrg 74835c4bbdfSmrgint 74935c4bbdfSmrgPanoramiXCreateGC(ClientPtr client) 75005b261ecSmrg{ 75105b261ecSmrg PanoramiXRes *refDraw; 75205b261ecSmrg PanoramiXRes *newGC; 75305b261ecSmrg PanoramiXRes *stip = NULL; 75405b261ecSmrg PanoramiXRes *tile = NULL; 75505b261ecSmrg PanoramiXRes *clip = NULL; 75635c4bbdfSmrg 75705b261ecSmrg REQUEST(xCreateGCReq); 75805b261ecSmrg int tile_offset = 0, stip_offset = 0, clip_offset = 0; 7596747b715Smrg int result, len, j; 76005b261ecSmrg XID tmp; 76105b261ecSmrg 76205b261ecSmrg REQUEST_AT_LEAST_SIZE(xCreateGCReq); 76335c4bbdfSmrg 76405b261ecSmrg client->errorValue = stuff->gc; 7656747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq)); 76605b261ecSmrg if (Ones(stuff->mask) != len) 76705b261ecSmrg return BadLength; 76805b261ecSmrg 76935c4bbdfSmrg result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable, 77035c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 77135c4bbdfSmrg if (result != Success) 77235c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 77335c4bbdfSmrg 77435c4bbdfSmrg if ((Mask) stuff->mask & GCTile) { 77535c4bbdfSmrg tile_offset = Ones((Mask) stuff->mask & (GCTile - 1)); 77635c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) { 77735c4bbdfSmrg result = dixLookupResourceByType((void **) &tile, tmp, XRT_PIXMAP, 77835c4bbdfSmrg client, DixReadAccess); 77935c4bbdfSmrg if (result != Success) 78035c4bbdfSmrg return result; 78135c4bbdfSmrg } 78235c4bbdfSmrg } 78335c4bbdfSmrg if ((Mask) stuff->mask & GCStipple) { 78435c4bbdfSmrg stip_offset = Ones((Mask) stuff->mask & (GCStipple - 1)); 78535c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) { 78635c4bbdfSmrg result = dixLookupResourceByType((void **) &stip, tmp, XRT_PIXMAP, 78735c4bbdfSmrg client, DixReadAccess); 78835c4bbdfSmrg if (result != Success) 78935c4bbdfSmrg return result; 79035c4bbdfSmrg } 79135c4bbdfSmrg } 79235c4bbdfSmrg if ((Mask) stuff->mask & GCClipMask) { 79335c4bbdfSmrg clip_offset = Ones((Mask) stuff->mask & (GCClipMask - 1)); 79435c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) { 79535c4bbdfSmrg result = dixLookupResourceByType((void **) &clip, tmp, XRT_PIXMAP, 79635c4bbdfSmrg client, DixReadAccess); 79735c4bbdfSmrg if (result != Success) 79835c4bbdfSmrg return result; 79935c4bbdfSmrg } 80035c4bbdfSmrg } 80135c4bbdfSmrg 80235c4bbdfSmrg if (!(newGC = malloc(sizeof(PanoramiXRes)))) 80305b261ecSmrg return BadAlloc; 80405b261ecSmrg 80505b261ecSmrg newGC->type = XRT_GC; 80635c4bbdfSmrg panoramix_setup_ids(newGC, client, stuff->gc); 80705b261ecSmrg 80805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 80905b261ecSmrg stuff->gc = newGC->info[j].id; 81005b261ecSmrg stuff->drawable = refDraw->info[j].id; 81135c4bbdfSmrg if (tile) 81235c4bbdfSmrg *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id; 81335c4bbdfSmrg if (stip) 81435c4bbdfSmrg *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id; 81535c4bbdfSmrg if (clip) 81635c4bbdfSmrg *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id; 81735c4bbdfSmrg result = (*SavedProcVector[X_CreateGC]) (client); 81835c4bbdfSmrg if (result != Success) 81935c4bbdfSmrg break; 82005b261ecSmrg } 82105b261ecSmrg 82205b261ecSmrg if (result == Success) 82305b261ecSmrg AddResource(newGC->info[0].id, XRT_GC, newGC); 82435c4bbdfSmrg else 8256747b715Smrg free(newGC); 82605b261ecSmrg 8276747b715Smrg return result; 82805b261ecSmrg} 82905b261ecSmrg 83035c4bbdfSmrgint 83135c4bbdfSmrgPanoramiXChangeGC(ClientPtr client) 83205b261ecSmrg{ 83305b261ecSmrg PanoramiXRes *gc; 83405b261ecSmrg PanoramiXRes *stip = NULL; 83505b261ecSmrg PanoramiXRes *tile = NULL; 83605b261ecSmrg PanoramiXRes *clip = NULL; 83735c4bbdfSmrg 83805b261ecSmrg REQUEST(xChangeGCReq); 83905b261ecSmrg int tile_offset = 0, stip_offset = 0, clip_offset = 0; 8406747b715Smrg int result, len, j; 84105b261ecSmrg XID tmp; 84205b261ecSmrg 84305b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeGCReq); 84435c4bbdfSmrg 8456747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq)); 84605b261ecSmrg if (Ones(stuff->mask) != len) 84705b261ecSmrg return BadLength; 84805b261ecSmrg 84935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 85035c4bbdfSmrg client, DixReadAccess); 8516747b715Smrg if (result != Success) 85235c4bbdfSmrg return result; 85305b261ecSmrg 85435c4bbdfSmrg if ((Mask) stuff->mask & GCTile) { 85535c4bbdfSmrg tile_offset = Ones((Mask) stuff->mask & (GCTile - 1)); 85635c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) { 85735c4bbdfSmrg result = dixLookupResourceByType((void **) &tile, tmp, XRT_PIXMAP, 85835c4bbdfSmrg client, DixReadAccess); 85935c4bbdfSmrg if (result != Success) 86035c4bbdfSmrg return result; 86135c4bbdfSmrg } 86205b261ecSmrg } 86335c4bbdfSmrg if ((Mask) stuff->mask & GCStipple) { 86435c4bbdfSmrg stip_offset = Ones((Mask) stuff->mask & (GCStipple - 1)); 86535c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) { 86635c4bbdfSmrg result = dixLookupResourceByType((void **) &stip, tmp, XRT_PIXMAP, 86735c4bbdfSmrg client, DixReadAccess); 86835c4bbdfSmrg if (result != Success) 86935c4bbdfSmrg return result; 87035c4bbdfSmrg } 87105b261ecSmrg } 87235c4bbdfSmrg if ((Mask) stuff->mask & GCClipMask) { 87335c4bbdfSmrg clip_offset = Ones((Mask) stuff->mask & (GCClipMask - 1)); 87435c4bbdfSmrg if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) { 87535c4bbdfSmrg result = dixLookupResourceByType((void **) &clip, tmp, XRT_PIXMAP, 87635c4bbdfSmrg client, DixReadAccess); 87735c4bbdfSmrg if (result != Success) 87835c4bbdfSmrg return result; 87935c4bbdfSmrg } 88005b261ecSmrg } 88105b261ecSmrg 88205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 88305b261ecSmrg stuff->gc = gc->info[j].id; 88435c4bbdfSmrg if (tile) 88535c4bbdfSmrg *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id; 88635c4bbdfSmrg if (stip) 88735c4bbdfSmrg *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id; 88835c4bbdfSmrg if (clip) 88935c4bbdfSmrg *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id; 89035c4bbdfSmrg result = (*SavedProcVector[X_ChangeGC]) (client); 89135c4bbdfSmrg if (result != Success) 89235c4bbdfSmrg break; 89305b261ecSmrg } 89405b261ecSmrg 8956747b715Smrg return result; 89605b261ecSmrg} 89705b261ecSmrg 89835c4bbdfSmrgint 89935c4bbdfSmrgPanoramiXCopyGC(ClientPtr client) 90005b261ecSmrg{ 90105b261ecSmrg PanoramiXRes *srcGC, *dstGC; 90235c4bbdfSmrg int result, j; 90335c4bbdfSmrg 90405b261ecSmrg REQUEST(xCopyGCReq); 90505b261ecSmrg 90605b261ecSmrg REQUEST_SIZE_MATCH(xCopyGCReq); 90705b261ecSmrg 90835c4bbdfSmrg result = dixLookupResourceByType((void **) &srcGC, stuff->srcGC, XRT_GC, 90935c4bbdfSmrg client, DixReadAccess); 9106747b715Smrg if (result != Success) 91135c4bbdfSmrg return result; 91205b261ecSmrg 91335c4bbdfSmrg result = dixLookupResourceByType((void **) &dstGC, stuff->dstGC, XRT_GC, 91435c4bbdfSmrg client, DixWriteAccess); 9156747b715Smrg if (result != Success) 91635c4bbdfSmrg return result; 91705b261ecSmrg 91805b261ecSmrg FOR_NSCREENS(j) { 91935c4bbdfSmrg stuff->srcGC = srcGC->info[j].id; 92035c4bbdfSmrg stuff->dstGC = dstGC->info[j].id; 92135c4bbdfSmrg result = (*SavedProcVector[X_CopyGC]) (client); 92235c4bbdfSmrg if (result != Success) 92335c4bbdfSmrg break; 92405b261ecSmrg } 92505b261ecSmrg 9266747b715Smrg return result; 92705b261ecSmrg} 92805b261ecSmrg 92935c4bbdfSmrgint 93035c4bbdfSmrgPanoramiXSetDashes(ClientPtr client) 93105b261ecSmrg{ 93205b261ecSmrg PanoramiXRes *gc; 93335c4bbdfSmrg int result, j; 93435c4bbdfSmrg 93505b261ecSmrg REQUEST(xSetDashesReq); 93605b261ecSmrg 93705b261ecSmrg REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes); 93805b261ecSmrg 93935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 94035c4bbdfSmrg client, DixWriteAccess); 9416747b715Smrg if (result != Success) 94235c4bbdfSmrg return result; 94305b261ecSmrg 94405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 94535c4bbdfSmrg stuff->gc = gc->info[j].id; 94635c4bbdfSmrg result = (*SavedProcVector[X_SetDashes]) (client); 94735c4bbdfSmrg if (result != Success) 94835c4bbdfSmrg break; 94905b261ecSmrg } 95005b261ecSmrg 9516747b715Smrg return result; 95205b261ecSmrg} 95305b261ecSmrg 95435c4bbdfSmrgint 95535c4bbdfSmrgPanoramiXSetClipRectangles(ClientPtr client) 95605b261ecSmrg{ 95705b261ecSmrg PanoramiXRes *gc; 95835c4bbdfSmrg int result, j; 95935c4bbdfSmrg 96005b261ecSmrg REQUEST(xSetClipRectanglesReq); 96105b261ecSmrg 96205b261ecSmrg REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq); 96305b261ecSmrg 96435c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 96535c4bbdfSmrg client, DixWriteAccess); 9666747b715Smrg if (result != Success) 96735c4bbdfSmrg return result; 96805b261ecSmrg 96905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 97035c4bbdfSmrg stuff->gc = gc->info[j].id; 97135c4bbdfSmrg result = (*SavedProcVector[X_SetClipRectangles]) (client); 97235c4bbdfSmrg if (result != Success) 97335c4bbdfSmrg break; 97405b261ecSmrg } 97505b261ecSmrg 9766747b715Smrg return result; 97705b261ecSmrg} 97805b261ecSmrg 97935c4bbdfSmrgint 98035c4bbdfSmrgPanoramiXFreeGC(ClientPtr client) 98105b261ecSmrg{ 98205b261ecSmrg PanoramiXRes *gc; 98335c4bbdfSmrg int result, j; 98435c4bbdfSmrg 98505b261ecSmrg REQUEST(xResourceReq); 98605b261ecSmrg 98705b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 98805b261ecSmrg 98935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->id, XRT_GC, 99035c4bbdfSmrg client, DixDestroyAccess); 9916747b715Smrg if (result != Success) 99235c4bbdfSmrg return result; 99305b261ecSmrg 99405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 99535c4bbdfSmrg stuff->id = gc->info[j].id; 99635c4bbdfSmrg result = (*SavedProcVector[X_FreeGC]) (client); 99735c4bbdfSmrg if (result != Success) 99835c4bbdfSmrg break; 99905b261ecSmrg } 100005b261ecSmrg 100105b261ecSmrg /* Since ProcFreeGC is using FreeResource, it will free 100235c4bbdfSmrg our resource for us on the last pass through the loop above */ 100335c4bbdfSmrg 10046747b715Smrg return result; 100505b261ecSmrg} 100605b261ecSmrg 100735c4bbdfSmrgint 100835c4bbdfSmrgPanoramiXClearToBackground(ClientPtr client) 100905b261ecSmrg{ 101005b261ecSmrg PanoramiXRes *win; 101135c4bbdfSmrg int result, j, x, y; 101235c4bbdfSmrg Bool isRoot; 101335c4bbdfSmrg 101405b261ecSmrg REQUEST(xClearAreaReq); 101505b261ecSmrg 101605b261ecSmrg REQUEST_SIZE_MATCH(xClearAreaReq); 101705b261ecSmrg 101835c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 101935c4bbdfSmrg XRT_WINDOW, client, DixWriteAccess); 10206747b715Smrg if (result != Success) 102135c4bbdfSmrg return result; 102205b261ecSmrg 102305b261ecSmrg x = stuff->x; 102405b261ecSmrg y = stuff->y; 102505b261ecSmrg isRoot = win->u.win.root; 102605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 102735c4bbdfSmrg stuff->window = win->info[j].id; 102835c4bbdfSmrg if (isRoot) { 102935c4bbdfSmrg stuff->x = x - screenInfo.screens[j]->x; 103035c4bbdfSmrg stuff->y = y - screenInfo.screens[j]->y; 103135c4bbdfSmrg } 103235c4bbdfSmrg result = (*SavedProcVector[X_ClearArea]) (client); 103335c4bbdfSmrg if (result != Success) 103435c4bbdfSmrg break; 103535c4bbdfSmrg } 103635c4bbdfSmrg 10376747b715Smrg return result; 103805b261ecSmrg} 103905b261ecSmrg 104035c4bbdfSmrg/* 104105b261ecSmrg For Window to Pixmap copies you're screwed since each screen's 104205b261ecSmrg pixmap will look like what it sees on its screen. Unless the 104305b261ecSmrg screens overlap and the window lies on each, the two copies 104405b261ecSmrg will be out of sync. To remedy this we do a GetImage and PutImage 104505b261ecSmrg in place of the copy. Doing this as a single Image isn't quite 104605b261ecSmrg correct since it will include the obscured areas but we will 104705b261ecSmrg have to fix this later. (MArk). 104805b261ecSmrg*/ 104905b261ecSmrg 105035c4bbdfSmrgint 105135c4bbdfSmrgPanoramiXCopyArea(ClientPtr client) 105205b261ecSmrg{ 105335c4bbdfSmrg int j, result, srcx, srcy, dstx, dsty; 105435c4bbdfSmrg PanoramiXRes *gc, *src, *dst; 105535c4bbdfSmrg Bool srcIsRoot = FALSE; 105635c4bbdfSmrg Bool dstIsRoot = FALSE; 105735c4bbdfSmrg Bool srcShared, dstShared; 105835c4bbdfSmrg 105905b261ecSmrg REQUEST(xCopyAreaReq); 106005b261ecSmrg 106105b261ecSmrg REQUEST_SIZE_MATCH(xCopyAreaReq); 106205b261ecSmrg 106335c4bbdfSmrg result = dixLookupResourceByClass((void **) &src, stuff->srcDrawable, 106435c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 10656747b715Smrg if (result != Success) 106635c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 106705b261ecSmrg 106805b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 106905b261ecSmrg 107035c4bbdfSmrg result = dixLookupResourceByClass((void **) &dst, stuff->dstDrawable, 107135c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 10726747b715Smrg if (result != Success) 107335c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 107405b261ecSmrg 107505b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 107605b261ecSmrg 107735c4bbdfSmrg if (dstShared && srcShared) 107835c4bbdfSmrg return (*SavedProcVector[X_CopyArea]) (client); 107905b261ecSmrg 108035c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 108135c4bbdfSmrg client, DixReadAccess); 10826747b715Smrg if (result != Success) 108335c4bbdfSmrg return result; 108405b261ecSmrg 108535c4bbdfSmrg if ((dst->type == XRT_WINDOW) && dst->u.win.root) 108635c4bbdfSmrg dstIsRoot = TRUE; 108735c4bbdfSmrg if ((src->type == XRT_WINDOW) && src->u.win.root) 108835c4bbdfSmrg srcIsRoot = TRUE; 108935c4bbdfSmrg 109035c4bbdfSmrg srcx = stuff->srcX; 109135c4bbdfSmrg srcy = stuff->srcY; 109235c4bbdfSmrg dstx = stuff->dstX; 109335c4bbdfSmrg dsty = stuff->dstY; 109435c4bbdfSmrg if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) { 109535c4bbdfSmrg DrawablePtr drawables[MAXSCREENS]; 109635c4bbdfSmrg DrawablePtr pDst; 109735c4bbdfSmrg GCPtr pGC; 109805b261ecSmrg char *data; 109935c4bbdfSmrg int pitch, rc; 110035c4bbdfSmrg 110135c4bbdfSmrg FOR_NSCREENS(j) { 110235c4bbdfSmrg rc = dixLookupDrawable(drawables + j, src->info[j].id, client, 0, 110335c4bbdfSmrg DixGetAttrAccess); 110435c4bbdfSmrg if (rc != Success) 110535c4bbdfSmrg return rc; 110635c4bbdfSmrg } 110735c4bbdfSmrg 110835c4bbdfSmrg pitch = PixmapBytePad(stuff->width, drawables[0]->depth); 110935c4bbdfSmrg if (!(data = calloc(stuff->height, pitch))) 111035c4bbdfSmrg return BadAlloc; 111135c4bbdfSmrg 111235c4bbdfSmrg XineramaGetImageData(drawables, srcx, srcy, 111335c4bbdfSmrg stuff->width, stuff->height, ZPixmap, ~0, data, 111435c4bbdfSmrg pitch, srcIsRoot); 111535c4bbdfSmrg 111635c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 111735c4bbdfSmrg stuff->gc = gc->info[j].id; 111835c4bbdfSmrg VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess); 111935c4bbdfSmrg if (drawables[0]->depth != pDst->depth) { 112035c4bbdfSmrg client->errorValue = stuff->dstDrawable; 112135c4bbdfSmrg free(data); 112235c4bbdfSmrg return BadMatch; 112335c4bbdfSmrg } 112435c4bbdfSmrg 112535c4bbdfSmrg (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty, 112635c4bbdfSmrg stuff->width, stuff->height, 112735c4bbdfSmrg 0, ZPixmap, data); 112835c4bbdfSmrg 112935c4bbdfSmrg if (dstShared) 113035c4bbdfSmrg break; 113135c4bbdfSmrg } 113235c4bbdfSmrg 113335c4bbdfSmrg free(data); 113435c4bbdfSmrg } 113535c4bbdfSmrg else { 113635c4bbdfSmrg DrawablePtr pDst = NULL, pSrc = NULL; 113735c4bbdfSmrg GCPtr pGC = NULL; 113835c4bbdfSmrg RegionRec totalReg; 113935c4bbdfSmrg int rc; 114035c4bbdfSmrg 114135c4bbdfSmrg RegionNull(&totalReg); 114235c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 114335c4bbdfSmrg RegionPtr pRgn; 114435c4bbdfSmrg 114535c4bbdfSmrg stuff->dstDrawable = dst->info[j].id; 114635c4bbdfSmrg stuff->srcDrawable = src->info[j].id; 114735c4bbdfSmrg stuff->gc = gc->info[j].id; 114835c4bbdfSmrg if (srcIsRoot) { 114935c4bbdfSmrg stuff->srcX = srcx - screenInfo.screens[j]->x; 115035c4bbdfSmrg stuff->srcY = srcy - screenInfo.screens[j]->y; 115135c4bbdfSmrg } 115235c4bbdfSmrg if (dstIsRoot) { 115335c4bbdfSmrg stuff->dstX = dstx - screenInfo.screens[j]->x; 115435c4bbdfSmrg stuff->dstY = dsty - screenInfo.screens[j]->y; 115535c4bbdfSmrg } 115635c4bbdfSmrg 115735c4bbdfSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess); 115835c4bbdfSmrg 115935c4bbdfSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 116035c4bbdfSmrg rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0, 116135c4bbdfSmrg DixReadAccess); 116235c4bbdfSmrg if (rc != Success) 116335c4bbdfSmrg return rc; 116435c4bbdfSmrg 116535c4bbdfSmrg if ((pDst->pScreen != pSrc->pScreen) || 116635c4bbdfSmrg (pDst->depth != pSrc->depth)) { 116735c4bbdfSmrg client->errorValue = stuff->dstDrawable; 116835c4bbdfSmrg return BadMatch; 116935c4bbdfSmrg } 117035c4bbdfSmrg } 117135c4bbdfSmrg else 117235c4bbdfSmrg pSrc = pDst; 117335c4bbdfSmrg 117435c4bbdfSmrg pRgn = (*pGC->ops->CopyArea) (pSrc, pDst, pGC, 117535c4bbdfSmrg stuff->srcX, stuff->srcY, 117635c4bbdfSmrg stuff->width, stuff->height, 117735c4bbdfSmrg stuff->dstX, stuff->dstY); 117835c4bbdfSmrg if (pGC->graphicsExposures && pRgn) { 117935c4bbdfSmrg if (srcIsRoot) { 118035c4bbdfSmrg RegionTranslate(pRgn, 118135c4bbdfSmrg screenInfo.screens[j]->x, 118235c4bbdfSmrg screenInfo.screens[j]->y); 118335c4bbdfSmrg } 118435c4bbdfSmrg RegionAppend(&totalReg, pRgn); 118535c4bbdfSmrg RegionDestroy(pRgn); 118635c4bbdfSmrg } 118735c4bbdfSmrg 118835c4bbdfSmrg if (dstShared) 118935c4bbdfSmrg break; 119035c4bbdfSmrg } 119135c4bbdfSmrg 119235c4bbdfSmrg if (pGC->graphicsExposures) { 119335c4bbdfSmrg Bool overlap; 119435c4bbdfSmrg 119535c4bbdfSmrg RegionValidate(&totalReg, &overlap); 119635c4bbdfSmrg SendGraphicsExpose(client, &totalReg, stuff->dstDrawable, 119735c4bbdfSmrg X_CopyArea, 0); 119835c4bbdfSmrg RegionUninit(&totalReg); 119935c4bbdfSmrg } 120005b261ecSmrg } 120105b261ecSmrg 12026747b715Smrg return Success; 120305b261ecSmrg} 120405b261ecSmrg 120535c4bbdfSmrgint 120635c4bbdfSmrgPanoramiXCopyPlane(ClientPtr client) 120705b261ecSmrg{ 120835c4bbdfSmrg int j, srcx, srcy, dstx, dsty, rc; 120935c4bbdfSmrg PanoramiXRes *gc, *src, *dst; 121035c4bbdfSmrg Bool srcIsRoot = FALSE; 121135c4bbdfSmrg Bool dstIsRoot = FALSE; 121235c4bbdfSmrg Bool srcShared, dstShared; 121335c4bbdfSmrg DrawablePtr psrcDraw, pdstDraw = NULL; 121435c4bbdfSmrg GCPtr pGC = NULL; 121535c4bbdfSmrg RegionRec totalReg; 121635c4bbdfSmrg 121705b261ecSmrg REQUEST(xCopyPlaneReq); 121805b261ecSmrg 121905b261ecSmrg REQUEST_SIZE_MATCH(xCopyPlaneReq); 122005b261ecSmrg 122135c4bbdfSmrg rc = dixLookupResourceByClass((void **) &src, stuff->srcDrawable, 122235c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 12236747b715Smrg if (rc != Success) 122435c4bbdfSmrg return (rc == BadValue) ? BadDrawable : rc; 122505b261ecSmrg 122605b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 122705b261ecSmrg 122835c4bbdfSmrg rc = dixLookupResourceByClass((void **) &dst, stuff->dstDrawable, 122935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 12306747b715Smrg if (rc != Success) 123135c4bbdfSmrg return (rc == BadValue) ? BadDrawable : rc; 123205b261ecSmrg 123305b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 123405b261ecSmrg 123535c4bbdfSmrg if (dstShared && srcShared) 123635c4bbdfSmrg return (*SavedProcVector[X_CopyPlane]) (client); 123705b261ecSmrg 123835c4bbdfSmrg rc = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 123935c4bbdfSmrg client, DixReadAccess); 12406747b715Smrg if (rc != Success) 124135c4bbdfSmrg return rc; 124235c4bbdfSmrg 124335c4bbdfSmrg if ((dst->type == XRT_WINDOW) && dst->u.win.root) 124435c4bbdfSmrg dstIsRoot = TRUE; 124535c4bbdfSmrg if ((src->type == XRT_WINDOW) && src->u.win.root) 124635c4bbdfSmrg srcIsRoot = TRUE; 124705b261ecSmrg 124835c4bbdfSmrg srcx = stuff->srcX; 124935c4bbdfSmrg srcy = stuff->srcY; 125035c4bbdfSmrg dstx = stuff->dstX; 125135c4bbdfSmrg dsty = stuff->dstY; 125205b261ecSmrg 12536747b715Smrg RegionNull(&totalReg); 125405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 125535c4bbdfSmrg RegionPtr pRgn; 125635c4bbdfSmrg 125735c4bbdfSmrg stuff->dstDrawable = dst->info[j].id; 125835c4bbdfSmrg stuff->srcDrawable = src->info[j].id; 125935c4bbdfSmrg stuff->gc = gc->info[j].id; 126035c4bbdfSmrg if (srcIsRoot) { 126135c4bbdfSmrg stuff->srcX = srcx - screenInfo.screens[j]->x; 126235c4bbdfSmrg stuff->srcY = srcy - screenInfo.screens[j]->y; 126335c4bbdfSmrg } 126435c4bbdfSmrg if (dstIsRoot) { 126535c4bbdfSmrg stuff->dstX = dstx - screenInfo.screens[j]->x; 126635c4bbdfSmrg stuff->dstY = dsty - screenInfo.screens[j]->y; 126735c4bbdfSmrg } 126835c4bbdfSmrg 126935c4bbdfSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess); 127035c4bbdfSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 127135c4bbdfSmrg rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0, 127235c4bbdfSmrg DixReadAccess); 127335c4bbdfSmrg if (rc != Success) 127435c4bbdfSmrg return rc; 127505b261ecSmrg 127605b261ecSmrg if (pdstDraw->pScreen != psrcDraw->pScreen) { 127735c4bbdfSmrg client->errorValue = stuff->dstDrawable; 127835c4bbdfSmrg return BadMatch; 127935c4bbdfSmrg } 128035c4bbdfSmrg } 128135c4bbdfSmrg else 128235c4bbdfSmrg psrcDraw = pdstDraw; 128335c4bbdfSmrg 128435c4bbdfSmrg if (stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) || 128535c4bbdfSmrg (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) { 128635c4bbdfSmrg client->errorValue = stuff->bitPlane; 128735c4bbdfSmrg return BadValue; 128835c4bbdfSmrg } 128935c4bbdfSmrg 129035c4bbdfSmrg pRgn = (*pGC->ops->CopyPlane) (psrcDraw, pdstDraw, pGC, 129135c4bbdfSmrg stuff->srcX, stuff->srcY, 129235c4bbdfSmrg stuff->width, stuff->height, 129335c4bbdfSmrg stuff->dstX, stuff->dstY, 129435c4bbdfSmrg stuff->bitPlane); 129535c4bbdfSmrg if (pGC->graphicsExposures && pRgn) { 129635c4bbdfSmrg RegionAppend(&totalReg, pRgn); 129735c4bbdfSmrg RegionDestroy(pRgn); 129835c4bbdfSmrg } 129935c4bbdfSmrg 130035c4bbdfSmrg if (dstShared) 130135c4bbdfSmrg break; 130235c4bbdfSmrg } 130335c4bbdfSmrg 130435c4bbdfSmrg if (pGC->graphicsExposures) { 130535c4bbdfSmrg Bool overlap; 130635c4bbdfSmrg 130735c4bbdfSmrg RegionValidate(&totalReg, &overlap); 130835c4bbdfSmrg SendGraphicsExpose(client, &totalReg, stuff->dstDrawable, 130935c4bbdfSmrg X_CopyPlane, 0); 131035c4bbdfSmrg RegionUninit(&totalReg); 131105b261ecSmrg } 131205b261ecSmrg 13136747b715Smrg return Success; 131405b261ecSmrg} 131505b261ecSmrg 131635c4bbdfSmrgint 131735c4bbdfSmrgPanoramiXPolyPoint(ClientPtr client) 131805b261ecSmrg{ 131905b261ecSmrg PanoramiXRes *gc, *draw; 132035c4bbdfSmrg int result, npoint, j; 132135c4bbdfSmrg xPoint *origPts; 132235c4bbdfSmrg Bool isRoot; 132335c4bbdfSmrg 132405b261ecSmrg REQUEST(xPolyPointReq); 132505b261ecSmrg 132605b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyPointReq); 132705b261ecSmrg 132835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 132935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 13306747b715Smrg if (result != Success) 133135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 133205b261ecSmrg 133335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 133435c4bbdfSmrg return (*SavedProcVector[X_PolyPoint]) (client); 133505b261ecSmrg 133635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 133735c4bbdfSmrg client, DixReadAccess); 13386747b715Smrg if (result != Success) 133935c4bbdfSmrg return result; 134005b261ecSmrg 134105b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 13426747b715Smrg npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq)); 134305b261ecSmrg if (npoint > 0) { 134435c4bbdfSmrg origPts = xallocarray(npoint, sizeof(xPoint)); 134505b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 134635c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 134705b261ecSmrg 134835c4bbdfSmrg if (j) 134935c4bbdfSmrg memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 135005b261ecSmrg 135105b261ecSmrg if (isRoot) { 13526747b715Smrg int x_off = screenInfo.screens[j]->x; 13536747b715Smrg int y_off = screenInfo.screens[j]->y; 135405b261ecSmrg 135535c4bbdfSmrg if (x_off || y_off) { 135635c4bbdfSmrg xPoint *pnts = (xPoint *) &stuff[1]; 135735c4bbdfSmrg int i = 135835c4bbdfSmrg (stuff->coordMode == CoordModePrevious) ? 1 : npoint; 135905b261ecSmrg 136035c4bbdfSmrg while (i--) { 136135c4bbdfSmrg pnts->x -= x_off; 136235c4bbdfSmrg pnts->y -= y_off; 136335c4bbdfSmrg pnts++; 136405b261ecSmrg } 136535c4bbdfSmrg } 136605b261ecSmrg } 136705b261ecSmrg 136835c4bbdfSmrg stuff->drawable = draw->info[j].id; 136935c4bbdfSmrg stuff->gc = gc->info[j].id; 137035c4bbdfSmrg result = (*SavedProcVector[X_PolyPoint]) (client); 137135c4bbdfSmrg if (result != Success) 137235c4bbdfSmrg break; 137305b261ecSmrg } 13746747b715Smrg free(origPts); 13756747b715Smrg return result; 137635c4bbdfSmrg } 137735c4bbdfSmrg else 137835c4bbdfSmrg return Success; 137905b261ecSmrg} 138005b261ecSmrg 138135c4bbdfSmrgint 138235c4bbdfSmrgPanoramiXPolyLine(ClientPtr client) 138305b261ecSmrg{ 138405b261ecSmrg PanoramiXRes *gc, *draw; 138535c4bbdfSmrg int result, npoint, j; 138635c4bbdfSmrg xPoint *origPts; 138735c4bbdfSmrg Bool isRoot; 138835c4bbdfSmrg 138905b261ecSmrg REQUEST(xPolyLineReq); 139005b261ecSmrg 139105b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyLineReq); 139205b261ecSmrg 139335c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 139435c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 13956747b715Smrg if (result != Success) 139635c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 139705b261ecSmrg 139835c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 139935c4bbdfSmrg return (*SavedProcVector[X_PolyLine]) (client); 140005b261ecSmrg 140135c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 140235c4bbdfSmrg client, DixReadAccess); 14036747b715Smrg if (result != Success) 140435c4bbdfSmrg return result; 140505b261ecSmrg 140635c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 14076747b715Smrg npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq)); 140835c4bbdfSmrg if (npoint > 0) { 140935c4bbdfSmrg origPts = xallocarray(npoint, sizeof(xPoint)); 141005b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 141135c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 141205b261ecSmrg 141335c4bbdfSmrg if (j) 141435c4bbdfSmrg memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 141505b261ecSmrg 141605b261ecSmrg if (isRoot) { 14176747b715Smrg int x_off = screenInfo.screens[j]->x; 14186747b715Smrg int y_off = screenInfo.screens[j]->y; 141905b261ecSmrg 142035c4bbdfSmrg if (x_off || y_off) { 142135c4bbdfSmrg xPoint *pnts = (xPoint *) &stuff[1]; 142235c4bbdfSmrg int i = 142335c4bbdfSmrg (stuff->coordMode == CoordModePrevious) ? 1 : npoint; 142405b261ecSmrg 142535c4bbdfSmrg while (i--) { 142635c4bbdfSmrg pnts->x -= x_off; 142735c4bbdfSmrg pnts->y -= y_off; 142835c4bbdfSmrg pnts++; 142935c4bbdfSmrg } 143035c4bbdfSmrg } 143105b261ecSmrg } 143205b261ecSmrg 143335c4bbdfSmrg stuff->drawable = draw->info[j].id; 143435c4bbdfSmrg stuff->gc = gc->info[j].id; 143535c4bbdfSmrg result = (*SavedProcVector[X_PolyLine]) (client); 143635c4bbdfSmrg if (result != Success) 143735c4bbdfSmrg break; 143805b261ecSmrg } 14396747b715Smrg free(origPts); 14406747b715Smrg return result; 144135c4bbdfSmrg } 144235c4bbdfSmrg else 144335c4bbdfSmrg return Success; 144405b261ecSmrg} 144505b261ecSmrg 144635c4bbdfSmrgint 144735c4bbdfSmrgPanoramiXPolySegment(ClientPtr client) 144805b261ecSmrg{ 144935c4bbdfSmrg int result, nsegs, i, j; 145005b261ecSmrg PanoramiXRes *gc, *draw; 145135c4bbdfSmrg xSegment *origSegs; 145235c4bbdfSmrg Bool isRoot; 145335c4bbdfSmrg 145405b261ecSmrg REQUEST(xPolySegmentReq); 145505b261ecSmrg 145605b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolySegmentReq); 145705b261ecSmrg 145835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 145935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 14606747b715Smrg if (result != Success) 146135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 146205b261ecSmrg 146335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 146435c4bbdfSmrg return (*SavedProcVector[X_PolySegment]) (client); 146505b261ecSmrg 146635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 146735c4bbdfSmrg client, DixReadAccess); 14686747b715Smrg if (result != Success) 146935c4bbdfSmrg return result; 147005b261ecSmrg 147135c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 147205b261ecSmrg 147305b261ecSmrg nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq); 147435c4bbdfSmrg if (nsegs & 4) 147535c4bbdfSmrg return BadLength; 147605b261ecSmrg nsegs >>= 3; 147705b261ecSmrg if (nsegs > 0) { 147835c4bbdfSmrg origSegs = xallocarray(nsegs, sizeof(xSegment)); 147905b261ecSmrg memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment)); 148035c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 148105b261ecSmrg 148235c4bbdfSmrg if (j) 148335c4bbdfSmrg memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment)); 148405b261ecSmrg 148505b261ecSmrg if (isRoot) { 14866747b715Smrg int x_off = screenInfo.screens[j]->x; 14876747b715Smrg int y_off = screenInfo.screens[j]->y; 148805b261ecSmrg 148935c4bbdfSmrg if (x_off || y_off) { 149035c4bbdfSmrg xSegment *segs = (xSegment *) &stuff[1]; 149105b261ecSmrg 149235c4bbdfSmrg for (i = nsegs; i--; segs++) { 149335c4bbdfSmrg segs->x1 -= x_off; 149435c4bbdfSmrg segs->x2 -= x_off; 149535c4bbdfSmrg segs->y1 -= y_off; 149635c4bbdfSmrg segs->y2 -= y_off; 149735c4bbdfSmrg } 149835c4bbdfSmrg } 149905b261ecSmrg } 150005b261ecSmrg 150135c4bbdfSmrg stuff->drawable = draw->info[j].id; 150235c4bbdfSmrg stuff->gc = gc->info[j].id; 150335c4bbdfSmrg result = (*SavedProcVector[X_PolySegment]) (client); 150435c4bbdfSmrg if (result != Success) 150535c4bbdfSmrg break; 150635c4bbdfSmrg } 150735c4bbdfSmrg free(origSegs); 150835c4bbdfSmrg return result; 150935c4bbdfSmrg } 151035c4bbdfSmrg else 151135c4bbdfSmrg return Success; 151205b261ecSmrg} 151305b261ecSmrg 151435c4bbdfSmrgint 151535c4bbdfSmrgPanoramiXPolyRectangle(ClientPtr client) 151605b261ecSmrg{ 151735c4bbdfSmrg int result, nrects, i, j; 151805b261ecSmrg PanoramiXRes *gc, *draw; 151935c4bbdfSmrg Bool isRoot; 152035c4bbdfSmrg xRectangle *origRecs; 152135c4bbdfSmrg 152205b261ecSmrg REQUEST(xPolyRectangleReq); 152305b261ecSmrg 152405b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyRectangleReq); 152505b261ecSmrg 152635c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 152735c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 15286747b715Smrg if (result != Success) 152935c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 153005b261ecSmrg 153135c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 153235c4bbdfSmrg return (*SavedProcVector[X_PolyRectangle]) (client); 153305b261ecSmrg 153435c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 153535c4bbdfSmrg client, DixReadAccess); 15366747b715Smrg if (result != Success) 153735c4bbdfSmrg return result; 153805b261ecSmrg 153935c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 154005b261ecSmrg 154105b261ecSmrg nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq); 154235c4bbdfSmrg if (nrects & 4) 154335c4bbdfSmrg return BadLength; 154405b261ecSmrg nrects >>= 3; 154535c4bbdfSmrg if (nrects > 0) { 154635c4bbdfSmrg origRecs = xallocarray(nrects, sizeof(xRectangle)); 154735c4bbdfSmrg memcpy((char *) origRecs, (char *) &stuff[1], 154835c4bbdfSmrg nrects * sizeof(xRectangle)); 154935c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 155035c4bbdfSmrg 155135c4bbdfSmrg if (j) 155235c4bbdfSmrg memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle)); 155305b261ecSmrg 155435c4bbdfSmrg if (isRoot) { 155535c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 155635c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 155705b261ecSmrg 155835c4bbdfSmrg if (x_off || y_off) { 155935c4bbdfSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 156035c4bbdfSmrg 156135c4bbdfSmrg for (i = nrects; i--; rects++) { 156235c4bbdfSmrg rects->x -= x_off; 156335c4bbdfSmrg rects->y -= y_off; 156435c4bbdfSmrg } 156535c4bbdfSmrg } 156635c4bbdfSmrg } 156735c4bbdfSmrg 156835c4bbdfSmrg stuff->drawable = draw->info[j].id; 156935c4bbdfSmrg stuff->gc = gc->info[j].id; 157035c4bbdfSmrg result = (*SavedProcVector[X_PolyRectangle]) (client); 157135c4bbdfSmrg if (result != Success) 157235c4bbdfSmrg break; 157335c4bbdfSmrg } 157435c4bbdfSmrg free(origRecs); 157535c4bbdfSmrg return result; 157635c4bbdfSmrg } 157735c4bbdfSmrg else 157835c4bbdfSmrg return Success; 157935c4bbdfSmrg} 158035c4bbdfSmrg 158135c4bbdfSmrgint 158235c4bbdfSmrgPanoramiXPolyArc(ClientPtr client) 158305b261ecSmrg{ 158435c4bbdfSmrg int result, narcs, i, j; 158505b261ecSmrg PanoramiXRes *gc, *draw; 158635c4bbdfSmrg Bool isRoot; 158735c4bbdfSmrg xArc *origArcs; 158835c4bbdfSmrg 158905b261ecSmrg REQUEST(xPolyArcReq); 159005b261ecSmrg 159105b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyArcReq); 159205b261ecSmrg 159335c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 159435c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 15956747b715Smrg if (result != Success) 159635c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 159705b261ecSmrg 159835c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 159935c4bbdfSmrg return (*SavedProcVector[X_PolyArc]) (client); 160005b261ecSmrg 160135c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 160235c4bbdfSmrg client, DixReadAccess); 16036747b715Smrg if (result != Success) 160435c4bbdfSmrg return result; 160505b261ecSmrg 160635c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 160705b261ecSmrg 160805b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyArcReq); 160935c4bbdfSmrg if (narcs % sizeof(xArc)) 161035c4bbdfSmrg return BadLength; 161105b261ecSmrg narcs /= sizeof(xArc); 161235c4bbdfSmrg if (narcs > 0) { 161335c4bbdfSmrg origArcs = xallocarray(narcs, sizeof(xArc)); 161435c4bbdfSmrg memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); 161535c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 161635c4bbdfSmrg 161735c4bbdfSmrg if (j) 161835c4bbdfSmrg memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 161935c4bbdfSmrg 162035c4bbdfSmrg if (isRoot) { 162135c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 162235c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 162335c4bbdfSmrg 162435c4bbdfSmrg if (x_off || y_off) { 162535c4bbdfSmrg xArc *arcs = (xArc *) &stuff[1]; 162635c4bbdfSmrg 162735c4bbdfSmrg for (i = narcs; i--; arcs++) { 162835c4bbdfSmrg arcs->x -= x_off; 162935c4bbdfSmrg arcs->y -= y_off; 163035c4bbdfSmrg } 163135c4bbdfSmrg } 163205b261ecSmrg } 163335c4bbdfSmrg stuff->drawable = draw->info[j].id; 163435c4bbdfSmrg stuff->gc = gc->info[j].id; 163535c4bbdfSmrg result = (*SavedProcVector[X_PolyArc]) (client); 163635c4bbdfSmrg if (result != Success) 163735c4bbdfSmrg break; 163805b261ecSmrg } 163935c4bbdfSmrg free(origArcs); 164035c4bbdfSmrg return result; 164135c4bbdfSmrg } 164235c4bbdfSmrg else 164335c4bbdfSmrg return Success; 164405b261ecSmrg} 164505b261ecSmrg 164635c4bbdfSmrgint 164735c4bbdfSmrgPanoramiXFillPoly(ClientPtr client) 164805b261ecSmrg{ 164935c4bbdfSmrg int result, count, j; 165005b261ecSmrg PanoramiXRes *gc, *draw; 165135c4bbdfSmrg Bool isRoot; 165235c4bbdfSmrg DDXPointPtr locPts; 165335c4bbdfSmrg 165405b261ecSmrg REQUEST(xFillPolyReq); 165505b261ecSmrg 165605b261ecSmrg REQUEST_AT_LEAST_SIZE(xFillPolyReq); 165705b261ecSmrg 165835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 165935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 16606747b715Smrg if (result != Success) 166135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 166205b261ecSmrg 166335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 166435c4bbdfSmrg return (*SavedProcVector[X_FillPoly]) (client); 166505b261ecSmrg 166635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 166735c4bbdfSmrg client, DixReadAccess); 16686747b715Smrg if (result != Success) 166935c4bbdfSmrg return result; 167005b261ecSmrg 167135c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 167205b261ecSmrg 16736747b715Smrg count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq)); 167435c4bbdfSmrg if (count > 0) { 167535c4bbdfSmrg locPts = xallocarray(count, sizeof(DDXPointRec)); 167635c4bbdfSmrg memcpy((char *) locPts, (char *) &stuff[1], 167735c4bbdfSmrg count * sizeof(DDXPointRec)); 167835c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 167935c4bbdfSmrg 168035c4bbdfSmrg if (j) 168135c4bbdfSmrg memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec)); 168235c4bbdfSmrg 168335c4bbdfSmrg if (isRoot) { 168435c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 168535c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 168605b261ecSmrg 168735c4bbdfSmrg if (x_off || y_off) { 168835c4bbdfSmrg DDXPointPtr pnts = (DDXPointPtr) &stuff[1]; 168935c4bbdfSmrg int i = (stuff->coordMode == CoordModePrevious) ? 1 : count; 169035c4bbdfSmrg 169135c4bbdfSmrg while (i--) { 169235c4bbdfSmrg pnts->x -= x_off; 169335c4bbdfSmrg pnts->y -= y_off; 169435c4bbdfSmrg pnts++; 169535c4bbdfSmrg } 169635c4bbdfSmrg } 169735c4bbdfSmrg } 169835c4bbdfSmrg 169935c4bbdfSmrg stuff->drawable = draw->info[j].id; 170035c4bbdfSmrg stuff->gc = gc->info[j].id; 170135c4bbdfSmrg result = (*SavedProcVector[X_FillPoly]) (client); 170235c4bbdfSmrg if (result != Success) 170335c4bbdfSmrg break; 170435c4bbdfSmrg } 170535c4bbdfSmrg free(locPts); 170635c4bbdfSmrg return result; 170735c4bbdfSmrg } 170835c4bbdfSmrg else 170935c4bbdfSmrg return Success; 171035c4bbdfSmrg} 171105b261ecSmrg 171235c4bbdfSmrgint 171335c4bbdfSmrgPanoramiXPolyFillRectangle(ClientPtr client) 171405b261ecSmrg{ 171535c4bbdfSmrg int result, things, i, j; 171605b261ecSmrg PanoramiXRes *gc, *draw; 171735c4bbdfSmrg Bool isRoot; 171835c4bbdfSmrg xRectangle *origRects; 171935c4bbdfSmrg 172005b261ecSmrg REQUEST(xPolyFillRectangleReq); 172105b261ecSmrg 172205b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq); 172305b261ecSmrg 172435c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 172535c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 17266747b715Smrg if (result != Success) 172735c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 172805b261ecSmrg 172935c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 173035c4bbdfSmrg return (*SavedProcVector[X_PolyFillRectangle]) (client); 173105b261ecSmrg 173235c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 173335c4bbdfSmrg client, DixReadAccess); 17346747b715Smrg if (result != Success) 173535c4bbdfSmrg return result; 173605b261ecSmrg 173735c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 173805b261ecSmrg 173905b261ecSmrg things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq); 174035c4bbdfSmrg if (things & 4) 174135c4bbdfSmrg return BadLength; 174205b261ecSmrg things >>= 3; 174335c4bbdfSmrg if (things > 0) { 174435c4bbdfSmrg origRects = xallocarray(things, sizeof(xRectangle)); 174535c4bbdfSmrg memcpy((char *) origRects, (char *) &stuff[1], 174635c4bbdfSmrg things * sizeof(xRectangle)); 174735c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 174835c4bbdfSmrg 174935c4bbdfSmrg if (j) 175035c4bbdfSmrg memcpy(&stuff[1], origRects, things * sizeof(xRectangle)); 175105b261ecSmrg 175235c4bbdfSmrg if (isRoot) { 175335c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 175435c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 175535c4bbdfSmrg 175635c4bbdfSmrg if (x_off || y_off) { 175735c4bbdfSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 175835c4bbdfSmrg 175935c4bbdfSmrg for (i = things; i--; rects++) { 176035c4bbdfSmrg rects->x -= x_off; 176135c4bbdfSmrg rects->y -= y_off; 176235c4bbdfSmrg } 176335c4bbdfSmrg } 176435c4bbdfSmrg } 176505b261ecSmrg 176635c4bbdfSmrg stuff->drawable = draw->info[j].id; 176735c4bbdfSmrg stuff->gc = gc->info[j].id; 176835c4bbdfSmrg result = (*SavedProcVector[X_PolyFillRectangle]) (client); 176935c4bbdfSmrg if (result != Success) 177035c4bbdfSmrg break; 177135c4bbdfSmrg } 177235c4bbdfSmrg free(origRects); 177335c4bbdfSmrg return result; 177435c4bbdfSmrg } 177535c4bbdfSmrg else 177635c4bbdfSmrg return Success; 177735c4bbdfSmrg} 177835c4bbdfSmrg 177935c4bbdfSmrgint 178035c4bbdfSmrgPanoramiXPolyFillArc(ClientPtr client) 178105b261ecSmrg{ 178205b261ecSmrg PanoramiXRes *gc, *draw; 178335c4bbdfSmrg Bool isRoot; 178435c4bbdfSmrg int result, narcs, i, j; 178535c4bbdfSmrg xArc *origArcs; 178635c4bbdfSmrg 178705b261ecSmrg REQUEST(xPolyFillArcReq); 178805b261ecSmrg 178905b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillArcReq); 179005b261ecSmrg 179135c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 179235c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 17936747b715Smrg if (result != Success) 179435c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 179505b261ecSmrg 179635c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 179735c4bbdfSmrg return (*SavedProcVector[X_PolyFillArc]) (client); 179805b261ecSmrg 179935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 180035c4bbdfSmrg client, DixReadAccess); 18016747b715Smrg if (result != Success) 180235c4bbdfSmrg return result; 180305b261ecSmrg 180435c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 180505b261ecSmrg 180605b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq); 180735c4bbdfSmrg if (narcs % sizeof(xArc)) 180835c4bbdfSmrg return BadLength; 180905b261ecSmrg narcs /= sizeof(xArc); 181005b261ecSmrg if (narcs > 0) { 181135c4bbdfSmrg origArcs = xallocarray(narcs, sizeof(xArc)); 181235c4bbdfSmrg memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); 181335c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 181435c4bbdfSmrg 181535c4bbdfSmrg if (j) 181635c4bbdfSmrg memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 181735c4bbdfSmrg 181835c4bbdfSmrg if (isRoot) { 181935c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 182035c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 182105b261ecSmrg 182235c4bbdfSmrg if (x_off || y_off) { 182335c4bbdfSmrg xArc *arcs = (xArc *) &stuff[1]; 182435c4bbdfSmrg 182535c4bbdfSmrg for (i = narcs; i--; arcs++) { 182635c4bbdfSmrg arcs->x -= x_off; 182735c4bbdfSmrg arcs->y -= y_off; 182835c4bbdfSmrg } 182935c4bbdfSmrg } 183035c4bbdfSmrg } 183105b261ecSmrg 183235c4bbdfSmrg stuff->drawable = draw->info[j].id; 183335c4bbdfSmrg stuff->gc = gc->info[j].id; 183435c4bbdfSmrg result = (*SavedProcVector[X_PolyFillArc]) (client); 183535c4bbdfSmrg if (result != Success) 183635c4bbdfSmrg break; 183735c4bbdfSmrg } 183835c4bbdfSmrg free(origArcs); 183935c4bbdfSmrg return result; 184035c4bbdfSmrg } 184135c4bbdfSmrg else 184235c4bbdfSmrg return Success; 184335c4bbdfSmrg} 184435c4bbdfSmrg 184535c4bbdfSmrgint 184635c4bbdfSmrgPanoramiXPutImage(ClientPtr client) 184705b261ecSmrg{ 184805b261ecSmrg PanoramiXRes *gc, *draw; 184935c4bbdfSmrg Bool isRoot; 185035c4bbdfSmrg int j, result, orig_x, orig_y; 185135c4bbdfSmrg 185205b261ecSmrg REQUEST(xPutImageReq); 185305b261ecSmrg 185405b261ecSmrg REQUEST_AT_LEAST_SIZE(xPutImageReq); 185505b261ecSmrg 185635c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 185735c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 18586747b715Smrg if (result != Success) 185935c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 186005b261ecSmrg 186135c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 186235c4bbdfSmrg return (*SavedProcVector[X_PutImage]) (client); 186305b261ecSmrg 186435c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 186535c4bbdfSmrg client, DixReadAccess); 18666747b715Smrg if (result != Success) 186735c4bbdfSmrg return result; 186805b261ecSmrg 186935c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 187005b261ecSmrg 187105b261ecSmrg orig_x = stuff->dstX; 187205b261ecSmrg orig_y = stuff->dstY; 187335c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 187435c4bbdfSmrg if (isRoot) { 187535c4bbdfSmrg stuff->dstX = orig_x - screenInfo.screens[j]->x; 187635c4bbdfSmrg stuff->dstY = orig_y - screenInfo.screens[j]->y; 187735c4bbdfSmrg } 187835c4bbdfSmrg stuff->drawable = draw->info[j].id; 187935c4bbdfSmrg stuff->gc = gc->info[j].id; 188035c4bbdfSmrg result = (*SavedProcVector[X_PutImage]) (client); 188135c4bbdfSmrg if (result != Success) 188235c4bbdfSmrg break; 188305b261ecSmrg } 18846747b715Smrg return result; 188505b261ecSmrg} 188605b261ecSmrg 188735c4bbdfSmrgint 188835c4bbdfSmrgPanoramiXGetImage(ClientPtr client) 188905b261ecSmrg{ 189035c4bbdfSmrg DrawablePtr drawables[MAXSCREENS]; 189135c4bbdfSmrg DrawablePtr pDraw; 189235c4bbdfSmrg PanoramiXRes *draw; 189335c4bbdfSmrg xGetImageReply xgi; 189435c4bbdfSmrg Bool isRoot; 189535c4bbdfSmrg char *pBuf; 189635c4bbdfSmrg int i, x, y, w, h, format, rc; 189735c4bbdfSmrg Mask plane = 0, planemask; 189835c4bbdfSmrg int linesDone, nlines, linesPerBuf; 189935c4bbdfSmrg long widthBytesLine, length; 190005b261ecSmrg 190105b261ecSmrg REQUEST(xGetImageReq); 190205b261ecSmrg 190305b261ecSmrg REQUEST_SIZE_MATCH(xGetImageReq); 190405b261ecSmrg 190505b261ecSmrg if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) { 190635c4bbdfSmrg client->errorValue = stuff->format; 19076747b715Smrg return BadValue; 190805b261ecSmrg } 190905b261ecSmrg 191035c4bbdfSmrg rc = dixLookupResourceByClass((void **) &draw, stuff->drawable, 191135c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 19126747b715Smrg if (rc != Success) 191335c4bbdfSmrg return (rc == BadValue) ? BadDrawable : rc; 191405b261ecSmrg 191535c4bbdfSmrg if (draw->type == XRT_PIXMAP) 191635c4bbdfSmrg return (*SavedProcVector[X_GetImage]) (client); 191705b261ecSmrg 191835c4bbdfSmrg rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReadAccess); 191905b261ecSmrg if (rc != Success) 192035c4bbdfSmrg return rc; 192105b261ecSmrg 192235c4bbdfSmrg if (!((WindowPtr) pDraw)->realized) 192335c4bbdfSmrg return BadMatch; 192405b261ecSmrg 192505b261ecSmrg x = stuff->x; 192605b261ecSmrg y = stuff->y; 192705b261ecSmrg w = stuff->width; 192805b261ecSmrg h = stuff->height; 192905b261ecSmrg format = stuff->format; 193005b261ecSmrg planemask = stuff->planeMask; 193105b261ecSmrg 193235c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 193305b261ecSmrg 193435c4bbdfSmrg if (isRoot) { 193535c4bbdfSmrg /* check for being onscreen */ 193635c4bbdfSmrg if (x < 0 || x + w > PanoramiXPixWidth || 193735c4bbdfSmrg y < 0 || y + h > PanoramiXPixHeight) 193835c4bbdfSmrg return BadMatch; 193935c4bbdfSmrg } 194035c4bbdfSmrg else { 194135c4bbdfSmrg /* check for being onscreen and inside of border */ 194235c4bbdfSmrg if (screenInfo.screens[0]->x + pDraw->x + x < 0 || 194335c4bbdfSmrg screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth || 194435c4bbdfSmrg screenInfo.screens[0]->y + pDraw->y + y < 0 || 194535c4bbdfSmrg screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight || 194635c4bbdfSmrg x < -wBorderWidth((WindowPtr) pDraw) || 194735c4bbdfSmrg x + w > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->width || 194835c4bbdfSmrg y < -wBorderWidth((WindowPtr) pDraw) || 194935c4bbdfSmrg y + h > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->height) 195035c4bbdfSmrg return BadMatch; 195105b261ecSmrg } 195205b261ecSmrg 195305b261ecSmrg drawables[0] = pDraw; 195435c4bbdfSmrg FOR_NSCREENS_FORWARD_SKIP(i) { 195535c4bbdfSmrg rc = dixLookupDrawable(drawables + i, draw->info[i].id, client, 0, 195635c4bbdfSmrg DixGetAttrAccess); 195735c4bbdfSmrg if (rc != Success) 195835c4bbdfSmrg return rc; 195905b261ecSmrg } 196005b261ecSmrg 196135c4bbdfSmrg xgi = (xGetImageReply) { 196235c4bbdfSmrg .type = X_Reply, 196335c4bbdfSmrg .sequenceNumber = client->sequence, 196435c4bbdfSmrg .visual = wVisual(((WindowPtr) pDraw)), 196535c4bbdfSmrg .depth = pDraw->depth 196635c4bbdfSmrg }; 196735c4bbdfSmrg if (format == ZPixmap) { 196835c4bbdfSmrg widthBytesLine = PixmapBytePad(w, pDraw->depth); 196935c4bbdfSmrg length = widthBytesLine * h; 197005b261ecSmrg 197135c4bbdfSmrg } 197235c4bbdfSmrg else { 197335c4bbdfSmrg widthBytesLine = BitmapBytePad(w); 197435c4bbdfSmrg plane = ((Mask) 1) << (pDraw->depth - 1); 197535c4bbdfSmrg /* only planes asked for */ 197635c4bbdfSmrg length = widthBytesLine * h * Ones(planemask & (plane | (plane - 1))); 197705b261ecSmrg 197805b261ecSmrg } 197905b261ecSmrg 19806747b715Smrg xgi.length = bytes_to_int32(length); 198105b261ecSmrg 198205b261ecSmrg if (widthBytesLine == 0 || h == 0) 198335c4bbdfSmrg linesPerBuf = 0; 198405b261ecSmrg else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE) 198535c4bbdfSmrg linesPerBuf = 1; 198605b261ecSmrg else { 198735c4bbdfSmrg linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine; 198835c4bbdfSmrg if (linesPerBuf > h) 198935c4bbdfSmrg linesPerBuf = h; 199005b261ecSmrg } 199135c4bbdfSmrg if (!(pBuf = xallocarray(linesPerBuf, widthBytesLine))) 199235c4bbdfSmrg return BadAlloc; 199305b261ecSmrg 199435c4bbdfSmrg WriteReplyToClient(client, sizeof(xGetImageReply), &xgi); 199505b261ecSmrg 199605b261ecSmrg if (linesPerBuf == 0) { 199735c4bbdfSmrg /* nothing to do */ 199805b261ecSmrg } 199905b261ecSmrg else if (format == ZPixmap) { 200005b261ecSmrg linesDone = 0; 200105b261ecSmrg while (h - linesDone > 0) { 200235c4bbdfSmrg nlines = min(linesPerBuf, h - linesDone); 200305b261ecSmrg 200435c4bbdfSmrg if (pDraw->depth == 1) 200535c4bbdfSmrg memset(pBuf, 0, nlines * widthBytesLine); 200605b261ecSmrg 200735c4bbdfSmrg XineramaGetImageData(drawables, x, y + linesDone, w, nlines, 200835c4bbdfSmrg format, planemask, pBuf, widthBytesLine, 200935c4bbdfSmrg isRoot); 201005b261ecSmrg 201135c4bbdfSmrg WriteToClient(client, (int) (nlines * widthBytesLine), pBuf); 201235c4bbdfSmrg linesDone += nlines; 201305b261ecSmrg } 201435c4bbdfSmrg } 201535c4bbdfSmrg else { /* XYPixmap */ 201605b261ecSmrg for (; plane; plane >>= 1) { 201735c4bbdfSmrg if (planemask & plane) { 201835c4bbdfSmrg linesDone = 0; 201935c4bbdfSmrg while (h - linesDone > 0) { 202035c4bbdfSmrg nlines = min(linesPerBuf, h - linesDone); 202105b261ecSmrg 202235c4bbdfSmrg memset(pBuf, 0, nlines * widthBytesLine); 202305b261ecSmrg 202435c4bbdfSmrg XineramaGetImageData(drawables, x, y + linesDone, w, 202535c4bbdfSmrg nlines, format, plane, pBuf, 202635c4bbdfSmrg widthBytesLine, isRoot); 202705b261ecSmrg 202835c4bbdfSmrg WriteToClient(client, (int)(nlines * widthBytesLine), pBuf); 202905b261ecSmrg 203035c4bbdfSmrg linesDone += nlines; 203135c4bbdfSmrg } 203205b261ecSmrg } 203335c4bbdfSmrg } 203405b261ecSmrg } 20356747b715Smrg free(pBuf); 20366747b715Smrg return Success; 203705b261ecSmrg} 203805b261ecSmrg 203905b261ecSmrg/* The text stuff should be rewritten so that duplication happens 204005b261ecSmrg at the GlyphBlt level. That is, loading the font and getting 204105b261ecSmrg the glyphs should only happen once */ 204205b261ecSmrg 204335c4bbdfSmrgint 204405b261ecSmrgPanoramiXPolyText8(ClientPtr client) 204505b261ecSmrg{ 204605b261ecSmrg PanoramiXRes *gc, *draw; 204735c4bbdfSmrg Bool isRoot; 204835c4bbdfSmrg int result, j; 204935c4bbdfSmrg int orig_x, orig_y; 205035c4bbdfSmrg 205105b261ecSmrg REQUEST(xPolyTextReq); 205205b261ecSmrg 205305b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 205405b261ecSmrg 205535c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 205635c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 20576747b715Smrg if (result != Success) 205835c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 205905b261ecSmrg 206035c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 206135c4bbdfSmrg return (*SavedProcVector[X_PolyText8]) (client); 206205b261ecSmrg 206335c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 206435c4bbdfSmrg client, DixReadAccess); 20656747b715Smrg if (result != Success) 206635c4bbdfSmrg return result; 206705b261ecSmrg 206835c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 206905b261ecSmrg 207005b261ecSmrg orig_x = stuff->x; 207105b261ecSmrg orig_y = stuff->y; 207235c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 207335c4bbdfSmrg stuff->drawable = draw->info[j].id; 207435c4bbdfSmrg stuff->gc = gc->info[j].id; 207535c4bbdfSmrg if (isRoot) { 207635c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 207735c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 207835c4bbdfSmrg } 207935c4bbdfSmrg result = (*SavedProcVector[X_PolyText8]) (client); 208035c4bbdfSmrg if (result != Success) 208135c4bbdfSmrg break; 208205b261ecSmrg } 20836747b715Smrg return result; 208405b261ecSmrg} 208505b261ecSmrg 208635c4bbdfSmrgint 208705b261ecSmrgPanoramiXPolyText16(ClientPtr client) 208805b261ecSmrg{ 208905b261ecSmrg PanoramiXRes *gc, *draw; 209035c4bbdfSmrg Bool isRoot; 209135c4bbdfSmrg int result, j; 209235c4bbdfSmrg int orig_x, orig_y; 209335c4bbdfSmrg 209405b261ecSmrg REQUEST(xPolyTextReq); 209505b261ecSmrg 209605b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 209705b261ecSmrg 209835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 209935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 21006747b715Smrg if (result != Success) 210135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 210205b261ecSmrg 210335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 210435c4bbdfSmrg return (*SavedProcVector[X_PolyText16]) (client); 210505b261ecSmrg 210635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 210735c4bbdfSmrg client, DixReadAccess); 21086747b715Smrg if (result != Success) 210935c4bbdfSmrg return result; 211005b261ecSmrg 211135c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 211205b261ecSmrg 211305b261ecSmrg orig_x = stuff->x; 211405b261ecSmrg orig_y = stuff->y; 211535c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 211635c4bbdfSmrg stuff->drawable = draw->info[j].id; 211735c4bbdfSmrg stuff->gc = gc->info[j].id; 211835c4bbdfSmrg if (isRoot) { 211935c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 212035c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 212135c4bbdfSmrg } 212235c4bbdfSmrg result = (*SavedProcVector[X_PolyText16]) (client); 212335c4bbdfSmrg if (result != Success) 212435c4bbdfSmrg break; 212505b261ecSmrg } 21266747b715Smrg return result; 212705b261ecSmrg} 212805b261ecSmrg 212935c4bbdfSmrgint 213035c4bbdfSmrgPanoramiXImageText8(ClientPtr client) 213105b261ecSmrg{ 213235c4bbdfSmrg int result, j; 213305b261ecSmrg PanoramiXRes *gc, *draw; 213435c4bbdfSmrg Bool isRoot; 213535c4bbdfSmrg int orig_x, orig_y; 213635c4bbdfSmrg 213705b261ecSmrg REQUEST(xImageTextReq); 213805b261ecSmrg 213905b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars); 214005b261ecSmrg 214135c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 214235c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 21436747b715Smrg if (result != Success) 214435c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 214505b261ecSmrg 214635c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 214735c4bbdfSmrg return (*SavedProcVector[X_ImageText8]) (client); 214805b261ecSmrg 214935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 215035c4bbdfSmrg client, DixReadAccess); 21516747b715Smrg if (result != Success) 215235c4bbdfSmrg return result; 215305b261ecSmrg 215435c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 215505b261ecSmrg 215605b261ecSmrg orig_x = stuff->x; 215705b261ecSmrg orig_y = stuff->y; 215835c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 215935c4bbdfSmrg stuff->drawable = draw->info[j].id; 216035c4bbdfSmrg stuff->gc = gc->info[j].id; 216135c4bbdfSmrg if (isRoot) { 216235c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 216335c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 216435c4bbdfSmrg } 216535c4bbdfSmrg result = (*SavedProcVector[X_ImageText8]) (client); 216635c4bbdfSmrg if (result != Success) 216735c4bbdfSmrg break; 216805b261ecSmrg } 21696747b715Smrg return result; 217005b261ecSmrg} 217105b261ecSmrg 217235c4bbdfSmrgint 217335c4bbdfSmrgPanoramiXImageText16(ClientPtr client) 217405b261ecSmrg{ 217535c4bbdfSmrg int result, j; 217605b261ecSmrg PanoramiXRes *gc, *draw; 217735c4bbdfSmrg Bool isRoot; 217835c4bbdfSmrg int orig_x, orig_y; 217935c4bbdfSmrg 218005b261ecSmrg REQUEST(xImageTextReq); 218105b261ecSmrg 218205b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1); 218305b261ecSmrg 218435c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 218535c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 21866747b715Smrg if (result != Success) 218735c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 218805b261ecSmrg 218935c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 219035c4bbdfSmrg return (*SavedProcVector[X_ImageText16]) (client); 219105b261ecSmrg 219235c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 219335c4bbdfSmrg client, DixReadAccess); 21946747b715Smrg if (result != Success) 219535c4bbdfSmrg return result; 219605b261ecSmrg 219735c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 219805b261ecSmrg 219905b261ecSmrg orig_x = stuff->x; 220005b261ecSmrg orig_y = stuff->y; 220135c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 220235c4bbdfSmrg stuff->drawable = draw->info[j].id; 220335c4bbdfSmrg stuff->gc = gc->info[j].id; 220435c4bbdfSmrg if (isRoot) { 220535c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 220635c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 220735c4bbdfSmrg } 220835c4bbdfSmrg result = (*SavedProcVector[X_ImageText16]) (client); 220935c4bbdfSmrg if (result != Success) 221035c4bbdfSmrg break; 221105b261ecSmrg } 22126747b715Smrg return result; 221305b261ecSmrg} 221405b261ecSmrg 221535c4bbdfSmrgint 221635c4bbdfSmrgPanoramiXCreateColormap(ClientPtr client) 221705b261ecSmrg{ 221835c4bbdfSmrg PanoramiXRes *win, *newCmap; 221935c4bbdfSmrg int result, j, orig_visual; 222035c4bbdfSmrg 222105b261ecSmrg REQUEST(xCreateColormapReq); 222205b261ecSmrg 222305b261ecSmrg REQUEST_SIZE_MATCH(xCreateColormapReq); 222405b261ecSmrg 222535c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 222635c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 22276747b715Smrg if (result != Success) 222835c4bbdfSmrg return result; 222905b261ecSmrg 223035c4bbdfSmrg if (!(newCmap = malloc(sizeof(PanoramiXRes)))) 223105b261ecSmrg return BadAlloc; 223205b261ecSmrg 223305b261ecSmrg newCmap->type = XRT_COLORMAP; 223435c4bbdfSmrg panoramix_setup_ids(newCmap, client, stuff->mid); 223505b261ecSmrg 223605b261ecSmrg orig_visual = stuff->visual; 223735c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 223835c4bbdfSmrg stuff->mid = newCmap->info[j].id; 223935c4bbdfSmrg stuff->window = win->info[j].id; 224035c4bbdfSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 224135c4bbdfSmrg result = (*SavedProcVector[X_CreateColormap]) (client); 224235c4bbdfSmrg if (result != Success) 224335c4bbdfSmrg break; 224435c4bbdfSmrg } 224535c4bbdfSmrg 224605b261ecSmrg if (result == Success) 224705b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 224835c4bbdfSmrg else 22496747b715Smrg free(newCmap); 225005b261ecSmrg 22516747b715Smrg return result; 225205b261ecSmrg} 225305b261ecSmrg 225435c4bbdfSmrgint 225535c4bbdfSmrgPanoramiXFreeColormap(ClientPtr client) 225605b261ecSmrg{ 225705b261ecSmrg PanoramiXRes *cmap; 225835c4bbdfSmrg int result, j; 225935c4bbdfSmrg 226005b261ecSmrg REQUEST(xResourceReq); 226105b261ecSmrg 226205b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 226305b261ecSmrg 226405b261ecSmrg client->errorValue = stuff->id; 226505b261ecSmrg 226635c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP, 226735c4bbdfSmrg client, DixDestroyAccess); 22686747b715Smrg if (result != Success) 22696747b715Smrg return result; 227005b261ecSmrg 227105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 227205b261ecSmrg stuff->id = cmap->info[j].id; 227335c4bbdfSmrg result = (*SavedProcVector[X_FreeColormap]) (client); 227435c4bbdfSmrg if (result != Success) 227535c4bbdfSmrg break; 227605b261ecSmrg } 227705b261ecSmrg 227805b261ecSmrg /* Since ProcFreeColormap is using FreeResource, it will free 227935c4bbdfSmrg our resource for us on the last pass through the loop above */ 228005b261ecSmrg 22816747b715Smrg return result; 228205b261ecSmrg} 228305b261ecSmrg 228405b261ecSmrgint 228505b261ecSmrgPanoramiXCopyColormapAndFree(ClientPtr client) 228605b261ecSmrg{ 228705b261ecSmrg PanoramiXRes *cmap, *newCmap; 228835c4bbdfSmrg int result, j; 228935c4bbdfSmrg 229005b261ecSmrg REQUEST(xCopyColormapAndFreeReq); 229105b261ecSmrg 229205b261ecSmrg REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq); 229305b261ecSmrg 229405b261ecSmrg client->errorValue = stuff->srcCmap; 229505b261ecSmrg 229635c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->srcCmap, 229735c4bbdfSmrg XRT_COLORMAP, client, 229835c4bbdfSmrg DixReadAccess | DixWriteAccess); 22996747b715Smrg if (result != Success) 23006747b715Smrg return result; 230105b261ecSmrg 230235c4bbdfSmrg if (!(newCmap = malloc(sizeof(PanoramiXRes)))) 230305b261ecSmrg return BadAlloc; 230405b261ecSmrg 230505b261ecSmrg newCmap->type = XRT_COLORMAP; 230635c4bbdfSmrg panoramix_setup_ids(newCmap, client, stuff->mid); 230705b261ecSmrg 230835c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 230905b261ecSmrg stuff->srcCmap = cmap->info[j].id; 231035c4bbdfSmrg stuff->mid = newCmap->info[j].id; 231135c4bbdfSmrg result = (*SavedProcVector[X_CopyColormapAndFree]) (client); 231235c4bbdfSmrg if (result != Success) 231335c4bbdfSmrg break; 231405b261ecSmrg } 231505b261ecSmrg 231605b261ecSmrg if (result == Success) 231705b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 231835c4bbdfSmrg else 23196747b715Smrg free(newCmap); 232005b261ecSmrg 23216747b715Smrg return result; 232205b261ecSmrg} 232305b261ecSmrg 232435c4bbdfSmrgint 232535c4bbdfSmrgPanoramiXInstallColormap(ClientPtr client) 232605b261ecSmrg{ 232705b261ecSmrg REQUEST(xResourceReq); 232835c4bbdfSmrg int result, j; 232905b261ecSmrg PanoramiXRes *cmap; 233005b261ecSmrg 233105b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 233205b261ecSmrg 233305b261ecSmrg client->errorValue = stuff->id; 233405b261ecSmrg 233535c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP, 233635c4bbdfSmrg client, DixReadAccess); 23376747b715Smrg if (result != Success) 23386747b715Smrg return result; 233905b261ecSmrg 234035c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 234135c4bbdfSmrg stuff->id = cmap->info[j].id; 234235c4bbdfSmrg result = (*SavedProcVector[X_InstallColormap]) (client); 234335c4bbdfSmrg if (result != Success) 234435c4bbdfSmrg break; 234505b261ecSmrg } 23466747b715Smrg return result; 234705b261ecSmrg} 234805b261ecSmrg 234935c4bbdfSmrgint 235035c4bbdfSmrgPanoramiXUninstallColormap(ClientPtr client) 235105b261ecSmrg{ 235205b261ecSmrg REQUEST(xResourceReq); 235335c4bbdfSmrg int result, j; 235405b261ecSmrg PanoramiXRes *cmap; 235505b261ecSmrg 235605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 235735c4bbdfSmrg 235805b261ecSmrg client->errorValue = stuff->id; 235905b261ecSmrg 236035c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP, 236135c4bbdfSmrg client, DixReadAccess); 23626747b715Smrg if (result != Success) 23636747b715Smrg return result; 236405b261ecSmrg 236505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 236635c4bbdfSmrg stuff->id = cmap->info[j].id; 236735c4bbdfSmrg result = (*SavedProcVector[X_UninstallColormap]) (client); 236835c4bbdfSmrg if (result != Success) 236935c4bbdfSmrg break; 237005b261ecSmrg } 23716747b715Smrg return result; 237205b261ecSmrg} 237305b261ecSmrg 237435c4bbdfSmrgint 237535c4bbdfSmrgPanoramiXAllocColor(ClientPtr client) 237605b261ecSmrg{ 237735c4bbdfSmrg int result, j; 237805b261ecSmrg PanoramiXRes *cmap; 237935c4bbdfSmrg 238005b261ecSmrg REQUEST(xAllocColorReq); 238105b261ecSmrg 238205b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorReq); 238305b261ecSmrg 238405b261ecSmrg client->errorValue = stuff->cmap; 238505b261ecSmrg 238635c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 238735c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 23886747b715Smrg if (result != Success) 23896747b715Smrg return result; 239005b261ecSmrg 239135c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 239235c4bbdfSmrg stuff->cmap = cmap->info[j].id; 239335c4bbdfSmrg result = (*SavedProcVector[X_AllocColor]) (client); 239435c4bbdfSmrg if (result != Success) 239535c4bbdfSmrg break; 239605b261ecSmrg } 23976747b715Smrg return result; 239805b261ecSmrg} 239905b261ecSmrg 240035c4bbdfSmrgint 240135c4bbdfSmrgPanoramiXAllocNamedColor(ClientPtr client) 240205b261ecSmrg{ 240335c4bbdfSmrg int result, j; 240435c4bbdfSmrg PanoramiXRes *cmap; 240535c4bbdfSmrg 240605b261ecSmrg REQUEST(xAllocNamedColorReq); 240705b261ecSmrg 240805b261ecSmrg REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes); 240905b261ecSmrg 241005b261ecSmrg client->errorValue = stuff->cmap; 241105b261ecSmrg 241235c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 241335c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24146747b715Smrg if (result != Success) 24156747b715Smrg return result; 241605b261ecSmrg 241735c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 241805b261ecSmrg stuff->cmap = cmap->info[j].id; 241935c4bbdfSmrg result = (*SavedProcVector[X_AllocNamedColor]) (client); 242035c4bbdfSmrg if (result != Success) 242135c4bbdfSmrg break; 242205b261ecSmrg } 24236747b715Smrg return result; 242405b261ecSmrg} 242505b261ecSmrg 242635c4bbdfSmrgint 242735c4bbdfSmrgPanoramiXAllocColorCells(ClientPtr client) 242805b261ecSmrg{ 242935c4bbdfSmrg int result, j; 243035c4bbdfSmrg PanoramiXRes *cmap; 243135c4bbdfSmrg 243205b261ecSmrg REQUEST(xAllocColorCellsReq); 243305b261ecSmrg 243405b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorCellsReq); 243505b261ecSmrg 243605b261ecSmrg client->errorValue = stuff->cmap; 243705b261ecSmrg 243835c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 243935c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24406747b715Smrg if (result != Success) 24416747b715Smrg return result; 244235c4bbdfSmrg 244335c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 244435c4bbdfSmrg stuff->cmap = cmap->info[j].id; 244535c4bbdfSmrg result = (*SavedProcVector[X_AllocColorCells]) (client); 244635c4bbdfSmrg if (result != Success) 244735c4bbdfSmrg break; 244805b261ecSmrg } 24496747b715Smrg return result; 245005b261ecSmrg} 245105b261ecSmrg 245235c4bbdfSmrgint 245335c4bbdfSmrgPanoramiXAllocColorPlanes(ClientPtr client) 245405b261ecSmrg{ 245535c4bbdfSmrg int result, j; 245635c4bbdfSmrg PanoramiXRes *cmap; 245735c4bbdfSmrg 245805b261ecSmrg REQUEST(xAllocColorPlanesReq); 245905b261ecSmrg 246005b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorPlanesReq); 246105b261ecSmrg 246205b261ecSmrg client->errorValue = stuff->cmap; 246305b261ecSmrg 246435c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 246535c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24666747b715Smrg if (result != Success) 24676747b715Smrg return result; 246835c4bbdfSmrg 246935c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 247035c4bbdfSmrg stuff->cmap = cmap->info[j].id; 247135c4bbdfSmrg result = (*SavedProcVector[X_AllocColorPlanes]) (client); 247235c4bbdfSmrg if (result != Success) 247335c4bbdfSmrg break; 247405b261ecSmrg } 24756747b715Smrg return result; 247605b261ecSmrg} 247705b261ecSmrg 247835c4bbdfSmrgint 247935c4bbdfSmrgPanoramiXFreeColors(ClientPtr client) 248005b261ecSmrg{ 248135c4bbdfSmrg int result, j; 248235c4bbdfSmrg PanoramiXRes *cmap; 248335c4bbdfSmrg 248405b261ecSmrg REQUEST(xFreeColorsReq); 248505b261ecSmrg 248605b261ecSmrg REQUEST_AT_LEAST_SIZE(xFreeColorsReq); 248705b261ecSmrg 248805b261ecSmrg client->errorValue = stuff->cmap; 248905b261ecSmrg 249035c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 249135c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24926747b715Smrg if (result != Success) 24936747b715Smrg return result; 249405b261ecSmrg 249505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 249605b261ecSmrg stuff->cmap = cmap->info[j].id; 249735c4bbdfSmrg result = (*SavedProcVector[X_FreeColors]) (client); 249805b261ecSmrg } 24996747b715Smrg return result; 250005b261ecSmrg} 250105b261ecSmrg 250235c4bbdfSmrgint 250335c4bbdfSmrgPanoramiXStoreColors(ClientPtr client) 250405b261ecSmrg{ 250535c4bbdfSmrg int result, j; 250635c4bbdfSmrg PanoramiXRes *cmap; 250735c4bbdfSmrg 250805b261ecSmrg REQUEST(xStoreColorsReq); 250905b261ecSmrg 251005b261ecSmrg REQUEST_AT_LEAST_SIZE(xStoreColorsReq); 251105b261ecSmrg 251205b261ecSmrg client->errorValue = stuff->cmap; 251305b261ecSmrg 251435c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 251535c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 25166747b715Smrg if (result != Success) 25176747b715Smrg return result; 251805b261ecSmrg 251935c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 252035c4bbdfSmrg stuff->cmap = cmap->info[j].id; 252135c4bbdfSmrg result = (*SavedProcVector[X_StoreColors]) (client); 252235c4bbdfSmrg if (result != Success) 252335c4bbdfSmrg break; 252405b261ecSmrg } 25256747b715Smrg return result; 252605b261ecSmrg} 252705b261ecSmrg 252835c4bbdfSmrgint 252935c4bbdfSmrgPanoramiXStoreNamedColor(ClientPtr client) 253005b261ecSmrg{ 253135c4bbdfSmrg int result, j; 253235c4bbdfSmrg PanoramiXRes *cmap; 253335c4bbdfSmrg 253405b261ecSmrg REQUEST(xStoreNamedColorReq); 253505b261ecSmrg 253605b261ecSmrg REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes); 253705b261ecSmrg 253805b261ecSmrg client->errorValue = stuff->cmap; 253905b261ecSmrg 254035c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 254135c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 25426747b715Smrg if (result != Success) 25436747b715Smrg return result; 254405b261ecSmrg 254535c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 254635c4bbdfSmrg stuff->cmap = cmap->info[j].id; 254735c4bbdfSmrg result = (*SavedProcVector[X_StoreNamedColor]) (client); 254835c4bbdfSmrg if (result != Success) 254935c4bbdfSmrg break; 255005b261ecSmrg } 25516747b715Smrg return result; 255205b261ecSmrg} 2553