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