SDL-1.2.14
[sdl_omap.git] / src / video / Xext / XME / xme.c
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 /* 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