panoramiXprocs.c revision 1b5d61b8
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{ 10531b5d61b8Smrg int j, result, srcx, srcy, dstx, dsty, width, height; 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; 10941b5d61b8Smrg width = stuff->width; 10951b5d61b8Smrg height = stuff->height; 109635c4bbdfSmrg if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) { 109735c4bbdfSmrg DrawablePtr drawables[MAXSCREENS]; 109835c4bbdfSmrg DrawablePtr pDst; 109935c4bbdfSmrg GCPtr pGC; 110005b261ecSmrg char *data; 110135c4bbdfSmrg int pitch, rc; 110235c4bbdfSmrg 110335c4bbdfSmrg FOR_NSCREENS(j) { 110435c4bbdfSmrg rc = dixLookupDrawable(drawables + j, src->info[j].id, client, 0, 110535c4bbdfSmrg DixGetAttrAccess); 110635c4bbdfSmrg if (rc != Success) 110735c4bbdfSmrg return rc; 110835c4bbdfSmrg } 110935c4bbdfSmrg 11101b5d61b8Smrg pitch = PixmapBytePad(width, drawables[0]->depth); 11111b5d61b8Smrg if (!(data = calloc(height, pitch))) 111235c4bbdfSmrg return BadAlloc; 111335c4bbdfSmrg 11141b5d61b8Smrg XineramaGetImageData(drawables, srcx, srcy, width, height, ZPixmap, ~0, 11151b5d61b8Smrg data, pitch, srcIsRoot); 111635c4bbdfSmrg 111735c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 111835c4bbdfSmrg stuff->gc = gc->info[j].id; 111935c4bbdfSmrg VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess); 112035c4bbdfSmrg if (drawables[0]->depth != pDst->depth) { 112135c4bbdfSmrg client->errorValue = stuff->dstDrawable; 112235c4bbdfSmrg free(data); 112335c4bbdfSmrg return BadMatch; 112435c4bbdfSmrg } 112535c4bbdfSmrg 112635c4bbdfSmrg (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty, 11271b5d61b8Smrg width, height, 0, ZPixmap, data); 112835c4bbdfSmrg if (dstShared) 112935c4bbdfSmrg break; 113035c4bbdfSmrg } 113135c4bbdfSmrg free(data); 11321b5d61b8Smrg 11331b5d61b8Smrg if (pGC->graphicsExposures) { 11341b5d61b8Smrg RegionRec rgn; 11351b5d61b8Smrg int dx, dy; 11361b5d61b8Smrg BoxRec sourceBox; 11371b5d61b8Smrg 11381b5d61b8Smrg dx = drawables[0]->x; 11391b5d61b8Smrg dy = drawables[0]->y; 11401b5d61b8Smrg if (srcIsRoot) { 11411b5d61b8Smrg dx += screenInfo.screens[0]->x; 11421b5d61b8Smrg dy += screenInfo.screens[0]->y; 11431b5d61b8Smrg } 11441b5d61b8Smrg 11451b5d61b8Smrg sourceBox.x1 = min(srcx + dx, 0); 11461b5d61b8Smrg sourceBox.y1 = min(srcy + dy, 0); 11471b5d61b8Smrg sourceBox.x2 = max(sourceBox.x1 + width, 32767); 11481b5d61b8Smrg sourceBox.y2 = max(sourceBox.y1 + height, 32767); 11491b5d61b8Smrg 11501b5d61b8Smrg RegionInit(&rgn, &sourceBox, 1); 11511b5d61b8Smrg 11521b5d61b8Smrg /* subtract the (screen-space) clips of the source drawables */ 11531b5d61b8Smrg FOR_NSCREENS(j) { 11541b5d61b8Smrg ScreenPtr screen = screenInfo.screens[j]; 11551b5d61b8Smrg RegionPtr sd; 11561b5d61b8Smrg 11571b5d61b8Smrg if (pGC->subWindowMode == IncludeInferiors) 11581b5d61b8Smrg sd = NotClippedByChildren((WindowPtr)drawables[j]); 11591b5d61b8Smrg else 11601b5d61b8Smrg sd = &((WindowPtr)drawables[j])->clipList; 11611b5d61b8Smrg 11621b5d61b8Smrg if (srcIsRoot) 11631b5d61b8Smrg RegionTranslate(&rgn, -screen->x, -screen->y); 11641b5d61b8Smrg 11651b5d61b8Smrg RegionSubtract(&rgn, &rgn, sd); 11661b5d61b8Smrg 11671b5d61b8Smrg if (srcIsRoot) 11681b5d61b8Smrg RegionTranslate(&rgn, screen->x, screen->y); 11691b5d61b8Smrg 11701b5d61b8Smrg if (pGC->subWindowMode == IncludeInferiors) 11711b5d61b8Smrg RegionDestroy(sd); 11721b5d61b8Smrg } 11731b5d61b8Smrg 11741b5d61b8Smrg /* -dx/-dy to get back to dest-relative, plus request offsets */ 11751b5d61b8Smrg RegionTranslate(&rgn, -dx + dstx, -dy + dsty); 11761b5d61b8Smrg 11771b5d61b8Smrg /* intersect with gc clip; just one screen is fine because pixmap */ 11781b5d61b8Smrg RegionIntersect(&rgn, &rgn, pGC->pCompositeClip); 11791b5d61b8Smrg 11801b5d61b8Smrg /* and expose */ 11811b5d61b8Smrg SendGraphicsExpose(client, &rgn, dst->info[0].id, X_CopyArea, 0); 11821b5d61b8Smrg RegionUninit(&rgn); 11831b5d61b8Smrg } 118435c4bbdfSmrg } 118535c4bbdfSmrg else { 118635c4bbdfSmrg DrawablePtr pDst = NULL, pSrc = NULL; 118735c4bbdfSmrg GCPtr pGC = NULL; 118835c4bbdfSmrg RegionRec totalReg; 118935c4bbdfSmrg int rc; 119035c4bbdfSmrg 119135c4bbdfSmrg RegionNull(&totalReg); 119235c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 119335c4bbdfSmrg RegionPtr pRgn; 119435c4bbdfSmrg 119535c4bbdfSmrg stuff->dstDrawable = dst->info[j].id; 119635c4bbdfSmrg stuff->srcDrawable = src->info[j].id; 119735c4bbdfSmrg stuff->gc = gc->info[j].id; 119835c4bbdfSmrg if (srcIsRoot) { 119935c4bbdfSmrg stuff->srcX = srcx - screenInfo.screens[j]->x; 120035c4bbdfSmrg stuff->srcY = srcy - screenInfo.screens[j]->y; 120135c4bbdfSmrg } 120235c4bbdfSmrg if (dstIsRoot) { 120335c4bbdfSmrg stuff->dstX = dstx - screenInfo.screens[j]->x; 120435c4bbdfSmrg stuff->dstY = dsty - screenInfo.screens[j]->y; 120535c4bbdfSmrg } 120635c4bbdfSmrg 120735c4bbdfSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess); 120835c4bbdfSmrg 120935c4bbdfSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 121035c4bbdfSmrg rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0, 121135c4bbdfSmrg DixReadAccess); 121235c4bbdfSmrg if (rc != Success) 121335c4bbdfSmrg return rc; 121435c4bbdfSmrg 121535c4bbdfSmrg if ((pDst->pScreen != pSrc->pScreen) || 121635c4bbdfSmrg (pDst->depth != pSrc->depth)) { 121735c4bbdfSmrg client->errorValue = stuff->dstDrawable; 121835c4bbdfSmrg return BadMatch; 121935c4bbdfSmrg } 122035c4bbdfSmrg } 122135c4bbdfSmrg else 122235c4bbdfSmrg pSrc = pDst; 122335c4bbdfSmrg 122435c4bbdfSmrg pRgn = (*pGC->ops->CopyArea) (pSrc, pDst, pGC, 122535c4bbdfSmrg stuff->srcX, stuff->srcY, 122635c4bbdfSmrg stuff->width, stuff->height, 122735c4bbdfSmrg stuff->dstX, stuff->dstY); 122835c4bbdfSmrg if (pGC->graphicsExposures && pRgn) { 122935c4bbdfSmrg if (srcIsRoot) { 123035c4bbdfSmrg RegionTranslate(pRgn, 123135c4bbdfSmrg screenInfo.screens[j]->x, 123235c4bbdfSmrg screenInfo.screens[j]->y); 123335c4bbdfSmrg } 123435c4bbdfSmrg RegionAppend(&totalReg, pRgn); 123535c4bbdfSmrg RegionDestroy(pRgn); 123635c4bbdfSmrg } 123735c4bbdfSmrg 123835c4bbdfSmrg if (dstShared) 123935c4bbdfSmrg break; 124035c4bbdfSmrg } 124135c4bbdfSmrg 124235c4bbdfSmrg if (pGC->graphicsExposures) { 124335c4bbdfSmrg Bool overlap; 124435c4bbdfSmrg 124535c4bbdfSmrg RegionValidate(&totalReg, &overlap); 124635c4bbdfSmrg SendGraphicsExpose(client, &totalReg, stuff->dstDrawable, 124735c4bbdfSmrg X_CopyArea, 0); 124835c4bbdfSmrg RegionUninit(&totalReg); 124935c4bbdfSmrg } 125005b261ecSmrg } 125105b261ecSmrg 12526747b715Smrg return Success; 125305b261ecSmrg} 125405b261ecSmrg 125535c4bbdfSmrgint 125635c4bbdfSmrgPanoramiXCopyPlane(ClientPtr client) 125705b261ecSmrg{ 125835c4bbdfSmrg int j, srcx, srcy, dstx, dsty, rc; 125935c4bbdfSmrg PanoramiXRes *gc, *src, *dst; 126035c4bbdfSmrg Bool srcIsRoot = FALSE; 126135c4bbdfSmrg Bool dstIsRoot = FALSE; 126235c4bbdfSmrg Bool srcShared, dstShared; 126335c4bbdfSmrg DrawablePtr psrcDraw, pdstDraw = NULL; 126435c4bbdfSmrg GCPtr pGC = NULL; 126535c4bbdfSmrg RegionRec totalReg; 126635c4bbdfSmrg 126705b261ecSmrg REQUEST(xCopyPlaneReq); 126805b261ecSmrg 126905b261ecSmrg REQUEST_SIZE_MATCH(xCopyPlaneReq); 127005b261ecSmrg 127135c4bbdfSmrg rc = dixLookupResourceByClass((void **) &src, stuff->srcDrawable, 127235c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 12736747b715Smrg if (rc != Success) 127435c4bbdfSmrg return (rc == BadValue) ? BadDrawable : rc; 127505b261ecSmrg 127605b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 127705b261ecSmrg 127835c4bbdfSmrg rc = dixLookupResourceByClass((void **) &dst, stuff->dstDrawable, 127935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 12806747b715Smrg if (rc != Success) 128135c4bbdfSmrg return (rc == BadValue) ? BadDrawable : rc; 128205b261ecSmrg 128305b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 128405b261ecSmrg 128535c4bbdfSmrg if (dstShared && srcShared) 128635c4bbdfSmrg return (*SavedProcVector[X_CopyPlane]) (client); 128705b261ecSmrg 128835c4bbdfSmrg rc = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 128935c4bbdfSmrg client, DixReadAccess); 12906747b715Smrg if (rc != Success) 129135c4bbdfSmrg return rc; 129235c4bbdfSmrg 129335c4bbdfSmrg if ((dst->type == XRT_WINDOW) && dst->u.win.root) 129435c4bbdfSmrg dstIsRoot = TRUE; 129535c4bbdfSmrg if ((src->type == XRT_WINDOW) && src->u.win.root) 129635c4bbdfSmrg srcIsRoot = TRUE; 129705b261ecSmrg 129835c4bbdfSmrg srcx = stuff->srcX; 129935c4bbdfSmrg srcy = stuff->srcY; 130035c4bbdfSmrg dstx = stuff->dstX; 130135c4bbdfSmrg dsty = stuff->dstY; 130205b261ecSmrg 13036747b715Smrg RegionNull(&totalReg); 130405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 130535c4bbdfSmrg RegionPtr pRgn; 130635c4bbdfSmrg 130735c4bbdfSmrg stuff->dstDrawable = dst->info[j].id; 130835c4bbdfSmrg stuff->srcDrawable = src->info[j].id; 130935c4bbdfSmrg stuff->gc = gc->info[j].id; 131035c4bbdfSmrg if (srcIsRoot) { 131135c4bbdfSmrg stuff->srcX = srcx - screenInfo.screens[j]->x; 131235c4bbdfSmrg stuff->srcY = srcy - screenInfo.screens[j]->y; 131335c4bbdfSmrg } 131435c4bbdfSmrg if (dstIsRoot) { 131535c4bbdfSmrg stuff->dstX = dstx - screenInfo.screens[j]->x; 131635c4bbdfSmrg stuff->dstY = dsty - screenInfo.screens[j]->y; 131735c4bbdfSmrg } 131835c4bbdfSmrg 131935c4bbdfSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess); 132035c4bbdfSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 132135c4bbdfSmrg rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0, 132235c4bbdfSmrg DixReadAccess); 132335c4bbdfSmrg if (rc != Success) 132435c4bbdfSmrg return rc; 132505b261ecSmrg 132605b261ecSmrg if (pdstDraw->pScreen != psrcDraw->pScreen) { 132735c4bbdfSmrg client->errorValue = stuff->dstDrawable; 132835c4bbdfSmrg return BadMatch; 132935c4bbdfSmrg } 133035c4bbdfSmrg } 133135c4bbdfSmrg else 133235c4bbdfSmrg psrcDraw = pdstDraw; 133335c4bbdfSmrg 133435c4bbdfSmrg if (stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) || 133535c4bbdfSmrg (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) { 133635c4bbdfSmrg client->errorValue = stuff->bitPlane; 133735c4bbdfSmrg return BadValue; 133835c4bbdfSmrg } 133935c4bbdfSmrg 134035c4bbdfSmrg pRgn = (*pGC->ops->CopyPlane) (psrcDraw, pdstDraw, pGC, 134135c4bbdfSmrg stuff->srcX, stuff->srcY, 134235c4bbdfSmrg stuff->width, stuff->height, 134335c4bbdfSmrg stuff->dstX, stuff->dstY, 134435c4bbdfSmrg stuff->bitPlane); 134535c4bbdfSmrg if (pGC->graphicsExposures && pRgn) { 134635c4bbdfSmrg RegionAppend(&totalReg, pRgn); 134735c4bbdfSmrg RegionDestroy(pRgn); 134835c4bbdfSmrg } 134935c4bbdfSmrg 135035c4bbdfSmrg if (dstShared) 135135c4bbdfSmrg break; 135235c4bbdfSmrg } 135335c4bbdfSmrg 135435c4bbdfSmrg if (pGC->graphicsExposures) { 135535c4bbdfSmrg Bool overlap; 135635c4bbdfSmrg 135735c4bbdfSmrg RegionValidate(&totalReg, &overlap); 135835c4bbdfSmrg SendGraphicsExpose(client, &totalReg, stuff->dstDrawable, 135935c4bbdfSmrg X_CopyPlane, 0); 136035c4bbdfSmrg RegionUninit(&totalReg); 136105b261ecSmrg } 136205b261ecSmrg 13636747b715Smrg return Success; 136405b261ecSmrg} 136505b261ecSmrg 136635c4bbdfSmrgint 136735c4bbdfSmrgPanoramiXPolyPoint(ClientPtr client) 136805b261ecSmrg{ 136905b261ecSmrg PanoramiXRes *gc, *draw; 137035c4bbdfSmrg int result, npoint, j; 137135c4bbdfSmrg xPoint *origPts; 137235c4bbdfSmrg Bool isRoot; 137335c4bbdfSmrg 137405b261ecSmrg REQUEST(xPolyPointReq); 137505b261ecSmrg 137605b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyPointReq); 137705b261ecSmrg 137835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 137935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 13806747b715Smrg if (result != Success) 138135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 138205b261ecSmrg 138335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 138435c4bbdfSmrg return (*SavedProcVector[X_PolyPoint]) (client); 138505b261ecSmrg 138635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 138735c4bbdfSmrg client, DixReadAccess); 13886747b715Smrg if (result != Success) 138935c4bbdfSmrg return result; 139005b261ecSmrg 139105b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 13926747b715Smrg npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq)); 139305b261ecSmrg if (npoint > 0) { 139435c4bbdfSmrg origPts = xallocarray(npoint, sizeof(xPoint)); 139505b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 139635c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 139705b261ecSmrg 139835c4bbdfSmrg if (j) 139935c4bbdfSmrg memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 140005b261ecSmrg 140105b261ecSmrg if (isRoot) { 14026747b715Smrg int x_off = screenInfo.screens[j]->x; 14036747b715Smrg int y_off = screenInfo.screens[j]->y; 140405b261ecSmrg 140535c4bbdfSmrg if (x_off || y_off) { 140635c4bbdfSmrg xPoint *pnts = (xPoint *) &stuff[1]; 140735c4bbdfSmrg int i = 140835c4bbdfSmrg (stuff->coordMode == CoordModePrevious) ? 1 : npoint; 140905b261ecSmrg 141035c4bbdfSmrg while (i--) { 141135c4bbdfSmrg pnts->x -= x_off; 141235c4bbdfSmrg pnts->y -= y_off; 141335c4bbdfSmrg pnts++; 141405b261ecSmrg } 141535c4bbdfSmrg } 141605b261ecSmrg } 141705b261ecSmrg 141835c4bbdfSmrg stuff->drawable = draw->info[j].id; 141935c4bbdfSmrg stuff->gc = gc->info[j].id; 142035c4bbdfSmrg result = (*SavedProcVector[X_PolyPoint]) (client); 142135c4bbdfSmrg if (result != Success) 142235c4bbdfSmrg break; 142305b261ecSmrg } 14246747b715Smrg free(origPts); 14256747b715Smrg return result; 142635c4bbdfSmrg } 142735c4bbdfSmrg else 142835c4bbdfSmrg return Success; 142905b261ecSmrg} 143005b261ecSmrg 143135c4bbdfSmrgint 143235c4bbdfSmrgPanoramiXPolyLine(ClientPtr client) 143305b261ecSmrg{ 143405b261ecSmrg PanoramiXRes *gc, *draw; 143535c4bbdfSmrg int result, npoint, j; 143635c4bbdfSmrg xPoint *origPts; 143735c4bbdfSmrg Bool isRoot; 143835c4bbdfSmrg 143905b261ecSmrg REQUEST(xPolyLineReq); 144005b261ecSmrg 144105b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyLineReq); 144205b261ecSmrg 144335c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 144435c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 14456747b715Smrg if (result != Success) 144635c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 144705b261ecSmrg 144835c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 144935c4bbdfSmrg return (*SavedProcVector[X_PolyLine]) (client); 145005b261ecSmrg 145135c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 145235c4bbdfSmrg client, DixReadAccess); 14536747b715Smrg if (result != Success) 145435c4bbdfSmrg return result; 145505b261ecSmrg 145635c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 14576747b715Smrg npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq)); 145835c4bbdfSmrg if (npoint > 0) { 145935c4bbdfSmrg origPts = xallocarray(npoint, sizeof(xPoint)); 146005b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 146135c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 146205b261ecSmrg 146335c4bbdfSmrg if (j) 146435c4bbdfSmrg memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 146505b261ecSmrg 146605b261ecSmrg if (isRoot) { 14676747b715Smrg int x_off = screenInfo.screens[j]->x; 14686747b715Smrg int y_off = screenInfo.screens[j]->y; 146905b261ecSmrg 147035c4bbdfSmrg if (x_off || y_off) { 147135c4bbdfSmrg xPoint *pnts = (xPoint *) &stuff[1]; 147235c4bbdfSmrg int i = 147335c4bbdfSmrg (stuff->coordMode == CoordModePrevious) ? 1 : npoint; 147405b261ecSmrg 147535c4bbdfSmrg while (i--) { 147635c4bbdfSmrg pnts->x -= x_off; 147735c4bbdfSmrg pnts->y -= y_off; 147835c4bbdfSmrg pnts++; 147935c4bbdfSmrg } 148035c4bbdfSmrg } 148105b261ecSmrg } 148205b261ecSmrg 148335c4bbdfSmrg stuff->drawable = draw->info[j].id; 148435c4bbdfSmrg stuff->gc = gc->info[j].id; 148535c4bbdfSmrg result = (*SavedProcVector[X_PolyLine]) (client); 148635c4bbdfSmrg if (result != Success) 148735c4bbdfSmrg break; 148805b261ecSmrg } 14896747b715Smrg free(origPts); 14906747b715Smrg return result; 149135c4bbdfSmrg } 149235c4bbdfSmrg else 149335c4bbdfSmrg return Success; 149405b261ecSmrg} 149505b261ecSmrg 149635c4bbdfSmrgint 149735c4bbdfSmrgPanoramiXPolySegment(ClientPtr client) 149805b261ecSmrg{ 149935c4bbdfSmrg int result, nsegs, i, j; 150005b261ecSmrg PanoramiXRes *gc, *draw; 150135c4bbdfSmrg xSegment *origSegs; 150235c4bbdfSmrg Bool isRoot; 150335c4bbdfSmrg 150405b261ecSmrg REQUEST(xPolySegmentReq); 150505b261ecSmrg 150605b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolySegmentReq); 150705b261ecSmrg 150835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 150935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 15106747b715Smrg if (result != Success) 151135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 151205b261ecSmrg 151335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 151435c4bbdfSmrg return (*SavedProcVector[X_PolySegment]) (client); 151505b261ecSmrg 151635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 151735c4bbdfSmrg client, DixReadAccess); 15186747b715Smrg if (result != Success) 151935c4bbdfSmrg return result; 152005b261ecSmrg 152135c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 152205b261ecSmrg 152305b261ecSmrg nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq); 152435c4bbdfSmrg if (nsegs & 4) 152535c4bbdfSmrg return BadLength; 152605b261ecSmrg nsegs >>= 3; 152705b261ecSmrg if (nsegs > 0) { 152835c4bbdfSmrg origSegs = xallocarray(nsegs, sizeof(xSegment)); 152905b261ecSmrg memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment)); 153035c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 153105b261ecSmrg 153235c4bbdfSmrg if (j) 153335c4bbdfSmrg memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment)); 153405b261ecSmrg 153505b261ecSmrg if (isRoot) { 15366747b715Smrg int x_off = screenInfo.screens[j]->x; 15376747b715Smrg int y_off = screenInfo.screens[j]->y; 153805b261ecSmrg 153935c4bbdfSmrg if (x_off || y_off) { 154035c4bbdfSmrg xSegment *segs = (xSegment *) &stuff[1]; 154105b261ecSmrg 154235c4bbdfSmrg for (i = nsegs; i--; segs++) { 154335c4bbdfSmrg segs->x1 -= x_off; 154435c4bbdfSmrg segs->x2 -= x_off; 154535c4bbdfSmrg segs->y1 -= y_off; 154635c4bbdfSmrg segs->y2 -= y_off; 154735c4bbdfSmrg } 154835c4bbdfSmrg } 154905b261ecSmrg } 155005b261ecSmrg 155135c4bbdfSmrg stuff->drawable = draw->info[j].id; 155235c4bbdfSmrg stuff->gc = gc->info[j].id; 155335c4bbdfSmrg result = (*SavedProcVector[X_PolySegment]) (client); 155435c4bbdfSmrg if (result != Success) 155535c4bbdfSmrg break; 155635c4bbdfSmrg } 155735c4bbdfSmrg free(origSegs); 155835c4bbdfSmrg return result; 155935c4bbdfSmrg } 156035c4bbdfSmrg else 156135c4bbdfSmrg return Success; 156205b261ecSmrg} 156305b261ecSmrg 156435c4bbdfSmrgint 156535c4bbdfSmrgPanoramiXPolyRectangle(ClientPtr client) 156605b261ecSmrg{ 156735c4bbdfSmrg int result, nrects, i, j; 156805b261ecSmrg PanoramiXRes *gc, *draw; 156935c4bbdfSmrg Bool isRoot; 157035c4bbdfSmrg xRectangle *origRecs; 157135c4bbdfSmrg 157205b261ecSmrg REQUEST(xPolyRectangleReq); 157305b261ecSmrg 157405b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyRectangleReq); 157505b261ecSmrg 157635c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 157735c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 15786747b715Smrg if (result != Success) 157935c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 158005b261ecSmrg 158135c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 158235c4bbdfSmrg return (*SavedProcVector[X_PolyRectangle]) (client); 158305b261ecSmrg 158435c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 158535c4bbdfSmrg client, DixReadAccess); 15866747b715Smrg if (result != Success) 158735c4bbdfSmrg return result; 158805b261ecSmrg 158935c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 159005b261ecSmrg 159105b261ecSmrg nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq); 159235c4bbdfSmrg if (nrects & 4) 159335c4bbdfSmrg return BadLength; 159405b261ecSmrg nrects >>= 3; 159535c4bbdfSmrg if (nrects > 0) { 159635c4bbdfSmrg origRecs = xallocarray(nrects, sizeof(xRectangle)); 159735c4bbdfSmrg memcpy((char *) origRecs, (char *) &stuff[1], 159835c4bbdfSmrg nrects * sizeof(xRectangle)); 159935c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 160035c4bbdfSmrg 160135c4bbdfSmrg if (j) 160235c4bbdfSmrg memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle)); 160305b261ecSmrg 160435c4bbdfSmrg if (isRoot) { 160535c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 160635c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 160705b261ecSmrg 160835c4bbdfSmrg if (x_off || y_off) { 160935c4bbdfSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 161035c4bbdfSmrg 161135c4bbdfSmrg for (i = nrects; i--; rects++) { 161235c4bbdfSmrg rects->x -= x_off; 161335c4bbdfSmrg rects->y -= y_off; 161435c4bbdfSmrg } 161535c4bbdfSmrg } 161635c4bbdfSmrg } 161735c4bbdfSmrg 161835c4bbdfSmrg stuff->drawable = draw->info[j].id; 161935c4bbdfSmrg stuff->gc = gc->info[j].id; 162035c4bbdfSmrg result = (*SavedProcVector[X_PolyRectangle]) (client); 162135c4bbdfSmrg if (result != Success) 162235c4bbdfSmrg break; 162335c4bbdfSmrg } 162435c4bbdfSmrg free(origRecs); 162535c4bbdfSmrg return result; 162635c4bbdfSmrg } 162735c4bbdfSmrg else 162835c4bbdfSmrg return Success; 162935c4bbdfSmrg} 163035c4bbdfSmrg 163135c4bbdfSmrgint 163235c4bbdfSmrgPanoramiXPolyArc(ClientPtr client) 163305b261ecSmrg{ 163435c4bbdfSmrg int result, narcs, i, j; 163505b261ecSmrg PanoramiXRes *gc, *draw; 163635c4bbdfSmrg Bool isRoot; 163735c4bbdfSmrg xArc *origArcs; 163835c4bbdfSmrg 163905b261ecSmrg REQUEST(xPolyArcReq); 164005b261ecSmrg 164105b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyArcReq); 164205b261ecSmrg 164335c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 164435c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 16456747b715Smrg if (result != Success) 164635c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 164705b261ecSmrg 164835c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 164935c4bbdfSmrg return (*SavedProcVector[X_PolyArc]) (client); 165005b261ecSmrg 165135c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 165235c4bbdfSmrg client, DixReadAccess); 16536747b715Smrg if (result != Success) 165435c4bbdfSmrg return result; 165505b261ecSmrg 165635c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 165705b261ecSmrg 165805b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyArcReq); 165935c4bbdfSmrg if (narcs % sizeof(xArc)) 166035c4bbdfSmrg return BadLength; 166105b261ecSmrg narcs /= sizeof(xArc); 166235c4bbdfSmrg if (narcs > 0) { 166335c4bbdfSmrg origArcs = xallocarray(narcs, sizeof(xArc)); 166435c4bbdfSmrg memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); 166535c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 166635c4bbdfSmrg 166735c4bbdfSmrg if (j) 166835c4bbdfSmrg memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 166935c4bbdfSmrg 167035c4bbdfSmrg if (isRoot) { 167135c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 167235c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 167335c4bbdfSmrg 167435c4bbdfSmrg if (x_off || y_off) { 167535c4bbdfSmrg xArc *arcs = (xArc *) &stuff[1]; 167635c4bbdfSmrg 167735c4bbdfSmrg for (i = narcs; i--; arcs++) { 167835c4bbdfSmrg arcs->x -= x_off; 167935c4bbdfSmrg arcs->y -= y_off; 168035c4bbdfSmrg } 168135c4bbdfSmrg } 168205b261ecSmrg } 168335c4bbdfSmrg stuff->drawable = draw->info[j].id; 168435c4bbdfSmrg stuff->gc = gc->info[j].id; 168535c4bbdfSmrg result = (*SavedProcVector[X_PolyArc]) (client); 168635c4bbdfSmrg if (result != Success) 168735c4bbdfSmrg break; 168805b261ecSmrg } 168935c4bbdfSmrg free(origArcs); 169035c4bbdfSmrg return result; 169135c4bbdfSmrg } 169235c4bbdfSmrg else 169335c4bbdfSmrg return Success; 169405b261ecSmrg} 169505b261ecSmrg 169635c4bbdfSmrgint 169735c4bbdfSmrgPanoramiXFillPoly(ClientPtr client) 169805b261ecSmrg{ 169935c4bbdfSmrg int result, count, j; 170005b261ecSmrg PanoramiXRes *gc, *draw; 170135c4bbdfSmrg Bool isRoot; 170235c4bbdfSmrg DDXPointPtr locPts; 170335c4bbdfSmrg 170405b261ecSmrg REQUEST(xFillPolyReq); 170505b261ecSmrg 170605b261ecSmrg REQUEST_AT_LEAST_SIZE(xFillPolyReq); 170705b261ecSmrg 170835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 170935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 17106747b715Smrg if (result != Success) 171135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 171205b261ecSmrg 171335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 171435c4bbdfSmrg return (*SavedProcVector[X_FillPoly]) (client); 171505b261ecSmrg 171635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 171735c4bbdfSmrg client, DixReadAccess); 17186747b715Smrg if (result != Success) 171935c4bbdfSmrg return result; 172005b261ecSmrg 172135c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 172205b261ecSmrg 17236747b715Smrg count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq)); 172435c4bbdfSmrg if (count > 0) { 172535c4bbdfSmrg locPts = xallocarray(count, sizeof(DDXPointRec)); 172635c4bbdfSmrg memcpy((char *) locPts, (char *) &stuff[1], 172735c4bbdfSmrg count * sizeof(DDXPointRec)); 172835c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 172935c4bbdfSmrg 173035c4bbdfSmrg if (j) 173135c4bbdfSmrg memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec)); 173235c4bbdfSmrg 173335c4bbdfSmrg if (isRoot) { 173435c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 173535c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 173605b261ecSmrg 173735c4bbdfSmrg if (x_off || y_off) { 173835c4bbdfSmrg DDXPointPtr pnts = (DDXPointPtr) &stuff[1]; 173935c4bbdfSmrg int i = (stuff->coordMode == CoordModePrevious) ? 1 : count; 174035c4bbdfSmrg 174135c4bbdfSmrg while (i--) { 174235c4bbdfSmrg pnts->x -= x_off; 174335c4bbdfSmrg pnts->y -= y_off; 174435c4bbdfSmrg pnts++; 174535c4bbdfSmrg } 174635c4bbdfSmrg } 174735c4bbdfSmrg } 174835c4bbdfSmrg 174935c4bbdfSmrg stuff->drawable = draw->info[j].id; 175035c4bbdfSmrg stuff->gc = gc->info[j].id; 175135c4bbdfSmrg result = (*SavedProcVector[X_FillPoly]) (client); 175235c4bbdfSmrg if (result != Success) 175335c4bbdfSmrg break; 175435c4bbdfSmrg } 175535c4bbdfSmrg free(locPts); 175635c4bbdfSmrg return result; 175735c4bbdfSmrg } 175835c4bbdfSmrg else 175935c4bbdfSmrg return Success; 176035c4bbdfSmrg} 176105b261ecSmrg 176235c4bbdfSmrgint 176335c4bbdfSmrgPanoramiXPolyFillRectangle(ClientPtr client) 176405b261ecSmrg{ 176535c4bbdfSmrg int result, things, i, j; 176605b261ecSmrg PanoramiXRes *gc, *draw; 176735c4bbdfSmrg Bool isRoot; 176835c4bbdfSmrg xRectangle *origRects; 176935c4bbdfSmrg 177005b261ecSmrg REQUEST(xPolyFillRectangleReq); 177105b261ecSmrg 177205b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq); 177305b261ecSmrg 177435c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 177535c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 17766747b715Smrg if (result != Success) 177735c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 177805b261ecSmrg 177935c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 178035c4bbdfSmrg return (*SavedProcVector[X_PolyFillRectangle]) (client); 178105b261ecSmrg 178235c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 178335c4bbdfSmrg client, DixReadAccess); 17846747b715Smrg if (result != Success) 178535c4bbdfSmrg return result; 178605b261ecSmrg 178735c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 178805b261ecSmrg 178905b261ecSmrg things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq); 179035c4bbdfSmrg if (things & 4) 179135c4bbdfSmrg return BadLength; 179205b261ecSmrg things >>= 3; 179335c4bbdfSmrg if (things > 0) { 179435c4bbdfSmrg origRects = xallocarray(things, sizeof(xRectangle)); 179535c4bbdfSmrg memcpy((char *) origRects, (char *) &stuff[1], 179635c4bbdfSmrg things * sizeof(xRectangle)); 179735c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 179835c4bbdfSmrg 179935c4bbdfSmrg if (j) 180035c4bbdfSmrg memcpy(&stuff[1], origRects, things * sizeof(xRectangle)); 180105b261ecSmrg 180235c4bbdfSmrg if (isRoot) { 180335c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 180435c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 180535c4bbdfSmrg 180635c4bbdfSmrg if (x_off || y_off) { 180735c4bbdfSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 180835c4bbdfSmrg 180935c4bbdfSmrg for (i = things; i--; rects++) { 181035c4bbdfSmrg rects->x -= x_off; 181135c4bbdfSmrg rects->y -= y_off; 181235c4bbdfSmrg } 181335c4bbdfSmrg } 181435c4bbdfSmrg } 181505b261ecSmrg 181635c4bbdfSmrg stuff->drawable = draw->info[j].id; 181735c4bbdfSmrg stuff->gc = gc->info[j].id; 181835c4bbdfSmrg result = (*SavedProcVector[X_PolyFillRectangle]) (client); 181935c4bbdfSmrg if (result != Success) 182035c4bbdfSmrg break; 182135c4bbdfSmrg } 182235c4bbdfSmrg free(origRects); 182335c4bbdfSmrg return result; 182435c4bbdfSmrg } 182535c4bbdfSmrg else 182635c4bbdfSmrg return Success; 182735c4bbdfSmrg} 182835c4bbdfSmrg 182935c4bbdfSmrgint 183035c4bbdfSmrgPanoramiXPolyFillArc(ClientPtr client) 183105b261ecSmrg{ 183205b261ecSmrg PanoramiXRes *gc, *draw; 183335c4bbdfSmrg Bool isRoot; 183435c4bbdfSmrg int result, narcs, i, j; 183535c4bbdfSmrg xArc *origArcs; 183635c4bbdfSmrg 183705b261ecSmrg REQUEST(xPolyFillArcReq); 183805b261ecSmrg 183905b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillArcReq); 184005b261ecSmrg 184135c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 184235c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 18436747b715Smrg if (result != Success) 184435c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 184505b261ecSmrg 184635c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 184735c4bbdfSmrg return (*SavedProcVector[X_PolyFillArc]) (client); 184805b261ecSmrg 184935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 185035c4bbdfSmrg client, DixReadAccess); 18516747b715Smrg if (result != Success) 185235c4bbdfSmrg return result; 185305b261ecSmrg 185435c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 185505b261ecSmrg 185605b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq); 185735c4bbdfSmrg if (narcs % sizeof(xArc)) 185835c4bbdfSmrg return BadLength; 185905b261ecSmrg narcs /= sizeof(xArc); 186005b261ecSmrg if (narcs > 0) { 186135c4bbdfSmrg origArcs = xallocarray(narcs, sizeof(xArc)); 186235c4bbdfSmrg memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); 186335c4bbdfSmrg FOR_NSCREENS_FORWARD(j) { 186435c4bbdfSmrg 186535c4bbdfSmrg if (j) 186635c4bbdfSmrg memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 186735c4bbdfSmrg 186835c4bbdfSmrg if (isRoot) { 186935c4bbdfSmrg int x_off = screenInfo.screens[j]->x; 187035c4bbdfSmrg int y_off = screenInfo.screens[j]->y; 187105b261ecSmrg 187235c4bbdfSmrg if (x_off || y_off) { 187335c4bbdfSmrg xArc *arcs = (xArc *) &stuff[1]; 187435c4bbdfSmrg 187535c4bbdfSmrg for (i = narcs; i--; arcs++) { 187635c4bbdfSmrg arcs->x -= x_off; 187735c4bbdfSmrg arcs->y -= y_off; 187835c4bbdfSmrg } 187935c4bbdfSmrg } 188035c4bbdfSmrg } 188105b261ecSmrg 188235c4bbdfSmrg stuff->drawable = draw->info[j].id; 188335c4bbdfSmrg stuff->gc = gc->info[j].id; 188435c4bbdfSmrg result = (*SavedProcVector[X_PolyFillArc]) (client); 188535c4bbdfSmrg if (result != Success) 188635c4bbdfSmrg break; 188735c4bbdfSmrg } 188835c4bbdfSmrg free(origArcs); 188935c4bbdfSmrg return result; 189035c4bbdfSmrg } 189135c4bbdfSmrg else 189235c4bbdfSmrg return Success; 189335c4bbdfSmrg} 189435c4bbdfSmrg 189535c4bbdfSmrgint 189635c4bbdfSmrgPanoramiXPutImage(ClientPtr client) 189705b261ecSmrg{ 189805b261ecSmrg PanoramiXRes *gc, *draw; 189935c4bbdfSmrg Bool isRoot; 190035c4bbdfSmrg int j, result, orig_x, orig_y; 190135c4bbdfSmrg 190205b261ecSmrg REQUEST(xPutImageReq); 190305b261ecSmrg 190405b261ecSmrg REQUEST_AT_LEAST_SIZE(xPutImageReq); 190505b261ecSmrg 190635c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 190735c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 19086747b715Smrg if (result != Success) 190935c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 191005b261ecSmrg 191135c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 191235c4bbdfSmrg return (*SavedProcVector[X_PutImage]) (client); 191305b261ecSmrg 191435c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 191535c4bbdfSmrg client, DixReadAccess); 19166747b715Smrg if (result != Success) 191735c4bbdfSmrg return result; 191805b261ecSmrg 191935c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 192005b261ecSmrg 192105b261ecSmrg orig_x = stuff->dstX; 192205b261ecSmrg orig_y = stuff->dstY; 192335c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 192435c4bbdfSmrg if (isRoot) { 192535c4bbdfSmrg stuff->dstX = orig_x - screenInfo.screens[j]->x; 192635c4bbdfSmrg stuff->dstY = orig_y - screenInfo.screens[j]->y; 192735c4bbdfSmrg } 192835c4bbdfSmrg stuff->drawable = draw->info[j].id; 192935c4bbdfSmrg stuff->gc = gc->info[j].id; 193035c4bbdfSmrg result = (*SavedProcVector[X_PutImage]) (client); 193135c4bbdfSmrg if (result != Success) 193235c4bbdfSmrg break; 193305b261ecSmrg } 19346747b715Smrg return result; 193505b261ecSmrg} 193605b261ecSmrg 193735c4bbdfSmrgint 193835c4bbdfSmrgPanoramiXGetImage(ClientPtr client) 193905b261ecSmrg{ 194035c4bbdfSmrg DrawablePtr drawables[MAXSCREENS]; 194135c4bbdfSmrg DrawablePtr pDraw; 194235c4bbdfSmrg PanoramiXRes *draw; 194335c4bbdfSmrg xGetImageReply xgi; 194435c4bbdfSmrg Bool isRoot; 194535c4bbdfSmrg char *pBuf; 194635c4bbdfSmrg int i, x, y, w, h, format, rc; 194735c4bbdfSmrg Mask plane = 0, planemask; 194835c4bbdfSmrg int linesDone, nlines, linesPerBuf; 194935c4bbdfSmrg long widthBytesLine, length; 195005b261ecSmrg 195105b261ecSmrg REQUEST(xGetImageReq); 195205b261ecSmrg 195305b261ecSmrg REQUEST_SIZE_MATCH(xGetImageReq); 195405b261ecSmrg 195505b261ecSmrg if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) { 195635c4bbdfSmrg client->errorValue = stuff->format; 19576747b715Smrg return BadValue; 195805b261ecSmrg } 195905b261ecSmrg 196035c4bbdfSmrg rc = dixLookupResourceByClass((void **) &draw, stuff->drawable, 196135c4bbdfSmrg XRC_DRAWABLE, client, DixReadAccess); 19626747b715Smrg if (rc != Success) 196335c4bbdfSmrg return (rc == BadValue) ? BadDrawable : rc; 196405b261ecSmrg 196535c4bbdfSmrg if (draw->type == XRT_PIXMAP) 196635c4bbdfSmrg return (*SavedProcVector[X_GetImage]) (client); 196705b261ecSmrg 196835c4bbdfSmrg rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReadAccess); 196905b261ecSmrg if (rc != Success) 197035c4bbdfSmrg return rc; 197105b261ecSmrg 197235c4bbdfSmrg if (!((WindowPtr) pDraw)->realized) 197335c4bbdfSmrg return BadMatch; 197405b261ecSmrg 197505b261ecSmrg x = stuff->x; 197605b261ecSmrg y = stuff->y; 197705b261ecSmrg w = stuff->width; 197805b261ecSmrg h = stuff->height; 197905b261ecSmrg format = stuff->format; 198005b261ecSmrg planemask = stuff->planeMask; 198105b261ecSmrg 198235c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 198305b261ecSmrg 198435c4bbdfSmrg if (isRoot) { 198535c4bbdfSmrg /* check for being onscreen */ 198635c4bbdfSmrg if (x < 0 || x + w > PanoramiXPixWidth || 198735c4bbdfSmrg y < 0 || y + h > PanoramiXPixHeight) 198835c4bbdfSmrg return BadMatch; 198935c4bbdfSmrg } 199035c4bbdfSmrg else { 199135c4bbdfSmrg /* check for being onscreen and inside of border */ 199235c4bbdfSmrg if (screenInfo.screens[0]->x + pDraw->x + x < 0 || 199335c4bbdfSmrg screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth || 199435c4bbdfSmrg screenInfo.screens[0]->y + pDraw->y + y < 0 || 199535c4bbdfSmrg screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight || 199635c4bbdfSmrg x < -wBorderWidth((WindowPtr) pDraw) || 199735c4bbdfSmrg x + w > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->width || 199835c4bbdfSmrg y < -wBorderWidth((WindowPtr) pDraw) || 199935c4bbdfSmrg y + h > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->height) 200035c4bbdfSmrg return BadMatch; 200105b261ecSmrg } 200205b261ecSmrg 200305b261ecSmrg drawables[0] = pDraw; 200435c4bbdfSmrg FOR_NSCREENS_FORWARD_SKIP(i) { 200535c4bbdfSmrg rc = dixLookupDrawable(drawables + i, draw->info[i].id, client, 0, 200635c4bbdfSmrg DixGetAttrAccess); 200735c4bbdfSmrg if (rc != Success) 200835c4bbdfSmrg return rc; 200905b261ecSmrg } 201005b261ecSmrg 201135c4bbdfSmrg xgi = (xGetImageReply) { 201235c4bbdfSmrg .type = X_Reply, 201335c4bbdfSmrg .sequenceNumber = client->sequence, 201435c4bbdfSmrg .visual = wVisual(((WindowPtr) pDraw)), 201535c4bbdfSmrg .depth = pDraw->depth 201635c4bbdfSmrg }; 201735c4bbdfSmrg if (format == ZPixmap) { 201835c4bbdfSmrg widthBytesLine = PixmapBytePad(w, pDraw->depth); 201935c4bbdfSmrg length = widthBytesLine * h; 202005b261ecSmrg 202135c4bbdfSmrg } 202235c4bbdfSmrg else { 202335c4bbdfSmrg widthBytesLine = BitmapBytePad(w); 202435c4bbdfSmrg plane = ((Mask) 1) << (pDraw->depth - 1); 202535c4bbdfSmrg /* only planes asked for */ 202635c4bbdfSmrg length = widthBytesLine * h * Ones(planemask & (plane | (plane - 1))); 202705b261ecSmrg 202805b261ecSmrg } 202905b261ecSmrg 20306747b715Smrg xgi.length = bytes_to_int32(length); 203105b261ecSmrg 203205b261ecSmrg if (widthBytesLine == 0 || h == 0) 203335c4bbdfSmrg linesPerBuf = 0; 203405b261ecSmrg else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE) 203535c4bbdfSmrg linesPerBuf = 1; 203605b261ecSmrg else { 203735c4bbdfSmrg linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine; 203835c4bbdfSmrg if (linesPerBuf > h) 203935c4bbdfSmrg linesPerBuf = h; 204005b261ecSmrg } 204135c4bbdfSmrg if (!(pBuf = xallocarray(linesPerBuf, widthBytesLine))) 204235c4bbdfSmrg return BadAlloc; 204305b261ecSmrg 204435c4bbdfSmrg WriteReplyToClient(client, sizeof(xGetImageReply), &xgi); 204505b261ecSmrg 204605b261ecSmrg if (linesPerBuf == 0) { 204735c4bbdfSmrg /* nothing to do */ 204805b261ecSmrg } 204905b261ecSmrg else if (format == ZPixmap) { 205005b261ecSmrg linesDone = 0; 205105b261ecSmrg while (h - linesDone > 0) { 205235c4bbdfSmrg nlines = min(linesPerBuf, h - linesDone); 205305b261ecSmrg 205435c4bbdfSmrg if (pDraw->depth == 1) 205535c4bbdfSmrg memset(pBuf, 0, nlines * widthBytesLine); 205605b261ecSmrg 205735c4bbdfSmrg XineramaGetImageData(drawables, x, y + linesDone, w, nlines, 205835c4bbdfSmrg format, planemask, pBuf, widthBytesLine, 205935c4bbdfSmrg isRoot); 206005b261ecSmrg 206135c4bbdfSmrg WriteToClient(client, (int) (nlines * widthBytesLine), pBuf); 206235c4bbdfSmrg linesDone += nlines; 206305b261ecSmrg } 206435c4bbdfSmrg } 206535c4bbdfSmrg else { /* XYPixmap */ 206605b261ecSmrg for (; plane; plane >>= 1) { 206735c4bbdfSmrg if (planemask & plane) { 206835c4bbdfSmrg linesDone = 0; 206935c4bbdfSmrg while (h - linesDone > 0) { 207035c4bbdfSmrg nlines = min(linesPerBuf, h - linesDone); 207105b261ecSmrg 207235c4bbdfSmrg memset(pBuf, 0, nlines * widthBytesLine); 207305b261ecSmrg 207435c4bbdfSmrg XineramaGetImageData(drawables, x, y + linesDone, w, 207535c4bbdfSmrg nlines, format, plane, pBuf, 207635c4bbdfSmrg widthBytesLine, isRoot); 207705b261ecSmrg 207835c4bbdfSmrg WriteToClient(client, (int)(nlines * widthBytesLine), pBuf); 207905b261ecSmrg 208035c4bbdfSmrg linesDone += nlines; 208135c4bbdfSmrg } 208205b261ecSmrg } 208335c4bbdfSmrg } 208405b261ecSmrg } 20856747b715Smrg free(pBuf); 20866747b715Smrg return Success; 208705b261ecSmrg} 208805b261ecSmrg 208905b261ecSmrg/* The text stuff should be rewritten so that duplication happens 209005b261ecSmrg at the GlyphBlt level. That is, loading the font and getting 209105b261ecSmrg the glyphs should only happen once */ 209205b261ecSmrg 209335c4bbdfSmrgint 209405b261ecSmrgPanoramiXPolyText8(ClientPtr client) 209505b261ecSmrg{ 209605b261ecSmrg PanoramiXRes *gc, *draw; 209735c4bbdfSmrg Bool isRoot; 209835c4bbdfSmrg int result, j; 209935c4bbdfSmrg int orig_x, orig_y; 210035c4bbdfSmrg 210105b261ecSmrg REQUEST(xPolyTextReq); 210205b261ecSmrg 210305b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 210405b261ecSmrg 210535c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 210635c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 21076747b715Smrg if (result != Success) 210835c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 210905b261ecSmrg 211035c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 211135c4bbdfSmrg return (*SavedProcVector[X_PolyText8]) (client); 211205b261ecSmrg 211335c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 211435c4bbdfSmrg client, DixReadAccess); 21156747b715Smrg if (result != Success) 211635c4bbdfSmrg return result; 211705b261ecSmrg 211835c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 211905b261ecSmrg 212005b261ecSmrg orig_x = stuff->x; 212105b261ecSmrg orig_y = stuff->y; 212235c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 212335c4bbdfSmrg stuff->drawable = draw->info[j].id; 212435c4bbdfSmrg stuff->gc = gc->info[j].id; 212535c4bbdfSmrg if (isRoot) { 212635c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 212735c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 212835c4bbdfSmrg } 212935c4bbdfSmrg result = (*SavedProcVector[X_PolyText8]) (client); 213035c4bbdfSmrg if (result != Success) 213135c4bbdfSmrg break; 213205b261ecSmrg } 21336747b715Smrg return result; 213405b261ecSmrg} 213505b261ecSmrg 213635c4bbdfSmrgint 213705b261ecSmrgPanoramiXPolyText16(ClientPtr client) 213805b261ecSmrg{ 213905b261ecSmrg PanoramiXRes *gc, *draw; 214035c4bbdfSmrg Bool isRoot; 214135c4bbdfSmrg int result, j; 214235c4bbdfSmrg int orig_x, orig_y; 214335c4bbdfSmrg 214405b261ecSmrg REQUEST(xPolyTextReq); 214505b261ecSmrg 214605b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 214705b261ecSmrg 214835c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 214935c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 21506747b715Smrg if (result != Success) 215135c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 215205b261ecSmrg 215335c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 215435c4bbdfSmrg return (*SavedProcVector[X_PolyText16]) (client); 215505b261ecSmrg 215635c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 215735c4bbdfSmrg client, DixReadAccess); 21586747b715Smrg if (result != Success) 215935c4bbdfSmrg return result; 216005b261ecSmrg 216135c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 216205b261ecSmrg 216305b261ecSmrg orig_x = stuff->x; 216405b261ecSmrg orig_y = stuff->y; 216535c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 216635c4bbdfSmrg stuff->drawable = draw->info[j].id; 216735c4bbdfSmrg stuff->gc = gc->info[j].id; 216835c4bbdfSmrg if (isRoot) { 216935c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 217035c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 217135c4bbdfSmrg } 217235c4bbdfSmrg result = (*SavedProcVector[X_PolyText16]) (client); 217335c4bbdfSmrg if (result != Success) 217435c4bbdfSmrg break; 217505b261ecSmrg } 21766747b715Smrg return result; 217705b261ecSmrg} 217805b261ecSmrg 217935c4bbdfSmrgint 218035c4bbdfSmrgPanoramiXImageText8(ClientPtr client) 218105b261ecSmrg{ 218235c4bbdfSmrg int result, j; 218305b261ecSmrg PanoramiXRes *gc, *draw; 218435c4bbdfSmrg Bool isRoot; 218535c4bbdfSmrg int orig_x, orig_y; 218635c4bbdfSmrg 218705b261ecSmrg REQUEST(xImageTextReq); 218805b261ecSmrg 218905b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars); 219005b261ecSmrg 219135c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 219235c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 21936747b715Smrg if (result != Success) 219435c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 219505b261ecSmrg 219635c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 219735c4bbdfSmrg return (*SavedProcVector[X_ImageText8]) (client); 219805b261ecSmrg 219935c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 220035c4bbdfSmrg client, DixReadAccess); 22016747b715Smrg if (result != Success) 220235c4bbdfSmrg return result; 220305b261ecSmrg 220435c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 220505b261ecSmrg 220605b261ecSmrg orig_x = stuff->x; 220705b261ecSmrg orig_y = stuff->y; 220835c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 220935c4bbdfSmrg stuff->drawable = draw->info[j].id; 221035c4bbdfSmrg stuff->gc = gc->info[j].id; 221135c4bbdfSmrg if (isRoot) { 221235c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 221335c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 221435c4bbdfSmrg } 221535c4bbdfSmrg result = (*SavedProcVector[X_ImageText8]) (client); 221635c4bbdfSmrg if (result != Success) 221735c4bbdfSmrg break; 221805b261ecSmrg } 22196747b715Smrg return result; 222005b261ecSmrg} 222105b261ecSmrg 222235c4bbdfSmrgint 222335c4bbdfSmrgPanoramiXImageText16(ClientPtr client) 222405b261ecSmrg{ 222535c4bbdfSmrg int result, j; 222605b261ecSmrg PanoramiXRes *gc, *draw; 222735c4bbdfSmrg Bool isRoot; 222835c4bbdfSmrg int orig_x, orig_y; 222935c4bbdfSmrg 223005b261ecSmrg REQUEST(xImageTextReq); 223105b261ecSmrg 223205b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1); 223305b261ecSmrg 223435c4bbdfSmrg result = dixLookupResourceByClass((void **) &draw, stuff->drawable, 223535c4bbdfSmrg XRC_DRAWABLE, client, DixWriteAccess); 22366747b715Smrg if (result != Success) 223735c4bbdfSmrg return (result == BadValue) ? BadDrawable : result; 223805b261ecSmrg 223935c4bbdfSmrg if (IS_SHARED_PIXMAP(draw)) 224035c4bbdfSmrg return (*SavedProcVector[X_ImageText16]) (client); 224105b261ecSmrg 224235c4bbdfSmrg result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC, 224335c4bbdfSmrg client, DixReadAccess); 22446747b715Smrg if (result != Success) 224535c4bbdfSmrg return result; 224605b261ecSmrg 224735c4bbdfSmrg isRoot = IS_ROOT_DRAWABLE(draw); 224805b261ecSmrg 224905b261ecSmrg orig_x = stuff->x; 225005b261ecSmrg orig_y = stuff->y; 225135c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 225235c4bbdfSmrg stuff->drawable = draw->info[j].id; 225335c4bbdfSmrg stuff->gc = gc->info[j].id; 225435c4bbdfSmrg if (isRoot) { 225535c4bbdfSmrg stuff->x = orig_x - screenInfo.screens[j]->x; 225635c4bbdfSmrg stuff->y = orig_y - screenInfo.screens[j]->y; 225735c4bbdfSmrg } 225835c4bbdfSmrg result = (*SavedProcVector[X_ImageText16]) (client); 225935c4bbdfSmrg if (result != Success) 226035c4bbdfSmrg break; 226105b261ecSmrg } 22626747b715Smrg return result; 226305b261ecSmrg} 226405b261ecSmrg 226535c4bbdfSmrgint 226635c4bbdfSmrgPanoramiXCreateColormap(ClientPtr client) 226705b261ecSmrg{ 226835c4bbdfSmrg PanoramiXRes *win, *newCmap; 226935c4bbdfSmrg int result, j, orig_visual; 227035c4bbdfSmrg 227105b261ecSmrg REQUEST(xCreateColormapReq); 227205b261ecSmrg 227305b261ecSmrg REQUEST_SIZE_MATCH(xCreateColormapReq); 227405b261ecSmrg 227535c4bbdfSmrg result = dixLookupResourceByType((void **) &win, stuff->window, 227635c4bbdfSmrg XRT_WINDOW, client, DixReadAccess); 22776747b715Smrg if (result != Success) 227835c4bbdfSmrg return result; 227905b261ecSmrg 228035c4bbdfSmrg if (!(newCmap = malloc(sizeof(PanoramiXRes)))) 228105b261ecSmrg return BadAlloc; 228205b261ecSmrg 228305b261ecSmrg newCmap->type = XRT_COLORMAP; 228435c4bbdfSmrg panoramix_setup_ids(newCmap, client, stuff->mid); 228505b261ecSmrg 228605b261ecSmrg orig_visual = stuff->visual; 228735c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 228835c4bbdfSmrg stuff->mid = newCmap->info[j].id; 228935c4bbdfSmrg stuff->window = win->info[j].id; 229035c4bbdfSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 229135c4bbdfSmrg result = (*SavedProcVector[X_CreateColormap]) (client); 229235c4bbdfSmrg if (result != Success) 229335c4bbdfSmrg break; 229435c4bbdfSmrg } 229535c4bbdfSmrg 229605b261ecSmrg if (result == Success) 229705b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 229835c4bbdfSmrg else 22996747b715Smrg free(newCmap); 230005b261ecSmrg 23016747b715Smrg return result; 230205b261ecSmrg} 230305b261ecSmrg 230435c4bbdfSmrgint 230535c4bbdfSmrgPanoramiXFreeColormap(ClientPtr client) 230605b261ecSmrg{ 230705b261ecSmrg PanoramiXRes *cmap; 230835c4bbdfSmrg int result, j; 230935c4bbdfSmrg 231005b261ecSmrg REQUEST(xResourceReq); 231105b261ecSmrg 231205b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 231305b261ecSmrg 231405b261ecSmrg client->errorValue = stuff->id; 231505b261ecSmrg 231635c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP, 231735c4bbdfSmrg client, DixDestroyAccess); 23186747b715Smrg if (result != Success) 23196747b715Smrg return result; 232005b261ecSmrg 232105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 232205b261ecSmrg stuff->id = cmap->info[j].id; 232335c4bbdfSmrg result = (*SavedProcVector[X_FreeColormap]) (client); 232435c4bbdfSmrg if (result != Success) 232535c4bbdfSmrg break; 232605b261ecSmrg } 232705b261ecSmrg 232805b261ecSmrg /* Since ProcFreeColormap is using FreeResource, it will free 232935c4bbdfSmrg our resource for us on the last pass through the loop above */ 233005b261ecSmrg 23316747b715Smrg return result; 233205b261ecSmrg} 233305b261ecSmrg 233405b261ecSmrgint 233505b261ecSmrgPanoramiXCopyColormapAndFree(ClientPtr client) 233605b261ecSmrg{ 233705b261ecSmrg PanoramiXRes *cmap, *newCmap; 233835c4bbdfSmrg int result, j; 233935c4bbdfSmrg 234005b261ecSmrg REQUEST(xCopyColormapAndFreeReq); 234105b261ecSmrg 234205b261ecSmrg REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq); 234305b261ecSmrg 234405b261ecSmrg client->errorValue = stuff->srcCmap; 234505b261ecSmrg 234635c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->srcCmap, 234735c4bbdfSmrg XRT_COLORMAP, client, 234835c4bbdfSmrg DixReadAccess | DixWriteAccess); 23496747b715Smrg if (result != Success) 23506747b715Smrg return result; 235105b261ecSmrg 235235c4bbdfSmrg if (!(newCmap = malloc(sizeof(PanoramiXRes)))) 235305b261ecSmrg return BadAlloc; 235405b261ecSmrg 235505b261ecSmrg newCmap->type = XRT_COLORMAP; 235635c4bbdfSmrg panoramix_setup_ids(newCmap, client, stuff->mid); 235705b261ecSmrg 235835c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 235905b261ecSmrg stuff->srcCmap = cmap->info[j].id; 236035c4bbdfSmrg stuff->mid = newCmap->info[j].id; 236135c4bbdfSmrg result = (*SavedProcVector[X_CopyColormapAndFree]) (client); 236235c4bbdfSmrg if (result != Success) 236335c4bbdfSmrg break; 236405b261ecSmrg } 236505b261ecSmrg 236605b261ecSmrg if (result == Success) 236705b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 236835c4bbdfSmrg else 23696747b715Smrg free(newCmap); 237005b261ecSmrg 23716747b715Smrg return result; 237205b261ecSmrg} 237305b261ecSmrg 237435c4bbdfSmrgint 237535c4bbdfSmrgPanoramiXInstallColormap(ClientPtr client) 237605b261ecSmrg{ 237705b261ecSmrg REQUEST(xResourceReq); 237835c4bbdfSmrg int result, j; 237905b261ecSmrg PanoramiXRes *cmap; 238005b261ecSmrg 238105b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 238205b261ecSmrg 238305b261ecSmrg client->errorValue = stuff->id; 238405b261ecSmrg 238535c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP, 238635c4bbdfSmrg client, DixReadAccess); 23876747b715Smrg if (result != Success) 23886747b715Smrg return result; 238905b261ecSmrg 239035c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 239135c4bbdfSmrg stuff->id = cmap->info[j].id; 239235c4bbdfSmrg result = (*SavedProcVector[X_InstallColormap]) (client); 239335c4bbdfSmrg if (result != Success) 239435c4bbdfSmrg break; 239505b261ecSmrg } 23966747b715Smrg return result; 239705b261ecSmrg} 239805b261ecSmrg 239935c4bbdfSmrgint 240035c4bbdfSmrgPanoramiXUninstallColormap(ClientPtr client) 240105b261ecSmrg{ 240205b261ecSmrg REQUEST(xResourceReq); 240335c4bbdfSmrg int result, j; 240405b261ecSmrg PanoramiXRes *cmap; 240505b261ecSmrg 240605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 240735c4bbdfSmrg 240805b261ecSmrg client->errorValue = stuff->id; 240905b261ecSmrg 241035c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP, 241135c4bbdfSmrg client, DixReadAccess); 24126747b715Smrg if (result != Success) 24136747b715Smrg return result; 241405b261ecSmrg 241505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 241635c4bbdfSmrg stuff->id = cmap->info[j].id; 241735c4bbdfSmrg result = (*SavedProcVector[X_UninstallColormap]) (client); 241835c4bbdfSmrg if (result != Success) 241935c4bbdfSmrg break; 242005b261ecSmrg } 24216747b715Smrg return result; 242205b261ecSmrg} 242305b261ecSmrg 242435c4bbdfSmrgint 242535c4bbdfSmrgPanoramiXAllocColor(ClientPtr client) 242605b261ecSmrg{ 242735c4bbdfSmrg int result, j; 242805b261ecSmrg PanoramiXRes *cmap; 242935c4bbdfSmrg 243005b261ecSmrg REQUEST(xAllocColorReq); 243105b261ecSmrg 243205b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorReq); 243305b261ecSmrg 243405b261ecSmrg client->errorValue = stuff->cmap; 243505b261ecSmrg 243635c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 243735c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24386747b715Smrg if (result != Success) 24396747b715Smrg return result; 244005b261ecSmrg 244135c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 244235c4bbdfSmrg stuff->cmap = cmap->info[j].id; 244335c4bbdfSmrg result = (*SavedProcVector[X_AllocColor]) (client); 244435c4bbdfSmrg if (result != Success) 244535c4bbdfSmrg break; 244605b261ecSmrg } 24476747b715Smrg return result; 244805b261ecSmrg} 244905b261ecSmrg 245035c4bbdfSmrgint 245135c4bbdfSmrgPanoramiXAllocNamedColor(ClientPtr client) 245205b261ecSmrg{ 245335c4bbdfSmrg int result, j; 245435c4bbdfSmrg PanoramiXRes *cmap; 245535c4bbdfSmrg 245605b261ecSmrg REQUEST(xAllocNamedColorReq); 245705b261ecSmrg 245805b261ecSmrg REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes); 245905b261ecSmrg 246005b261ecSmrg client->errorValue = stuff->cmap; 246105b261ecSmrg 246235c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 246335c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24646747b715Smrg if (result != Success) 24656747b715Smrg return result; 246605b261ecSmrg 246735c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 246805b261ecSmrg stuff->cmap = cmap->info[j].id; 246935c4bbdfSmrg result = (*SavedProcVector[X_AllocNamedColor]) (client); 247035c4bbdfSmrg if (result != Success) 247135c4bbdfSmrg break; 247205b261ecSmrg } 24736747b715Smrg return result; 247405b261ecSmrg} 247505b261ecSmrg 247635c4bbdfSmrgint 247735c4bbdfSmrgPanoramiXAllocColorCells(ClientPtr client) 247805b261ecSmrg{ 247935c4bbdfSmrg int result, j; 248035c4bbdfSmrg PanoramiXRes *cmap; 248135c4bbdfSmrg 248205b261ecSmrg REQUEST(xAllocColorCellsReq); 248305b261ecSmrg 248405b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorCellsReq); 248505b261ecSmrg 248605b261ecSmrg client->errorValue = stuff->cmap; 248705b261ecSmrg 248835c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 248935c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 24906747b715Smrg if (result != Success) 24916747b715Smrg return result; 249235c4bbdfSmrg 249335c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 249435c4bbdfSmrg stuff->cmap = cmap->info[j].id; 249535c4bbdfSmrg result = (*SavedProcVector[X_AllocColorCells]) (client); 249635c4bbdfSmrg if (result != Success) 249735c4bbdfSmrg break; 249805b261ecSmrg } 24996747b715Smrg return result; 250005b261ecSmrg} 250105b261ecSmrg 250235c4bbdfSmrgint 250335c4bbdfSmrgPanoramiXAllocColorPlanes(ClientPtr client) 250405b261ecSmrg{ 250535c4bbdfSmrg int result, j; 250635c4bbdfSmrg PanoramiXRes *cmap; 250735c4bbdfSmrg 250805b261ecSmrg REQUEST(xAllocColorPlanesReq); 250905b261ecSmrg 251005b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorPlanesReq); 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; 251835c4bbdfSmrg 251935c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 252035c4bbdfSmrg stuff->cmap = cmap->info[j].id; 252135c4bbdfSmrg result = (*SavedProcVector[X_AllocColorPlanes]) (client); 252235c4bbdfSmrg if (result != Success) 252335c4bbdfSmrg break; 252405b261ecSmrg } 25256747b715Smrg return result; 252605b261ecSmrg} 252705b261ecSmrg 252835c4bbdfSmrgint 252935c4bbdfSmrgPanoramiXFreeColors(ClientPtr client) 253005b261ecSmrg{ 253135c4bbdfSmrg int result, j; 253235c4bbdfSmrg PanoramiXRes *cmap; 253335c4bbdfSmrg 253405b261ecSmrg REQUEST(xFreeColorsReq); 253505b261ecSmrg 253605b261ecSmrg REQUEST_AT_LEAST_SIZE(xFreeColorsReq); 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 254505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 254605b261ecSmrg stuff->cmap = cmap->info[j].id; 254735c4bbdfSmrg result = (*SavedProcVector[X_FreeColors]) (client); 254805b261ecSmrg } 25496747b715Smrg return result; 255005b261ecSmrg} 255105b261ecSmrg 255235c4bbdfSmrgint 255335c4bbdfSmrgPanoramiXStoreColors(ClientPtr client) 255405b261ecSmrg{ 255535c4bbdfSmrg int result, j; 255635c4bbdfSmrg PanoramiXRes *cmap; 255735c4bbdfSmrg 255805b261ecSmrg REQUEST(xStoreColorsReq); 255905b261ecSmrg 256005b261ecSmrg REQUEST_AT_LEAST_SIZE(xStoreColorsReq); 256105b261ecSmrg 256205b261ecSmrg client->errorValue = stuff->cmap; 256305b261ecSmrg 256435c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 256535c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 25666747b715Smrg if (result != Success) 25676747b715Smrg return result; 256805b261ecSmrg 256935c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 257035c4bbdfSmrg stuff->cmap = cmap->info[j].id; 257135c4bbdfSmrg result = (*SavedProcVector[X_StoreColors]) (client); 257235c4bbdfSmrg if (result != Success) 257335c4bbdfSmrg break; 257405b261ecSmrg } 25756747b715Smrg return result; 257605b261ecSmrg} 257705b261ecSmrg 257835c4bbdfSmrgint 257935c4bbdfSmrgPanoramiXStoreNamedColor(ClientPtr client) 258005b261ecSmrg{ 258135c4bbdfSmrg int result, j; 258235c4bbdfSmrg PanoramiXRes *cmap; 258335c4bbdfSmrg 258405b261ecSmrg REQUEST(xStoreNamedColorReq); 258505b261ecSmrg 258605b261ecSmrg REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes); 258705b261ecSmrg 258805b261ecSmrg client->errorValue = stuff->cmap; 258905b261ecSmrg 259035c4bbdfSmrg result = dixLookupResourceByType((void **) &cmap, stuff->cmap, 259135c4bbdfSmrg XRT_COLORMAP, client, DixWriteAccess); 25926747b715Smrg if (result != Success) 25936747b715Smrg return result; 259405b261ecSmrg 259535c4bbdfSmrg FOR_NSCREENS_BACKWARD(j) { 259635c4bbdfSmrg stuff->cmap = cmap->info[j].id; 259735c4bbdfSmrg result = (*SavedProcVector[X_StoreNamedColor]) (client); 259835c4bbdfSmrg if (result != Success) 259935c4bbdfSmrg break; 260005b261ecSmrg } 26016747b715Smrg return result; 260205b261ecSmrg} 2603