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 #include <X11/Xlibint.h> 32 #include <X11/Xutil.h> 33 #include "../extensions/Xext.h" 34 #include "../extensions/extutil.h" /* in ../include */ 35 #include "../extensions/panoramiXext.h" 36 #include "../extensions/panoramiXproto.h" /* in ../include */ 37 #include "../extensions/Xinerama.h" 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 320