/* %Z%%M% %I% %E% */

/*
 * Copyright (c) 1994-2005 by Wayne C. Gramlich.
 * All rights reserved.
 */

/*
 * This file provide a bunch of interface routines for dealing xlib
 * {Visual} objects.
 */

#ifndef XLIB_H
#include "xlib.h"
#endif

extern Vector vector__allocate(void);
extern void vector__append(Vector, void *);

/* The initial object: */
Xlib_visual_struct xlib_visual___initial_object = {
    &xlib_screen___initial_object,
    0					/* Pad the rest with zeros */
};
Xlib_visual xlib_visual___initial = &xlib_visual___initial_object;

/*
 * xlib_screen__visuals_get(screen)
 *	This routine will return a vector of {Xlib_visual} objects
 *	assocated with {screen}.
 */
Vector
xlib_screen__visuals_get(
    Xlib_screen screen)
{
    int count;
    Xlib_display display;
    unsigned index;
    XVisualInfo template;
    XVisualInfo *visual_infos;
    Xlib_visual visual;
    Vector visuals;

    visuals = vector__allocate();
    display = screen->display;
    if (display->closed) {
	xlib_display___closed(display);
    } else {
	template.screen = screen->number;
	visual_infos = XGetVisualInfo(display->display,
	  VisualScreenMask, &template, &count);
	for (index = 0; index < count; index++) {
	    visual = (Xlib_visual)malloc(sizeof *visual);
	    visual->visual = visual_infos[index]; /* Struct copy */
	    visual->screen = screen;
	    vector__append(visuals, (void *)visual);
	}
	XFree(visual_infos);
    }
    return visuals;

}


/*
 * xlib_visual__address_get(visual)
 *	This routine will return the address of {visual}.
 */
unsigned
xlib_visual__address_get(
    Xlib_visual visual)
{
    return (unsigned)visual;
}
    
/*
 * xlib_visual__class_get(visual)
 *	This routine will return the class associated with`
 *	{visual}.
 */
unsigned
xlib_visual__class_get(
    Xlib_visual visual)
{
    unsigned result;
    extern unsigned xlib_visual_class__static_gray;
    extern unsigned xlib_visual_class__gray_scale;
    extern unsigned xlib_visual_class__static_color;
    extern unsigned xlib_visual_class__pseudo_color;
    extern unsigned xlib_visual_class__true_color;
    extern unsigned xlib_visual_class__direct_color;

    switch (visual->visual.class) {
      case StaticGray:
	result = xlib_visual_class__static_gray;
	break;
      case GrayScale:
	result = xlib_visual_class__gray_scale;
	break;
      case StaticColor:
	result = xlib_visual_class__static_color;
	break;
      case PseudoColor:
	result = xlib_visual_class__pseudo_color;
	break;
      case TrueColor:
	result = xlib_visual_class__true_color;
	break;
      case DirectColor:
	result = xlib_visual_class__direct_color;
	break;
      defaut:
	assert(0);
    }
    return result;
}

/*
 * xlib_visual__color_map_size_get(visual)
 *	This routine will return the depth associated with`
 *	{visual}.
 */
unsigned
xlib_visual__color_map_size_get(
    Xlib_visual visual)
{
    return visual->visual.colormap_size;
}

/*
 * xlib_visual__depth_get(visual)
 *	This routine will return the depth associated with`
 *	{visual}.
 */
unsigned
xlib_visual__depth_get(
    Xlib_visual visual)
{
    return visual->visual.depth;
}

/*
 * xlib_visual__external__initializ()
 *	This routine will initialize the {Xlib_visual} object:
 */
void
xlib_visual__external__initialize(void)
{
    assert(xlib_visual___initial == &xlib_visual___initial_object);
}

