XScrnSaver.c revision ee424013
1ef981d24Smrg/*
2ef981d24Smrg *
3ef981d24SmrgCopyright (c) 1992  X Consortium
4ef981d24Smrg
5ef981d24SmrgPermission is hereby granted, free of charge, to any person obtaining a copy
6ef981d24Smrgof this software and associated documentation files (the "Software"), to deal
7ef981d24Smrgin the Software without restriction, including without limitation the rights
8ef981d24Smrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9ef981d24Smrgcopies of the Software, and to permit persons to whom the Software is
10ef981d24Smrgfurnished to do so, subject to the following conditions:
11ef981d24Smrg
12ef981d24SmrgThe above copyright notice and this permission notice shall be included in
13ef981d24Smrgall copies or substantial portions of the Software.
14ef981d24Smrg
15ef981d24SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16ef981d24SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17ef981d24SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18ef981d24SmrgX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19ef981d24SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20ef981d24SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21ef981d24Smrg
22ef981d24SmrgExcept as contained in this notice, the name of the X Consortium shall not be
23ef981d24Smrgused in advertising or otherwise to promote the sale, use or other dealings
24ef981d24Smrgin this Software without prior written authorization from the X Consortium.
25ef981d24Smrg *
26ef981d24Smrg * Author:  Keith Packard, MIT X Consortium
27ef981d24Smrg */
28ef981d24Smrg
29ef981d24Smrg#include <X11/Xlibint.h>
30ef981d24Smrg#include <X11/Xutil.h>
31ef981d24Smrg#include <X11/extensions/Xext.h>
32ef981d24Smrg#include <X11/extensions/extutil.h>
33ef981d24Smrg#include <X11/extensions/saverproto.h>
34ef981d24Smrg#include <X11/extensions/scrnsaver.h>
35ef981d24Smrg
36ef981d24Smrg
37ef981d24Smrgstatic XExtensionInfo _screen_saver_info_data;
38ef981d24Smrgstatic XExtensionInfo *screen_saver_info = &_screen_saver_info_data;
39347791aaSmrgstatic const char *screen_saver_extension_name = ScreenSaverName;
40ef981d24Smrg
41ef981d24Smrg#define ScreenSaverCheckExtension(dpy,i,val) \
42ef981d24Smrg  XextCheckExtension (dpy, i, screen_saver_extension_name, val)
43ef981d24Smrg#define ScreenSaverSimpleCheckExtension(dpy,i) \
44ef981d24Smrg  XextSimpleCheckExtension (dpy, i, screen_saver_extension_name)
45ef981d24Smrg
46ef981d24Smrgstatic int close_display(
47ef981d24Smrg    Display *		/* dpy */,
48ef981d24Smrg    XExtCodes *		/* codes */
49ef981d24Smrg);
50ef981d24Smrg
51ef981d24Smrgstatic Bool wire_to_event(
52ef981d24Smrg    Display *		/* dpy */,
53ef981d24Smrg    XEvent *		/* re */,
54ef981d24Smrg    xEvent *		/* event */
55ef981d24Smrg);
56ef981d24Smrg
57ef981d24Smrgstatic Status event_to_wire(
58ef981d24Smrg    Display *		/* dpy */,
59ef981d24Smrg    XEvent *		/* re */,
60ef981d24Smrg    xEvent *		/* event */
61ef981d24Smrg);
62ef981d24Smrg
63ef981d24Smrgstatic /* const */ XExtensionHooks screen_saver_extension_hooks = {
64ef981d24Smrg    NULL,				/* create_gc */
65ef981d24Smrg    NULL,				/* copy_gc */
66ef981d24Smrg    NULL,				/* flush_gc */
67ef981d24Smrg    NULL,				/* free_gc */
68ef981d24Smrg    NULL,				/* create_font */
69ef981d24Smrg    NULL,				/* free_font */
70ef981d24Smrg    close_display,			/* close_display */
71ef981d24Smrg    wire_to_event,			/* wire_to_event */
72ef981d24Smrg    event_to_wire,			/* event_to_wire */
73ef981d24Smrg    NULL,				/* error */
74ef981d24Smrg    NULL,				/* error_string */
75ef981d24Smrg};
76ef981d24Smrg
77ef981d24Smrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, screen_saver_info,
78200d7199Smrg				   screen_saver_extension_name,
79ef981d24Smrg				   &screen_saver_extension_hooks,
80ef981d24Smrg				   ScreenSaverNumberEvents, NULL)
81ef981d24Smrg
82ef981d24Smrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, screen_saver_info)
83ef981d24Smrg
84ef981d24Smrg
85ef981d24Smrgstatic Bool wire_to_event (
86ef981d24Smrg    Display	*dpy,
87ef981d24Smrg    XEvent	*re,
88ef981d24Smrg    xEvent	*event)
89ef981d24Smrg{
90ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
91ef981d24Smrg    XScreenSaverNotifyEvent	*se;
92ef981d24Smrg    xScreenSaverNotifyEvent	*sevent;
93ef981d24Smrg
94ef981d24Smrg    ScreenSaverCheckExtension (dpy, info, False);
95ef981d24Smrg
96ef981d24Smrg    switch ((event->u.u.type & 0x7f) - info->codes->first_event) {
97ef981d24Smrg    case ScreenSaverNotify:
98ef981d24Smrg    	se = (XScreenSaverNotifyEvent *) re;
99ef981d24Smrg	sevent = (xScreenSaverNotifyEvent *) event;
100ef981d24Smrg    	se->type = sevent->type & 0x7f;
101ef981d24Smrg    	se->serial = _XSetLastRequestRead(dpy,(xGenericReply *) event);
102ef981d24Smrg    	se->send_event = (sevent->type & 0x80) != 0;
103ef981d24Smrg    	se->display = dpy;
104ef981d24Smrg    	se->window = sevent->window;
105ee424013Smrg	se->root = sevent->root;
106ef981d24Smrg    	se->state = sevent->state;
107ef981d24Smrg	se->kind = sevent->kind;
108ef981d24Smrg	se->forced = True;
109ef981d24Smrg	if (sevent->forced == xFalse)
110ef981d24Smrg	    se->forced = False;
111ef981d24Smrg	se->time = sevent->timestamp;
112ef981d24Smrg    	return True;
113ef981d24Smrg    }
114ef981d24Smrg    return False;
115ef981d24Smrg}
116ef981d24Smrg
117ef981d24Smrgstatic Status event_to_wire (
118ef981d24Smrg    Display	*dpy,
119ef981d24Smrg    XEvent	*re,
120ef981d24Smrg    xEvent	*event)
121ef981d24Smrg{
122ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
123ef981d24Smrg    XScreenSaverNotifyEvent	*se;
124ef981d24Smrg    xScreenSaverNotifyEvent	*sevent;
125ef981d24Smrg
126ef981d24Smrg    ScreenSaverCheckExtension (dpy, info, 0);
127ef981d24Smrg
128ef981d24Smrg    switch ((re->type & 0x7f) - info->codes->first_event) {
129ef981d24Smrg    case ScreenSaverNotify:
130ef981d24Smrg    	se = (XScreenSaverNotifyEvent *) re;
131ef981d24Smrg	sevent = (xScreenSaverNotifyEvent *) event;
132ef981d24Smrg    	sevent->type = se->type | (se->send_event ? 0x80 : 0);
133ef981d24Smrg    	sevent->sequenceNumber = se->serial & 0xffff;
134ef981d24Smrg    	sevent->root = se->root;
135ef981d24Smrg    	sevent->window = se->window;
136ef981d24Smrg    	sevent->state = se->state;
137ef981d24Smrg	sevent->kind = se->kind;
138ef981d24Smrg	sevent->forced = xFalse;
139ef981d24Smrg	if (se->forced == True)
140ef981d24Smrg	    sevent->forced = xTrue;
141ef981d24Smrg	sevent->timestamp = se->time;
142ef981d24Smrg    	return 1;
143ef981d24Smrg    }
144ef981d24Smrg    return 0;
145ef981d24Smrg}
146ef981d24Smrg
147ef981d24Smrg/****************************************************************************
148ef981d24Smrg *                                                                          *
149ef981d24Smrg *			    ScreenSaver public interfaces                         *
150ef981d24Smrg *                                                                          *
151ef981d24Smrg ****************************************************************************/
152ef981d24Smrg
153ef981d24SmrgBool XScreenSaverQueryExtension (
154ef981d24Smrg    Display	*dpy,
15565eef222Smrg    int		*event_base_return,
15665eef222Smrg    int		*error_base_return)
157ef981d24Smrg{
158ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
159ef981d24Smrg
160ef981d24Smrg    if (XextHasExtension(info)) {
16165eef222Smrg	*event_base_return = info->codes->first_event;
16265eef222Smrg	*error_base_return = info->codes->first_error;
163ef981d24Smrg	return True;
164ef981d24Smrg    } else {
165ef981d24Smrg	return False;
166ef981d24Smrg    }
167ef981d24Smrg}
168ef981d24Smrg
169ef981d24Smrg
170ef981d24SmrgStatus XScreenSaverQueryVersion(
171ef981d24Smrg    Display	*dpy,
17265eef222Smrg    int		*major_version_return,
17365eef222Smrg    int		*minor_version_return)
174ef981d24Smrg{
175ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
176ef981d24Smrg    xScreenSaverQueryVersionReply	    rep;
177ef981d24Smrg    register xScreenSaverQueryVersionReq  *req;
178ef981d24Smrg
179ef981d24Smrg    ScreenSaverCheckExtension (dpy, info, 0);
180ef981d24Smrg
181ef981d24Smrg    LockDisplay (dpy);
182ef981d24Smrg    GetReq (ScreenSaverQueryVersion, req);
183ef981d24Smrg    req->reqType = info->codes->major_opcode;
184ef981d24Smrg    req->saverReqType = X_ScreenSaverQueryVersion;
185ef981d24Smrg    req->clientMajor = ScreenSaverMajorVersion;
186ef981d24Smrg    req->clientMinor = ScreenSaverMinorVersion;
187ef981d24Smrg    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
188ef981d24Smrg	UnlockDisplay (dpy);
189ef981d24Smrg	SyncHandle ();
190ef981d24Smrg	return 0;
191ef981d24Smrg    }
19265eef222Smrg    *major_version_return = rep.majorVersion;
19365eef222Smrg    *minor_version_return = rep.minorVersion;
194ef981d24Smrg    UnlockDisplay (dpy);
195ef981d24Smrg    SyncHandle ();
196ef981d24Smrg    return 1;
197ef981d24Smrg}
198ef981d24Smrg
199ef981d24SmrgXScreenSaverInfo *XScreenSaverAllocInfo (void)
200ef981d24Smrg{
201ef981d24Smrg    return (XScreenSaverInfo *) Xmalloc (sizeof (XScreenSaverInfo));
202ef981d24Smrg}
203ef981d24Smrg
204ef981d24SmrgStatus XScreenSaverQueryInfo (
205ef981d24Smrg    Display		*dpy,
206ef981d24Smrg    Drawable		 drawable,
207ef981d24Smrg    XScreenSaverInfo	*saver_info)
208ef981d24Smrg{
209ef981d24Smrg    XExtDisplayInfo			*info = find_display (dpy);
210ef981d24Smrg    xScreenSaverQueryInfoReply		rep;
211ef981d24Smrg    register xScreenSaverQueryInfoReq	*req;
212ef981d24Smrg
213ef981d24Smrg    ScreenSaverCheckExtension (dpy, info, 0);
214ef981d24Smrg
215ef981d24Smrg    LockDisplay (dpy);
216ef981d24Smrg    GetReq (ScreenSaverQueryInfo, req);
217ef981d24Smrg    req->reqType = info->codes->major_opcode;
218ef981d24Smrg    req->saverReqType = X_ScreenSaverQueryInfo;
219ef981d24Smrg    req->drawable = drawable;
220ef981d24Smrg    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
221ef981d24Smrg	UnlockDisplay (dpy);
222ef981d24Smrg	SyncHandle ();
223ef981d24Smrg	return 0;
224ef981d24Smrg    }
225ef981d24Smrg    UnlockDisplay (dpy);
226ef981d24Smrg    SyncHandle ();
227ef981d24Smrg    saver_info->window = rep.window;
228ef981d24Smrg    saver_info->state = rep.state;
229ef981d24Smrg    saver_info->kind = rep.kind;
230ef981d24Smrg    saver_info->til_or_since = rep.tilOrSince;
231ef981d24Smrg    saver_info->idle = rep.idle;
232ef981d24Smrg    saver_info->eventMask = rep.eventMask;
233ef981d24Smrg    return 1;
234ef981d24Smrg}
235ef981d24Smrg
236ef981d24Smrgvoid XScreenSaverSelectInput (
237ef981d24Smrg    register Display	*dpy,
238ef981d24Smrg    Drawable		 drawable,
239ef981d24Smrg    unsigned long	 mask)
240ef981d24Smrg{
241ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
242ef981d24Smrg    register xScreenSaverSelectInputReq   *req;
243ef981d24Smrg
244ef981d24Smrg    ScreenSaverSimpleCheckExtension (dpy, info);
245ef981d24Smrg
246ef981d24Smrg    LockDisplay (dpy);
247ef981d24Smrg    GetReq (ScreenSaverSelectInput, req);
248ef981d24Smrg    req->reqType = info->codes->major_opcode;
249ef981d24Smrg    req->saverReqType = X_ScreenSaverSelectInput;
250ef981d24Smrg    req->drawable = drawable;
251ef981d24Smrg    req->eventMask = mask;
252ef981d24Smrg    UnlockDisplay (dpy);
253ef981d24Smrg    SyncHandle ();
254ef981d24Smrg}
255ef981d24Smrg
256ef981d24Smrgstatic void
257ef981d24SmrgXScreenSaverProcessWindowAttributes (
258ef981d24Smrg    register Display			*dpy,
259ef981d24Smrg    xChangeWindowAttributesReq		*req,
260ef981d24Smrg    register unsigned long		 valuemask,
261ef981d24Smrg    register XSetWindowAttributes	*attributes)
262ef981d24Smrg    {
263ef981d24Smrg    unsigned long values[32];
264ef981d24Smrg    register unsigned long *value = values;
265ef981d24Smrg    unsigned int nvalues;
266ef981d24Smrg
267ef981d24Smrg    if (valuemask & CWBackPixmap)
268ef981d24Smrg	*value++ = attributes->background_pixmap;
269200d7199Smrg
270ef981d24Smrg    if (valuemask & CWBackPixel)
271ef981d24Smrg    	*value++ = attributes->background_pixel;
272ef981d24Smrg
273ef981d24Smrg    if (valuemask & CWBorderPixmap)
274ef981d24Smrg    	*value++ = attributes->border_pixmap;
275ef981d24Smrg
276ef981d24Smrg    if (valuemask & CWBorderPixel)
277ef981d24Smrg    	*value++ = attributes->border_pixel;
278ef981d24Smrg
279ef981d24Smrg    if (valuemask & CWBitGravity)
280ef981d24Smrg    	*value++ = attributes->bit_gravity;
281ef981d24Smrg
282ef981d24Smrg    if (valuemask & CWWinGravity)
283ef981d24Smrg	*value++ = attributes->win_gravity;
284ef981d24Smrg
285ef981d24Smrg    if (valuemask & CWBackingStore)
286ef981d24Smrg        *value++ = attributes->backing_store;
287200d7199Smrg
288ef981d24Smrg    if (valuemask & CWBackingPlanes)
289ef981d24Smrg	*value++ = attributes->backing_planes;
290ef981d24Smrg
291ef981d24Smrg    if (valuemask & CWBackingPixel)
292ef981d24Smrg    	*value++ = attributes->backing_pixel;
293ef981d24Smrg
294ef981d24Smrg    if (valuemask & CWOverrideRedirect)
295ef981d24Smrg    	*value++ = attributes->override_redirect;
296ef981d24Smrg
297ef981d24Smrg    if (valuemask & CWSaveUnder)
298ef981d24Smrg    	*value++ = attributes->save_under;
299ef981d24Smrg
300ef981d24Smrg    if (valuemask & CWEventMask)
301ef981d24Smrg	*value++ = attributes->event_mask;
302ef981d24Smrg
303ef981d24Smrg    if (valuemask & CWDontPropagate)
304ef981d24Smrg	*value++ = attributes->do_not_propagate_mask;
305ef981d24Smrg
306ef981d24Smrg    if (valuemask & CWColormap)
307ef981d24Smrg	*value++ = attributes->colormap;
308ef981d24Smrg
309ef981d24Smrg    if (valuemask & CWCursor)
310ef981d24Smrg	*value++ = attributes->cursor;
311ef981d24Smrg
312ef981d24Smrg    req->length += (nvalues = value - values);
313ef981d24Smrg
314ef981d24Smrg    nvalues <<= 2;			    /* watch out for macros... */
315ef981d24Smrg    Data32 (dpy, (long *) values, (long)nvalues);
316ef981d24Smrg
317ef981d24Smrg    }
318ef981d24Smrg
319ef981d24Smrgvoid XScreenSaverSetAttributes (
320ef981d24Smrg    Display			*dpy,
321ef981d24Smrg    Drawable			 drawable,
322ef981d24Smrg    int				 x,
323ef981d24Smrg    int				 y,
324ef981d24Smrg    unsigned int		 width,
325ef981d24Smrg    unsigned int		 height,
326ef981d24Smrg    unsigned int		 border_width,
327ef981d24Smrg    int				 depth,
328ef981d24Smrg    unsigned int		 class,
329ef981d24Smrg    Visual			*visual,
330ef981d24Smrg    unsigned long		 valuemask,
331ef981d24Smrg    XSetWindowAttributes	*attributes)
332ef981d24Smrg{
333ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
334ef981d24Smrg    register xScreenSaverSetAttributesReq   *req;
335ef981d24Smrg
336ef981d24Smrg    ScreenSaverSimpleCheckExtension (dpy, info);
337ef981d24Smrg
338ef981d24Smrg    LockDisplay (dpy);
339ef981d24Smrg    GetReq (ScreenSaverSetAttributes, req);
340ef981d24Smrg    req->reqType = info->codes->major_opcode;
341ef981d24Smrg    req->saverReqType = X_ScreenSaverSetAttributes;
342ef981d24Smrg    req->drawable = drawable;
343ef981d24Smrg    req->x = x;
344ef981d24Smrg    req->y = y;
345ef981d24Smrg    req->width = width;
346ef981d24Smrg    req->height = height;
347ef981d24Smrg    req->borderWidth = border_width;
348ef981d24Smrg    req->c_class = class;
349ef981d24Smrg    req->depth = depth;
35065eef222Smrg    if (visual == (Visual *)CopyFromParent)
351ef981d24Smrg	req->visualID = CopyFromParent;
352ef981d24Smrg    else
353ef981d24Smrg	req->visualID = visual->visualid;
354ef981d24Smrg    /* abuse an Xlib internal interface - is this legal for us? */
355200d7199Smrg    if ((req->mask = valuemask))
356ef981d24Smrg        XScreenSaverProcessWindowAttributes (dpy,
357200d7199Smrg			(xChangeWindowAttributesReq *)req,
358ef981d24Smrg			valuemask, attributes);
359ef981d24Smrg    UnlockDisplay (dpy);
360ef981d24Smrg    SyncHandle ();
361ef981d24Smrg}
362ef981d24Smrg
363ef981d24Smrg
364ef981d24Smrgvoid XScreenSaverUnsetAttributes (
365ef981d24Smrg    register Display	*dpy,
366ef981d24Smrg    Drawable		 drawable)
367ef981d24Smrg{
368ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
369ef981d24Smrg    register xScreenSaverUnsetAttributesReq   *req;
370ef981d24Smrg
371ef981d24Smrg    ScreenSaverSimpleCheckExtension (dpy, info);
372ef981d24Smrg
373ef981d24Smrg    LockDisplay (dpy);
374ef981d24Smrg    GetReq (ScreenSaverUnsetAttributes, req);
375ef981d24Smrg    req->reqType = info->codes->major_opcode;
376ef981d24Smrg    req->saverReqType = X_ScreenSaverUnsetAttributes;
377ef981d24Smrg    req->drawable = drawable;
378ef981d24Smrg    UnlockDisplay (dpy);
379ef981d24Smrg    SyncHandle ();
380ef981d24Smrg}
381ef981d24Smrg
382ef981d24Smrg
383ef981d24SmrgStatus XScreenSaverRegister (
384ef981d24Smrg    Display	*dpy,
385ef981d24Smrg    int		 screen,
386ef981d24Smrg    XID		 xid,
387ef981d24Smrg    Atom	 type)
388ef981d24Smrg{
389ef981d24Smrg    Atom prop;
390ef981d24Smrg    unsigned long ul;
391ef981d24Smrg
392ef981d24Smrg    prop = XInternAtom (dpy, ScreenSaverPropertyName, False);
393ef981d24Smrg    if (!prop)
394ef981d24Smrg	return 0;
395ef981d24Smrg
396ef981d24Smrg    ul = (unsigned long) xid;
397200d7199Smrg    XChangeProperty (dpy, RootWindow(dpy,screen), prop, type, 32,
398ef981d24Smrg		     PropModeReplace, (unsigned char *) &ul, 1);
399ef981d24Smrg    return 1;
400ef981d24Smrg}
401ef981d24Smrg
402ef981d24Smrg
403ef981d24Smrg
404ef981d24SmrgStatus XScreenSaverUnregister (
405ef981d24Smrg    Display	*dpy,
406ef981d24Smrg    int		 screen)
407ef981d24Smrg{
408ef981d24Smrg    Atom prop;
409ef981d24Smrg
410ef981d24Smrg    prop = XInternAtom (dpy, ScreenSaverPropertyName, False);
411ef981d24Smrg    if (!prop)
412ef981d24Smrg	return 0;
413ef981d24Smrg
414ef981d24Smrg    XDeleteProperty (dpy, RootWindow(dpy,screen), prop);
415ef981d24Smrg    return 1;
416ef981d24Smrg}
417ef981d24Smrg
418ef981d24Smrg
419ef981d24Smrg
420ef981d24SmrgStatus XScreenSaverGetRegistered (
421ef981d24Smrg    Display	*dpy,
422ef981d24Smrg    int		 screen,
423ef981d24Smrg    XID		*xid,
424ef981d24Smrg    Atom	*type)
425ef981d24Smrg{
426ef981d24Smrg    Atom actual_type = None;
427ef981d24Smrg    int actual_format;
428ef981d24Smrg    unsigned long nitems, bytesafter;
429ef981d24Smrg    unsigned long *ulp = (unsigned long *) 0;
430ef981d24Smrg    Atom prop;
431ef981d24Smrg    int retval = 0;
432ef981d24Smrg
433ef981d24Smrg    prop = XInternAtom (dpy, ScreenSaverPropertyName, False);
434ef981d24Smrg    if (!prop)
435ef981d24Smrg	return retval;
436ef981d24Smrg
437ef981d24Smrg    if (XGetWindowProperty (dpy, RootWindow(dpy,screen), prop, 0L, 1L, False,
438ef981d24Smrg			    AnyPropertyType, &actual_type,  &actual_format,
439ef981d24Smrg			    &nitems, &bytesafter, (unsigned char **) &ulp)
440ef981d24Smrg	!= Success)
441ef981d24Smrg	return retval;
442ef981d24Smrg
443ef981d24Smrg    if (ulp) {
444ef981d24Smrg	if (actual_format == 32) {
445ef981d24Smrg	    *xid = (XID) ulp[0];
446ef981d24Smrg	    *type = actual_type;
447ef981d24Smrg	    retval = 1;
448ef981d24Smrg	}
449ef981d24Smrg	XFree ((char *) ulp);
450ef981d24Smrg    }
451ef981d24Smrg    return retval;
452ef981d24Smrg}
453ef981d24Smrg
454ef981d24Smrgvoid
455ef981d24SmrgXScreenSaverSuspend (Display *dpy, Bool suspend)
456ef981d24Smrg{
457ef981d24Smrg    XExtDisplayInfo *info = find_display (dpy);
458ef981d24Smrg    xScreenSaverSuspendReq   *req;
459ef981d24Smrg
460ef981d24Smrg    ScreenSaverSimpleCheckExtension (dpy, info);
461ef981d24Smrg
462ef981d24Smrg    LockDisplay (dpy);
463ef981d24Smrg    GetReq (ScreenSaverSuspend, req);
464ef981d24Smrg    req->reqType = info->codes->major_opcode;
465ef981d24Smrg    req->saverReqType = X_ScreenSaverSuspend;
466ef981d24Smrg    req->suspend = suspend;
467ef981d24Smrg    UnlockDisplay (dpy);
468ef981d24Smrg    SyncHandle ();
469ef981d24Smrg}
470ef981d24Smrg
471