1706f2543Smrg/* 2706f2543Smrg * Minimal implementation of PanoramiX/Xinerama 3706f2543Smrg * 4706f2543Smrg * This is used in rootless mode where the underlying window server 5706f2543Smrg * already provides an abstracted view of multiple screens as one 6706f2543Smrg * large screen area. 7706f2543Smrg * 8706f2543Smrg * This code is largely based on panoramiX.c, which contains the 9706f2543Smrg * following copyright notice: 10706f2543Smrg */ 11706f2543Smrg/***************************************************************** 12706f2543SmrgCopyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts. 13706f2543SmrgPermission is hereby granted, free of charge, to any person obtaining a copy 14706f2543Smrgof this software and associated documentation files (the "Software"), to deal 15706f2543Smrgin the Software without restriction, including without limitation the rights 16706f2543Smrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17706f2543Smrgcopies of the Software. 18706f2543Smrg 19706f2543SmrgThe above copyright notice and this permission notice shall be included in 20706f2543Smrgall copies or substantial portions of the Software. 21706f2543Smrg 22706f2543SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23706f2543SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24706f2543SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25706f2543SmrgDIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING, 26706f2543SmrgBUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY, 27706f2543SmrgWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 28706f2543SmrgIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29706f2543Smrg 30706f2543SmrgExcept as contained in this notice, the name of Digital Equipment Corporation 31706f2543Smrgshall not be used in advertising or otherwise to promote the sale, use or other 32706f2543Smrgdealings in this Software without prior written authorization from Digital 33706f2543SmrgEquipment Corporation. 34706f2543Smrg******************************************************************/ 35706f2543Smrg 36706f2543Smrg#ifdef HAVE_DIX_CONFIG_H 37706f2543Smrg#include <dix-config.h> 38706f2543Smrg#endif 39706f2543Smrg 40706f2543Smrg#include "darwin.h" 41706f2543Smrg#include "pseudoramiX.h" 42706f2543Smrg#include "extnsionst.h" 43706f2543Smrg#include "dixstruct.h" 44706f2543Smrg#include "window.h" 45706f2543Smrg#include <X11/extensions/panoramiXproto.h> 46706f2543Smrg#include "globals.h" 47706f2543Smrg 48706f2543SmrgBool noPseudoramiXExtension = FALSE; 49706f2543Smrg 50706f2543Smrgextern int ProcPanoramiXQueryVersion (ClientPtr client); 51706f2543Smrg 52706f2543Smrgstatic void PseudoramiXResetProc(ExtensionEntry *extEntry); 53706f2543Smrg 54706f2543Smrgstatic int ProcPseudoramiXQueryVersion(ClientPtr client); 55706f2543Smrgstatic int ProcPseudoramiXGetState(ClientPtr client); 56706f2543Smrgstatic int ProcPseudoramiXGetScreenCount(ClientPtr client); 57706f2543Smrgstatic int ProcPseudoramiXGetScreenSize(ClientPtr client); 58706f2543Smrgstatic int ProcPseudoramiXIsActive(ClientPtr client); 59706f2543Smrgstatic int ProcPseudoramiXQueryScreens(ClientPtr client); 60706f2543Smrgstatic int ProcPseudoramiXDispatch(ClientPtr client); 61706f2543Smrg 62706f2543Smrgstatic int SProcPseudoramiXQueryVersion(ClientPtr client); 63706f2543Smrgstatic int SProcPseudoramiXGetState(ClientPtr client); 64706f2543Smrgstatic int SProcPseudoramiXGetScreenCount(ClientPtr client); 65706f2543Smrgstatic int SProcPseudoramiXGetScreenSize(ClientPtr client); 66706f2543Smrgstatic int SProcPseudoramiXIsActive(ClientPtr client); 67706f2543Smrgstatic int SProcPseudoramiXQueryScreens(ClientPtr client); 68706f2543Smrgstatic int SProcPseudoramiXDispatch(ClientPtr client); 69706f2543Smrg 70706f2543Smrg 71706f2543Smrgtypedef struct { 72706f2543Smrg int x; 73706f2543Smrg int y; 74706f2543Smrg int w; 75706f2543Smrg int h; 76706f2543Smrg} PseudoramiXScreenRec; 77706f2543Smrg 78706f2543Smrgstatic PseudoramiXScreenRec *pseudoramiXScreens = NULL; 79706f2543Smrgstatic int pseudoramiXScreensAllocated = 0; 80706f2543Smrgstatic int pseudoramiXNumScreens = 0; 81706f2543Smrgstatic unsigned long pseudoramiXGeneration = 0; 82706f2543Smrg 83706f2543Smrg 84706f2543Smrg// Add a PseudoramiX screen. 85706f2543Smrg// The rest of the X server will know nothing about this screen. 86706f2543Smrg// Can be called before or after extension init. 87706f2543Smrg// Screens must be re-added once per generation. 88706f2543Smrgvoid 89706f2543SmrgPseudoramiXAddScreen(int x, int y, int w, int h) 90706f2543Smrg{ 91706f2543Smrg PseudoramiXScreenRec *s; 92706f2543Smrg 93706f2543Smrg if (noPseudoramiXExtension) return; 94706f2543Smrg 95706f2543Smrg if (pseudoramiXNumScreens == pseudoramiXScreensAllocated) { 96706f2543Smrg pseudoramiXScreensAllocated += pseudoramiXScreensAllocated + 1; 97706f2543Smrg pseudoramiXScreens = realloc(pseudoramiXScreens, 98706f2543Smrg pseudoramiXScreensAllocated * 99706f2543Smrg sizeof(PseudoramiXScreenRec)); 100706f2543Smrg } 101706f2543Smrg 102706f2543Smrg DEBUG_LOG("x: %d, y: %d, w: %d, h: %d\n", x, y, w, h); 103706f2543Smrg 104706f2543Smrg s = &pseudoramiXScreens[pseudoramiXNumScreens++]; 105706f2543Smrg s->x = x; 106706f2543Smrg s->y = y; 107706f2543Smrg s->w = w; 108706f2543Smrg s->h = h; 109706f2543Smrg} 110706f2543Smrg 111706f2543Smrg 112706f2543Smrg// Initialize PseudoramiX. 113706f2543Smrg// Copied from PanoramiXExtensionInit 114706f2543Smrgvoid PseudoramiXExtensionInit(int argc, char *argv[]) 115706f2543Smrg{ 116706f2543Smrg Bool success = FALSE; 117706f2543Smrg ExtensionEntry *extEntry; 118706f2543Smrg 119706f2543Smrg if (noPseudoramiXExtension) return; 120706f2543Smrg 121706f2543Smrg TRACE(); 122706f2543Smrg 123706f2543Smrg /* Even with only one screen we need to enable PseudoramiX to allow 124706f2543Smrg dynamic screen configuration changes. */ 125706f2543Smrg#if 0 126706f2543Smrg if (pseudoramiXNumScreens == 1) { 127706f2543Smrg // Only one screen - disable Xinerama extension. 128706f2543Smrg noPseudoramiXExtension = TRUE; 129706f2543Smrg return; 130706f2543Smrg } 131706f2543Smrg#endif 132706f2543Smrg 133706f2543Smrg if (pseudoramiXGeneration != serverGeneration) { 134706f2543Smrg extEntry = AddExtension(PANORAMIX_PROTOCOL_NAME, 0, 0, 135706f2543Smrg ProcPseudoramiXDispatch, 136706f2543Smrg SProcPseudoramiXDispatch, 137706f2543Smrg PseudoramiXResetProc, 138706f2543Smrg StandardMinorOpcode); 139706f2543Smrg if (!extEntry) { 140706f2543Smrg ErrorF("PseudoramiXExtensionInit(): AddExtension failed\n"); 141706f2543Smrg } else { 142706f2543Smrg pseudoramiXGeneration = serverGeneration; 143706f2543Smrg success = TRUE; 144706f2543Smrg } 145706f2543Smrg } 146706f2543Smrg 147706f2543Smrg if (!success) { 148706f2543Smrg ErrorF("%s Extension (PseudoramiX) failed to initialize\n", 149706f2543Smrg PANORAMIX_PROTOCOL_NAME); 150706f2543Smrg return; 151706f2543Smrg } 152706f2543Smrg} 153706f2543Smrg 154706f2543Smrg 155706f2543Smrgvoid PseudoramiXResetScreens(void) 156706f2543Smrg{ 157706f2543Smrg TRACE(); 158706f2543Smrg 159706f2543Smrg pseudoramiXNumScreens = 0; 160706f2543Smrg} 161706f2543Smrg 162706f2543Smrg 163706f2543Smrgstatic void PseudoramiXResetProc(ExtensionEntry *extEntry) 164706f2543Smrg{ 165706f2543Smrg TRACE(); 166706f2543Smrg 167706f2543Smrg PseudoramiXResetScreens(); 168706f2543Smrg} 169706f2543Smrg 170706f2543Smrg 171706f2543Smrg// was PanoramiX 172706f2543Smrgstatic int ProcPseudoramiXQueryVersion(ClientPtr client) 173706f2543Smrg{ 174706f2543Smrg TRACE(); 175706f2543Smrg 176706f2543Smrg return ProcPanoramiXQueryVersion(client); 177706f2543Smrg} 178706f2543Smrg 179706f2543Smrg 180706f2543Smrg// was PanoramiX 181706f2543Smrgstatic int ProcPseudoramiXGetState(ClientPtr client) 182706f2543Smrg{ 183706f2543Smrg REQUEST(xPanoramiXGetStateReq); 184706f2543Smrg WindowPtr pWin; 185706f2543Smrg xPanoramiXGetStateReply rep; 186706f2543Smrg register int n, rc; 187706f2543Smrg 188706f2543Smrg TRACE(); 189706f2543Smrg 190706f2543Smrg REQUEST_SIZE_MATCH(xPanoramiXGetStateReq); 191706f2543Smrg rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); 192706f2543Smrg if (rc != Success) 193706f2543Smrg return rc; 194706f2543Smrg 195706f2543Smrg rep.type = X_Reply; 196706f2543Smrg rep.length = 0; 197706f2543Smrg rep.sequenceNumber = client->sequence; 198706f2543Smrg rep.state = !noPseudoramiXExtension; 199706f2543Smrg if (client->swapped) { 200706f2543Smrg swaps (&rep.sequenceNumber, n); 201706f2543Smrg swapl (&rep.length, n); 202706f2543Smrg swaps (&rep.state, n); 203706f2543Smrg } 204706f2543Smrg WriteToClient (client, sizeof (xPanoramiXGetStateReply), (char *) &rep); 205706f2543Smrg return Success; 206706f2543Smrg} 207706f2543Smrg 208706f2543Smrg 209706f2543Smrg// was PanoramiX 210706f2543Smrgstatic int ProcPseudoramiXGetScreenCount(ClientPtr client) 211706f2543Smrg{ 212706f2543Smrg REQUEST(xPanoramiXGetScreenCountReq); 213706f2543Smrg WindowPtr pWin; 214706f2543Smrg xPanoramiXGetScreenCountReply rep; 215706f2543Smrg register int n, rc; 216706f2543Smrg 217706f2543Smrg TRACE(); 218706f2543Smrg 219706f2543Smrg REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq); 220706f2543Smrg rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); 221706f2543Smrg if (rc != Success) 222706f2543Smrg return rc; 223706f2543Smrg 224706f2543Smrg rep.type = X_Reply; 225706f2543Smrg rep.length = 0; 226706f2543Smrg rep.sequenceNumber = client->sequence; 227706f2543Smrg rep.ScreenCount = pseudoramiXNumScreens; 228706f2543Smrg if (client->swapped) { 229706f2543Smrg swaps (&rep.sequenceNumber, n); 230706f2543Smrg swapl (&rep.length, n); 231706f2543Smrg swaps (&rep.ScreenCount, n); 232706f2543Smrg } 233706f2543Smrg WriteToClient (client, sizeof(xPanoramiXGetScreenCountReply), (char *)&rep); 234706f2543Smrg return Success; 235706f2543Smrg} 236706f2543Smrg 237706f2543Smrg 238706f2543Smrg// was PanoramiX 239706f2543Smrgstatic int ProcPseudoramiXGetScreenSize(ClientPtr client) 240706f2543Smrg{ 241706f2543Smrg REQUEST(xPanoramiXGetScreenSizeReq); 242706f2543Smrg WindowPtr pWin; 243706f2543Smrg xPanoramiXGetScreenSizeReply rep; 244706f2543Smrg register int n, rc; 245706f2543Smrg 246706f2543Smrg TRACE(); 247706f2543Smrg 248706f2543Smrg REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq); 249706f2543Smrg rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); 250706f2543Smrg if (rc != Success) 251706f2543Smrg return rc; 252706f2543Smrg 253706f2543Smrg rep.type = X_Reply; 254706f2543Smrg rep.length = 0; 255706f2543Smrg rep.sequenceNumber = client->sequence; 256706f2543Smrg /* screen dimensions */ 257706f2543Smrg rep.width = pseudoramiXScreens[stuff->screen].w; 258706f2543Smrg // was screenInfo.screens[stuff->screen]->width; 259706f2543Smrg rep.height = pseudoramiXScreens[stuff->screen].h; 260706f2543Smrg // was screenInfo.screens[stuff->screen]->height; 261706f2543Smrg if (client->swapped) { 262706f2543Smrg swaps (&rep.sequenceNumber, n); 263706f2543Smrg swapl (&rep.length, n); 264706f2543Smrg swaps (&rep.width, n); 265706f2543Smrg swaps (&rep.height, n); 266706f2543Smrg } 267706f2543Smrg WriteToClient (client, sizeof(xPanoramiXGetScreenSizeReply), (char *)&rep); 268706f2543Smrg return Success; 269706f2543Smrg} 270706f2543Smrg 271706f2543Smrg 272706f2543Smrg// was Xinerama 273706f2543Smrgstatic int ProcPseudoramiXIsActive(ClientPtr client) 274706f2543Smrg{ 275706f2543Smrg /* REQUEST(xXineramaIsActiveReq); */ 276706f2543Smrg xXineramaIsActiveReply rep; 277706f2543Smrg 278706f2543Smrg TRACE(); 279706f2543Smrg 280706f2543Smrg REQUEST_SIZE_MATCH(xXineramaIsActiveReq); 281706f2543Smrg 282706f2543Smrg rep.type = X_Reply; 283706f2543Smrg rep.length = 0; 284706f2543Smrg rep.sequenceNumber = client->sequence; 285706f2543Smrg rep.state = !noPseudoramiXExtension; 286706f2543Smrg if (client->swapped) { 287706f2543Smrg register int n; 288706f2543Smrg swaps (&rep.sequenceNumber, n); 289706f2543Smrg swapl (&rep.length, n); 290706f2543Smrg swapl (&rep.state, n); 291706f2543Smrg } 292706f2543Smrg WriteToClient (client, sizeof (xXineramaIsActiveReply), (char *) &rep); 293706f2543Smrg return Success; 294706f2543Smrg} 295706f2543Smrg 296706f2543Smrg 297706f2543Smrg// was Xinerama 298706f2543Smrgstatic int ProcPseudoramiXQueryScreens(ClientPtr client) 299706f2543Smrg{ 300706f2543Smrg /* REQUEST(xXineramaQueryScreensReq); */ 301706f2543Smrg xXineramaQueryScreensReply rep; 302706f2543Smrg 303706f2543Smrg DEBUG_LOG("noPseudoramiXExtension=%d, pseudoramiXNumScreens=%d\n", noPseudoramiXExtension, pseudoramiXNumScreens); 304706f2543Smrg 305706f2543Smrg REQUEST_SIZE_MATCH(xXineramaQueryScreensReq); 306706f2543Smrg 307706f2543Smrg rep.type = X_Reply; 308706f2543Smrg rep.sequenceNumber = client->sequence; 309706f2543Smrg rep.number = noPseudoramiXExtension ? 0 : pseudoramiXNumScreens; 310706f2543Smrg rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo); 311706f2543Smrg if (client->swapped) { 312706f2543Smrg register int n; 313706f2543Smrg swaps (&rep.sequenceNumber, n); 314706f2543Smrg swapl (&rep.length, n); 315706f2543Smrg swapl (&rep.number, n); 316706f2543Smrg } 317706f2543Smrg WriteToClient (client, sizeof (xXineramaQueryScreensReply), (char *) &rep); 318706f2543Smrg 319706f2543Smrg if (!noPseudoramiXExtension) { 320706f2543Smrg xXineramaScreenInfo scratch; 321706f2543Smrg int i; 322706f2543Smrg 323706f2543Smrg for(i = 0; i < pseudoramiXNumScreens; i++) { 324706f2543Smrg scratch.x_org = pseudoramiXScreens[i].x; 325706f2543Smrg scratch.y_org = pseudoramiXScreens[i].y; 326706f2543Smrg scratch.width = pseudoramiXScreens[i].w; 327706f2543Smrg scratch.height = pseudoramiXScreens[i].h; 328706f2543Smrg 329706f2543Smrg if(client->swapped) { 330706f2543Smrg register int n; 331706f2543Smrg swaps (&scratch.x_org, n); 332706f2543Smrg swaps (&scratch.y_org, n); 333706f2543Smrg swaps (&scratch.width, n); 334706f2543Smrg swaps (&scratch.height, n); 335706f2543Smrg } 336706f2543Smrg WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch); 337706f2543Smrg } 338706f2543Smrg } 339706f2543Smrg 340706f2543Smrg return Success; 341706f2543Smrg} 342706f2543Smrg 343706f2543Smrg 344706f2543Smrg// was PanoramiX 345706f2543Smrgstatic int ProcPseudoramiXDispatch (ClientPtr client) 346706f2543Smrg{ REQUEST(xReq); 347706f2543Smrg TRACE(); 348706f2543Smrg switch (stuff->data) 349706f2543Smrg { 350706f2543Smrg case X_PanoramiXQueryVersion: 351706f2543Smrg return ProcPseudoramiXQueryVersion(client); 352706f2543Smrg case X_PanoramiXGetState: 353706f2543Smrg return ProcPseudoramiXGetState(client); 354706f2543Smrg case X_PanoramiXGetScreenCount: 355706f2543Smrg return ProcPseudoramiXGetScreenCount(client); 356706f2543Smrg case X_PanoramiXGetScreenSize: 357706f2543Smrg return ProcPseudoramiXGetScreenSize(client); 358706f2543Smrg case X_XineramaIsActive: 359706f2543Smrg return ProcPseudoramiXIsActive(client); 360706f2543Smrg case X_XineramaQueryScreens: 361706f2543Smrg return ProcPseudoramiXQueryScreens(client); 362706f2543Smrg } 363706f2543Smrg return BadRequest; 364706f2543Smrg} 365706f2543Smrg 366706f2543Smrg 367706f2543Smrg 368706f2543Smrgstatic int 369706f2543SmrgSProcPseudoramiXQueryVersion (ClientPtr client) 370706f2543Smrg{ 371706f2543Smrg REQUEST(xPanoramiXQueryVersionReq); 372706f2543Smrg register int n; 373706f2543Smrg 374706f2543Smrg TRACE(); 375706f2543Smrg 376706f2543Smrg swaps(&stuff->length,n); 377706f2543Smrg REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq); 378706f2543Smrg return ProcPseudoramiXQueryVersion(client); 379706f2543Smrg} 380706f2543Smrg 381706f2543Smrgstatic int 382706f2543SmrgSProcPseudoramiXGetState(ClientPtr client) 383706f2543Smrg{ 384706f2543Smrg REQUEST(xPanoramiXGetStateReq); 385706f2543Smrg register int n; 386706f2543Smrg 387706f2543Smrg TRACE(); 388706f2543Smrg 389706f2543Smrg swaps (&stuff->length, n); 390706f2543Smrg REQUEST_SIZE_MATCH(xPanoramiXGetStateReq); 391706f2543Smrg return ProcPseudoramiXGetState(client); 392706f2543Smrg} 393706f2543Smrg 394706f2543Smrgstatic int 395706f2543SmrgSProcPseudoramiXGetScreenCount(ClientPtr client) 396706f2543Smrg{ 397706f2543Smrg REQUEST(xPanoramiXGetScreenCountReq); 398706f2543Smrg register int n; 399706f2543Smrg 400706f2543Smrg TRACE(); 401706f2543Smrg 402706f2543Smrg swaps (&stuff->length, n); 403706f2543Smrg REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq); 404706f2543Smrg return ProcPseudoramiXGetScreenCount(client); 405706f2543Smrg} 406706f2543Smrg 407706f2543Smrgstatic int 408706f2543SmrgSProcPseudoramiXGetScreenSize(ClientPtr client) 409706f2543Smrg{ 410706f2543Smrg REQUEST(xPanoramiXGetScreenSizeReq); 411706f2543Smrg register int n; 412706f2543Smrg 413706f2543Smrg TRACE(); 414706f2543Smrg 415706f2543Smrg swaps (&stuff->length, n); 416706f2543Smrg REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq); 417706f2543Smrg return ProcPseudoramiXGetScreenSize(client); 418706f2543Smrg} 419706f2543Smrg 420706f2543Smrg 421706f2543Smrgstatic int 422706f2543SmrgSProcPseudoramiXIsActive(ClientPtr client) 423706f2543Smrg{ 424706f2543Smrg REQUEST(xXineramaIsActiveReq); 425706f2543Smrg register int n; 426706f2543Smrg 427706f2543Smrg TRACE(); 428706f2543Smrg 429706f2543Smrg swaps (&stuff->length, n); 430706f2543Smrg REQUEST_SIZE_MATCH(xXineramaIsActiveReq); 431706f2543Smrg return ProcPseudoramiXIsActive(client); 432706f2543Smrg} 433706f2543Smrg 434706f2543Smrg 435706f2543Smrgstatic int 436706f2543SmrgSProcPseudoramiXQueryScreens(ClientPtr client) 437706f2543Smrg{ 438706f2543Smrg REQUEST(xXineramaQueryScreensReq); 439706f2543Smrg register int n; 440706f2543Smrg 441706f2543Smrg TRACE(); 442706f2543Smrg 443706f2543Smrg swaps (&stuff->length, n); 444706f2543Smrg REQUEST_SIZE_MATCH(xXineramaQueryScreensReq); 445706f2543Smrg return ProcPseudoramiXQueryScreens(client); 446706f2543Smrg} 447706f2543Smrg 448706f2543Smrg 449706f2543Smrgstatic int 450706f2543SmrgSProcPseudoramiXDispatch (ClientPtr client) 451706f2543Smrg{ REQUEST(xReq); 452706f2543Smrg 453706f2543Smrg TRACE(); 454706f2543Smrg 455706f2543Smrg switch (stuff->data) 456706f2543Smrg { 457706f2543Smrg case X_PanoramiXQueryVersion: 458706f2543Smrg return SProcPseudoramiXQueryVersion(client); 459706f2543Smrg case X_PanoramiXGetState: 460706f2543Smrg return SProcPseudoramiXGetState(client); 461706f2543Smrg case X_PanoramiXGetScreenCount: 462706f2543Smrg return SProcPseudoramiXGetScreenCount(client); 463706f2543Smrg case X_PanoramiXGetScreenSize: 464706f2543Smrg return SProcPseudoramiXGetScreenSize(client); 465706f2543Smrg case X_XineramaIsActive: 466706f2543Smrg return SProcPseudoramiXIsActive(client); 467706f2543Smrg case X_XineramaQueryScreens: 468706f2543Smrg return SProcPseudoramiXQueryScreens(client); 469706f2543Smrg } 470706f2543Smrg return BadRequest; 471706f2543Smrg} 472