Blame gdk/x11/gdkvisual-x11.c

Packit 98cdb6
/* GDK - The GIMP Drawing Kit
Packit 98cdb6
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Lesser General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Lesser General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Lesser General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit 98cdb6
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit 98cdb6
 * files for a list of changes.  These files are distributed with
Packit 98cdb6
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include "config.h"
Packit 98cdb6
#include <X11/Xlib.h>
Packit 98cdb6
#include <X11/Xutil.h>
Packit 98cdb6
Packit 98cdb6
#include "gdkx.h"
Packit 98cdb6
#include "gdkvisual.h"
Packit 98cdb6
#include "gdkprivate-x11.h"
Packit 98cdb6
#include "gdkscreen-x11.h"
Packit 98cdb6
#include "gdkinternals.h"
Packit 98cdb6
#include "gdkalias.h"
Packit 98cdb6
Packit 98cdb6
struct _GdkVisualClass
Packit 98cdb6
{
Packit 98cdb6
  GObjectClass parent_class;
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
static void     gdk_visual_add            (GdkVisual *visual);
Packit 98cdb6
static void     gdk_visual_decompose_mask (gulong     mask,
Packit 98cdb6
					   gint      *shift,
Packit 98cdb6
					   gint      *prec);
Packit 98cdb6
static guint    gdk_visual_hash           (Visual    *key);
Packit 98cdb6
static gboolean gdk_visual_equal          (Visual    *a,
Packit 98cdb6
					   Visual    *b);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
#ifdef G_ENABLE_DEBUG
Packit 98cdb6
Packit 98cdb6
static const gchar *const visual_names[] =
Packit 98cdb6
{
Packit 98cdb6
  "static gray",
Packit 98cdb6
  "grayscale",
Packit 98cdb6
  "static color",
Packit 98cdb6
  "pseudo color",
Packit 98cdb6
  "true color",
Packit 98cdb6
  "direct color",
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
#endif /* G_ENABLE_DEBUG */
Packit 98cdb6
Packit 98cdb6
GType
Packit 98cdb6
gdk_visual_get_type (void)
Packit 98cdb6
{
Packit 98cdb6
  static GType object_type = 0;
Packit 98cdb6
Packit 98cdb6
  if (!object_type)
Packit 98cdb6
    {
Packit 98cdb6
      const GTypeInfo object_info =
Packit 98cdb6
      {
Packit 98cdb6
        sizeof (GdkVisualClass),
Packit 98cdb6
        (GBaseInitFunc) NULL,
Packit 98cdb6
        (GBaseFinalizeFunc) NULL,
Packit 98cdb6
        (GClassInitFunc) NULL,
Packit 98cdb6
        NULL,           /* class_finalize */
Packit 98cdb6
        NULL,           /* class_data */
Packit 98cdb6
        sizeof (GdkVisualPrivate),
Packit 98cdb6
        0,              /* n_preallocs */
Packit 98cdb6
        (GInstanceInitFunc) NULL,
Packit 98cdb6
      };
Packit 98cdb6
      
Packit 98cdb6
      object_type = g_type_register_static (G_TYPE_OBJECT,
Packit 98cdb6
                                            g_intern_static_string ("GdkVisual"),
Packit 98cdb6
                                            &object_info, 0);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  return object_type;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_visual_init (GdkScreen *screen)
Packit 98cdb6
{
Packit 98cdb6
  static const gint possible_depths[8] = { 32, 30, 24, 16, 15, 8, 4, 1 };
Packit 98cdb6
  static const GdkVisualType possible_types[6] =
Packit 98cdb6
    {
Packit 98cdb6
      GDK_VISUAL_DIRECT_COLOR,
Packit 98cdb6
      GDK_VISUAL_TRUE_COLOR,
Packit 98cdb6
      GDK_VISUAL_PSEUDO_COLOR,
Packit 98cdb6
      GDK_VISUAL_STATIC_COLOR,
Packit 98cdb6
      GDK_VISUAL_GRAYSCALE,
Packit 98cdb6
      GDK_VISUAL_STATIC_GRAY
Packit 98cdb6
    };
Packit 98cdb6
Packit 98cdb6
  GdkScreenX11 *screen_x11;
Packit 98cdb6
  XVisualInfo *visual_list;
Packit 98cdb6
  XVisualInfo visual_template;
Packit 98cdb6
  GdkVisualPrivate *temp_visual;
Packit 98cdb6
  Visual *default_xvisual;
Packit 98cdb6
  GdkVisualPrivate **visuals;
Packit 98cdb6
  int nxvisuals;
Packit 98cdb6
  int nvisuals;
Packit 98cdb6
  int i, j;
Packit 98cdb6
  
Packit 98cdb6
  g_return_if_fail (GDK_IS_SCREEN (screen));
Packit 98cdb6
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit 98cdb6
Packit 98cdb6
  nxvisuals = 0;
Packit 98cdb6
  visual_template.screen = screen_x11->screen_num;
Packit 98cdb6
  visual_list = XGetVisualInfo (screen_x11->xdisplay, VisualScreenMask, &visual_template, &nxvisuals);
Packit 98cdb6
  
Packit 98cdb6
  visuals = g_new (GdkVisualPrivate *, nxvisuals);
Packit 98cdb6
  for (i = 0; i < nxvisuals; i++)
Packit 98cdb6
    visuals[i] = g_object_new (GDK_TYPE_VISUAL, NULL);
Packit 98cdb6
Packit 98cdb6
  default_xvisual = DefaultVisual (screen_x11->xdisplay, screen_x11->screen_num);
Packit 98cdb6
Packit 98cdb6
  nvisuals = 0;
Packit 98cdb6
  for (i = 0; i < nxvisuals; i++)
Packit 98cdb6
    {
Packit 98cdb6
      visuals[nvisuals]->screen = screen;
Packit 98cdb6
      
Packit 98cdb6
      if (visual_list[i].depth >= 1)
Packit 98cdb6
	{
Packit 98cdb6
#ifdef __cplusplus
Packit 98cdb6
	  switch (visual_list[i].c_class)
Packit 98cdb6
#else /* __cplusplus */
Packit 98cdb6
	  switch (visual_list[i].class)
Packit 98cdb6
#endif /* __cplusplus */
Packit 98cdb6
	    {
Packit 98cdb6
	    case StaticGray:
Packit 98cdb6
	      visuals[nvisuals]->visual.type = GDK_VISUAL_STATIC_GRAY;
Packit 98cdb6
	      break;
Packit 98cdb6
	    case GrayScale:
Packit 98cdb6
	      visuals[nvisuals]->visual.type = GDK_VISUAL_GRAYSCALE;
Packit 98cdb6
	      break;
Packit 98cdb6
	    case StaticColor:
Packit 98cdb6
	      visuals[nvisuals]->visual.type = GDK_VISUAL_STATIC_COLOR;
Packit 98cdb6
	      break;
Packit 98cdb6
	    case PseudoColor:
Packit 98cdb6
	      visuals[nvisuals]->visual.type = GDK_VISUAL_PSEUDO_COLOR;
Packit 98cdb6
	      break;
Packit 98cdb6
	    case TrueColor:
Packit 98cdb6
	      visuals[nvisuals]->visual.type = GDK_VISUAL_TRUE_COLOR;
Packit 98cdb6
	      break;
Packit 98cdb6
	    case DirectColor:
Packit 98cdb6
	      visuals[nvisuals]->visual.type = GDK_VISUAL_DIRECT_COLOR;
Packit 98cdb6
	      break;
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  visuals[nvisuals]->visual.depth = visual_list[i].depth;
Packit 98cdb6
	  visuals[nvisuals]->visual.byte_order =
Packit 98cdb6
	    (ImageByteOrder(screen_x11->xdisplay) == LSBFirst) ?
Packit 98cdb6
	    GDK_LSB_FIRST : GDK_MSB_FIRST;
Packit 98cdb6
	  visuals[nvisuals]->visual.red_mask = visual_list[i].red_mask;
Packit 98cdb6
	  visuals[nvisuals]->visual.green_mask = visual_list[i].green_mask;
Packit 98cdb6
	  visuals[nvisuals]->visual.blue_mask = visual_list[i].blue_mask;
Packit 98cdb6
	  visuals[nvisuals]->visual.colormap_size = visual_list[i].colormap_size;
Packit 98cdb6
	  visuals[nvisuals]->visual.bits_per_rgb = visual_list[i].bits_per_rgb;
Packit 98cdb6
	  visuals[nvisuals]->xvisual = visual_list[i].visual;
Packit 98cdb6
Packit 98cdb6
	  if ((visuals[nvisuals]->visual.type == GDK_VISUAL_TRUE_COLOR) ||
Packit 98cdb6
	      (visuals[nvisuals]->visual.type == GDK_VISUAL_DIRECT_COLOR))
Packit 98cdb6
	    {
Packit 98cdb6
	      gdk_visual_decompose_mask (visuals[nvisuals]->visual.red_mask,
Packit 98cdb6
					 &visuals[nvisuals]->visual.red_shift,
Packit 98cdb6
					 &visuals[nvisuals]->visual.red_prec);
Packit 98cdb6
Packit 98cdb6
	      gdk_visual_decompose_mask (visuals[nvisuals]->visual.green_mask,
Packit 98cdb6
					 &visuals[nvisuals]->visual.green_shift,
Packit 98cdb6
					 &visuals[nvisuals]->visual.green_prec);
Packit 98cdb6
Packit 98cdb6
	      gdk_visual_decompose_mask (visuals[nvisuals]->visual.blue_mask,
Packit 98cdb6
					 &visuals[nvisuals]->visual.blue_shift,
Packit 98cdb6
					 &visuals[nvisuals]->visual.blue_prec);
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      visuals[nvisuals]->visual.red_mask = 0;
Packit 98cdb6
	      visuals[nvisuals]->visual.red_shift = 0;
Packit 98cdb6
	      visuals[nvisuals]->visual.red_prec = 0;
Packit 98cdb6
Packit 98cdb6
	      visuals[nvisuals]->visual.green_mask = 0;
Packit 98cdb6
	      visuals[nvisuals]->visual.green_shift = 0;
Packit 98cdb6
	      visuals[nvisuals]->visual.green_prec = 0;
Packit 98cdb6
Packit 98cdb6
	      visuals[nvisuals]->visual.blue_mask = 0;
Packit 98cdb6
	      visuals[nvisuals]->visual.blue_shift = 0;
Packit 98cdb6
	      visuals[nvisuals]->visual.blue_prec = 0;
Packit 98cdb6
	    }
Packit 98cdb6
	  
Packit 98cdb6
	  nvisuals += 1;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (visual_list)
Packit 98cdb6
    XFree (visual_list);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < nvisuals; i++)
Packit 98cdb6
    {
Packit 98cdb6
      for (j = i+1; j < nvisuals; j++)
Packit 98cdb6
	{
Packit 98cdb6
	  if (visuals[j]->visual.depth >= visuals[i]->visual.depth)
Packit 98cdb6
	    {
Packit 98cdb6
	      if ((visuals[j]->visual.depth == 8) && (visuals[i]->visual.depth == 8))
Packit 98cdb6
		{
Packit 98cdb6
		  if (visuals[j]->visual.type == GDK_VISUAL_PSEUDO_COLOR)
Packit 98cdb6
		    {
Packit 98cdb6
		      temp_visual = visuals[j];
Packit 98cdb6
		      visuals[j] = visuals[i];
Packit 98cdb6
		      visuals[i] = temp_visual;
Packit 98cdb6
		    }
Packit 98cdb6
		  else if ((visuals[i]->visual.type != GDK_VISUAL_PSEUDO_COLOR) &&
Packit 98cdb6
			   visuals[j]->visual.type > visuals[i]->visual.type)
Packit 98cdb6
		    {
Packit 98cdb6
		      temp_visual = visuals[j];
Packit 98cdb6
		      visuals[j] = visuals[i];
Packit 98cdb6
		      visuals[i] = temp_visual;
Packit 98cdb6
		    }
Packit 98cdb6
		}
Packit 98cdb6
	      else if ((visuals[j]->visual.depth > visuals[i]->visual.depth) ||
Packit 98cdb6
		       ((visuals[j]->visual.depth == visuals[i]->visual.depth) &&
Packit 98cdb6
			(visuals[j]->visual.type > visuals[i]->visual.type)))
Packit 98cdb6
		{
Packit 98cdb6
		  temp_visual = visuals[j];
Packit 98cdb6
		  visuals[j] = visuals[i];
Packit 98cdb6
		  visuals[i] = temp_visual;
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < nvisuals; i++)
Packit 98cdb6
    {
Packit 98cdb6
      if (default_xvisual->visualid == visuals[i]->xvisual->visualid)
Packit 98cdb6
	screen_x11->system_visual = visuals[i];
Packit 98cdb6
Packit 98cdb6
      /* For now, we only support 8888 ARGB for the "rgba visual".
Packit 98cdb6
       * Additional formats (like ABGR) could be added later if they
Packit 98cdb6
       * turn up.
Packit 98cdb6
       */
Packit 98cdb6
      if (visuals[i]->visual.depth == 32 &&
Packit 98cdb6
	  (visuals[i]->visual.red_mask   == 0xff0000 &&
Packit 98cdb6
	   visuals[i]->visual.green_mask == 0x00ff00 &&
Packit 98cdb6
	   visuals[i]->visual.blue_mask  == 0x0000ff))
Packit 98cdb6
	{
Packit 98cdb6
	  screen_x11->rgba_visual = GDK_VISUAL (visuals[i]);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
#ifdef G_ENABLE_DEBUG 
Packit 98cdb6
  if (_gdk_debug_flags & GDK_DEBUG_MISC)
Packit 98cdb6
    for (i = 0; i < nvisuals; i++)
Packit 98cdb6
      g_message ("visual: %s: %d",
Packit 98cdb6
		 visual_names[visuals[i]->visual.type],
Packit 98cdb6
		 visuals[i]->visual.depth);
Packit 98cdb6
#endif /* G_ENABLE_DEBUG */
Packit 98cdb6
Packit 98cdb6
  screen_x11->navailable_depths = 0;
Packit 98cdb6
  for (i = 0; i < G_N_ELEMENTS (possible_depths); i++)
Packit 98cdb6
    {
Packit 98cdb6
      for (j = 0; j < nvisuals; j++)
Packit 98cdb6
	{
Packit 98cdb6
	  if (visuals[j]->visual.depth == possible_depths[i])
Packit 98cdb6
	    {
Packit 98cdb6
	      screen_x11->available_depths[screen_x11->navailable_depths++] = visuals[j]->visual.depth;
Packit 98cdb6
	      break;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (screen_x11->navailable_depths == 0)
Packit 98cdb6
    g_error ("unable to find a usable depth");
Packit 98cdb6
Packit 98cdb6
  screen_x11->navailable_types = 0;
Packit 98cdb6
  for (i = 0; i < G_N_ELEMENTS (possible_types); i++)
Packit 98cdb6
    {
Packit 98cdb6
      for (j = 0; j < nvisuals; j++)
Packit 98cdb6
	{
Packit 98cdb6
	  if (visuals[j]->visual.type == possible_types[i])
Packit 98cdb6
	    {
Packit 98cdb6
	      screen_x11->available_types[screen_x11->navailable_types++] = visuals[j]->visual.type;
Packit 98cdb6
	      break;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < nvisuals; i++)
Packit 98cdb6
    gdk_visual_add ((GdkVisual*) visuals[i]);
Packit 98cdb6
Packit 98cdb6
  if (screen_x11->navailable_types == 0)
Packit 98cdb6
    g_error ("unable to find a usable visual type");
Packit 98cdb6
Packit 98cdb6
  screen_x11->visuals = visuals;
Packit 98cdb6
  screen_x11->nvisuals = nvisuals;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_best_depth:
Packit 98cdb6
 * 
Packit 98cdb6
 * Get the best available depth for the default GDK screen.  "Best"
Packit 98cdb6
 * means "largest," i.e. 32 preferred over 24 preferred over 8 bits
Packit 98cdb6
 * per pixel.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: best available depth
Packit 98cdb6
 **/
Packit 98cdb6
gint
Packit 98cdb6
gdk_visual_get_best_depth (void)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreen *screen = gdk_screen_get_default();
Packit 98cdb6
  
Packit 98cdb6
  return GDK_SCREEN_X11 (screen)->available_depths[0];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_best_type:
Packit 98cdb6
 * 
Packit 98cdb6
 * Return the best available visual type for the default GDK screen.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: best visual type
Packit 98cdb6
 **/
Packit 98cdb6
GdkVisualType
Packit 98cdb6
gdk_visual_get_best_type (void)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreen *screen = gdk_screen_get_default();
Packit 98cdb6
  
Packit 98cdb6
  return GDK_SCREEN_X11 (screen)->available_types[0];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_screen_get_system_visual:
Packit 98cdb6
 * @screen: a #GdkScreen.
Packit 98cdb6
 * 
Packit 98cdb6
 * Get the system's default visual for @screen.
Packit 98cdb6
 * This is the visual for the root window of the display.
Packit 98cdb6
 * The return value should not be freed.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer none): the system visual
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 **/
Packit 98cdb6
GdkVisual *
Packit 98cdb6
gdk_screen_get_system_visual (GdkScreen * screen)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
Packit 98cdb6
Packit 98cdb6
  return ((GdkVisual *) GDK_SCREEN_X11 (screen)->system_visual);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_best:
Packit 98cdb6
 *
Packit 98cdb6
 * Get the visual with the most available colors for the default
Packit 98cdb6
 * GDK screen. The return value should not be freed.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer none): best visual
Packit 98cdb6
 **/
Packit 98cdb6
GdkVisual*
Packit 98cdb6
gdk_visual_get_best (void)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (gdk_screen_get_default());
Packit 98cdb6
Packit 98cdb6
  return (GdkVisual *)screen_x11->visuals[0];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_best_with_depth:
Packit 98cdb6
 * @depth: a bit depth
Packit 98cdb6
 * 
Packit 98cdb6
 * Get the best visual with depth @depth for the default GDK screen.
Packit 98cdb6
 * Color visuals and visuals with mutable colormaps are preferred
Packit 98cdb6
 * over grayscale or fixed-colormap visuals. The return value should not
Packit 98cdb6
 * be freed. %NULL may be returned if no visual supports @depth.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer none): best visual for the given depth
Packit 98cdb6
 **/
Packit 98cdb6
GdkVisual*
Packit 98cdb6
gdk_visual_get_best_with_depth (gint depth)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (gdk_screen_get_default ());
Packit 98cdb6
  GdkVisual *return_val;
Packit 98cdb6
  int i;
Packit 98cdb6
  
Packit 98cdb6
  return_val = NULL;
Packit 98cdb6
  for (i = 0; i < screen_x11->nvisuals; i++)
Packit 98cdb6
    if (depth == screen_x11->visuals[i]->visual.depth)
Packit 98cdb6
      {
Packit 98cdb6
	return_val = (GdkVisual *) screen_x11->visuals[i];
Packit 98cdb6
	break;
Packit 98cdb6
      }
Packit 98cdb6
Packit 98cdb6
  return return_val;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_best_with_type:
Packit 98cdb6
 * @visual_type: a visual type
Packit 98cdb6
 *
Packit 98cdb6
 * Get the best visual of the given @visual_type for the default GDK screen.
Packit 98cdb6
 * Visuals with higher color depths are considered better. The return value
Packit 98cdb6
 * should not be freed. %NULL may be returned if no visual has type
Packit 98cdb6
 * @visual_type.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer none): best visual of the given type
Packit 98cdb6
 **/
Packit 98cdb6
GdkVisual*
Packit 98cdb6
gdk_visual_get_best_with_type (GdkVisualType visual_type)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (gdk_screen_get_default ());
Packit 98cdb6
  GdkVisual *return_val;
Packit 98cdb6
  int i;
Packit 98cdb6
Packit 98cdb6
  return_val = NULL;
Packit 98cdb6
  for (i = 0; i < screen_x11->nvisuals; i++)
Packit 98cdb6
    if (visual_type == screen_x11->visuals[i]->visual.type)
Packit 98cdb6
      {
Packit 98cdb6
	return_val = (GdkVisual *) screen_x11->visuals[i];
Packit 98cdb6
	break;
Packit 98cdb6
      }
Packit 98cdb6
Packit 98cdb6
  return return_val;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_best_with_both:
Packit 98cdb6
 * @depth: a bit depth
Packit 98cdb6
 * @visual_type: a visual type
Packit 98cdb6
 *
Packit 98cdb6
 * Combines gdk_visual_get_best_with_depth() and gdk_visual_get_best_with_type().
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer none): best visual with both @depth and
Packit 98cdb6
 *     @visual_type, or %NULL if none
Packit 98cdb6
 **/
Packit 98cdb6
GdkVisual*
Packit 98cdb6
gdk_visual_get_best_with_both (gint          depth,
Packit 98cdb6
			       GdkVisualType visual_type)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (gdk_screen_get_default ());
Packit 98cdb6
  GdkVisual *return_val;
Packit 98cdb6
  int i;
Packit 98cdb6
Packit 98cdb6
  return_val = NULL;
Packit 98cdb6
  for (i = 0; i < screen_x11->nvisuals; i++)
Packit 98cdb6
    if ((depth == screen_x11->visuals[i]->visual.depth) &&
Packit 98cdb6
	(visual_type == screen_x11->visuals[i]->visual.type))
Packit 98cdb6
      {
Packit 98cdb6
	return_val = (GdkVisual *) screen_x11->visuals[i];
Packit 98cdb6
	break;
Packit 98cdb6
      }
Packit 98cdb6
Packit 98cdb6
  return return_val;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_query_depths:
Packit 98cdb6
 * @depths: (out) (array): return location for available depths
Packit 98cdb6
 * @count: (out): return location for number of available depths
Packit 98cdb6
 *
Packit 98cdb6
 * This function returns the available bit depths for the default
Packit 98cdb6
 * screen. It's equivalent to listing the visuals
Packit 98cdb6
 * (gdk_list_visuals()) and then looking at the depth field in each
Packit 98cdb6
 * visual, removing duplicates.
Packit 98cdb6
 * 
Packit 98cdb6
 * The array returned by this function should not be freed.
Packit 98cdb6
 * 
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_query_depths  (gint **depths,
Packit 98cdb6
		   gint  *count)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (gdk_screen_get_default ());
Packit 98cdb6
  
Packit 98cdb6
  *count = screen_x11->navailable_depths;
Packit 98cdb6
  *depths = screen_x11->available_depths;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_query_visual_types:
Packit 98cdb6
 * @visual_types: return location for the available visual types
Packit 98cdb6
 * @count: return location for the number of available visual types
Packit 98cdb6
 *
Packit 98cdb6
 * This function returns the available visual types for the default
Packit 98cdb6
 * screen. It's equivalent to listing the visuals
Packit 98cdb6
 * (gdk_list_visuals()) and then looking at the type field in each
Packit 98cdb6
 * visual, removing duplicates.
Packit 98cdb6
 * 
Packit 98cdb6
 * The array returned by this function should not be freed.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_query_visual_types (GdkVisualType **visual_types,
Packit 98cdb6
			gint           *count)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (gdk_screen_get_default ());
Packit 98cdb6
  
Packit 98cdb6
  *count = screen_x11->navailable_types;
Packit 98cdb6
  *visual_types = screen_x11->available_types;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_screen_list_visuals:
Packit 98cdb6
 * @screen: the relevant #GdkScreen.
Packit 98cdb6
 *  
Packit 98cdb6
 * Lists the available visuals for the specified @screen.
Packit 98cdb6
 * A visual describes a hardware image data format.
Packit 98cdb6
 * For example, a visual might support 24-bit color, or 8-bit color,
Packit 98cdb6
 * and might expect pixels to be in a certain format.
Packit 98cdb6
 *
Packit 98cdb6
 * Call g_list_free() on the return value when you're finished with it.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer container) (element-type GdkVisual):
Packit 98cdb6
 *     a list of visuals; the list must be freed, but not its contents
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 **/
Packit 98cdb6
GList *
Packit 98cdb6
gdk_screen_list_visuals (GdkScreen *screen)
Packit 98cdb6
{
Packit 98cdb6
  GList *list;
Packit 98cdb6
  GdkScreenX11 *screen_x11;
Packit 98cdb6
  guint i;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
Packit 98cdb6
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit 98cdb6
  
Packit 98cdb6
  list = NULL;
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < screen_x11->nvisuals; ++i)
Packit 98cdb6
    list = g_list_append (list, screen_x11->visuals[i]);
Packit 98cdb6
Packit 98cdb6
  return list;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_x11_screen_lookup_visual:
Packit 98cdb6
 * @screen: a #GdkScreen.
Packit 98cdb6
 * @xvisualid: an X Visual ID.
Packit 98cdb6
 *
Packit 98cdb6
 * Looks up the #GdkVisual for a particular screen and X Visual ID.
Packit 98cdb6
 *
Packit 98cdb6
 * Returns: (transfer none): the #GdkVisual (owned by the screen
Packit 98cdb6
 *   object), or %NULL if the visual ID wasn't found.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 */
Packit 98cdb6
GdkVisual *
Packit 98cdb6
gdk_x11_screen_lookup_visual (GdkScreen *screen,
Packit 98cdb6
			      VisualID   xvisualid)
Packit 98cdb6
{
Packit 98cdb6
  int i;
Packit 98cdb6
  GdkScreenX11 *screen_x11;
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
Packit 98cdb6
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < screen_x11->nvisuals; i++)
Packit 98cdb6
    if (xvisualid == screen_x11->visuals[i]->xvisual->visualid)
Packit 98cdb6
      return (GdkVisual *)  screen_x11->visuals[i];
Packit 98cdb6
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdkx_visual_get:
Packit 98cdb6
 * @xvisualid: a X visual id.
Packit 98cdb6
 *
Packit 98cdb6
 * Returns a #GdkVisual corresponding to a X visual. 
Packit 98cdb6
 *
Packit 98cdb6
 * Return value: the #GdkVisual.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated:2.24: Use gdk_x11_screen_lookup_visual() instead
Packit 98cdb6
 */
Packit 98cdb6
GdkVisual*
Packit 98cdb6
gdkx_visual_get (VisualID xvisualid)
Packit 98cdb6
{
Packit 98cdb6
  return gdk_x11_screen_lookup_visual (gdk_screen_get_default (), xvisualid);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_visual_add (GdkVisual *visual)
Packit 98cdb6
{
Packit 98cdb6
  GdkVisualPrivate *private = (GdkVisualPrivate *) visual;
Packit 98cdb6
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (private->screen);
Packit 98cdb6
  
Packit 98cdb6
  if (!screen_x11->visual_hash)
Packit 98cdb6
    screen_x11->visual_hash = g_hash_table_new ((GHashFunc) gdk_visual_hash,
Packit 98cdb6
                                                (GEqualFunc) gdk_visual_equal);
Packit 98cdb6
Packit 98cdb6
  g_hash_table_insert (screen_x11->visual_hash, private->xvisual, visual);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_visual_decompose_mask (gulong  mask,
Packit 98cdb6
			   gint   *shift,
Packit 98cdb6
			   gint   *prec)
Packit 98cdb6
{
Packit 98cdb6
  *shift = 0;
Packit 98cdb6
  *prec = 0;
Packit 98cdb6
Packit 98cdb6
  if (mask == 0)
Packit 98cdb6
    {
Packit 98cdb6
      g_warning ("Mask is 0 in visual. Server bug ?");
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  while (!(mask & 0x1))
Packit 98cdb6
    {
Packit 98cdb6
      (*shift)++;
Packit 98cdb6
      mask >>= 1;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  while (mask & 0x1)
Packit 98cdb6
    {
Packit 98cdb6
      (*prec)++;
Packit 98cdb6
      mask >>= 1;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static guint
Packit 98cdb6
gdk_visual_hash (Visual *key)
Packit 98cdb6
{
Packit 98cdb6
  return key->visualid;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_visual_equal (Visual *a,
Packit 98cdb6
		  Visual *b)
Packit 98cdb6
{
Packit 98cdb6
  return (a->visualid == b->visualid);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_x11_visual_get_xvisual:
Packit 98cdb6
 * @visual: a #GdkVisual.
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns the X visual belonging to a #GdkVisual.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: an Xlib <type>Visual*</type>.
Packit 98cdb6
 **/
Packit 98cdb6
Visual *
Packit 98cdb6
gdk_x11_visual_get_xvisual (GdkVisual *visual)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (visual != NULL, NULL);
Packit 98cdb6
Packit 98cdb6
  return  ((GdkVisualPrivate*) visual)->xvisual;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_visual_get_screen:
Packit 98cdb6
 * @visual: a #GdkVisual
Packit 98cdb6
 * 
Packit 98cdb6
 * Gets the screen to which this visual belongs
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: (transfer none): the screen to which this visual belongs.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 **/
Packit 98cdb6
GdkScreen *
Packit 98cdb6
gdk_visual_get_screen (GdkVisual *visual)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_VISUAL (visual), NULL);
Packit 98cdb6
Packit 98cdb6
  return  ((GdkVisualPrivate*) visual)->screen;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
#define __GDK_VISUAL_X11_C__
Packit 98cdb6
#include "gdkaliasdef.c"