Home | History | Annotate | Download | only in Xinerama
      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 
    325