Mercurial > sdl-ios-xcode
diff src/video/Xext/XME/xme.c @ 1242:caf0328c8058
Add XME hooks to X11 driver instead of relying on libxme...libxme hasn't
changed in five years, and it's a small .c file that just calls into the X11
dependencies we already use elsewhere. Including it directly allows us to
make use of the dynamic X11 code.
Fixes Bugzilla #41.
--ryan.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Thu, 12 Jan 2006 22:46:36 +0000 |
parents | |
children | 19418e4422cb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/video/Xext/XME/xme.c Thu Jan 12 22:46:36 2006 +0000 @@ -0,0 +1,397 @@ +/* + * Copyright 1993-2001 by Xi Graphics, Inc. + * All Rights Reserved. + * + * Please see the LICENSE file accompanying this distribution for licensing + * information. + * + * Please send any bug fixes and modifications to src@xig.com. + * + * $XiGId: xme.c,v 1.2 2001/11/30 21:56:59 jon Exp $ + * + */ + +#define NEED_EVENTS +#define NEED_REPLIES + +#include <X11/Xlibint.h> +#include <X11/Xthreads.h> +#include <X11/Xmd.h> +#include <X11/Xproto.h> +#include <X11/extensions/Xext.h> +#include "extutil.h" + +#include "../../x11/SDL_x11dyn.h" + +/*****************************************************************************/ + + +#define XIGMISC_PROTOCOL_NAME "XiG-SUNDRY-NONSTANDARD" +#define XIGMISC_MAJOR_VERSION 2 +#define XIGMISC_MINOR_VERSION 0 + +#define XiGMiscNumberEvents 0 + +#define X_XiGMiscQueryVersion 0 +#define X_XiGMiscQueryViews 1 +#define X_XiGMiscQueryResolutions 2 +#define X_XiGMiscChangeResolution 3 +#define X_XiGMiscFullScreen 4 + +#define sz_xXiGMiscQueryVersionReq 8 +#define sz_xXiGMiscQueryViewsReq 8 +#define sz_xXiGMiscQueryResolutionsReq 8 +#define sz_xXiGMiscChangeResolutionReq 16 +#define sz_xXiGMiscFullScreenReq 16 + +#define sz_xXiGMiscQueryVersionReply 32 +#define sz_xXiGMiscQueryViewsReply 32 +#define sz_xXiGMiscQueryResolutionsReply 32 +#define sz_xXiGMiscQueryFullScreenReply 32 + +/*******************************************************************/ + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 xigmiscReqType; /* always X_XiGMiscQueryVersion */ + CARD16 length; + CARD16 major; + CARD16 minor; +} xXiGMiscQueryVersionReq; + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 xigmiscReqType; /* always X_XiGMiscQueryViews */ + CARD16 length; + CARD8 screen; + CARD8 pad0; + CARD16 pad1; +} xXiGMiscQueryViewsReq; + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 xigmiscReqType; /* always X_XiGMiscQueryResolutions */ + CARD16 length; + CARD8 screen; + CARD8 view; + CARD16 pad0; +} xXiGMiscQueryResolutionsReq; + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 xigmiscReqType; /* always X_XiGMiscChangeResolution */ + CARD16 length; + CARD8 screen; + CARD8 view; + CARD16 pad0; + CARD16 width; + CARD16 height; + INT32 refresh; +} xXiGMiscChangeResolutionReq; + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 xigmiscReqType; /* always X_XiGMiscFullScreen */ + CARD16 length; + CARD8 screen; + CARD8 pad0; + CARD16 pad1; + CARD32 window; + CARD32 cmap; +} xXiGMiscFullScreenReq; + +/*******************************************************************/ + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 pad0; + CARD16 sequenceNumber; + CARD32 length; + CARD16 major; + CARD16 minor; + CARD32 pad1; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; +} xXiGMiscQueryVersionReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 pad0; + CARD16 sequenceNumber; + CARD32 length; + CARD32 nviews; + CARD32 pad1; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; +} xXiGMiscQueryViewsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 pad0; + CARD16 sequenceNumber; + CARD32 length; + CARD16 active; + CARD16 nresolutions; + CARD32 pad1; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; +} xXiGMiscQueryResolutionsReply; + +typedef struct { + BYTE type; /* X_Reply */ + BOOL success; + CARD16 sequenceNumber; + CARD32 length; + CARD32 pad1; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; +} xXiGMiscFullScreenReply; + +/*******************************************************************/ + +typedef struct { + INT16 x; + INT16 y; + CARD16 w; + CARD16 h; +} XiGMiscViewInfo; + +typedef struct { + CARD16 width; + CARD16 height; + INT32 refresh; +} XiGMiscResolutionInfo; + +/*****************************************************************************/ + +static XExtensionInfo *xigmisc_info = NULL; +static char *xigmisc_extension_name = XIGMISC_PROTOCOL_NAME; + +#define XiGMiscCheckExtension(dpy,i,val) \ + XextCheckExtension (dpy, i, xigmisc_extension_name, val) +#define XiGMiscSimpleCheckExtension(dpy,i) \ + XextSimpleCheckExtension (dpy, i, xigmisc_extension_name) + +#if defined(__STDC__) && !defined(UNIXCPP) +#define XiGMiscGetReq(name,req,info) GetReq (name, req); \ + req->reqType = info->codes->major_opcode; \ + req->xigmiscReqType = X_##name; + +#define XiGMiscGetReqExtra(name,n,req,info) GetReqExtra (name, n, req); \ + req->reqType = info->codes->major_opcode; \ + req->xigmicReqType = X_##name; +#else +#define XiGMiscGetReq(name,req,info) GetReq (name, req); \ + req->reqType = info->codes->major_opcode; \ + req->xigmiscReqType = X_/**/name; +#define XiGMiscGetReqExtra(name,n,req,info) GetReqExtra (name, n, req); \ + req->reqType = info->codes->major_opcode; \ + req->xigmiscReqType = X_/**/name; +#endif + + + +/* + * find_display - locate the display info block + */ +static int XiGMiscCloseDisplay(); + +static XExtensionHooks xigmisc_extension_hooks = { + NULL, /* create_gc */ + NULL, /* copy_gc */ + NULL, /* flush_gc */ + NULL, /* free_gc */ + NULL, /* create_font */ + NULL, /* free_font */ + XiGMiscCloseDisplay, /* close_display */ + NULL, /* wire_to_event */ + NULL, /* event_to_wire */ + NULL, /* error */ + NULL, /* error_string */ +}; + + +static XEXT_GENERATE_CLOSE_DISPLAY (XiGMiscCloseDisplay, xigmisc_info) + +static XEXT_GENERATE_FIND_DISPLAY (XiGMiscFindDisplay, xigmisc_info, + xigmisc_extension_name, + &xigmisc_extension_hooks, XiGMiscNumberEvents, NULL) + + +/*****************************************************************************/ + +Bool XiGMiscQueryVersion(Display *dpy, int *major, int *minor) +{ + int opcode, event, error; + xXiGMiscQueryVersionReq *req; + xXiGMiscQueryVersionReply rep; + XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); + + if (!pXQueryExtension(dpy, XIGMISC_PROTOCOL_NAME, &opcode, &event, &error)) + return xFalse; + + XiGMiscCheckExtension(dpy, info, xFalse); + + LockDisplay (dpy); + XiGMiscGetReq (XiGMiscQueryVersion, req, info); + + req->major = XIGMISC_MAJOR_VERSION; + req->minor = XIGMISC_MINOR_VERSION; + + if (!p_XReply (dpy, (xReply *)&rep, 0, xTrue)) { + UnlockDisplay(dpy); + SyncHandle(); + return xFalse; + } + + *major = rep.major; + *minor = rep.minor; + UnlockDisplay(dpy); + SyncHandle(); + + return xTrue; +} + +int XiGMiscQueryViews(Display *dpy, int screen, XiGMiscViewInfo **pviews) +{ + int n, size; + XiGMiscViewInfo *views; + xXiGMiscQueryViewsReq *req; + xXiGMiscQueryViewsReply rep; + XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); + XiGMiscCheckExtension(dpy, info, 0); + + LockDisplay (dpy); + XiGMiscGetReq (XiGMiscQueryViews, req, info); + req->screen = screen; + + if (!p_XReply (dpy, (xReply *)&rep, 0, xFalse)) { + UnlockDisplay(dpy); + SyncHandle(); + return 0; + } + + n = rep.nviews; + + if (n > 0) { + size = sizeof(XiGMiscViewInfo) * n; + views = (XiGMiscViewInfo*)Xmalloc(size); + if (!views) { + p_XEatData(dpy, (unsigned long)size); + UnlockDisplay(dpy); + SyncHandle(); + return 0; + } + + p_XReadPad(dpy, (void*)views, size); + + *pviews = views; + } + + UnlockDisplay(dpy); + SyncHandle(); + + return n; +} + +int XiGMiscQueryResolutions(Display *dpy, int screen, int view, int *pactive, XiGMiscResolutionInfo **presolutions) +{ + int n, size; + XiGMiscResolutionInfo *resolutions; + xXiGMiscQueryResolutionsReq *req; + xXiGMiscQueryResolutionsReply rep; + XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); + XiGMiscCheckExtension(dpy, info, 0); + + LockDisplay (dpy); + XiGMiscGetReq (XiGMiscQueryResolutions, req, info); + req->screen = screen; + req->view = view; + + if (!p_XReply (dpy, (xReply *)&rep, 0, xFalse)) { + UnlockDisplay(dpy); + SyncHandle(); + return 0; + } + + n = rep.nresolutions; + + if (n > 0) { + size = sizeof(XiGMiscResolutionInfo) * n; + resolutions = (XiGMiscResolutionInfo*)Xmalloc(size); + if (!resolutions) { + p_XEatData(dpy, (unsigned long)size); + UnlockDisplay(dpy); + SyncHandle(); + return 0; + } + + p_XReadPad(dpy, (void*)resolutions, size); + + *presolutions = resolutions; + *pactive = rep.active; + } + + UnlockDisplay(dpy); + SyncHandle(); + + return n; +} + +void XiGMiscChangeResolution(Display *dpy, int screen, int view, int width, int height, int refresh) +{ + xXiGMiscChangeResolutionReq *req; + XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); + + XiGMiscSimpleCheckExtension(dpy, info); + + LockDisplay (dpy); + XiGMiscGetReq (XiGMiscChangeResolution, req, info); + req->screen = screen; + req->view = view; + req->width = width; + req->height = height; + req->refresh = refresh; + + UnlockDisplay(dpy); + SyncHandle(); +} + + +Bool XiGMiscFullScreen(Display *dpy, int screen, XID window, XID cmap) +{ + xXiGMiscFullScreenReq *req; + xXiGMiscFullScreenReply rep; + XExtDisplayInfo *info = XiGMiscFindDisplay(dpy); + + XiGMiscCheckExtension(dpy, info, xFalse); + + LockDisplay (dpy); + XiGMiscGetReq (XiGMiscFullScreen, req, info); + req->screen = screen; + req->pad0 = 0; + req->pad1 = 0; + req->window = window; + req->cmap = cmap; + + if (!p_XReply (dpy, (xReply *)&rep, 0, xTrue)) { + UnlockDisplay(dpy); + SyncHandle(); + return xFalse; + } + + UnlockDisplay(dpy); + SyncHandle(); + + return (rep.success ? xTrue : xFalse); +} +