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