diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-12-18 19:29:12 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-12-18 19:29:12 +0000 |
commit | 49b23aa4b53349d2795a38058740f7f56e3cdb33 (patch) | |
tree | 45218d75d1d7d4e478d5b673ac4ef6f31cb548c0 /src/Xinerama.c | |
parent | d16fb988d427bf8c684a80fee18a4fe6c4d1d578 (diff) |
First pass at "Standard" Xinerama. The sources for this came from Heather
Lanigan's xinerama tree on Sourceforge.Net. No attempt has been made to
handle previous, non-standard versions of the protocol. Nor has any
attempt been made to preserve the ABI of previous versions -- that part
will be added at a later time, and then probably only on systems that
have nice object/linker semantics, e.g. ELF systems with weak symbols.
Diffstat (limited to 'src/Xinerama.c')
-rw-r--r-- | src/Xinerama.c | 419 |
1 files changed, 187 insertions, 232 deletions
diff --git a/src/Xinerama.c b/src/Xinerama.c index 7138613..575cb7e 100644 --- a/src/Xinerama.c +++ b/src/Xinerama.c @@ -1,81 +1,83 @@ -/* $Xorg: XPanoramiX.c,v 1.4 2000/08/17 19:45:51 cpqbld Exp $ */ -/***************************************************************** -Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING, -BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of Digital Equipment Corporation -shall not be used in advertising or otherwise to promote the sale, use or other -dealings in this Software without prior written authorization from Digital -Equipment Corporation. -******************************************************************/ -/* $XFree86: xc/lib/Xinerama/Xinerama.c,v 1.3 2002/10/16 00:37:31 dawes Exp $ */ +/* $XdotOrg$ */ +/************************************************************************* +* +* Copyright (c) 1999,2002 Hewlett-Packard Company +* Copyright (c) 1999,2002 IBM Corporation +* Copyright (c) 1999,2002 Hummingbird Communications Ltd. +* Copyright (c) 1999,2002 Silicon Graphics, Inc. +* Copyright (c) 1999,2002 Sun Microsystems, Inc. +* Copyright (c) 1999,2002 The Open Group +* +* All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, provided that the above copyright notice(s) and this +* permission notice appear in all copies of the Software and that both the +* above copyright notice(s) and this permission notice appear in supporting +* documentation. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE +* COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR +* ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR +* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +* OF THIS SOFTWARE. +* +* Except as contained in this notice, the name of a copyright holder shall +* not be used in advertising or otherwise to promote the sale, use or other +* dealings in this Software without prior written authorization of the +* copyright holder. +* +*************************************************************************/ #define NEED_EVENTS #define NEED_REPLIES +#include <stdio.h> #include <X11/Xlibint.h> #include <X11/Xutil.h> #include <X11/extensions/Xext.h> #include <X11/extensions/extutil.h> -#include <X11/extensions/panoramiXext.h> -#include <X11/extensions/panoramiXproto.h> +#include <X11/extensions/xineramaProto.h> #include <X11/extensions/Xinerama.h> -static XExtensionInfo _panoramiX_ext_info_data; -static XExtensionInfo *panoramiX_ext_info = &_panoramiX_ext_info_data; -static /* const */ char *panoramiX_extension_name = PANORAMIX_PROTOCOL_NAME; - -#define PanoramiXCheckExtension(dpy,i,val) \ - XextCheckExtension (dpy, i, panoramiX_extension_name, val) -#define PanoramiXSimpleCheckExtension(dpy,i) \ - XextSimpleCheckExtension (dpy, i, panoramiX_extension_name) - -static int close_display(); -static /* const */ XExtensionHooks panoramiX_extension_hooks = { - NULL, /* create_gc */ - NULL, /* copy_gc */ - NULL, /* flush_gc */ - NULL, /* free_gc */ - NULL, /* create_font */ - NULL, /* free_font */ - close_display, /* close_display */ - NULL, /* wire_to_event */ - NULL, /* event_to_wire */ - NULL, /* error */ - NULL, /* error_string */ -}; - -static XEXT_GENERATE_FIND_DISPLAY (find_display, panoramiX_ext_info, - panoramiX_extension_name, - &panoramiX_extension_hooks, - 0, NULL) +static XExtensionInfo _xinerama_ext_info_data; +static XExtensionInfo *xinerama_ext_info = &_xinerama_ext_info_data; +static char *xinerama_extension_name = XINERAMA_PROTOCOL_NAME; -static XEXT_GENERATE_CLOSE_DISPLAY (close_display, panoramiX_ext_info) +#define XineramaCheckExtension(dpy,i,val) \ + XextCheckExtension (dpy, i, xinerama_extension_name, val) +static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xinerama_ext_info) +static XExtensionHooks xinerama_extension_hooks = { + NULL, /* create_gc */ + NULL, /* copy_gc */ + NULL, /* flush_gc */ + NULL, /* free_gc */ + NULL, /* create_font */ + NULL, /* free_font */ + close_display, /* close_display */ + NULL, /* wire_to_event */ + NULL, /* event_to_wire */ + NULL, /* error */ + NULL, /* error_string */ +}; -/**************************************************************************** - * * - * PanoramiX public interfaces * - * * - ****************************************************************************/ +static XEXT_GENERATE_FIND_DISPLAY (find_display, xinerama_ext_info, + xinerama_extension_name, + &xinerama_extension_hooks, + 0, NULL) -Bool XPanoramiXQueryExtension ( +Bool XineramaQueryExtension ( Display *dpy, int *event_basep, int *error_basep @@ -84,236 +86,189 @@ Bool XPanoramiXQueryExtension ( XExtDisplayInfo *info = find_display (dpy); if (XextHasExtension(info)) { - *event_basep = info->codes->first_event; - *error_basep = info->codes->first_error; - return True; + *event_basep = info->codes->first_event; + *error_basep = info->codes->first_error; + return True; } else { - return False; + return False; } } - -Status XPanoramiXQueryVersion( +Status XineramaQueryVersion( Display *dpy, - int *major_versionp, - int *minor_versionp + int *major_version, + int *minor_version ) { XExtDisplayInfo *info = find_display (dpy); - xPanoramiXQueryVersionReply rep; - register xPanoramiXQueryVersionReq *req; + xXineramaQueryVersionReq *req; + xXineramaQueryVersionReply rep; - PanoramiXCheckExtension (dpy, info, 0); + XineramaCheckExtension (dpy, info, 0); LockDisplay (dpy); - GetReq (PanoramiXQueryVersion, req); + GetReq (XineramaQueryVersion, req); req->reqType = info->codes->major_opcode; - req->panoramiXReqType = X_PanoramiXQueryVersion; - req->clientMajor = PANORAMIX_MAJOR_VERSION; - req->clientMinor = PANORAMIX_MINOR_VERSION; + req->XineramaReqType = X_XineramaQueryVersion; + req->client_major_version = XINERAMA_MAJOR_VERSION; + req->client_minor_version = XINERAMA_MINOR_VERSION; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { - UnlockDisplay (dpy); - SyncHandle (); - return 0; + UnlockDisplay (dpy); + SyncHandle (); + return 0; } - *major_versionp = rep.majorVersion; - *minor_versionp = rep.minorVersion; + *major_version = rep.server_major_version; + *minor_version = rep.server_minor_version; UnlockDisplay (dpy); SyncHandle (); return 1; } -XPanoramiXInfo *XPanoramiXAllocInfo(void) -{ - return (XPanoramiXInfo *) Xmalloc (sizeof (XPanoramiXInfo)); -} - -Status XPanoramiXGetState ( - Display *dpy, - Drawable drawable, - XPanoramiXInfo *panoramiX_info +Bool XineramaActive ( + Display *dpy, + Window window ) { - XExtDisplayInfo *info = find_display (dpy); - xPanoramiXGetStateReply rep; - register xPanoramiXGetStateReq *req; + XExtDisplayInfo *info = find_display (dpy); + xXineramaActiveReply rep; + xXineramaActiveReq *req; + Bool active; - PanoramiXCheckExtension (dpy, info, 0); + XineramaCheckExtension (dpy, info, False); LockDisplay (dpy); - GetReq (PanoramiXGetState, req); + GetReq (XineramaActive, req); req->reqType = info->codes->major_opcode; - req->panoramiXReqType = X_PanoramiXGetState; - req->window = drawable; + req->XineramaReqType = X_XineramaActive; + req->window = window; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { - UnlockDisplay (dpy); - SyncHandle (); - return 0; + UnlockDisplay (dpy); + SyncHandle (); + return False; } + active = rep.active; UnlockDisplay (dpy); SyncHandle (); - panoramiX_info->window = rep.window; - panoramiX_info->State = rep.state; - return 1; + return active; } -Status XPanoramiXGetScreenCount ( - Display *dpy, - Drawable drawable, - XPanoramiXInfo *panoramiX_info + + +Status XineramaGetData( + Display *dpy, + Window window, + XRectangle **framebuffer_rects, + int *number_framebuffers ) { - XExtDisplayInfo *info = find_display (dpy); - xPanoramiXGetScreenCountReply rep; - register xPanoramiXGetScreenCountReq *req; + XExtDisplayInfo *info = find_display (dpy); + xXineramaGetDataReq *req; + xXineramaGetDataReply rep; + XRectangle *rects; + int result = 0; + + *number_framebuffers = 0; + *framebuffer_rects = NULL; - PanoramiXCheckExtension (dpy, info, 0); + XineramaCheckExtension (dpy, info, 0); LockDisplay (dpy); - GetReq (PanoramiXGetScreenCount, req); + GetReq (XineramaGetData, req); req->reqType = info->codes->major_opcode; - req->panoramiXReqType = X_PanoramiXGetScreenCount; - req->window = drawable; - if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { - UnlockDisplay (dpy); - SyncHandle (); - return 0; + req->XineramaReqType = X_XineramaGetData; + req->window = window; + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + + if(rep.num_rects) { + if((rects = Xmalloc(sizeof(XRectangle) * rep.num_rects))) { + xXineramaRectangle scratch; + int i; + + for(i = 0; i < rep.num_rects; i++) { + _XRead(dpy, (char*)&scratch, sz_xXineramaRectangle); + rects[i].x = scratch.x; + rects[i].y = scratch.y; + rects[i].width = scratch.width; + rects[i].height = scratch.height; + } + *framebuffer_rects = rects; + *number_framebuffers = rep.num_rects; + result = 1; + } else { + _XEatData(dpy, rep.length << 2); + } } + UnlockDisplay (dpy); SyncHandle (); - panoramiX_info->window = rep.window; - panoramiX_info->ScreenCount = rep.ScreenCount; - return 1; + return result; } -Status XPanoramiXGetScreenSize ( - Display *dpy, - Drawable drawable, - int screen_num, - XPanoramiXInfo *panoramiX_info +#define HINT_NAME "XINERAMA_CENTER_HINT" +#define HINT_TYPE "INTEGER" + +Status XineramaGetCenterHint ( + Display *dpy, + Window root, + int *x, + int *y ) { - XExtDisplayInfo *info = find_display (dpy); - xPanoramiXGetScreenSizeReply rep; - register xPanoramiXGetScreenSizeReq *req; + XExtDisplayInfo *info = find_display (dpy); + Atom atom, type, actual_type; + unsigned long nitems, bytes_after; + int actual_format, status; + short *prop; - PanoramiXCheckExtension (dpy, info, 0); + XineramaCheckExtension (dpy, info, 0); - LockDisplay (dpy); - GetReq (PanoramiXGetScreenSize, req); - req->reqType = info->codes->major_opcode; - req->panoramiXReqType = X_PanoramiXGetScreenSize; - req->window = drawable; - req->screen = screen_num; /* need to define */ - if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { - UnlockDisplay (dpy); - SyncHandle (); - return 0; - } - UnlockDisplay (dpy); - SyncHandle (); - panoramiX_info->window = rep.window; - panoramiX_info->screen = rep.screen; - panoramiX_info->width = rep.width; - panoramiX_info->height = rep.height; - return 1; -} + type = XInternAtom(dpy, HINT_TYPE, False); + atom = XInternAtom(dpy, HINT_NAME, True); -/*******************************************************************\ - Alternate interface to make up for shortcomings in the original, - namely, the omission of the screen origin. The new interface is - in the "Xinerama" namespace instead of "PanoramiX". -\*******************************************************************/ + if(atom == None) return 0; /* no such atom */ -Bool XineramaQueryExtension ( - Display *dpy, - int *event_base, - int *error_base -) -{ - return XPanoramiXQueryExtension(dpy, event_base, error_base); -} + if( (status = XGetWindowProperty(dpy, root, atom, 0, 1, False, type, + &actual_type, &actual_format, &nitems, + &bytes_after, (unsigned char**)(&prop))) + != Success) + return 0; -Status XineramaQueryVersion( - Display *dpy, - int *major, - int *minor -) -{ - return XPanoramiXQueryVersion(dpy, major, minor); -} + if(actual_type == None) return 0; /* no such property */ -Bool XineramaIsActive(Display *dpy) -{ - xXineramaIsActiveReply rep; - xXineramaIsActiveReq *req; - XExtDisplayInfo *info = find_display (dpy); + *x = prop[0]; + *y = prop[1]; - if(!XextHasExtension(info)) - return False; /* server doesn't even have the extension */ + if (prop) XFree(prop); - LockDisplay (dpy); - GetReq (XineramaIsActive, req); - req->reqType = info->codes->major_opcode; - req->panoramiXReqType = X_XineramaIsActive; - if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { - UnlockDisplay (dpy); - SyncHandle (); - return False; - } - UnlockDisplay (dpy); - SyncHandle (); - return rep.state; + return 1; } -#include <stdio.h> -XineramaScreenInfo * -XineramaQueryScreens( - Display *dpy, - int *number +Status XineramaSetCenterHint ( + Display *dpy, + Window root, + int x, + int y ) { - XExtDisplayInfo *info = find_display (dpy); - xXineramaQueryScreensReply rep; - xXineramaQueryScreensReq *req; - XineramaScreenInfo *scrnInfo = NULL; + XExtDisplayInfo *info = find_display (dpy); + Atom atom, type; + short data[2]; - PanoramiXCheckExtension (dpy, info, 0); + XineramaCheckExtension (dpy, info, 0); - LockDisplay (dpy); - GetReq (XineramaQueryScreens, req); - req->reqType = info->codes->major_opcode; - req->panoramiXReqType = X_XineramaQueryScreens; - if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { - UnlockDisplay (dpy); - SyncHandle (); - return NULL; - } + atom = XInternAtom(dpy, HINT_NAME, False); + type = XInternAtom(dpy, HINT_TYPE, False); - if(rep.number) { - if((scrnInfo = Xmalloc(sizeof(XineramaScreenInfo) * rep.number))) { - xXineramaScreenInfo scratch; - int i; - - for(i = 0; i < rep.number; i++) { - _XRead(dpy, (char*)(&scratch), sz_XineramaScreenInfo); - scrnInfo[i].screen_number = i; - scrnInfo[i].x_org = scratch.x_org; - scrnInfo[i].y_org = scratch.y_org; - scrnInfo[i].width = scratch.width; - scrnInfo[i].height = scratch.height; - } - - *number = rep.number; - } else - _XEatData(dpy, rep.length << 2); - } + data[0] = x; + data[1] = y; - UnlockDisplay (dpy); - SyncHandle (); - return scrnInfo; + return XChangeProperty(dpy, root, atom, type, 16, PropModeReplace, + (unsigned char*)data, 2); } - |