src/video/Xext/XME/xme.c
author Ryan C. Gordon
Sun, 29 Oct 2006 02:46:42 +0000
branchSDL-1.2
changeset 3885 a10bddfdc40f
parent 1599 ecba4bbaf9c2
child 4144 904defc0792e
permissions -rw-r--r--
Closing minor memory leak in XME code.
     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@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