Mercurial > sdl-ios-xcode
comparison src/video/Xext/Xinerama/Xinerama.c @ 292:eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Incorporated XFree86 extension libraries into the source
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 05 Mar 2002 19:55:32 +0000 |
parents | |
children | 045f186426e1 |
comparison
equal
deleted
inserted
replaced
291:68a8a8237c09 | 292:eadc0746dfaf |
---|---|
1 /* $Xorg: XPanoramiX.c,v 1.4 2000/08/17 19:45:51 cpqbld Exp $ */ | |
2 /***************************************************************** | |
3 Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts. | |
4 Permission is hereby granted, free of charge, to any person obtaining a copy | |
5 of this software and associated documentation files (the "Software"), to deal | |
6 in the Software without restriction, including without limitation the rights | |
7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 copies of the Software. | |
9 | |
10 The above copyright notice and this permission notice shall be included in | |
11 all copies or substantial portions of the Software. | |
12 | |
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
14 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
15 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
16 DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING, | |
17 BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY, | |
18 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR | |
19 IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
20 | |
21 Except as contained in this notice, the name of Digital Equipment Corporation | |
22 shall not be used in advertising or otherwise to promote the sale, use or other | |
23 dealings in this Software without prior written authorization from Digital | |
24 Equipment Corporation. | |
25 ******************************************************************/ | |
26 /* $XFree86: xc/lib/Xinerama/Xinerama.c,v 1.2 2001/07/23 17:20:28 dawes Exp $ */ | |
27 | |
28 #define NEED_EVENTS | |
29 #define NEED_REPLIES | |
30 #include <X11/Xlibint.h> | |
31 #include <X11/Xutil.h> | |
32 #include <X11/extensions/Xext.h> /* in ../include */ | |
33 #include "extutil.h" /* in ../include */ | |
34 #include "panoramiXext.h" | |
35 #include "panoramiXproto.h" /* in ../include */ | |
36 #include "Xinerama.h" | |
37 | |
38 | |
39 static XExtensionInfo _panoramiX_ext_info_data; | |
40 static XExtensionInfo *panoramiX_ext_info = &_panoramiX_ext_info_data; | |
41 static /* const */ char *panoramiX_extension_name = PANORAMIX_PROTOCOL_NAME; | |
42 | |
43 #define PanoramiXCheckExtension(dpy,i,val) \ | |
44 XextCheckExtension (dpy, i, panoramiX_extension_name, val) | |
45 #define PanoramiXSimpleCheckExtension(dpy,i) \ | |
46 XextSimpleCheckExtension (dpy, i, panoramiX_extension_name) | |
47 | |
48 static int close_display(); | |
49 static /* const */ XExtensionHooks panoramiX_extension_hooks = { | |
50 NULL, /* create_gc */ | |
51 NULL, /* copy_gc */ | |
52 NULL, /* flush_gc */ | |
53 NULL, /* free_gc */ | |
54 NULL, /* create_font */ | |
55 NULL, /* free_font */ | |
56 close_display, /* close_display */ | |
57 NULL, /* wire_to_event */ | |
58 NULL, /* event_to_wire */ | |
59 NULL, /* error */ | |
60 NULL, /* error_string */ | |
61 }; | |
62 | |
63 static XEXT_GENERATE_FIND_DISPLAY (find_display, panoramiX_ext_info, | |
64 panoramiX_extension_name, | |
65 &panoramiX_extension_hooks, | |
66 0, NULL) | |
67 | |
68 static XEXT_GENERATE_CLOSE_DISPLAY (close_display, panoramiX_ext_info) | |
69 | |
70 | |
71 | |
72 /**************************************************************************** | |
73 * * | |
74 * PanoramiX public interfaces * | |
75 * * | |
76 ****************************************************************************/ | |
77 | |
78 Bool SDL_NAME(XPanoramiXQueryExtension) ( | |
79 Display *dpy, | |
80 int *event_basep, | |
81 int *error_basep | |
82 ) | |
83 { | |
84 XExtDisplayInfo *info = find_display (dpy); | |
85 | |
86 if (XextHasExtension(info)) { | |
87 *event_basep = info->codes->first_event; | |
88 *error_basep = info->codes->first_error; | |
89 return True; | |
90 } else { | |
91 return False; | |
92 } | |
93 } | |
94 | |
95 | |
96 Status SDL_NAME(XPanoramiXQueryVersion)( | |
97 Display *dpy, | |
98 int *major_versionp, | |
99 int *minor_versionp | |
100 ) | |
101 { | |
102 XExtDisplayInfo *info = find_display (dpy); | |
103 xPanoramiXQueryVersionReply rep; | |
104 register xPanoramiXQueryVersionReq *req; | |
105 | |
106 PanoramiXCheckExtension (dpy, info, 0); | |
107 | |
108 LockDisplay (dpy); | |
109 GetReq (PanoramiXQueryVersion, req); | |
110 req->reqType = info->codes->major_opcode; | |
111 req->panoramiXReqType = X_PanoramiXQueryVersion; | |
112 req->clientMajor = PANORAMIX_MAJOR_VERSION; | |
113 req->clientMinor = PANORAMIX_MINOR_VERSION; | |
114 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { | |
115 UnlockDisplay (dpy); | |
116 SyncHandle (); | |
117 return 0; | |
118 } | |
119 *major_versionp = rep.majorVersion; | |
120 *minor_versionp = rep.minorVersion; | |
121 UnlockDisplay (dpy); | |
122 SyncHandle (); | |
123 return 1; | |
124 } | |
125 | |
126 SDL_NAME(XPanoramiXInfo) *SDL_NAME(XPanoramiXAllocInfo)(void) | |
127 { | |
128 return (SDL_NAME(XPanoramiXInfo) *) Xmalloc (sizeof (SDL_NAME(XPanoramiXInfo))); | |
129 } | |
130 | |
131 Status SDL_NAME(XPanoramiXGetState) ( | |
132 Display *dpy, | |
133 Drawable drawable, | |
134 SDL_NAME(XPanoramiXInfo) *panoramiX_info | |
135 ) | |
136 { | |
137 XExtDisplayInfo *info = find_display (dpy); | |
138 xPanoramiXGetStateReply rep; | |
139 register xPanoramiXGetStateReq *req; | |
140 | |
141 PanoramiXCheckExtension (dpy, info, 0); | |
142 | |
143 LockDisplay (dpy); | |
144 GetReq (PanoramiXGetState, req); | |
145 req->reqType = info->codes->major_opcode; | |
146 req->panoramiXReqType = X_PanoramiXGetState; | |
147 req->window = drawable; | |
148 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { | |
149 UnlockDisplay (dpy); | |
150 SyncHandle (); | |
151 return 0; | |
152 } | |
153 UnlockDisplay (dpy); | |
154 SyncHandle (); | |
155 panoramiX_info->window = rep.window; | |
156 panoramiX_info->State = rep.state; | |
157 return 1; | |
158 } | |
159 | |
160 Status SDL_NAME(XPanoramiXGetScreenCount) ( | |
161 Display *dpy, | |
162 Drawable drawable, | |
163 SDL_NAME(XPanoramiXInfo) *panoramiX_info | |
164 ) | |
165 { | |
166 XExtDisplayInfo *info = find_display (dpy); | |
167 xPanoramiXGetScreenCountReply rep; | |
168 register xPanoramiXGetScreenCountReq *req; | |
169 | |
170 PanoramiXCheckExtension (dpy, info, 0); | |
171 | |
172 LockDisplay (dpy); | |
173 GetReq (PanoramiXGetScreenCount, req); | |
174 req->reqType = info->codes->major_opcode; | |
175 req->panoramiXReqType = X_PanoramiXGetScreenCount; | |
176 req->window = drawable; | |
177 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { | |
178 UnlockDisplay (dpy); | |
179 SyncHandle (); | |
180 return 0; | |
181 } | |
182 UnlockDisplay (dpy); | |
183 SyncHandle (); | |
184 panoramiX_info->window = rep.window; | |
185 panoramiX_info->ScreenCount = rep.ScreenCount; | |
186 return 1; | |
187 } | |
188 | |
189 Status SDL_NAME(XPanoramiXGetScreenSize) ( | |
190 Display *dpy, | |
191 Drawable drawable, | |
192 int screen_num, | |
193 SDL_NAME(XPanoramiXInfo) *panoramiX_info | |
194 ) | |
195 { | |
196 XExtDisplayInfo *info = find_display (dpy); | |
197 xPanoramiXGetScreenSizeReply rep; | |
198 register xPanoramiXGetScreenSizeReq *req; | |
199 | |
200 PanoramiXCheckExtension (dpy, info, 0); | |
201 | |
202 LockDisplay (dpy); | |
203 GetReq (PanoramiXGetScreenSize, req); | |
204 req->reqType = info->codes->major_opcode; | |
205 req->panoramiXReqType = X_PanoramiXGetScreenSize; | |
206 req->window = drawable; | |
207 req->screen = screen_num; /* need to define */ | |
208 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { | |
209 UnlockDisplay (dpy); | |
210 SyncHandle (); | |
211 return 0; | |
212 } | |
213 UnlockDisplay (dpy); | |
214 SyncHandle (); | |
215 panoramiX_info->window = rep.window; | |
216 panoramiX_info->screen = rep.screen; | |
217 panoramiX_info->width = rep.width; | |
218 panoramiX_info->height = rep.height; | |
219 return 1; | |
220 } | |
221 | |
222 /*******************************************************************\ | |
223 Alternate interface to make up for shortcomings in the original, | |
224 namely, the omission of the screen origin. The new interface is | |
225 in the "Xinerama" namespace instead of "PanoramiX". | |
226 \*******************************************************************/ | |
227 | |
228 Bool SDL_NAME(XineramaQueryExtension) ( | |
229 Display *dpy, | |
230 int *event_base, | |
231 int *error_base | |
232 ) | |
233 { | |
234 return SDL_NAME(XPanoramiXQueryExtension)(dpy, event_base, error_base); | |
235 } | |
236 | |
237 Status SDL_NAME(XineramaQueryVersion)( | |
238 Display *dpy, | |
239 int *major, | |
240 int *minor | |
241 ) | |
242 { | |
243 return SDL_NAME(XPanoramiXQueryVersion)(dpy, major, minor); | |
244 } | |
245 | |
246 Bool SDL_NAME(XineramaIsActive)(Display *dpy) | |
247 { | |
248 xXineramaIsActiveReply rep; | |
249 xXineramaIsActiveReq *req; | |
250 XExtDisplayInfo *info = find_display (dpy); | |
251 | |
252 if(!XextHasExtension(info)) | |
253 return False; /* server doesn't even have the extension */ | |
254 | |
255 LockDisplay (dpy); | |
256 GetReq (XineramaIsActive, req); | |
257 req->reqType = info->codes->major_opcode; | |
258 req->panoramiXReqType = X_XineramaIsActive; | |
259 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { | |
260 UnlockDisplay (dpy); | |
261 SyncHandle (); | |
262 return False; | |
263 } | |
264 UnlockDisplay (dpy); | |
265 SyncHandle (); | |
266 return rep.state; | |
267 } | |
268 | |
269 #include <stdio.h> | |
270 | |
271 SDL_NAME(XineramaScreenInfo) * | |
272 SDL_NAME(XineramaQueryScreens)( | |
273 Display *dpy, | |
274 int *number | |
275 ) | |
276 { | |
277 XExtDisplayInfo *info = find_display (dpy); | |
278 xXineramaQueryScreensReply rep; | |
279 xXineramaQueryScreensReq *req; | |
280 SDL_NAME(XineramaScreenInfo) *scrnInfo = NULL; | |
281 | |
282 PanoramiXCheckExtension (dpy, info, 0); | |
283 | |
284 LockDisplay (dpy); | |
285 GetReq (XineramaQueryScreens, req); | |
286 req->reqType = info->codes->major_opcode; | |
287 req->panoramiXReqType = X_XineramaQueryScreens; | |
288 if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { | |
289 UnlockDisplay (dpy); | |
290 SyncHandle (); | |
291 return NULL; | |
292 } | |
293 | |
294 if(rep.number) { | |
295 if((scrnInfo = Xmalloc(sizeof(SDL_NAME(XineramaScreenInfo)) * rep.number))) { | |
296 xXineramaScreenInfo scratch; | |
297 int i; | |
298 | |
299 for(i = 0; i < rep.number; i++) { | |
300 _XRead(dpy, (char*)(&scratch), sz_XineramaScreenInfo); | |
301 scrnInfo[i].screen_number = i; | |
302 scrnInfo[i].x_org = scratch.x_org; | |
303 scrnInfo[i].y_org = scratch.y_org; | |
304 scrnInfo[i].width = scratch.width; | |
305 scrnInfo[i].height = scratch.height; | |
306 } | |
307 | |
308 *number = rep.number; | |
309 } else | |
310 _XEatData(dpy, rep.length << 2); | |
311 } | |
312 | |
313 UnlockDisplay (dpy); | |
314 SyncHandle (); | |
315 return scrnInfo; | |
316 } | |
317 | |
318 | |
319 |