XEVI.c revision 485f0483
1caade7ccSmrg/* $Xorg: XEVI.c,v 1.3 2000/08/17 19:45:51 cpqbld Exp $ */ 2caade7ccSmrg/************************************************************ 3caade7ccSmrgCopyright (c) 1997 by Silicon Graphics Computer Systems, Inc. 4caade7ccSmrgPermission to use, copy, modify, and distribute this 5caade7ccSmrgsoftware and its documentation for any purpose and without 6caade7ccSmrgfee is hereby granted, provided that the above copyright 7caade7ccSmrgnotice appear in all copies and that both that copyright 8caade7ccSmrgnotice and this permission notice appear in supporting 9caade7ccSmrgdocumentation, and that the name of Silicon Graphics not be 10caade7ccSmrgused in advertising or publicity pertaining to distribution 11caade7ccSmrgof the software without specific prior written permission. 12caade7ccSmrgSilicon Graphics makes no representation about the suitability 13caade7ccSmrgof this software for any purpose. It is provided "as is" 14caade7ccSmrgwithout any express or implied warranty. 15caade7ccSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 16caade7ccSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 17caade7ccSmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 18caade7ccSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 19caade7ccSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20caade7ccSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 21caade7ccSmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH 22caade7ccSmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE. 23caade7ccSmrg********************************************************/ 24caade7ccSmrg/* $XFree86$ */ 25caade7ccSmrg#define NEED_EVENTS 26caade7ccSmrg#define NEED_REPLIES 27caade7ccSmrg#ifdef HAVE_CONFIG_H 28caade7ccSmrg#include <config.h> 29caade7ccSmrg#endif 30caade7ccSmrg#include <X11/Xlibint.h> 31caade7ccSmrg#include <X11/extensions/XEVI.h> 32485f0483Smrg#include <X11/extensions/EVIproto.h> 33caade7ccSmrg#include <X11/extensions/Xext.h> 34caade7ccSmrg#include <X11/extensions/extutil.h> 35caade7ccSmrg#include <X11/Xutil.h> 36caade7ccSmrgstatic XExtensionInfo *xevi_info;/* needs to move to globals.c */ 37caade7ccSmrgstatic /* const */ char *xevi_extension_name = EVINAME; 38caade7ccSmrg#define XeviCheckExtension(dpy,i,val) \ 39caade7ccSmrg XextCheckExtension (dpy, i, xevi_extension_name, val) 40caade7ccSmrg/***************************************************************************** 41caade7ccSmrg * * 42caade7ccSmrg * private utility routines * 43caade7ccSmrg * * 44caade7ccSmrg *****************************************************************************/ 45caade7ccSmrgstatic /* const */ XExtensionHooks xevi_extension_hooks = { 46caade7ccSmrg NULL, /* create_gc */ 47caade7ccSmrg NULL, /* copy_gc */ 48caade7ccSmrg NULL, /* flush_gc */ 49caade7ccSmrg NULL, /* free_gc */ 50caade7ccSmrg NULL, /* create_font */ 51caade7ccSmrg NULL, /* free_font */ 52caade7ccSmrg NULL, /* close_display */ 53caade7ccSmrg NULL, /* wire_to_event */ 54caade7ccSmrg NULL, /* event_to_wire */ 55caade7ccSmrg NULL, /* error */ 56caade7ccSmrg NULL, /* error_string */ 57caade7ccSmrg}; 58caade7ccSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xevi_info, 59caade7ccSmrg xevi_extension_name, 60caade7ccSmrg &xevi_extension_hooks, 0, NULL) 61caade7ccSmrgBool XeviQueryExtension (Display *dpy) 62caade7ccSmrg{ 63caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 64caade7ccSmrg if (XextHasExtension(info)) { 65caade7ccSmrg return True; 66caade7ccSmrg } else { 67caade7ccSmrg return False; 68caade7ccSmrg } 69caade7ccSmrg} 70caade7ccSmrgBool XeviQueryVersion(Display *dpy, int *majorVersion, int *minorVersion) 71caade7ccSmrg{ 72caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 73caade7ccSmrg xEVIQueryVersionReply rep; 74caade7ccSmrg register xEVIQueryVersionReq *req; 75caade7ccSmrg XeviCheckExtension (dpy, info, False); 76caade7ccSmrg LockDisplay(dpy); 77caade7ccSmrg GetReq(EVIQueryVersion, req); 78caade7ccSmrg req->reqType = info->codes->major_opcode; 79caade7ccSmrg req->xeviReqType = X_EVIQueryVersion; 80caade7ccSmrg if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 81caade7ccSmrg UnlockDisplay(dpy); 82caade7ccSmrg SyncHandle(); 83caade7ccSmrg return False; 84caade7ccSmrg } 85caade7ccSmrg *majorVersion = rep.majorVersion; 86caade7ccSmrg *minorVersion = rep.minorVersion; 87caade7ccSmrg UnlockDisplay(dpy); 88caade7ccSmrg SyncHandle(); 89caade7ccSmrg return True; 90caade7ccSmrg} 91caade7ccSmrgstatic Bool notInList(VisualID32 *visual, int sz_visual, VisualID newVisualid) 92caade7ccSmrg{ 93caade7ccSmrg while (sz_visual-- > 0) { 94caade7ccSmrg if (*visual == newVisualid) 95caade7ccSmrg return False; 96caade7ccSmrg visual++; 97caade7ccSmrg } 98caade7ccSmrg return True; 99caade7ccSmrg} 100caade7ccSmrgStatus XeviGetVisualInfo( 101caade7ccSmrg register Display *dpy, 102caade7ccSmrg VisualID *visual, 103caade7ccSmrg int n_visual, 104caade7ccSmrg ExtendedVisualInfo **evi_return, 105caade7ccSmrg int *n_info_return) 106caade7ccSmrg{ 107caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 108caade7ccSmrg register xEVIGetVisualInfoReq *req; 109caade7ccSmrg xEVIGetVisualInfoReply rep; 110caade7ccSmrg int sz_info, sz_xInfo, sz_conflict, sz_xConflict; 111caade7ccSmrg VisualID32 *temp_conflict, *temp_visual, *xConflictPtr; 112caade7ccSmrg VisualID *conflict; 113caade7ccSmrg xExtendedVisualInfo *temp_xInfo; 114caade7ccSmrg XVisualInfo *vinfo; 115caade7ccSmrg register ExtendedVisualInfo *infoPtr; 116caade7ccSmrg register xExtendedVisualInfo *xInfoPtr; 117caade7ccSmrg register int n_data, visualIndex, vinfoIndex; 118caade7ccSmrg Bool isValid; 119caade7ccSmrg XeviCheckExtension (dpy, info, 0); 120caade7ccSmrg if (!n_info_return || !evi_return) { 121caade7ccSmrg return BadValue; 122caade7ccSmrg } 123caade7ccSmrg *n_info_return = 0; 124caade7ccSmrg *evi_return = NULL; 125caade7ccSmrg vinfo = XGetVisualInfo(dpy, 0, NULL, &sz_info); 126caade7ccSmrg if (!vinfo) { 127caade7ccSmrg return BadValue; 128caade7ccSmrg } 129caade7ccSmrg if (!n_visual || !visual) { /* copy the all visual */ 130caade7ccSmrg temp_visual = (VisualID32 *)Xmalloc(sz_VisualID32 * sz_info); 131caade7ccSmrg n_visual = 0; 132caade7ccSmrg for (vinfoIndex = 0; vinfoIndex < sz_info; vinfoIndex++) 133caade7ccSmrg if (notInList(temp_visual, n_visual, vinfo[vinfoIndex].visualid)) 134caade7ccSmrg temp_visual[n_visual++] = vinfo[vinfoIndex].visualid; 135caade7ccSmrg } 136caade7ccSmrg else { /* check if the visual is valid */ 137caade7ccSmrg for (visualIndex = 0; visualIndex < n_visual; visualIndex++) { 138caade7ccSmrg isValid = False; 139caade7ccSmrg for (vinfoIndex = 0; vinfoIndex < sz_info; vinfoIndex++) { 140caade7ccSmrg if (visual[visualIndex] == vinfo[vinfoIndex].visualid) { 141caade7ccSmrg isValid = True; 142caade7ccSmrg break; 143caade7ccSmrg } 144caade7ccSmrg } 145caade7ccSmrg if (!isValid) { 146caade7ccSmrg XFree(vinfo); 147caade7ccSmrg return BadValue; 148caade7ccSmrg } 149caade7ccSmrg } 150caade7ccSmrg temp_visual = (VisualID32 *)Xmalloc(sz_VisualID32 * n_visual); 151caade7ccSmrg for (visualIndex = 0; visualIndex < n_visual; visualIndex++) 152caade7ccSmrg temp_visual[visualIndex] = visual[visualIndex]; 153caade7ccSmrg } 154caade7ccSmrg XFree(vinfo); 155caade7ccSmrg LockDisplay(dpy); 156caade7ccSmrg GetReq(EVIGetVisualInfo, req); 157caade7ccSmrg req->reqType = info->codes->major_opcode; 158caade7ccSmrg req->xeviReqType = X_EVIGetVisualInfo; 159caade7ccSmrg req->n_visual = n_visual; 160caade7ccSmrg SetReqLen(req, n_visual, 1); 161caade7ccSmrg Data(dpy, (char *)temp_visual, n_visual * sz_VisualID32); 162caade7ccSmrg if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 163caade7ccSmrg UnlockDisplay(dpy); 164caade7ccSmrg SyncHandle(); 165caade7ccSmrg Xfree(temp_visual); 166caade7ccSmrg return BadAccess; 167caade7ccSmrg } 168caade7ccSmrg Xfree(temp_visual); 169caade7ccSmrg sz_info = rep.n_info * sizeof(ExtendedVisualInfo); 170caade7ccSmrg sz_xInfo = rep.n_info * sz_xExtendedVisualInfo; 171caade7ccSmrg sz_conflict = rep.n_conflicts * sizeof(VisualID); 172caade7ccSmrg sz_xConflict = rep.n_conflicts * sz_VisualID32; 173caade7ccSmrg infoPtr = *evi_return = (ExtendedVisualInfo *)Xmalloc(sz_info + sz_conflict); 174caade7ccSmrg xInfoPtr = temp_xInfo = (xExtendedVisualInfo *)Xmalloc(sz_xInfo); 175caade7ccSmrg xConflictPtr = temp_conflict = (VisualID32 *)Xmalloc(sz_xConflict); 176caade7ccSmrg if (!*evi_return || !temp_xInfo || !temp_conflict) { 177caade7ccSmrg _XEatData(dpy, (sz_xInfo + sz_xConflict + 3) & ~3); 178caade7ccSmrg UnlockDisplay(dpy); 179caade7ccSmrg SyncHandle(); 180caade7ccSmrg if (evi_return) 181caade7ccSmrg Xfree(evi_return); 182caade7ccSmrg if (temp_xInfo) 183caade7ccSmrg Xfree(temp_xInfo); 184caade7ccSmrg if (temp_conflict) 185caade7ccSmrg Xfree(temp_conflict); 186caade7ccSmrg return BadAlloc; 187caade7ccSmrg } 188caade7ccSmrg _XRead(dpy, (char *)temp_xInfo, sz_xInfo); 189caade7ccSmrg _XRead(dpy, (char *)temp_conflict, sz_xConflict); 190caade7ccSmrg UnlockDisplay(dpy); 191caade7ccSmrg SyncHandle(); 192caade7ccSmrg n_data = rep.n_info; 193caade7ccSmrg conflict = (VisualID *)(infoPtr + n_data); 194caade7ccSmrg while (n_data-- > 0) { 195caade7ccSmrg infoPtr->core_visual_id = xInfoPtr->core_visual_id; 196caade7ccSmrg infoPtr->screen = xInfoPtr->screen; 197caade7ccSmrg infoPtr->level = xInfoPtr->level; 198caade7ccSmrg infoPtr->transparency_type = xInfoPtr->transparency_type; 199caade7ccSmrg infoPtr->transparency_value = xInfoPtr->transparency_value; 200caade7ccSmrg infoPtr->min_hw_colormaps = xInfoPtr->min_hw_colormaps; 201caade7ccSmrg infoPtr->max_hw_colormaps = xInfoPtr->max_hw_colormaps; 202caade7ccSmrg infoPtr->num_colormap_conflicts = xInfoPtr->num_colormap_conflicts; 203caade7ccSmrg infoPtr->colormap_conflicts = conflict; 204caade7ccSmrg conflict += infoPtr->num_colormap_conflicts; 205caade7ccSmrg infoPtr++; 206caade7ccSmrg xInfoPtr++; 207caade7ccSmrg } 208caade7ccSmrg n_data = rep.n_conflicts; 209caade7ccSmrg conflict = (VisualID *)(infoPtr); 210caade7ccSmrg while (n_data-- > 0) 211caade7ccSmrg *conflict++ = *xConflictPtr++; 212caade7ccSmrg Xfree(temp_xInfo); 213caade7ccSmrg Xfree(temp_conflict); 214caade7ccSmrg *n_info_return = rep.n_info; 215caade7ccSmrg return Success; 216caade7ccSmrg} 217