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