Blame gdk/x11/gdkvisual-x11.c

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