Blame gdk/x11/gdkgc-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
Packit 98cdb6
#include "gdkgc.h"
Packit 98cdb6
#include "gdkprivate-x11.h"
Packit 98cdb6
#include "gdkregion-generic.h"
Packit 98cdb6
#include "gdkx.h"
Packit 98cdb6
#include "gdkalias.h"
Packit 98cdb6
Packit 98cdb6
#include <string.h>
Packit 98cdb6
Packit 98cdb6
typedef enum {
Packit 98cdb6
  GDK_GC_DIRTY_CLIP = 1 << 0,
Packit 98cdb6
  GDK_GC_DIRTY_TS = 1 << 1
Packit 98cdb6
} GdkGCDirtyValues;
Packit 98cdb6
Packit 98cdb6
static void gdk_x11_gc_values_to_xvalues (GdkGCValues    *values,
Packit 98cdb6
					  GdkGCValuesMask mask,
Packit 98cdb6
					  XGCValues      *xvalues,
Packit 98cdb6
					  unsigned long  *xvalues_mask);
Packit 98cdb6
Packit 98cdb6
static void gdk_x11_gc_get_values (GdkGC           *gc,
Packit 98cdb6
				   GdkGCValues     *values);
Packit 98cdb6
static void gdk_x11_gc_set_values (GdkGC           *gc,
Packit 98cdb6
				   GdkGCValues     *values,
Packit 98cdb6
				   GdkGCValuesMask  values_mask);
Packit 98cdb6
static void gdk_x11_gc_set_dashes (GdkGC           *gc,
Packit 98cdb6
				   gint             dash_offset,
Packit 98cdb6
				   gint8            dash_list[],
Packit 98cdb6
				   gint             n);
Packit 98cdb6
Packit 98cdb6
static void gdk_gc_x11_finalize   (GObject         *object);
Packit 98cdb6
Packit 98cdb6
G_DEFINE_TYPE (GdkGCX11, _gdk_gc_x11, GDK_TYPE_GC)
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
_gdk_gc_x11_class_init (GdkGCX11Class *klass)
Packit 98cdb6
{
Packit 98cdb6
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 98cdb6
  GdkGCClass *gc_class = GDK_GC_CLASS (klass);
Packit 98cdb6
  
Packit 98cdb6
  object_class->finalize = gdk_gc_x11_finalize;
Packit 98cdb6
Packit 98cdb6
  gc_class->get_values = gdk_x11_gc_get_values;
Packit 98cdb6
  gc_class->set_values = gdk_x11_gc_set_values;
Packit 98cdb6
  gc_class->set_dashes = gdk_x11_gc_set_dashes;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
_gdk_gc_x11_init (GdkGCX11 *gc)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_gc_x11_finalize (GObject *object)
Packit 98cdb6
{
Packit 98cdb6
  GdkGCX11 *x11_gc = GDK_GC_X11 (object);
Packit 98cdb6
  
Packit 98cdb6
  XFreeGC (GDK_GC_XDISPLAY (x11_gc), GDK_GC_XGC (x11_gc));
Packit 98cdb6
Packit 98cdb6
  G_OBJECT_CLASS (_gdk_gc_x11_parent_class)->finalize (object);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
GdkGC *
Packit 98cdb6
_gdk_x11_gc_new (GdkDrawable      *drawable,
Packit 98cdb6
		 GdkGCValues      *values,
Packit 98cdb6
		 GdkGCValuesMask   values_mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkGC *gc;
Packit 98cdb6
  GdkGCX11 *private;
Packit 98cdb6
  
Packit 98cdb6
  XGCValues xvalues;
Packit 98cdb6
  unsigned long xvalues_mask;
Packit 98cdb6
Packit 98cdb6
  /* NOTICE that the drawable here has to be the impl drawable,
Packit 98cdb6
   * not the publically-visible drawables.
Packit 98cdb6
   */
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE_IMPL_X11 (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  gc = g_object_new (_gdk_gc_x11_get_type (), NULL);
Packit 98cdb6
  private = GDK_GC_X11 (gc);
Packit 98cdb6
Packit 98cdb6
  _gdk_gc_init (gc, drawable, values, values_mask);
Packit 98cdb6
Packit 98cdb6
  private->dirty_mask = 0;
Packit 98cdb6
  private->have_clip_mask = FALSE;
Packit 98cdb6
    
Packit 98cdb6
  private->screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;
Packit 98cdb6
Packit 98cdb6
  private->depth = gdk_drawable_get_depth (drawable);
Packit 98cdb6
Packit 98cdb6
  if (values_mask & (GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN))
Packit 98cdb6
    {
Packit 98cdb6
      values_mask &= ~(GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN);
Packit 98cdb6
      private->dirty_mask |= GDK_GC_DIRTY_CLIP;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (values_mask & (GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN))
Packit 98cdb6
    {
Packit 98cdb6
      values_mask &= ~(GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
Packit 98cdb6
      private->dirty_mask |= GDK_GC_DIRTY_TS;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if ((values_mask & GDK_GC_CLIP_MASK) && values->clip_mask)
Packit 98cdb6
    private->have_clip_mask = TRUE;
Packit 98cdb6
Packit 98cdb6
  xvalues.function = GXcopy;
Packit 98cdb6
  xvalues.fill_style = FillSolid;
Packit 98cdb6
  xvalues.arc_mode = ArcPieSlice;
Packit 98cdb6
  xvalues.subwindow_mode = ClipByChildren;
Packit 98cdb6
  xvalues.graphics_exposures = False;
Packit 98cdb6
  xvalues_mask = GCFunction | GCFillStyle | GCArcMode | GCSubwindowMode | GCGraphicsExposures;
Packit 98cdb6
Packit 98cdb6
  gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask);
Packit 98cdb6
  
Packit 98cdb6
  private->xgc = XCreateGC (GDK_GC_XDISPLAY (gc),
Packit 98cdb6
                            GDK_DRAWABLE_IMPL_X11 (drawable)->xid,
Packit 98cdb6
                            xvalues_mask, &xvalues);
Packit 98cdb6
Packit 98cdb6
  return gc;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GC
Packit 98cdb6
_gdk_x11_gc_flush (GdkGC *gc)
Packit 98cdb6
{
Packit 98cdb6
  Display *xdisplay = GDK_GC_XDISPLAY (gc);
Packit 98cdb6
  GdkGCX11 *private = GDK_GC_X11 (gc);
Packit 98cdb6
  GC xgc = private->xgc;
Packit 98cdb6
Packit 98cdb6
  if (private->dirty_mask & GDK_GC_DIRTY_CLIP)
Packit 98cdb6
    {
Packit 98cdb6
      GdkRegion *clip_region = _gdk_gc_get_clip_region (gc);
Packit 98cdb6
      
Packit 98cdb6
      if (!clip_region)
Packit 98cdb6
	XSetClipOrigin (xdisplay, xgc,
Packit 98cdb6
			gc->clip_x_origin, gc->clip_y_origin);
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  XRectangle *rectangles;
Packit 98cdb6
          gint n_rects;
Packit 98cdb6
Packit 98cdb6
          _gdk_region_get_xrectangles (clip_region,
Packit 98cdb6
                                       gc->clip_x_origin,
Packit 98cdb6
                                       gc->clip_y_origin,
Packit 98cdb6
                                       &rectangles,
Packit 98cdb6
                                       &n_rects);
Packit 98cdb6
	  
Packit 98cdb6
	  XSetClipRectangles (xdisplay, xgc, 0, 0,
Packit 98cdb6
                              rectangles,
Packit 98cdb6
                              n_rects, YXBanded);
Packit 98cdb6
          
Packit 98cdb6
	  g_free (rectangles);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (private->dirty_mask & GDK_GC_DIRTY_TS)
Packit 98cdb6
    {
Packit 98cdb6
      XSetTSOrigin (xdisplay, xgc,
Packit 98cdb6
		    gc->ts_x_origin, gc->ts_y_origin);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  private->dirty_mask = 0;
Packit 98cdb6
  return xgc;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_x11_gc_get_values (GdkGC       *gc,
Packit 98cdb6
		       GdkGCValues *values)
Packit 98cdb6
{
Packit 98cdb6
  XGCValues xvalues;
Packit 98cdb6
  
Packit 98cdb6
  if (XGetGCValues (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc),
Packit 98cdb6
		    GCForeground | GCBackground | GCFont |
Packit 98cdb6
		    GCFunction | GCTile | GCStipple | /* GCClipMask | */
Packit 98cdb6
		    GCSubwindowMode | GCGraphicsExposures |
Packit 98cdb6
		    GCTileStipXOrigin | GCTileStipYOrigin |
Packit 98cdb6
		    GCClipXOrigin | GCClipYOrigin |
Packit 98cdb6
		    GCLineWidth | GCLineStyle | GCCapStyle |
Packit 98cdb6
		    GCFillStyle | GCJoinStyle, &xvalues))
Packit 98cdb6
    {
Packit 98cdb6
      values->foreground.pixel = xvalues.foreground;
Packit 98cdb6
      values->background.pixel = xvalues.background;
Packit 98cdb6
      values->font = gdk_font_lookup_for_display (GDK_GC_DISPLAY (gc),
Packit 98cdb6
						  xvalues.font);
Packit 98cdb6
Packit 98cdb6
      switch (xvalues.function)
Packit 98cdb6
	{
Packit 98cdb6
	case GXcopy:
Packit 98cdb6
	  values->function = GDK_COPY;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXinvert:
Packit 98cdb6
	  values->function = GDK_INVERT;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXxor:
Packit 98cdb6
	  values->function = GDK_XOR;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXclear:
Packit 98cdb6
	  values->function = GDK_CLEAR;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXand:
Packit 98cdb6
	  values->function = GDK_AND;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXandReverse:
Packit 98cdb6
	  values->function = GDK_AND_REVERSE;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXandInverted:
Packit 98cdb6
	  values->function = GDK_AND_INVERT;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXnoop:
Packit 98cdb6
	  values->function = GDK_NOOP;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXor:
Packit 98cdb6
	  values->function = GDK_OR;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXequiv:
Packit 98cdb6
	  values->function = GDK_EQUIV;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXorReverse:
Packit 98cdb6
	  values->function = GDK_OR_REVERSE;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXcopyInverted:
Packit 98cdb6
	  values->function =GDK_COPY_INVERT;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXorInverted:
Packit 98cdb6
	  values->function = GDK_OR_INVERT;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXnand:
Packit 98cdb6
	  values->function = GDK_NAND;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXset:
Packit 98cdb6
	  values->function = GDK_SET;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GXnor:
Packit 98cdb6
	  values->function = GDK_NOR;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      switch (xvalues.fill_style)
Packit 98cdb6
	{
Packit 98cdb6
	case FillSolid:
Packit 98cdb6
	  values->fill = GDK_SOLID;
Packit 98cdb6
	  break;
Packit 98cdb6
	case FillTiled:
Packit 98cdb6
	  values->fill = GDK_TILED;
Packit 98cdb6
	  break;
Packit 98cdb6
	case FillStippled:
Packit 98cdb6
	  values->fill = GDK_STIPPLED;
Packit 98cdb6
	  break;
Packit 98cdb6
	case FillOpaqueStippled:
Packit 98cdb6
	  values->fill = GDK_OPAQUE_STIPPLED;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      values->tile = gdk_pixmap_lookup_for_display (GDK_GC_DISPLAY (gc),
Packit 98cdb6
						    xvalues.tile);
Packit 98cdb6
      values->stipple = gdk_pixmap_lookup_for_display (GDK_GC_DISPLAY (gc),
Packit 98cdb6
						       xvalues.stipple);
Packit 98cdb6
      values->clip_mask = NULL;
Packit 98cdb6
      values->subwindow_mode = xvalues.subwindow_mode;
Packit 98cdb6
      values->ts_x_origin = xvalues.ts_x_origin;
Packit 98cdb6
      values->ts_y_origin = xvalues.ts_y_origin;
Packit 98cdb6
      values->clip_x_origin = xvalues.clip_x_origin;
Packit 98cdb6
      values->clip_y_origin = xvalues.clip_y_origin;
Packit 98cdb6
      values->graphics_exposures = xvalues.graphics_exposures;
Packit 98cdb6
      values->line_width = xvalues.line_width;
Packit 98cdb6
Packit 98cdb6
      switch (xvalues.line_style)
Packit 98cdb6
	{
Packit 98cdb6
	case LineSolid:
Packit 98cdb6
	  values->line_style = GDK_LINE_SOLID;
Packit 98cdb6
	  break;
Packit 98cdb6
	case LineOnOffDash:
Packit 98cdb6
	  values->line_style = GDK_LINE_ON_OFF_DASH;
Packit 98cdb6
	  break;
Packit 98cdb6
	case LineDoubleDash:
Packit 98cdb6
	  values->line_style = GDK_LINE_DOUBLE_DASH;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      switch (xvalues.cap_style)
Packit 98cdb6
	{
Packit 98cdb6
	case CapNotLast:
Packit 98cdb6
	  values->cap_style = GDK_CAP_NOT_LAST;
Packit 98cdb6
	  break;
Packit 98cdb6
	case CapButt:
Packit 98cdb6
	  values->cap_style = GDK_CAP_BUTT;
Packit 98cdb6
	  break;
Packit 98cdb6
	case CapRound:
Packit 98cdb6
	  values->cap_style = GDK_CAP_ROUND;
Packit 98cdb6
	  break;
Packit 98cdb6
	case CapProjecting:
Packit 98cdb6
	  values->cap_style = GDK_CAP_PROJECTING;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      switch (xvalues.join_style)
Packit 98cdb6
	{
Packit 98cdb6
	case JoinMiter:
Packit 98cdb6
	  values->join_style = GDK_JOIN_MITER;
Packit 98cdb6
	  break;
Packit 98cdb6
	case JoinRound:
Packit 98cdb6
	  values->join_style = GDK_JOIN_ROUND;
Packit 98cdb6
	  break;
Packit 98cdb6
	case JoinBevel:
Packit 98cdb6
	  values->join_style = GDK_JOIN_BEVEL;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      memset (values, 0, sizeof (GdkGCValues));
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_x11_gc_set_values (GdkGC           *gc,
Packit 98cdb6
		       GdkGCValues     *values,
Packit 98cdb6
		       GdkGCValuesMask  values_mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkGCX11 *x11_gc;
Packit 98cdb6
  XGCValues xvalues;
Packit 98cdb6
  unsigned long xvalues_mask = 0;
Packit 98cdb6
Packit 98cdb6
  x11_gc = GDK_GC_X11 (gc);
Packit 98cdb6
Packit 98cdb6
  if (values_mask & (GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN))
Packit 98cdb6
    {
Packit 98cdb6
      values_mask &= ~(GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN);
Packit 98cdb6
      x11_gc->dirty_mask |= GDK_GC_DIRTY_CLIP;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (values_mask & (GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN))
Packit 98cdb6
    {
Packit 98cdb6
      values_mask &= ~(GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
Packit 98cdb6
      x11_gc->dirty_mask |= GDK_GC_DIRTY_TS;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (values_mask & GDK_GC_CLIP_MASK)
Packit 98cdb6
    {
Packit 98cdb6
      x11_gc->have_clip_region = FALSE;
Packit 98cdb6
      x11_gc->have_clip_mask = values->clip_mask != NULL;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask);
Packit 98cdb6
Packit 98cdb6
  XChangeGC (GDK_GC_XDISPLAY (gc),
Packit 98cdb6
	     GDK_GC_XGC (gc),
Packit 98cdb6
	     xvalues_mask,
Packit 98cdb6
	     &xvalues);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_x11_gc_set_dashes (GdkGC *gc,
Packit 98cdb6
		       gint   dash_offset,
Packit 98cdb6
		       gint8  dash_list[],
Packit 98cdb6
		       gint   n)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (dash_list != NULL);
Packit 98cdb6
Packit 98cdb6
  XSetDashes (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc),
Packit 98cdb6
	      dash_offset, (char *)dash_list, n);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_x11_gc_values_to_xvalues (GdkGCValues    *values,
Packit 98cdb6
			      GdkGCValuesMask mask,
Packit 98cdb6
			      XGCValues      *xvalues,
Packit 98cdb6
			      unsigned long  *xvalues_mask)
Packit 98cdb6
{
Packit 98cdb6
  /* Optimization for the common case (gdk_gc_new()) */
Packit 98cdb6
  if (values == NULL || mask == 0)
Packit 98cdb6
    return;
Packit 98cdb6
  
Packit 98cdb6
  if (mask & GDK_GC_FOREGROUND)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->foreground = values->foreground.pixel;
Packit 98cdb6
      *xvalues_mask |= GCForeground;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_BACKGROUND)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->background = values->background.pixel;
Packit 98cdb6
      *xvalues_mask |= GCBackground;
Packit 98cdb6
    }
Packit 98cdb6
  if ((mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT))
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->font = ((XFontStruct *) (GDK_FONT_XFONT (values->font)))->fid;
Packit 98cdb6
      *xvalues_mask |= GCFont;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_FUNCTION)
Packit 98cdb6
    {
Packit 98cdb6
      switch (values->function)
Packit 98cdb6
	{
Packit 98cdb6
	case GDK_COPY:
Packit 98cdb6
	  xvalues->function = GXcopy;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_INVERT:
Packit 98cdb6
	  xvalues->function = GXinvert;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_XOR:
Packit 98cdb6
	  xvalues->function = GXxor;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_CLEAR:
Packit 98cdb6
	  xvalues->function = GXclear;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_AND:
Packit 98cdb6
	  xvalues->function = GXand;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_AND_REVERSE:
Packit 98cdb6
	  xvalues->function = GXandReverse;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_AND_INVERT:
Packit 98cdb6
	  xvalues->function = GXandInverted;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_NOOP:
Packit 98cdb6
	  xvalues->function = GXnoop;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_OR:
Packit 98cdb6
	  xvalues->function = GXor;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_EQUIV:
Packit 98cdb6
	  xvalues->function = GXequiv;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_OR_REVERSE:
Packit 98cdb6
	  xvalues->function = GXorReverse;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_COPY_INVERT:
Packit 98cdb6
	  xvalues->function = GXcopyInverted;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_OR_INVERT:
Packit 98cdb6
	  xvalues->function = GXorInverted;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_NAND:
Packit 98cdb6
	  xvalues->function = GXnand;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_SET:
Packit 98cdb6
	  xvalues->function = GXset;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_NOR:
Packit 98cdb6
	  xvalues->function = GXnor;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
      *xvalues_mask |= GCFunction;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_FILL)
Packit 98cdb6
    {
Packit 98cdb6
      switch (values->fill)
Packit 98cdb6
	{
Packit 98cdb6
	case GDK_SOLID:
Packit 98cdb6
	  xvalues->fill_style = FillSolid;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_TILED:
Packit 98cdb6
	  xvalues->fill_style = FillTiled;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_STIPPLED:
Packit 98cdb6
	  xvalues->fill_style = FillStippled;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_OPAQUE_STIPPLED:
Packit 98cdb6
	  xvalues->fill_style = FillOpaqueStippled;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
      *xvalues_mask |= GCFillStyle;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_TILE)
Packit 98cdb6
    {
Packit 98cdb6
      if (values->tile)
Packit 98cdb6
	xvalues->tile = GDK_DRAWABLE_XID (values->tile);
Packit 98cdb6
      else
Packit 98cdb6
	xvalues->tile = None;
Packit 98cdb6
      
Packit 98cdb6
      *xvalues_mask |= GCTile;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_STIPPLE)
Packit 98cdb6
    {
Packit 98cdb6
      if (values->stipple)
Packit 98cdb6
	xvalues->stipple = GDK_DRAWABLE_XID (values->stipple);
Packit 98cdb6
      else
Packit 98cdb6
	xvalues->stipple = None;
Packit 98cdb6
      
Packit 98cdb6
      *xvalues_mask |= GCStipple;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_CLIP_MASK)
Packit 98cdb6
    {
Packit 98cdb6
      if (values->clip_mask)
Packit 98cdb6
	xvalues->clip_mask = GDK_DRAWABLE_XID (values->clip_mask);
Packit 98cdb6
      else
Packit 98cdb6
	xvalues->clip_mask = None;
Packit 98cdb6
Packit 98cdb6
      *xvalues_mask |= GCClipMask;
Packit 98cdb6
      
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_SUBWINDOW)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->subwindow_mode = values->subwindow_mode;
Packit 98cdb6
      *xvalues_mask |= GCSubwindowMode;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_TS_X_ORIGIN)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->ts_x_origin = values->ts_x_origin;
Packit 98cdb6
      *xvalues_mask |= GCTileStipXOrigin;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_TS_Y_ORIGIN)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->ts_y_origin = values->ts_y_origin;
Packit 98cdb6
      *xvalues_mask |= GCTileStipYOrigin;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_CLIP_X_ORIGIN)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->clip_x_origin = values->clip_x_origin;
Packit 98cdb6
      *xvalues_mask |= GCClipXOrigin;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_CLIP_Y_ORIGIN)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->clip_y_origin = values->clip_y_origin;
Packit 98cdb6
      *xvalues_mask |= GCClipYOrigin;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (mask & GDK_GC_EXPOSURES)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->graphics_exposures = values->graphics_exposures;
Packit 98cdb6
      *xvalues_mask |= GCGraphicsExposures;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (mask & GDK_GC_LINE_WIDTH)
Packit 98cdb6
    {
Packit 98cdb6
      xvalues->line_width = values->line_width;
Packit 98cdb6
      *xvalues_mask |= GCLineWidth;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_LINE_STYLE)
Packit 98cdb6
    {
Packit 98cdb6
      switch (values->line_style)
Packit 98cdb6
	{
Packit 98cdb6
	case GDK_LINE_SOLID:
Packit 98cdb6
	  xvalues->line_style = LineSolid;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_LINE_ON_OFF_DASH:
Packit 98cdb6
	  xvalues->line_style = LineOnOffDash;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_LINE_DOUBLE_DASH:
Packit 98cdb6
	  xvalues->line_style = LineDoubleDash;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
      *xvalues_mask |= GCLineStyle;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_CAP_STYLE)
Packit 98cdb6
    {
Packit 98cdb6
      switch (values->cap_style)
Packit 98cdb6
	{
Packit 98cdb6
	case GDK_CAP_NOT_LAST:
Packit 98cdb6
	  xvalues->cap_style = CapNotLast;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_CAP_BUTT:
Packit 98cdb6
	  xvalues->cap_style = CapButt;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_CAP_ROUND:
Packit 98cdb6
	  xvalues->cap_style = CapRound;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_CAP_PROJECTING:
Packit 98cdb6
	  xvalues->cap_style = CapProjecting;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
      *xvalues_mask |= GCCapStyle;
Packit 98cdb6
    }
Packit 98cdb6
  if (mask & GDK_GC_JOIN_STYLE)
Packit 98cdb6
    {
Packit 98cdb6
      switch (values->join_style)
Packit 98cdb6
	{
Packit 98cdb6
	case GDK_JOIN_MITER:
Packit 98cdb6
	  xvalues->join_style = JoinMiter;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_JOIN_ROUND:
Packit 98cdb6
	  xvalues->join_style = JoinRound;
Packit 98cdb6
	  break;
Packit 98cdb6
	case GDK_JOIN_BEVEL:
Packit 98cdb6
	  xvalues->join_style = JoinBevel;
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
      *xvalues_mask |= GCJoinStyle;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_gc_set_clip_region (GdkGC           *gc,
Packit 98cdb6
				   const GdkRegion *region,
Packit 98cdb6
				   gboolean reset_origin)
Packit 98cdb6
{
Packit 98cdb6
  GdkGCX11 *x11_gc = GDK_GC_X11 (gc);
Packit 98cdb6
Packit 98cdb6
  /* Unset immediately, to make sure Xlib doesn't keep the
Packit 98cdb6
   * XID of an old clip mask cached
Packit 98cdb6
   */
Packit 98cdb6
  if ((x11_gc->have_clip_region && !region) || x11_gc->have_clip_mask)
Packit 98cdb6
    {
Packit 98cdb6
      XSetClipMask (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), None);
Packit 98cdb6
      x11_gc->have_clip_mask = FALSE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  x11_gc->have_clip_region = region != NULL;
Packit 98cdb6
Packit 98cdb6
  if (reset_origin)
Packit 98cdb6
    {
Packit 98cdb6
      gc->clip_x_origin = 0;
Packit 98cdb6
      gc->clip_y_origin = 0;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  x11_gc->dirty_mask |= GDK_GC_DIRTY_CLIP;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_gc_copy (GdkGC *dst_gc,
Packit 98cdb6
			GdkGC *src_gc)
Packit 98cdb6
{
Packit 98cdb6
  GdkGCX11 *x11_src_gc = GDK_GC_X11 (src_gc);
Packit 98cdb6
  GdkGCX11 *x11_dst_gc = GDK_GC_X11 (dst_gc);
Packit 98cdb6
Packit 98cdb6
  XCopyGC (GDK_GC_XDISPLAY (src_gc), GDK_GC_XGC (src_gc), ~((~1) << GCLastBit),
Packit 98cdb6
	   GDK_GC_XGC (dst_gc));
Packit 98cdb6
Packit 98cdb6
  x11_dst_gc->dirty_mask = x11_src_gc->dirty_mask;
Packit 98cdb6
  x11_dst_gc->have_clip_region = x11_src_gc->have_clip_region;
Packit 98cdb6
  x11_dst_gc->have_clip_mask = x11_src_gc->have_clip_mask;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_gc_get_screen:
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 *
Packit 98cdb6
 * Gets the #GdkScreen for which @gc was created
Packit 98cdb6
 *
Packit 98cdb6
 * Returns: the #GdkScreen for @gc.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 */
Packit 98cdb6
GdkScreen *  
Packit 98cdb6
gdk_gc_get_screen (GdkGC *gc)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_GC_X11 (gc), NULL);
Packit 98cdb6
  
Packit 98cdb6
  return GDK_GC_X11 (gc)->screen;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_x11_gc_get_xdisplay:
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns the display of a #GdkGC.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: an Xlib <type>Display*</type>.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: #GdkGC has been replaced by #cairo_t.
Packit 98cdb6
 **/
Packit 98cdb6
Display *
Packit 98cdb6
gdk_x11_gc_get_xdisplay (GdkGC *gc)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_GC_X11 (gc), NULL);
Packit 98cdb6
Packit 98cdb6
  return GDK_SCREEN_XDISPLAY (gdk_gc_get_screen (gc));
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_x11_gc_get_xgc:
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns the X GC of a #GdkGC.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: an Xlib <type>GC</type>.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: #GdkGC has been replaced by #cairo_t.
Packit 98cdb6
 **/
Packit 98cdb6
GC
Packit 98cdb6
gdk_x11_gc_get_xgc (GdkGC *gc)
Packit 98cdb6
{
Packit 98cdb6
  GdkGCX11 *gc_x11;
Packit 98cdb6
  
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_GC_X11 (gc), NULL);
Packit 98cdb6
Packit 98cdb6
  gc_x11 = GDK_GC_X11 (gc);
Packit 98cdb6
Packit 98cdb6
  if (gc_x11->dirty_mask)
Packit 98cdb6
    _gdk_x11_gc_flush (gc);
Packit 98cdb6
Packit 98cdb6
  return gc_x11->xgc;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
#define __GDK_GC_X11_C__
Packit 98cdb6
#include "gdkaliasdef.c"