⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdkgc.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#include <string.h>#include <X11/Xlib.h>#include "gdk.h"#include "gdkprivate.h"GdkGC*gdk_gc_new (GdkWindow *window){  return gdk_gc_new_with_values (window, NULL, 0);}GdkGC*gdk_gc_new_with_values (GdkWindow	*window,			GdkGCValues	*values,			GdkGCValuesMask	 values_mask){  GdkWindowPrivate *window_private;  GdkGC *gc;  GdkGCPrivate *private;  Window xwindow;  XGCValues xvalues;  unsigned long xvalues_mask;  g_return_val_if_fail (window != NULL, NULL);  window_private = (GdkWindowPrivate*) window;  if (window_private->destroyed)    return NULL;  private = g_new (GdkGCPrivate, 1);  gc = (GdkGC*) private;  xwindow = window_private->xwindow;  private->xdisplay = window_private->xdisplay;  private->ref_count = 1;  xvalues.function = GXcopy;  xvalues.fill_style = FillSolid;  xvalues.arc_mode = ArcPieSlice;  xvalues.subwindow_mode = ClipByChildren;  xvalues.graphics_exposures = True;  xvalues_mask = GCFunction | GCFillStyle | GCArcMode | GCSubwindowMode | GCGraphicsExposures;  if (values_mask & GDK_GC_FOREGROUND)    {      xvalues.foreground = values->foreground.pixel;      xvalues_mask |= GCForeground;    }  if (values_mask & GDK_GC_BACKGROUND)    {      xvalues.background = values->background.pixel;      xvalues_mask |= GCBackground;    }  if ((values_mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT))    {      xvalues.font = ((XFontStruct *) ((GdkFontPrivate*) values->font)->xfont)->fid;      xvalues_mask |= GCFont;    }  if (values_mask & GDK_GC_FUNCTION)    {      switch (values->function)	{	case GDK_COPY:	  xvalues.function = GXcopy;	  break;	case GDK_INVERT:	  xvalues.function = GXinvert;	  break;	case GDK_XOR:	  xvalues.function = GXxor;	  break;	case GDK_CLEAR:	  xvalues.function = GXclear;	  break;	case GDK_AND:	  xvalues.function = GXand;	  break;	case GDK_AND_REVERSE:	  xvalues.function = GXandReverse;	  break;	case GDK_AND_INVERT:	  xvalues.function = GXandInverted;	  break;	case GDK_NOOP:	  xvalues.function = GXnoop;	  break;	case GDK_OR:	  xvalues.function = GXor;	  break;	case GDK_EQUIV:	  xvalues.function = GXequiv;	  break;	case GDK_OR_REVERSE:	  xvalues.function = GXorReverse;	  break;	case GDK_COPY_INVERT:	  xvalues.function = GXcopyInverted;	  break;	case GDK_OR_INVERT:	  xvalues.function = GXorInverted;	  break;	case GDK_NAND:	  xvalues.function = GXnand;	  break;	case GDK_SET:	  xvalues.function = GXset;	  break;	}      xvalues_mask |= GCFunction;    }  if (values_mask & GDK_GC_FILL)    {      switch (values->fill)	{	case GDK_SOLID:	  xvalues.fill_style = FillSolid;	  break;	case GDK_TILED:	  xvalues.fill_style = FillTiled;	  break;	case GDK_STIPPLED:	  xvalues.fill_style = FillStippled;	  break;	case GDK_OPAQUE_STIPPLED:	  xvalues.fill_style = FillOpaqueStippled;	  break;	}      xvalues_mask |= GCFillStyle;    }  if (values_mask & GDK_GC_TILE)    {      xvalues.tile = ((GdkPixmapPrivate*) values->tile)->xwindow;      xvalues_mask |= GCTile;    }  if (values_mask & GDK_GC_STIPPLE)    {      xvalues.stipple = ((GdkPixmapPrivate*) values->stipple)->xwindow;      xvalues_mask |= GCStipple;    }  if (values_mask & GDK_GC_CLIP_MASK)    {      xvalues.clip_mask = ((GdkPixmapPrivate*) values->clip_mask)->xwindow;      xvalues_mask |= GCClipMask;    }  if (values_mask & GDK_GC_SUBWINDOW)    {      xvalues.subwindow_mode = values->subwindow_mode;      xvalues_mask |= GCSubwindowMode;    }  if (values_mask & GDK_GC_TS_X_ORIGIN)    {      xvalues.ts_x_origin = values->ts_x_origin;      xvalues_mask |= GCTileStipXOrigin;    }  if (values_mask & GDK_GC_TS_Y_ORIGIN)    {      xvalues.ts_y_origin = values->ts_y_origin;      xvalues_mask |= GCTileStipYOrigin;    }  if (values_mask & GDK_GC_CLIP_X_ORIGIN)    {      xvalues.clip_x_origin = values->clip_x_origin;      xvalues_mask |= GCClipXOrigin;    }  if (values_mask & GDK_GC_CLIP_Y_ORIGIN)    {      xvalues.clip_y_origin = values->clip_y_origin;      xvalues_mask |= GCClipYOrigin;    }   if (values_mask & GDK_GC_EXPOSURES)    xvalues.graphics_exposures = values->graphics_exposures;  else    xvalues.graphics_exposures = False;  xvalues_mask |= GCGraphicsExposures;  if (values_mask & GDK_GC_LINE_WIDTH)    {      xvalues.line_width = values->line_width;      xvalues_mask |= GCLineWidth;    }  if (values_mask & GDK_GC_LINE_STYLE)    {      switch (values->line_style)	{	case GDK_LINE_SOLID:	  xvalues.line_style = LineSolid;	  break;	case GDK_LINE_ON_OFF_DASH:	  xvalues.line_style = LineOnOffDash;	  break;	case GDK_LINE_DOUBLE_DASH:	  xvalues.line_style = LineDoubleDash;	  break;	}      xvalues_mask |= GCLineStyle;    }  if (values_mask & GDK_GC_CAP_STYLE)    {      switch (values->cap_style)	{	case GDK_CAP_NOT_LAST:	  xvalues.cap_style = CapNotLast;	  break;	case GDK_CAP_BUTT:	  xvalues.cap_style = CapButt;	  break;	case GDK_CAP_ROUND:	  xvalues.cap_style = CapRound;	  break;	case GDK_CAP_PROJECTING:	  xvalues.cap_style = CapProjecting;	  break;	}      xvalues_mask |= GCCapStyle;    }  if (values_mask & GDK_GC_JOIN_STYLE)    {      switch (values->join_style)	{	case GDK_JOIN_MITER:	  xvalues.join_style = JoinMiter;	  break;	case GDK_JOIN_ROUND:	  xvalues.join_style = JoinRound;	  break;	case GDK_JOIN_BEVEL:	  xvalues.join_style = JoinBevel;	  break;	}      xvalues_mask |= GCJoinStyle;    }  private->xgc = XCreateGC (private->xdisplay, xwindow, xvalues_mask, &xvalues);  return gc;}voidgdk_gc_destroy (GdkGC *gc){  gdk_gc_unref (gc);}GdkGC *gdk_gc_ref (GdkGC *gc){  GdkGCPrivate *private = (GdkGCPrivate*) gc;  g_return_val_if_fail (gc != NULL, NULL);  private->ref_count += 1;  return gc;}voidgdk_gc_unref (GdkGC *gc){  GdkGCPrivate *private = (GdkGCPrivate*) gc;    g_return_if_fail (gc != NULL);  g_return_if_fail (private->ref_count > 0);    if (private->ref_count > 1)    private->ref_count -= 1;  else    {      XFreeGC (private->xdisplay, private->xgc);      memset (gc, 0, sizeof (GdkGCPrivate));      g_free (gc);    }}voidgdk_gc_get_values (GdkGC       *gc,		   GdkGCValues *values){  GdkGCPrivate *private;  XGCValues xvalues;  g_return_if_fail (gc != NULL);  g_return_if_fail (values != NULL);  private = (GdkGCPrivate*) gc;  if (XGetGCValues (private->xdisplay, private->xgc,		    GCForeground | GCBackground | GCFont |		    GCFunction | GCTile | GCStipple | /* GCClipMask | */		    GCSubwindowMode | GCGraphicsExposures |		    GCTileStipXOrigin | GCTileStipYOrigin |		    GCClipXOrigin | GCClipYOrigin |		    GCLineWidth | GCLineStyle | GCCapStyle |		    GCFillStyle | GCJoinStyle, &xvalues))    {      values->foreground.pixel = xvalues.foreground;      values->background.pixel = xvalues.background;      values->font = gdk_font_lookup (xvalues.font);      switch (xvalues.function)	{	case GXcopy:	  values->function = GDK_COPY;	  break;	case GXinvert:	  values->function = GDK_INVERT;	  break;	case GXxor:	  values->function = GDK_XOR;	  break;	case GXclear:	  values->function = GDK_CLEAR;	  break;	case GXand:	  values->function = GDK_AND;	  break;	case GXandReverse:	  values->function = GDK_AND_REVERSE;	  break;	case GXandInverted:	  values->function = GDK_AND_INVERT;	  break;	case GXnoop:	  values->function = GDK_NOOP;	  break;	case GXor:	  values->function = GDK_OR;	  break;	case GXequiv:	  values->function = GDK_EQUIV;	  break;	case GXorReverse:	  values->function = GDK_OR_REVERSE;	  break;	case GXcopyInverted:	  values->function =GDK_COPY_INVERT;	  break;	case GXorInverted:	  values->function = GDK_OR_INVERT;	  break;	case GXnand:	  values->function = GDK_NAND;	  break;	case GXset:	  values->function = GDK_SET;	  break;	}      switch (xvalues.fill_style)	{	case FillSolid:	  values->fill = GDK_SOLID;	  break;	case FillTiled:	  values->fill = GDK_TILED;	  break;	case FillStippled:	  values->fill = GDK_STIPPLED;	  break;	case FillOpaqueStippled:	  values->fill = GDK_OPAQUE_STIPPLED;	  break;	}      values->tile = gdk_pixmap_lookup (xvalues.tile);      values->stipple = gdk_pixmap_lookup (xvalues.stipple);      values->clip_mask = NULL;      values->subwindow_mode = xvalues.subwindow_mode;      values->ts_x_origin = xvalues.ts_x_origin;      values->ts_y_origin = xvalues.ts_y_origin;      values->clip_x_origin = xvalues.clip_x_origin;      values->clip_y_origin = xvalues.clip_y_origin;      values->graphics_exposures = xvalues.graphics_exposures;      values->line_width = xvalues.line_width;      switch (xvalues.line_style)	{	case LineSolid:	  values->line_style = GDK_LINE_SOLID;	  break;	case LineOnOffDash:	  values->line_style = GDK_LINE_ON_OFF_DASH;	  break;	case LineDoubleDash:	  values->line_style = GDK_LINE_DOUBLE_DASH;	  break;	}      switch (xvalues.cap_style)	{	case CapNotLast:	  values->cap_style = GDK_CAP_NOT_LAST;	  break;	case CapButt:	  values->cap_style = GDK_CAP_BUTT;	  break;	case CapRound:	  values->cap_style = GDK_CAP_ROUND;	  break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -