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