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