#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
#include "Xutil.h"
#include <stdio.h>
XVisualInfo *XGetVisualInfo(
Display *dpy,
register long visual_info_mask,
register XVisualInfo *visual_info_template,
int *nitems)
{
register Visual *vp;
register Depth *dp;
Screen *sp;
int ii,screen_s,screen_e,total,count;
register XVisualInfo *vip,*vip_base;
LockDisplay(dpy);
count = 0;
total = 10;
if (! (vip_base = vip = (XVisualInfo *)
Xmalloc((unsigned) (sizeof(XVisualInfo) * total)))) {
UnlockDisplay(dpy);
return (XVisualInfo *) NULL;
}
screen_s = 0;
screen_e = dpy->nscreens;
if (visual_info_mask & VisualScreenMask)
{
screen_s = visual_info_template->screen;
if (screen_s < 0 || screen_s >= screen_e)
screen_e = screen_s;
else
screen_e = screen_s + 1;
}
for (ii=screen_s; ii<screen_e; ii++)
{
sp = (Screen *)(&dpy->screens[ii]);
for (dp=sp->depths; dp < (sp->depths + sp->ndepths); dp++)
{
if ((visual_info_mask & VisualDepthMask) &&
(dp->depth != visual_info_template->depth)) continue;
if (dp->visuals) {
for (vp=dp->visuals; vp<(dp->visuals + dp->nvisuals); vp++) {
if ((visual_info_mask & VisualIDMask) &&
(vp->visualid != visual_info_template->visualid)) continue;
if ((visual_info_mask & VisualClassMask) &&
(vp->class != visual_info_template->class)) continue;
if ((visual_info_mask & VisualRedMaskMask) &&
(vp->red_mask != visual_info_template->red_mask)) continue;
if ((visual_info_mask & VisualGreenMaskMask) &&
(vp->green_mask != visual_info_template->green_mask)) continue;
if ((visual_info_mask & VisualBlueMaskMask) &&
(vp->blue_mask != visual_info_template->blue_mask)) continue;
if ((visual_info_mask & VisualColormapSizeMask) &&
(vp->map_entries != visual_info_template->colormap_size)) continue;
if ((visual_info_mask & VisualBitsPerRGBMask) &&
(vp->bits_per_rgb != visual_info_template->bits_per_rgb)) continue;
if (count+1 > total)
{
XVisualInfo *old_vip_base = vip_base;
total += 10;
if (! (vip_base = (XVisualInfo *)
Xrealloc((char *) vip_base,
(unsigned) (sizeof(XVisualInfo) * total)))) {
Xfree((char *) old_vip_base);
UnlockDisplay(dpy);
return (XVisualInfo *) NULL;
}
vip = &vip_base[count];
}
count++;
vip->visual = _XVIDtoVisual(dpy, vp->visualid);
vip->visualid = vp->visualid;
vip->screen = ii;
vip->depth = dp->depth;
vip->class = vp->class;
vip->red_mask = vp->red_mask;
vip->green_mask = vp->green_mask;
vip->blue_mask = vp->blue_mask;
vip->colormap_size = vp->map_entries;
vip->bits_per_rgb = vp->bits_per_rgb;
vip++;
}
}
}
}
UnlockDisplay(dpy);
if (count)
{
*nitems = count;
return vip_base;
}
Xfree((char *) vip_base);
*nitems = 0;
return NULL;
}
Status XMatchVisualInfo(
Display *dpy,
int screen,
int depth,
int class,
XVisualInfo *visual_info)
{
Visual *vp;
Depth *dp;
Screen *sp;
int ii,jj;
if (screen < 0 || screen >= dpy->nscreens)
return False;
LockDisplay(dpy);
sp = (Screen *)(&dpy->screens[screen]);
dp = sp->depths;
for (ii=0; ii < sp->ndepths; ii++)
{
if (dp->depth == depth)
{
vp = dp->visuals;
for (jj=0; jj<dp->nvisuals; jj++)
{
if (vp->class == class)
{
visual_info->visual = _XVIDtoVisual(dpy, vp->visualid);
visual_info->visualid = vp->visualid;
visual_info->screen = screen;
visual_info->depth = depth;
visual_info->class = vp->class;
visual_info->red_mask = vp->red_mask;
visual_info->green_mask = vp->green_mask;
visual_info->blue_mask = vp->blue_mask;
visual_info->colormap_size = vp->map_entries;
visual_info->bits_per_rgb = vp->bits_per_rgb;
UnlockDisplay(dpy);
return True;
}
vp++;
}
}
dp++;
}
UnlockDisplay(dpy);
return False;
}