e14743d1 |
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 | |
31 | /* Apparently some X11 systems can't include this multiple times... */ |
32 | #ifndef SDL_INCLUDED_XLIBINT_H |
33 | #define SDL_INCLUDED_XLIBINT_H 1 |
34 | #include <X11/Xlibint.h> |
35 | #endif |
36 | |
37 | #include <X11/Xutil.h> |
38 | #include "../extensions/Xext.h" |
39 | #include "../extensions/extutil.h" /* in ../include */ |
40 | #include "../extensions/panoramiXext.h" |
41 | #include "../extensions/panoramiXproto.h" /* in ../include */ |
42 | #include "../extensions/Xinerama.h" |
43 | |
44 | static XExtensionInfo _panoramiX_ext_info_data; |
45 | static XExtensionInfo *panoramiX_ext_info = &_panoramiX_ext_info_data; |
46 | static /* const */ char *panoramiX_extension_name = PANORAMIX_PROTOCOL_NAME; |
47 | |
48 | #define PanoramiXCheckExtension(dpy,i,val) \ |
49 | XextCheckExtension (dpy, i, panoramiX_extension_name, val) |
50 | #define PanoramiXSimpleCheckExtension(dpy,i) \ |
51 | XextSimpleCheckExtension (dpy, i, panoramiX_extension_name) |
52 | |
53 | static int close_display(); |
54 | static /* const */ XExtensionHooks panoramiX_extension_hooks = { |
55 | NULL, /* create_gc */ |
56 | NULL, /* copy_gc */ |
57 | NULL, /* flush_gc */ |
58 | NULL, /* free_gc */ |
59 | NULL, /* create_font */ |
60 | NULL, /* free_font */ |
61 | close_display, /* close_display */ |
62 | NULL, /* wire_to_event */ |
63 | NULL, /* event_to_wire */ |
64 | NULL, /* error */ |
65 | NULL, /* error_string */ |
66 | }; |
67 | |
68 | static XEXT_GENERATE_FIND_DISPLAY (find_display, panoramiX_ext_info, |
69 | panoramiX_extension_name, |
70 | &panoramiX_extension_hooks, |
71 | 0, NULL) |
72 | |
73 | static XEXT_GENERATE_CLOSE_DISPLAY (close_display, panoramiX_ext_info) |
74 | |
75 | |
76 | |
77 | /**************************************************************************** |
78 | * * |
79 | * PanoramiX public interfaces * |
80 | * * |
81 | ****************************************************************************/ |
82 | |
83 | Bool SDL_NAME(XPanoramiXQueryExtension) ( |
84 | Display *dpy, |
85 | int *event_basep, |
86 | int *error_basep |
87 | ) |
88 | { |
89 | XExtDisplayInfo *info = find_display (dpy); |
90 | |
91 | if (XextHasExtension(info)) { |
92 | *event_basep = info->codes->first_event; |
93 | *error_basep = info->codes->first_error; |
94 | return True; |
95 | } else { |
96 | return False; |
97 | } |
98 | } |
99 | |
100 | |
101 | Status SDL_NAME(XPanoramiXQueryVersion)( |
102 | Display *dpy, |
103 | int *major_versionp, |
104 | int *minor_versionp |
105 | ) |
106 | { |
107 | XExtDisplayInfo *info = find_display (dpy); |
108 | xPanoramiXQueryVersionReply rep; |
109 | register xPanoramiXQueryVersionReq *req; |
110 | |
111 | PanoramiXCheckExtension (dpy, info, 0); |
112 | |
113 | LockDisplay (dpy); |
114 | GetReq (PanoramiXQueryVersion, req); |
115 | req->reqType = info->codes->major_opcode; |
116 | req->panoramiXReqType = X_PanoramiXQueryVersion; |
117 | req->clientMajor = PANORAMIX_MAJOR_VERSION; |
118 | req->clientMinor = PANORAMIX_MINOR_VERSION; |
119 | if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
120 | UnlockDisplay (dpy); |
121 | SyncHandle (); |
122 | return 0; |
123 | } |
124 | *major_versionp = rep.majorVersion; |
125 | *minor_versionp = rep.minorVersion; |
126 | UnlockDisplay (dpy); |
127 | SyncHandle (); |
128 | return 1; |
129 | } |
130 | |
131 | SDL_NAME(XPanoramiXInfo) *SDL_NAME(XPanoramiXAllocInfo)(void) |
132 | { |
133 | return (SDL_NAME(XPanoramiXInfo) *) Xmalloc (sizeof (SDL_NAME(XPanoramiXInfo))); |
134 | } |
135 | |
136 | Status SDL_NAME(XPanoramiXGetState) ( |
137 | Display *dpy, |
138 | Drawable drawable, |
139 | SDL_NAME(XPanoramiXInfo) *panoramiX_info |
140 | ) |
141 | { |
142 | XExtDisplayInfo *info = find_display (dpy); |
143 | xPanoramiXGetStateReply rep; |
144 | register xPanoramiXGetStateReq *req; |
145 | |
146 | PanoramiXCheckExtension (dpy, info, 0); |
147 | |
148 | LockDisplay (dpy); |
149 | GetReq (PanoramiXGetState, req); |
150 | req->reqType = info->codes->major_opcode; |
151 | req->panoramiXReqType = X_PanoramiXGetState; |
152 | req->window = drawable; |
153 | if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
154 | UnlockDisplay (dpy); |
155 | SyncHandle (); |
156 | return 0; |
157 | } |
158 | UnlockDisplay (dpy); |
159 | SyncHandle (); |
160 | panoramiX_info->window = rep.window; |
161 | panoramiX_info->State = rep.state; |
162 | return 1; |
163 | } |
164 | |
165 | Status SDL_NAME(XPanoramiXGetScreenCount) ( |
166 | Display *dpy, |
167 | Drawable drawable, |
168 | SDL_NAME(XPanoramiXInfo) *panoramiX_info |
169 | ) |
170 | { |
171 | XExtDisplayInfo *info = find_display (dpy); |
172 | xPanoramiXGetScreenCountReply rep; |
173 | register xPanoramiXGetScreenCountReq *req; |
174 | |
175 | PanoramiXCheckExtension (dpy, info, 0); |
176 | |
177 | LockDisplay (dpy); |
178 | GetReq (PanoramiXGetScreenCount, req); |
179 | req->reqType = info->codes->major_opcode; |
180 | req->panoramiXReqType = X_PanoramiXGetScreenCount; |
181 | req->window = drawable; |
182 | if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
183 | UnlockDisplay (dpy); |
184 | SyncHandle (); |
185 | return 0; |
186 | } |
187 | UnlockDisplay (dpy); |
188 | SyncHandle (); |
189 | panoramiX_info->window = rep.window; |
190 | panoramiX_info->ScreenCount = rep.ScreenCount; |
191 | return 1; |
192 | } |
193 | |
194 | Status SDL_NAME(XPanoramiXGetScreenSize) ( |
195 | Display *dpy, |
196 | Drawable drawable, |
197 | int screen_num, |
198 | SDL_NAME(XPanoramiXInfo) *panoramiX_info |
199 | ) |
200 | { |
201 | XExtDisplayInfo *info = find_display (dpy); |
202 | xPanoramiXGetScreenSizeReply rep; |
203 | register xPanoramiXGetScreenSizeReq *req; |
204 | |
205 | PanoramiXCheckExtension (dpy, info, 0); |
206 | |
207 | LockDisplay (dpy); |
208 | GetReq (PanoramiXGetScreenSize, req); |
209 | req->reqType = info->codes->major_opcode; |
210 | req->panoramiXReqType = X_PanoramiXGetScreenSize; |
211 | req->window = drawable; |
212 | req->screen = screen_num; /* need to define */ |
213 | if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
214 | UnlockDisplay (dpy); |
215 | SyncHandle (); |
216 | return 0; |
217 | } |
218 | UnlockDisplay (dpy); |
219 | SyncHandle (); |
220 | panoramiX_info->window = rep.window; |
221 | panoramiX_info->screen = rep.screen; |
222 | panoramiX_info->width = rep.width; |
223 | panoramiX_info->height = rep.height; |
224 | return 1; |
225 | } |
226 | |
227 | /*******************************************************************\ |
228 | Alternate interface to make up for shortcomings in the original, |
229 | namely, the omission of the screen origin. The new interface is |
230 | in the "Xinerama" namespace instead of "PanoramiX". |
231 | \*******************************************************************/ |
232 | |
233 | Bool SDL_NAME(XineramaQueryExtension) ( |
234 | Display *dpy, |
235 | int *event_base, |
236 | int *error_base |
237 | ) |
238 | { |
239 | return SDL_NAME(XPanoramiXQueryExtension)(dpy, event_base, error_base); |
240 | } |
241 | |
242 | Status SDL_NAME(XineramaQueryVersion)( |
243 | Display *dpy, |
244 | int *major, |
245 | int *minor |
246 | ) |
247 | { |
248 | return SDL_NAME(XPanoramiXQueryVersion)(dpy, major, minor); |
249 | } |
250 | |
251 | Bool SDL_NAME(XineramaIsActive)(Display *dpy) |
252 | { |
253 | xXineramaIsActiveReply rep; |
254 | xXineramaIsActiveReq *req; |
255 | XExtDisplayInfo *info = find_display (dpy); |
256 | |
257 | if(!XextHasExtension(info)) |
258 | return False; /* server doesn't even have the extension */ |
259 | |
260 | LockDisplay (dpy); |
261 | GetReq (XineramaIsActive, req); |
262 | req->reqType = info->codes->major_opcode; |
263 | req->panoramiXReqType = X_XineramaIsActive; |
264 | if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
265 | UnlockDisplay (dpy); |
266 | SyncHandle (); |
267 | return False; |
268 | } |
269 | UnlockDisplay (dpy); |
270 | SyncHandle (); |
271 | return rep.state; |
272 | } |
273 | |
274 | #include <stdio.h> |
275 | |
276 | SDL_NAME(XineramaScreenInfo) * |
277 | SDL_NAME(XineramaQueryScreens)( |
278 | Display *dpy, |
279 | int *number |
280 | ) |
281 | { |
282 | XExtDisplayInfo *info = find_display (dpy); |
283 | xXineramaQueryScreensReply rep; |
284 | xXineramaQueryScreensReq *req; |
285 | SDL_NAME(XineramaScreenInfo) *scrnInfo = NULL; |
286 | |
287 | PanoramiXCheckExtension (dpy, info, 0); |
288 | |
289 | LockDisplay (dpy); |
290 | GetReq (XineramaQueryScreens, req); |
291 | req->reqType = info->codes->major_opcode; |
292 | req->panoramiXReqType = X_XineramaQueryScreens; |
293 | if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { |
294 | UnlockDisplay (dpy); |
295 | SyncHandle (); |
296 | return NULL; |
297 | } |
298 | |
299 | if(rep.number) { |
300 | if((scrnInfo = Xmalloc(sizeof(SDL_NAME(XineramaScreenInfo)) * rep.number))) { |
301 | xXineramaScreenInfo scratch; |
302 | int i; |
303 | |
304 | for(i = 0; i < rep.number; i++) { |
305 | _XRead(dpy, (char*)(&scratch), sz_XineramaScreenInfo); |
306 | scrnInfo[i].screen_number = i; |
307 | scrnInfo[i].x_org = scratch.x_org; |
308 | scrnInfo[i].y_org = scratch.y_org; |
309 | scrnInfo[i].width = scratch.width; |
310 | scrnInfo[i].height = scratch.height; |
311 | } |
312 | |
313 | *number = rep.number; |
314 | } else |
315 | _XEatData(dpy, rep.length << 2); |
316 | } |
317 | |
318 | UnlockDisplay (dpy); |
319 | SyncHandle (); |
320 | return scrnInfo; |
321 | } |
322 | |
323 | |
324 | |