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