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