1 /* 2 * Copyright 1993-2001 by Xi Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * Please see the LICENSE file accompanying this distribution for licensing 6 * information. 7 * 8 * Please send any bug fixes and modifications to src (at) xig.com. 9 * 10 * $XiGId: xme.c,v 1.2 2001/11/30 21:56:59 jon Exp $ 11 * 12 */ 13 14 #define NEED_EVENTS 15 #define NEED_REPLIES 16 17 #include <X11/Xlibint.h> 18 #include <X11/Xthreads.h> 19 #include <X11/Xmd.h> 20 #include <X11/Xproto.h> 21 #include "../extensions/Xext.h" 22 #include "../extensions/extutil.h" 23 24 /*****************************************************************************/ 25 26 27 #define XIGMISC_PROTOCOL_NAME "XiG-SUNDRY-NONSTANDARD" 28 #define XIGMISC_MAJOR_VERSION 2 29 #define XIGMISC_MINOR_VERSION 0 30 31 #define XiGMiscNumberEvents 0 32 33 #define X_XiGMiscQueryVersion 0 34 #define X_XiGMiscQueryViews 1 35 #define X_XiGMiscQueryResolutions 2 36 #define X_XiGMiscChangeResolution 3 37 #define X_XiGMiscFullScreen 4 38 39 #define sz_xXiGMiscQueryVersionReq 8 40 #define sz_xXiGMiscQueryViewsReq 8 41 #define sz_xXiGMiscQueryResolutionsReq 8 42 #define sz_xXiGMiscChangeResolutionReq 16 43 #define sz_xXiGMiscFullScreenReq 16 44 45 #define sz_xXiGMiscQueryVersionReply 32 46 #define sz_xXiGMiscQueryViewsReply 32 47 #define sz_xXiGMiscQueryResolutionsReply 32 48 #define sz_xXiGMiscQueryFullScreenReply 32 49 50 /*******************************************************************/ 51 52 typedef struct { 53 CARD8 reqType; /* always codes->major_opcode */ 54 CARD8 xigmiscReqType; /* always X_XiGMiscQueryVersion */ 55 CARD16 length; 56 CARD16 major; 57 CARD16 minor; 58 } xXiGMiscQueryVersionReq; 59 60 typedef struct { 61 CARD8 reqType; /* always codes->major_opcode */ 62 CARD8 xigmiscReqType; /* always X_XiGMiscQueryViews */ 63 CARD16 length; 64 CARD8 screen; 65 CARD8 pad0; 66 CARD16 pad1; 67 } xXiGMiscQueryViewsReq; 68 69 typedef struct { 70 CARD8 reqType; /* always codes->major_opcode */ 71 CARD8 xigmiscReqType; /* always X_XiGMiscQueryResolutions */ 72 CARD16 length; 73 CARD8 screen; 74 CARD8 view; 75 CARD16 pad0; 76 } xXiGMiscQueryResolutionsReq; 77 78 typedef struct { 79 CARD8 reqType; /* always codes->major_opcode */ 80 CARD8 xigmiscReqType; /* always X_XiGMiscChangeResolution */ 81 CARD16 length; 82 CARD8 screen; 83 CARD8 view; 84 CARD16 pad0; 85 CARD16 width; 86 CARD16 height; 87 INT32 refresh; 88 } xXiGMiscChangeResolutionReq; 89 90 typedef struct { 91 CARD8 reqType; /* always codes->major_opcode */ 92 CARD8 xigmiscReqType; /* always X_XiGMiscFullScreen */ 93 CARD16 length; 94 CARD8 screen; 95 CARD8 pad0; 96 CARD16 pad1; 97 CARD32 window; 98 CARD32 cmap; 99 } xXiGMiscFullScreenReq; 100 101 /*******************************************************************/ 102 103 typedef struct { 104 BYTE type; /* X_Reply */ 105 CARD8 pad0; 106 CARD16 sequenceNumber; 107 CARD32 length; 108 CARD16 major; 109 CARD16 minor; 110 CARD32 pad1; 111 CARD32 pad2; 112 CARD32 pad3; 113 CARD32 pad4; 114 CARD32 pad5; 115 } xXiGMiscQueryVersionReply; 116 117 typedef struct { 118 BYTE type; /* X_Reply */ 119 CARD8 pad0; 120 CARD16 sequenceNumber; 121 CARD32 length; 122 CARD32 nviews; 123 CARD32 pad1; 124 CARD32 pad2; 125 CARD32 pad3; 126 CARD32 pad4; 127 CARD32 pad5; 128 } xXiGMiscQueryViewsReply; 129 130 typedef struct { 131 BYTE type; /* X_Reply */ 132 CARD8 pad0; 133 CARD16 sequenceNumber; 134 CARD32 length; 135 CARD16 active; 136 CARD16 nresolutions; 137 CARD32 pad1; 138 CARD32 pad2; 139 CARD32 pad3; 140 CARD32 pad4; 141 CARD32 pad5; 142 } xXiGMiscQueryResolutionsReply; 143 144 typedef struct { 145 BYTE type; /* X_Reply */ 146 BOOL success; 147 CARD16 sequenceNumber; 148 CARD32 length; 149 CARD32 pad1; 150 CARD32 pad2; 151 CARD32 pad3; 152 CARD32 pad4; 153 CARD32 pad5; 154 CARD32 pad6; 155 } xXiGMiscFullScreenReply; 156 157 /*******************************************************************/ 158 159 typedef struct { 160 INT16 x; 161 INT16 y; 162 CARD16 w; 163 CARD16 h; 164 } XiGMiscViewInfo; 165 166 typedef struct { 167 CARD16 width; 168 CARD16 height; 169 INT32 refresh; 170 } XiGMiscResolutionInfo; 171 172 /*****************************************************************************/ 173 174 static XExtensionInfo *xigmisc_info = NULL; 175 static char *xigmisc_extension_name = XIGMISC_PROTOCOL_NAME; 176 177 #define XiGMiscCheckExtension(dpy,i,val) \ 178 XextCheckExtension (dpy, i, xigmisc_extension_name, val) 179 #define XiGMiscSimpleCheckExtension(dpy,i) \ 180 XextSimpleCheckExtension (dpy, i, xigmisc_extension_name) 181 182 #if defined(__STDC__) && !defined(UNIXCPP) 183 #define XiGMiscGetReq(name,req,info) GetReq (name, req); \ 184 req->reqType = info->codes->major_opcode; \ 185 req->xigmiscReqType = X_##name; 186 187 #define XiGMiscGetReqExtra(name,n,req,info) GetReqExtra (name, n, req); \ 188 req->reqType = info->codes->major_opcode; \ 189 req->xigmicReqType = X_##name; 190 #else 191 #define XiGMiscGetReq(name,req,info) GetReq (name, req); \ 192 req->reqType = info->codes->major_opcode; \ 193 req->xigmiscReqType = X_/**/name; 194 #define XiGMiscGetReqExtra(name,n,req,info) GetReqExtra (name, n, req); \ 195 req->reqType = info->codes->major_opcode; \ 196 req->xigmiscReqType = X_/**/name; 197 #endif 198 199 200 201 /* 202 * find_display - locate the display info block 203 */ 204 static int XiGMiscCloseDisplay(); 205 206 static XExtensionHooks xigmisc_extension_hooks = { 207 NULL, /* create_gc */ 208 NULL, /* copy_gc */ 209 NULL, /* flush_gc */ 210 NULL, /* free_gc */ 211 NULL, /* create_font */ 212 NULL, /* free_font */ 213 XiGMiscCloseDisplay, /* close_display */ 214 NULL, /* wire_to_event */ 215 NULL, /* event_to_wire */ 216 NULL, /* error */ 217 NULL, /* error_string */ 218 }; 219 220 221 static XEXT_GENERATE_CLOSE_DISPLAY (XiGMiscCloseDisplay, xigmisc_info) 222 223 static XEXT_GENERATE_FIND_DISPLAY (XiGMiscFindDisplay, xigmisc_info, 224 xigmisc_extension_name, 225 &xigmisc_extension_hooks, XiGMiscNumberEvents, NULL) 226 227 228 /*****************************************************************************/ 229 230 Bool XiGMiscQueryVersion(Display *dpy, int *major, int *minor) 231 { 232 int opcode, event, error; 233 xXiGMiscQueryVersionReq *req; 234 xXiGMiscQueryVersionReply rep; 235 XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); 236 237 if (!XQueryExtension(dpy, XIGMISC_PROTOCOL_NAME, &opcode, &event, &error)) 238 return xFalse; 239 240 XiGMiscCheckExtension(dpy, info, xFalse); 241 242 LockDisplay (dpy); 243 XiGMiscGetReq (XiGMiscQueryVersion, req, info); 244 245 req->major = XIGMISC_MAJOR_VERSION; 246 req->minor = XIGMISC_MINOR_VERSION; 247 248 if (!_XReply (dpy, (xReply *)&rep, 0, xTrue)) { 249 UnlockDisplay(dpy); 250 SyncHandle(); 251 return xFalse; 252 } 253 254 *major = rep.major; 255 *minor = rep.minor; 256 UnlockDisplay(dpy); 257 SyncHandle(); 258 259 return xTrue; 260 } 261 262 int XiGMiscQueryViews(Display *dpy, int screen, XiGMiscViewInfo **pviews) 263 { 264 int n, size; 265 XiGMiscViewInfo *views; 266 xXiGMiscQueryViewsReq *req; 267 xXiGMiscQueryViewsReply rep; 268 XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); 269 XiGMiscCheckExtension(dpy, info, 0); 270 271 LockDisplay (dpy); 272 XiGMiscGetReq (XiGMiscQueryViews, req, info); 273 req->screen = screen; 274 275 if (!_XReply (dpy, (xReply *)&rep, 0, xFalse)) { 276 UnlockDisplay(dpy); 277 SyncHandle(); 278 return 0; 279 } 280 281 n = rep.nviews; 282 283 if (n > 0) { 284 size = sizeof(XiGMiscViewInfo) * n; 285 views = (XiGMiscViewInfo*)Xmalloc(size); 286 if (!views) { 287 _XEatData(dpy, (unsigned long)size); 288 UnlockDisplay(dpy); 289 SyncHandle(); 290 return 0; 291 } 292 293 _XReadPad(dpy, (void*)views, size); 294 295 *pviews = views; 296 } 297 298 UnlockDisplay(dpy); 299 SyncHandle(); 300 301 return n; 302 } 303 304 int XiGMiscQueryResolutions(Display *dpy, int screen, int view, int *pactive, XiGMiscResolutionInfo **presolutions) 305 { 306 int n, size; 307 XiGMiscResolutionInfo *resolutions; 308 xXiGMiscQueryResolutionsReq *req; 309 xXiGMiscQueryResolutionsReply rep; 310 XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); 311 XiGMiscCheckExtension(dpy, info, 0); 312 313 LockDisplay (dpy); 314 XiGMiscGetReq (XiGMiscQueryResolutions, req, info); 315 req->screen = screen; 316 req->view = view; 317 318 if (!_XReply (dpy, (xReply *)&rep, 0, xFalse)) { 319 UnlockDisplay(dpy); 320 SyncHandle(); 321 return 0; 322 } 323 324 n = rep.nresolutions; 325 326 if (n > 0) { 327 size = sizeof(XiGMiscResolutionInfo) * n; 328 resolutions = (XiGMiscResolutionInfo*)Xmalloc(size); 329 if (!resolutions) { 330 _XEatData(dpy, (unsigned long)size); 331 UnlockDisplay(dpy); 332 SyncHandle(); 333 return 0; 334 } 335 336 _XReadPad(dpy, (void*)resolutions, size); 337 338 *presolutions = resolutions; 339 *pactive = rep.active; 340 } 341 342 UnlockDisplay(dpy); 343 SyncHandle(); 344 345 return n; 346 } 347 348 void XiGMiscChangeResolution(Display *dpy, int screen, int view, int width, int height, int refresh) 349 { 350 xXiGMiscChangeResolutionReq *req; 351 XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); 352 353 XiGMiscSimpleCheckExtension(dpy, info); 354 355 LockDisplay (dpy); 356 XiGMiscGetReq (XiGMiscChangeResolution, req, info); 357 req->screen = screen; 358 req->view = view; 359 req->width = width; 360 req->height = height; 361 req->refresh = refresh; 362 363 UnlockDisplay(dpy); 364 SyncHandle(); 365 } 366 367 368 Bool XiGMiscFullScreen(Display *dpy, int screen, XID window, XID cmap) 369 { 370 xXiGMiscFullScreenReq *req; 371 xXiGMiscFullScreenReply rep; 372 XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); 373 374 XiGMiscCheckExtension(dpy, info, xFalse); 375 376 LockDisplay (dpy); 377 XiGMiscGetReq (XiGMiscFullScreen, req, info); 378 req->screen = screen; 379 req->pad0 = 0; 380 req->pad1 = 0; 381 req->window = window; 382 req->cmap = cmap; 383 384 if (!_XReply (dpy, (xReply *)&rep, 0, xTrue)) { 385 UnlockDisplay(dpy); 386 SyncHandle(); 387 return xFalse; 388 } 389 390 UnlockDisplay(dpy); 391 SyncHandle(); 392 393 return (rep.success ? xTrue : xFalse); 394 } 395 396 397 /* SDL addition from Ryan: free memory used by xme. */ 398 void XiGMiscDestroy(void) 399 { 400 if (xigmisc_info) { 401 XextDestroyExtension(xigmisc_info); 402 xigmisc_info = NULL; 403 } 404 } 405 406