Home | History | Annotate | Download | only in XME
      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