2 * $XConsortium: saver.c,v 1.12 94/04/17 20:59:36 dpw Exp $
3 * $XFree86: xc/programs/Xserver/Xext/saver.c,v 3.2 1996/06/10 09:11:17 dawes Exp $
5 Copyright (c) 1992 X Consortium
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the "Software"), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 Except as contained in this notice, the name of the X Consortium shall not be
25 used in advertising or otherwise to promote the sale, use or other dealings
26 in this Software without prior written authorization from the X Consortium.
28 * Author: Keith Packard, MIT X Consortium
38 #include "windowstr.h"
39 #include "scrnintstr.h"
40 #include "pixmapstr.h"
41 #include "extnsionst.h"
42 #include "dixstruct.h"
45 #include "saverproto.h"
47 #include "cursorstr.h"
48 #include "colormapst.h"
50 static unsigned char ScreenSaverReqCode = 0;
51 static int ScreenSaverEventBase = 0;
53 extern DISPATCH_PROC(ProcScreenSaverQueryInfo);
54 static DISPATCH_PROC(ProcScreenSaverDispatch);
55 static DISPATCH_PROC(ProcScreenSaverQueryVersion);
56 static DISPATCH_PROC(ProcScreenSaverSelectInput);
57 static DISPATCH_PROC(ProcScreenSaverSetAttributes);
58 static DISPATCH_PROC(ProcScreenSaverUnsetAttributes);
59 static DISPATCH_PROC(SProcScreenSaverDispatch);
60 static DISPATCH_PROC(SProcScreenSaverQueryInfo);
61 static DISPATCH_PROC(SProcScreenSaverQueryVersion);
62 static DISPATCH_PROC(SProcScreenSaverSelectInput);
63 static DISPATCH_PROC(SProcScreenSaverSetAttributes);
64 static DISPATCH_PROC(SProcScreenSaverUnsetAttributes);
66 static Bool ScreenSaverHandle (
67 #if NeedFunctionPrototypes
68 ScreenPtr /* pScreen */,
76 #if NeedFunctionPrototypes
77 ScreenPtr /* pScreen */
83 #if NeedFunctionPrototypes
84 ScreenPtr /* pScreen */
89 UninstallSaverColormap (
90 #if NeedFunctionPrototypes
91 ScreenPtr /* pScreen */
97 #if NeedFunctionPrototypes
98 ScreenPtr /* pScreen */
102 static void SScreenSaverNotifyEvent (
103 #if NeedFunctionPrototypes
104 xScreenSaverNotifyEvent * /* from */,
105 xScreenSaverNotifyEvent * /* to */
109 static void ScreenSaverResetProc (
110 #if NeedFunctionPrototypes
111 ExtensionEntry * /* extEntry */
115 extern WindowPtr *WindowTable;
118 * each screen has a list of clients requesting
119 * ScreenSaverNotify events. Each client has a resource
120 * for each screen it selects ScreenSaverNotify input for,
121 * this resource is used to delete the ScreenSaverNotifyRec
122 * entry from the per-screen queue.
125 static RESTYPE EventType; /* resource type for event masks */
127 typedef struct _ScreenSaverEvent *ScreenSaverEventPtr;
129 typedef struct _ScreenSaverEvent {
130 ScreenSaverEventPtr next;
135 } ScreenSaverEventRec;
137 static int ScreenSaverFreeEvents(
138 #if NeedFunctionPrototypes
144 static Bool setEventMask (
145 #if NeedFunctionPrototypes
146 ScreenPtr /* pScreen */,
147 ClientPtr /* client */,
148 unsigned long /* mask */
152 static unsigned long getEventMask (
153 #if NeedFunctionPrototypes
154 ScreenPtr /* pScreen */,
155 ClientPtr /* client */
160 * when a client sets the screen saver attributes, a resource is
161 * kept to be freed when the client exits
164 static RESTYPE AttrType; /* resource type for attributes */
166 typedef struct _ScreenSaverAttr {
171 unsigned short width, height, borderWidth;
176 PixmapPtr pBackgroundPixmap;
177 PixmapPtr pBorderPixmap;
179 unsigned long mask; /* no pixmaps or cursors */
180 unsigned long *values;
181 } ScreenSaverAttrRec, *ScreenSaverAttrPtr;
183 static int ScreenSaverFreeAttr (
184 #if NeedFunctionPrototypes
190 static void FreeAttrs (
191 #if NeedFunctionPrototypes
192 ScreenSaverAttrPtr /* pAttr */
196 static void FreeScreenAttr (
197 #if NeedFunctionPrototypes
198 ScreenSaverAttrPtr /* pAttr */
203 SendScreenSaverNotify (
204 #if NeedFunctionPrototypes
205 ScreenPtr /* pScreen */,
211 typedef struct _ScreenSaverScreenPrivate {
212 ScreenSaverEventPtr events;
213 ScreenSaverAttrPtr attr;
215 Colormap installedMap;
216 } ScreenSaverScreenPrivateRec, *ScreenSaverScreenPrivatePtr;
218 static ScreenSaverScreenPrivatePtr
220 #if NeedFunctionPrototypes
221 ScreenPtr /* pScreen */
225 static int ScreenPrivateIndex;
227 #define GetScreenPrivate(s) ((ScreenSaverScreenPrivatePtr)(s)->devPrivates[ScreenPrivateIndex].ptr)
228 #define SetScreenPrivate(s,v) ((s)->devPrivates[ScreenPrivateIndex].ptr = (pointer) v);
229 #define SetupScreen(s) ScreenSaverScreenPrivatePtr pPriv = GetScreenPrivate(s)
231 #define New(t) ((t *) xalloc (sizeof (t)))
234 * ScreenSaverExtensionInit
236 * Called from InitExtensions in main() or from QueryExtension() if the
237 * extension is dynamically loaded.
242 ScreenSaverExtensionInit()
244 ExtensionEntry *extEntry;
248 AttrType = CreateNewResourceType(ScreenSaverFreeAttr);
249 EventType = CreateNewResourceType(ScreenSaverFreeEvents);
250 ScreenPrivateIndex = AllocateScreenPrivateIndex ();
251 for (i = 0; i < screenInfo.numScreens; i++)
253 pScreen = screenInfo.screens[i];
254 SetScreenPrivate (pScreen, NULL);
256 if (AttrType && EventType && ScreenPrivateIndex != -1 &&
257 (extEntry = AddExtension(ScreenSaverName, ScreenSaverNumberEvents, 0,
258 ProcScreenSaverDispatch, SProcScreenSaverDispatch,
259 ScreenSaverResetProc, StandardMinorOpcode)))
261 ScreenSaverReqCode = (unsigned char)extEntry->base;
262 ScreenSaverEventBase = extEntry->eventBase;
263 EventSwapVector[ScreenSaverEventBase] = (EventSwapPtr) SScreenSaverNotifyEvent;
269 ScreenSaverResetProc (extEntry)
270 ExtensionEntry *extEntry;
275 CheckScreenPrivate (pScreen)
278 SetupScreen (pScreen);
282 if (!pPriv->attr && !pPriv->events &&
283 !pPriv->hasWindow && pPriv->installedMap == None)
286 SetScreenPrivate (pScreen, NULL);
287 savedScreenInfo[pScreen->myNum].ExternalScreenSaver = NULL;
291 static ScreenSaverScreenPrivatePtr
292 MakeScreenPrivate (pScreen)
295 SetupScreen (pScreen);
299 pPriv = New (ScreenSaverScreenPrivateRec);
304 pPriv->hasWindow = FALSE;
305 pPriv->installedMap = None;
306 SetScreenPrivate (pScreen, pPriv);
307 savedScreenInfo[pScreen->myNum].ExternalScreenSaver = ScreenSaverHandle;
312 getEventMask (pScreen, client)
316 SetupScreen(pScreen);
317 ScreenSaverEventPtr pEv;
321 for (pEv = pPriv->events; pEv; pEv = pEv->next)
322 if (pEv->client == client)
328 setEventMask (pScreen, client, mask)
333 SetupScreen(pScreen);
334 ScreenSaverEventPtr pEv, *pPrev;
336 if (getEventMask (pScreen, client) == mask)
340 pPriv = MakeScreenPrivate (pScreen);
344 for (pPrev = &pPriv->events; (pEv = *pPrev) != 0; pPrev = &pEv->next)
345 if (pEv->client == client)
349 FreeResource (pEv->resource, EventType);
352 CheckScreenPrivate (pScreen);
358 pEv = New (ScreenSaverEventRec);
361 CheckScreenPrivate (pScreen);
366 pEv->client = client;
367 pEv->screen = pScreen;
368 pEv->resource = FakeClientID (client->index);
369 if (!AddResource (pEv->resource, EventType, (pointer) pEv))
379 ScreenSaverAttrPtr pAttr;
384 if ((pPixmap = pAttr->pBackgroundPixmap) != 0)
385 (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
386 if ((pPixmap = pAttr->pBorderPixmap) != 0)
387 (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
388 if ((pCursor = pAttr->pCursor) != 0)
389 FreeCursor (pCursor, (Cursor) 0);
393 FreeScreenAttr (pAttr)
394 ScreenSaverAttrPtr pAttr;
397 xfree (pAttr->values);
402 ScreenSaverFreeEvents (value, id)
406 ScreenSaverEventPtr pOld = (ScreenSaverEventPtr)value;
407 ScreenPtr pScreen = pOld->screen;
408 SetupScreen (pScreen);
409 ScreenSaverEventPtr pEv, *pPrev;
413 for (pPrev = &pPriv->events; (pEv = *pPrev) != 0; pPrev = &pEv->next)
420 CheckScreenPrivate (pScreen);
425 ScreenSaverFreeAttr (value, id)
429 ScreenSaverAttrPtr pOldAttr = (ScreenSaverAttrPtr)value;
430 ScreenPtr pScreen = pOldAttr->screen;
431 SetupScreen (pScreen);
435 if (pPriv->attr != pOldAttr)
437 FreeScreenAttr (pOldAttr);
439 if (pPriv->hasWindow)
441 SaveScreens (SCREEN_SAVER_FORCER, ScreenSaverReset);
442 SaveScreens (SCREEN_SAVER_FORCER, ScreenSaverActive);
444 CheckScreenPrivate (pScreen);
449 SendScreenSaverNotify (pScreen, state, forced)
454 ScreenSaverScreenPrivatePtr pPriv;
455 ScreenSaverEventPtr pEv;
457 xScreenSaverNotifyEvent ev;
460 ScreenSaverStuffPtr pSaver;
462 UpdateCurrentTimeIf ();
463 mask = ScreenSaverNotifyMask;
464 if (state == ScreenSaverCycle)
465 mask = ScreenSaverCycleMask;
466 pScreen = screenInfo.screens[pScreen->myNum];
467 pPriv = GetScreenPrivate(pScreen);
470 pSaver = &savedScreenInfo[pScreen->myNum];
472 kind = ScreenSaverExternal;
473 else if (ScreenSaverBlanking != DontPreferBlanking)
474 kind = ScreenSaverBlanked;
476 kind = ScreenSaverInternal;
477 for (pEv = pPriv->events; pEv; pEv = pEv->next)
479 client = pEv->client;
480 if (client->clientGone)
482 if (!(pEv->mask & mask))
484 ev.type = ScreenSaverNotify + ScreenSaverEventBase;
486 ev.sequenceNumber = client->sequence;
487 ev.timestamp = currentTime.milliseconds;
488 ev.root = WindowTable[pScreen->myNum]->drawable.id;
489 ev.window = savedScreenInfo[pScreen->myNum].wid;
492 WriteEventsToClient (client, 1, (xEvent *) &ev);
497 SScreenSaverNotifyEvent (from, to)
498 xScreenSaverNotifyEvent *from, *to;
500 to->type = from->type;
501 to->state = from->state;
502 cpswaps (from->sequenceNumber, to->sequenceNumber);
503 cpswapl (from->timestamp, to->timestamp);
504 cpswapl (from->root, to->root);
505 cpswapl (from->window, to->window);
506 to->kind = from->kind;
507 to->forced = from->forced;
511 UninstallSaverColormap (pScreen)
514 SetupScreen(pScreen);
517 if (pPriv && pPriv->installedMap != None)
519 pCmap = (ColormapPtr) LookupIDByType (pPriv->installedMap, RT_COLORMAP);
521 (*pCmap->pScreen->UninstallColormap) (pCmap);
522 pPriv->installedMap = None;
523 CheckScreenPrivate (pScreen);
528 CreateSaverWindow (pScreen)
531 SetupScreen (pScreen);
532 ScreenSaverStuffPtr pSaver;
533 ScreenSaverAttrPtr pAttr;
537 extern int GrabInProgress;
538 Colormap *installedMaps;
544 pSaver = &savedScreenInfo[pScreen->myNum];
547 pSaver->pWindow = NullWindow;
548 FreeResource (pSaver->wid, RT_NONE);
551 UninstallSaverColormap (pScreen);
552 pPriv->hasWindow = FALSE;
553 CheckScreenPrivate (pScreen);
557 if (!pPriv || !(pAttr = pPriv->attr))
560 pPriv->installedMap = None;
562 if (GrabInProgress && GrabInProgress != pAttr->client->index)
565 pWin = CreateWindow (pSaver->wid, WindowTable[pScreen->myNum],
566 pAttr->x, pAttr->y, pAttr->width, pAttr->height,
567 pAttr->borderWidth, pAttr->class,
568 pAttr->mask, (XID *)pAttr->values,
569 pAttr->depth, serverClient, pAttr->visual,
574 if (!AddResource(pWin->drawable.id, RT_WINDOW, pWin))
578 if (pAttr->pBackgroundPixmap)
580 pWin->backgroundState = BackgroundPixmap;
581 pWin->background.pixmap = pAttr->pBackgroundPixmap;
582 pAttr->pBackgroundPixmap->refcnt++;
583 mask |= CWBackPixmap;
585 if (pAttr->pBorderPixmap)
587 pWin->borderIsPixel = FALSE;
588 pWin->border.pixmap = pAttr->pBorderPixmap;
589 pAttr->pBorderPixmap->refcnt++;
590 mask |= CWBorderPixmap;
595 if (!MakeWindowOptional (pWin))
597 FreeResource (pWin->drawable.id, RT_NONE);
600 if (pWin->optional->cursor)
601 FreeCursor (pWin->optional->cursor, (Cursor)0);
602 pWin->optional->cursor = pAttr->pCursor;
603 pAttr->pCursor->refcnt++;
604 pWin->cursorIsNone = FALSE;
605 CheckWindowOptionalNeed (pWin);
609 (*pScreen->ChangeWindowAttributes) (pWin, mask);
611 if (pAttr->colormap != None)
612 (void) ChangeWindowAttributes (pWin, CWColormap, &pAttr->colormap,
615 MapWindow (pWin, serverClient);
617 pPriv->hasWindow = TRUE;
618 pSaver->pWindow = pWin;
620 /* check and install our own colormap if it isn't installed now */
621 wantMap = wColormap (pWin);
624 installedMaps = (Colormap *) ALLOCATE_LOCAL (pScreen->maxInstalledCmaps *
626 numInstalled = (*pWin->drawable.pScreen->ListInstalledColormaps)
627 (pScreen, installedMaps);
628 for (i = 0; i < numInstalled; i++)
629 if (installedMaps[i] == wantMap)
632 DEALLOCATE_LOCAL ((char *) installedMaps);
634 if (i < numInstalled)
637 pCmap = (ColormapPtr) LookupIDByType (wantMap, RT_COLORMAP);
641 pPriv->installedMap = wantMap;
643 (*pCmap->pScreen->InstallColormap) (pCmap);
649 DestroySaverWindow (pScreen)
652 SetupScreen(pScreen);
653 ScreenSaverStuffPtr pSaver;
655 if (!pPriv || !pPriv->hasWindow)
658 pSaver = &savedScreenInfo[pScreen->myNum];
661 pSaver->pWindow = NullWindow;
662 FreeResource (pSaver->wid, RT_NONE);
664 pPriv->hasWindow = FALSE;
665 CheckScreenPrivate (pScreen);
666 UninstallSaverColormap (pScreen);
671 ScreenSaverHandle (pScreen, xstate, force)
678 ScreenSaverScreenPrivatePtr pPriv;
682 case SCREEN_SAVER_ON:
683 state = ScreenSaverOn;
684 ret = CreateSaverWindow (pScreen);
686 case SCREEN_SAVER_OFF:
687 state = ScreenSaverOff;
688 ret = DestroySaverWindow (pScreen);
690 case SCREEN_SAVER_CYCLE:
691 state = ScreenSaverCycle;
692 pPriv = GetScreenPrivate (pScreen);
693 if (pPriv && pPriv->hasWindow)
697 SendScreenSaverNotify (pScreen, state, force);
702 ProcScreenSaverQueryVersion (client)
703 register ClientPtr client;
705 xScreenSaverQueryVersionReply rep;
708 REQUEST_SIZE_MATCH (xScreenSaverQueryVersionReq);
711 rep.sequenceNumber = client->sequence;
712 rep.majorVersion = ScreenSaverMajorVersion;
713 rep.minorVersion = ScreenSaverMinorVersion;
714 if (client->swapped) {
715 swaps(&rep.sequenceNumber, n);
716 swapl(&rep.length, n);
718 WriteToClient(client, sizeof (xScreenSaverQueryVersionReply), (char *)&rep);
719 return (client->noClientException);
723 ProcScreenSaverQueryInfo (client)
724 register ClientPtr client;
726 REQUEST(xScreenSaverQueryInfoReq);
727 xScreenSaverQueryInfoReply rep;
729 ScreenSaverStuffPtr pSaver;
732 ScreenSaverScreenPrivatePtr pPriv;
734 REQUEST_SIZE_MATCH (xScreenSaverQueryInfoReq);
735 pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client);
739 pSaver = &savedScreenInfo[pDraw->pScreen->myNum];
740 pPriv = GetScreenPrivate (pDraw->pScreen);
742 UpdateCurrentTime ();
743 lastInput = GetTimeInMillis() - lastDeviceEventTime.milliseconds;
747 rep.sequenceNumber = client->sequence;
748 rep.window = pSaver->wid;
749 if (screenIsSaved != SCREEN_SAVER_OFF)
751 rep.state = ScreenSaverOn;
753 rep.tilOrSince = lastInput - ScreenSaverTime;
761 rep.state = ScreenSaverOff;
762 if (ScreenSaverTime < lastInput)
765 rep.tilOrSince = ScreenSaverTime - lastInput;
769 rep.state = ScreenSaverDisabled;
773 rep.idle = lastInput;
774 rep.eventMask = getEventMask (pDraw->pScreen, client);
775 if (pPriv && pPriv->attr)
776 rep.kind = ScreenSaverExternal;
777 else if (ScreenSaverBlanking != DontPreferBlanking)
778 rep.kind = ScreenSaverBlanked;
780 rep.kind = ScreenSaverInternal;
783 swaps (&rep.sequenceNumber, n);
784 swapl (&rep.length, n);
785 swapl (&rep.window, n);
786 swapl (&rep.tilOrSince, n);
787 swapl (&rep.idle, n);
788 swapl (&rep.eventMask, n);
790 WriteToClient(client, sizeof (xScreenSaverQueryInfoReply), (char *)&rep);
791 return (client->noClientException);
795 ProcScreenSaverSelectInput (client)
796 register ClientPtr client;
798 REQUEST(xScreenSaverSelectInputReq);
801 REQUEST_SIZE_MATCH (xScreenSaverSelectInputReq);
802 pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client);
805 if (!setEventMask (pDraw->pScreen, client, stuff->eventMask))
811 ProcScreenSaverSetAttributes (client)
812 register ClientPtr client;
814 REQUEST(xScreenSaverSetAttributesReq);
818 ScreenSaverScreenPrivatePtr pPriv = 0;
819 ScreenSaverAttrPtr pAttr = 0;
822 int class, bw, depth;
823 unsigned long visual;
827 WindowOptPtr ancwopt;
828 unsigned long *pVlist;
829 unsigned long *values = 0;
831 unsigned long tmask, imask;
840 REQUEST_AT_LEAST_SIZE (xScreenSaverSetAttributesReq);
841 pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client);
844 pScreen = pDraw->pScreen;
845 pParent = WindowTable[pScreen->myNum];
847 len = stuff->length - (sizeof(xScreenSaverSetAttributesReq) >> 2);
848 if (Ones(stuff->mask) != len)
850 if (!stuff->width || !stuff->height)
852 client->errorValue = 0;
855 switch (class = stuff->c_class)
862 client->errorValue = class;
865 bw = stuff->borderWidth;
866 depth = stuff->depth;
867 visual = stuff->visualID;
869 /* copied directly from CreateWindow */
871 if (class == CopyFromParent)
872 class = pParent->drawable.class;
874 if ((class != InputOutput) && (class != InputOnly))
876 client->errorValue = class;
880 if ((class != InputOnly) && (pParent->drawable.class == InputOnly))
883 if ((class == InputOnly) && ((bw != 0) || (depth != 0)))
886 if ((class == InputOutput) && (depth == 0))
887 depth = pParent->drawable.depth;
888 ancwopt = pParent->optional;
890 ancwopt = FindWindowWithOptional(pParent)->optional;
891 if (visual == CopyFromParent)
892 visual = ancwopt->visual;
894 /* Find out if the depth and visual are acceptable for this Screen */
895 if ((visual != ancwopt->visual) || (depth != pParent->drawable.depth))
898 for(idepth = 0; idepth < pScreen->numDepths; idepth++)
900 pDepth = (DepthPtr) &pScreen->allowedDepths[idepth];
901 if ((depth == pDepth->depth) || (depth == 0))
903 for (ivisual = 0; ivisual < pDepth->numVids; ivisual++)
905 if (visual == pDepth->vids[ivisual])
917 if (((stuff->mask & (CWBorderPixmap | CWBorderPixel)) == 0) &&
918 (class != InputOnly) &&
919 (depth != pParent->drawable.depth))
924 if (((stuff->mask & CWColormap) == 0) &&
925 (class != InputOnly) &&
926 ((visual != ancwopt->visual) || (ancwopt->colormap == None)))
931 /* end of errors from CreateWindow */
933 pPriv = GetScreenPrivate (pScreen);
934 if (pPriv && pPriv->attr)
936 if (pPriv->attr->client != client)
941 pPriv = MakeScreenPrivate (pScreen);
945 pAttr = New (ScreenSaverAttrRec);
951 /* over allocate for override redirect */
952 values = (unsigned long *) xalloc ((len + 1) * sizeof (unsigned long));
959 pAttr->screen = pScreen;
960 pAttr->client = client;
963 pAttr->width = stuff->width;
964 pAttr->height = stuff->height;
965 pAttr->borderWidth = stuff->borderWidth;
966 pAttr->class = stuff->c_class;
967 pAttr->depth = depth;
968 pAttr->visual = visual;
969 pAttr->colormap = None;
970 pAttr->pCursor = NullCursor;
971 pAttr->pBackgroundPixmap = NullPixmap;
972 pAttr->pBorderPixmap = NullPixmap;
973 pAttr->values = values;
975 * go through the mask, checking the values,
976 * looking up pixmaps and cursors and hold a reference
979 pAttr->mask = tmask = stuff->mask | CWOverrideRedirect;
980 pVlist = (unsigned long *) (stuff + 1);
982 imask = lowbit (tmask);
987 pixID = (Pixmap )*pVlist;
992 else if (pixID == ParentRelative)
994 if (depth != pParent->drawable.depth)
999 *values++ = ParentRelative;
1003 pPixmap = (PixmapPtr)LookupIDByType(pixID, RT_PIXMAP);
1004 if (pPixmap != (PixmapPtr) NULL)
1006 if ((pPixmap->drawable.depth != depth) ||
1007 (pPixmap->drawable.pScreen != pScreen))
1012 pAttr->pBackgroundPixmap = pPixmap;
1014 pAttr->mask &= ~CWBackPixmap;
1019 client->errorValue = pixID;
1025 *values++ = (CARD32) *pVlist;
1027 case CWBorderPixmap:
1028 pixID = (Pixmap ) *pVlist;
1029 if (pixID == CopyFromParent)
1031 if (depth != pParent->drawable.depth)
1036 *values++ = CopyFromParent;
1040 pPixmap = (PixmapPtr)LookupIDByType(pixID, RT_PIXMAP);
1043 if ((pPixmap->drawable.depth != depth) ||
1044 (pPixmap->drawable.pScreen != pScreen))
1049 pAttr->pBorderPixmap = pPixmap;
1051 pAttr->mask &= ~CWBorderPixmap;
1056 client->errorValue = pixID;
1062 *values++ = (CARD32) *pVlist;
1065 val = (CARD8 )*pVlist;
1066 if (val > StaticGravity)
1069 client->errorValue = val;
1075 val = (CARD8 )*pVlist;
1076 if (val > StaticGravity)
1079 client->errorValue = val;
1084 case CWBackingStore:
1085 val = (CARD8 )*pVlist;
1086 if ((val != NotUseful) && (val != WhenMapped) && (val != Always))
1089 client->errorValue = val;
1094 case CWBackingPlanes:
1095 *values++ = (CARD32) *pVlist;
1097 case CWBackingPixel:
1098 *values++ = (CARD32) *pVlist;
1101 val = (BOOL) *pVlist;
1102 if ((val != xTrue) && (val != xFalse))
1105 client->errorValue = val;
1111 *values++ = (CARD32) *pVlist;
1113 case CWDontPropagate:
1114 *values++ = (CARD32) *pVlist;
1116 case CWOverrideRedirect:
1117 if (!(stuff->mask & CWOverrideRedirect))
1121 val = (BOOL ) *pVlist;
1122 if ((val != xTrue) && (val != xFalse))
1125 client->errorValue = val;
1132 cmap = (Colormap) *pVlist;
1133 pCmap = (ColormapPtr)LookupIDByType(cmap, RT_COLORMAP);
1137 client->errorValue = cmap;
1140 if (pCmap->pVisual->vid != visual || pCmap->pScreen != pScreen)
1145 pAttr->colormap = cmap;
1146 pAttr->mask &= ~CWColormap;
1149 cursorID = (Cursor ) *pVlist;
1150 if ( cursorID == None)
1156 pCursor = (CursorPtr)LookupIDByType(cursorID, RT_CURSOR);
1160 client->errorValue = cursorID;
1164 pAttr->pCursor = pCursor;
1165 pAttr->mask &= ~CWCursor;
1170 client->errorValue = stuff->mask;
1176 FreeScreenAttr (pPriv->attr);
1177 pPriv->attr = pAttr;
1178 pAttr->resource = FakeClientID (client->index);
1179 if (!AddResource (pAttr->resource, AttrType, (pointer) pAttr))
1185 CheckScreenPrivate (pScreen);
1192 ProcScreenSaverUnsetAttributes (client)
1193 register ClientPtr client;
1195 REQUEST(xScreenSaverSetAttributesReq);
1197 ScreenSaverScreenPrivatePtr pPriv;
1199 REQUEST_SIZE_MATCH (xScreenSaverUnsetAttributesReq);
1200 pDraw = (DrawablePtr) LookupDrawable (stuff->drawable, client);
1203 pPriv = GetScreenPrivate (pDraw->pScreen);
1204 if (pPriv && pPriv->attr && pPriv->attr->client == client)
1206 FreeScreenAttr (pPriv->attr);
1208 CheckScreenPrivate (pDraw->pScreen);
1213 static DISPATCH_PROC((*NormalVector[])) = {
1214 ProcScreenSaverQueryVersion,
1215 ProcScreenSaverQueryInfo,
1216 ProcScreenSaverSelectInput,
1217 ProcScreenSaverSetAttributes,
1218 ProcScreenSaverUnsetAttributes,
1221 #define NUM_REQUESTS ((sizeof NormalVector) / (sizeof NormalVector[0]))
1224 ProcScreenSaverDispatch (client)
1229 if (stuff->data < NUM_REQUESTS)
1230 return (*NormalVector[stuff->data])(client);
1235 SProcScreenSaverQueryVersion (client)
1238 REQUEST(xScreenSaverQueryVersionReq);
1241 swaps (&stuff->length, n);
1242 REQUEST_SIZE_MATCH(xScreenSaverQueryVersionReq);
1243 return ProcScreenSaverQueryVersion (client);
1247 SProcScreenSaverQueryInfo (client)
1250 REQUEST(xScreenSaverQueryInfoReq);
1253 swaps (&stuff->length, n);
1254 REQUEST_SIZE_MATCH(xScreenSaverQueryInfoReq);
1255 swapl (&stuff->drawable, n);
1256 return ProcScreenSaverQueryInfo (client);
1260 SProcScreenSaverSelectInput (client)
1263 REQUEST(xScreenSaverSelectInputReq);
1266 swaps (&stuff->length, n);
1267 REQUEST_SIZE_MATCH(xScreenSaverSelectInputReq);
1268 swapl (&stuff->drawable, n);
1269 swapl (&stuff->eventMask, n);
1270 return ProcScreenSaverSelectInput (client);
1274 SProcScreenSaverSetAttributes (client)
1277 REQUEST(xScreenSaverSetAttributesReq);
1280 swaps (&stuff->length, n);
1281 REQUEST_AT_LEAST_SIZE(xScreenSaverSetAttributesReq);
1282 swapl (&stuff->drawable, n);
1283 swaps (&stuff->x, n);
1284 swaps (&stuff->y, n);
1285 swaps (&stuff->width, n);
1286 swaps (&stuff->height, n);
1287 swaps (&stuff->borderWidth, n);
1288 swapl (&stuff->visualID, n);
1289 swapl (&stuff->mask, n);
1291 return ProcScreenSaverSetAttributes (client);
1295 SProcScreenSaverUnsetAttributes (client)
1298 REQUEST(xScreenSaverUnsetAttributesReq);
1301 swaps (&stuff->length, n);
1302 REQUEST_SIZE_MATCH(xScreenSaverUnsetAttributesReq);
1303 swapl (&stuff->drawable, n);
1304 return ProcScreenSaverUnsetAttributes (client);
1307 static DISPATCH_PROC((*SwappedVector[])) = {
1308 SProcScreenSaverQueryVersion,
1309 SProcScreenSaverQueryInfo,
1310 SProcScreenSaverSelectInput,
1311 SProcScreenSaverSetAttributes,
1312 SProcScreenSaverUnsetAttributes,
1316 SProcScreenSaverDispatch (client)
1321 if (stuff->data < NUM_REQUESTS)
1322 return (*SwappedVector[stuff->data])(client);