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

📄 gdkfont.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 <X11/Xlib.h>#include <X11/Xos.h>#include "gdk.h"#include "gdkprivate.h"static GHashTable *font_name_hash = NULL;static GHashTable *fontset_name_hash = NULL;static voidgdk_font_hash_insert (GdkFontType type, GdkFont *font, const gchar *font_name){  GdkFontPrivate *private = (GdkFontPrivate *)font;  GHashTable **hashp = (type == GDK_FONT_FONT) ?    &font_name_hash : &fontset_name_hash;  if (!*hashp)    *hashp = g_hash_table_new (g_str_hash, g_str_equal);  private->names = g_slist_prepend (private->names, g_strdup (font_name));  g_hash_table_insert (*hashp, private->names->data, font);}static voidgdk_font_hash_remove (GdkFontType type, GdkFont *font){  GdkFontPrivate *private = (GdkFontPrivate *)font;  GSList *tmp_list;  GHashTable *hash = (type == GDK_FONT_FONT) ?    font_name_hash : fontset_name_hash;  tmp_list = private->names;  while (tmp_list)    {      g_hash_table_remove (hash, tmp_list->data);      g_free (tmp_list->data);            tmp_list = tmp_list->next;    }  g_slist_free (private->names);  private->names = NULL;}static GdkFont *gdk_font_hash_lookup (GdkFontType type, const gchar *font_name){  GdkFont *result;  GHashTable *hash = (type == GDK_FONT_FONT) ?    font_name_hash : fontset_name_hash;  if (!hash)    return NULL;  else    {      result = g_hash_table_lookup (hash, font_name);      if (result)	gdk_font_ref (result);            return result;    }}GdkFont*gdk_font_load (const gchar *font_name){  GdkFont *font;  GdkFontPrivate *private;  XFontStruct *xfont;  g_return_val_if_fail (font_name != NULL, NULL);  font = gdk_font_hash_lookup (GDK_FONT_FONT, font_name);  if (font)    return font;  xfont = XLoadQueryFont (gdk_display, font_name);  if (xfont == NULL)    return NULL;  font = gdk_font_lookup (xfont->fid);  if (font != NULL)    {      private = (GdkFontPrivate *) font;      if (xfont != private->xfont)	XFreeFont (gdk_display, xfont);      gdk_font_ref (font);    }  else    {      private = g_new (GdkFontPrivate, 1);      private->xdisplay = gdk_display;      private->xfont = xfont;      private->ref_count = 1;      private->names = NULL;       font = (GdkFont*) private;      font->type = GDK_FONT_FONT;      font->ascent =  xfont->ascent;      font->descent = xfont->descent;      gdk_xid_table_insert (&xfont->fid, font);    }  gdk_font_hash_insert (GDK_FONT_FONT, font, font_name);  return font;}GdkFont*gdk_fontset_load (gchar *fontset_name){  GdkFont *font;  GdkFontPrivate *private;  XFontSet fontset;  gint  missing_charset_count;  gchar **missing_charset_list;  gchar *def_string;  font = gdk_font_hash_lookup (GDK_FONT_FONTSET, fontset_name);  if (font)    return font;  private = g_new (GdkFontPrivate, 1);  font = (GdkFont*) private;  private->xdisplay = gdk_display;  fontset = XCreateFontSet (gdk_display, fontset_name,			    &missing_charset_list, &missing_charset_count,			    &def_string);  if (missing_charset_count)    {      gint i;      g_warning ("Missing charsets in FontSet creation\n");      for (i=0;i<missing_charset_count;i++)	g_warning ("    %s\n", missing_charset_list[i]);      XFreeStringList (missing_charset_list);    }  private->ref_count = 1;  if (!fontset)    {      g_free (font);      return NULL;    }  else    {      gint num_fonts;      gint i;      XFontStruct **font_structs;      gchar **font_names;            private->xfont = fontset;      font->type = GDK_FONT_FONTSET;      num_fonts = XFontsOfFontSet (fontset, &font_structs, &font_names);      font->ascent = font->descent = 0;            for (i = 0; i < num_fonts; i++)	{	  font->ascent = MAX (font->ascent, font_structs[i]->ascent);	  font->descent = MAX (font->descent, font_structs[i]->descent);	}      private->names = NULL;      gdk_font_hash_insert (GDK_FONT_FONTSET, font, fontset_name);            return font;    }}GdkFont*gdk_font_ref (GdkFont *font){  GdkFontPrivate *private;  g_return_val_if_fail (font != NULL, NULL);  private = (GdkFontPrivate*) font;  private->ref_count += 1;  return font;}voidgdk_font_unref (GdkFont *font){  GdkFontPrivate *private;  private = (GdkFontPrivate*) font;  g_return_if_fail (font != NULL);  g_return_if_fail (private->ref_count > 0);  private->ref_count -= 1;  if (private->ref_count == 0)    {      gdk_font_hash_remove (font->type, font);            switch (font->type)	{	case GDK_FONT_FONT:	  gdk_xid_table_remove (((XFontStruct *) private->xfont)->fid);	  XFreeFont (private->xdisplay, (XFontStruct *) private->xfont);	  break;	case GDK_FONT_FONTSET:	  XFreeFontSet (private->xdisplay, (XFontSet) private->xfont);	  break;	default:	  g_error ("unknown font type.");	  break;	}      g_free (font);    }}gintgdk_font_id (const GdkFont *font){  const GdkFontPrivate *font_private;  g_return_val_if_fail (font != NULL, 0);  font_private = (const GdkFontPrivate*) font;  if (font->type == GDK_FONT_FONT)    {      return ((XFontStruct *) font_private->xfont)->fid;    }  else    {      return 0;    }}gintgdk_font_equal (const GdkFont *fonta,                const GdkFont *fontb){  const GdkFontPrivate *privatea;  const GdkFontPrivate *privateb;  g_return_val_if_fail (fonta != NULL, FALSE);  g_return_val_if_fail (fontb != NULL, FALSE);  privatea = (const GdkFontPrivate*) fonta;  privateb = (const GdkFontPrivate*) fontb;  if (fonta->type == GDK_FONT_FONT && fontb->type == GDK_FONT_FONT)    {      return (((XFontStruct *) privatea->xfont)->fid ==	      ((XFontStruct *) privateb->xfont)->fid);    }  else if (fonta->type == GDK_FONT_FONTSET && fontb->type == GDK_FONT_FONTSET)    {      gchar *namea, *nameb;      namea = XBaseFontNameListOfFontSet((XFontSet) privatea->xfont);      nameb = XBaseFontNameListOfFontSet((XFontSet) privateb->xfont);            return (strcmp(namea, nameb) == 0);    }  else    /* fontset != font */    return 0;}gintgdk_string_width (GdkFont     *font,		  const gchar *string){  GdkFontPrivate *font_private;  gint width;  XFontStruct *xfont;  XFontSet fontset;  g_return_val_if_fail (font != NULL, -1);  g_return_val_if_fail (string != NULL, -1);  font_private = (GdkFontPrivate*) font;  switch (font->type)    {    case GDK_FONT_FONT:      xfont = (XFontStruct *) font_private->xfont;      if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))	{	  width = XTextWidth (xfont, string, strlen (string));	}      else	{	  width = XTextWidth16 (xfont, (XChar2b *) string, strlen (string) / 2);	}      break;    case GDK_FONT_FONTSET:      fontset = (XFontSet) font_private->xfont;      width = XmbTextEscapement (fontset, string, strlen(string));      break;    default:      width = 0;    }  return width;}gintgdk_text_width (GdkFont      *font,		const gchar  *text,		gint          text_length){  GdkFontPrivate *private;  gint width;  XFontStruct *xfont;  XFontSet fontset;  g_return_val_if_fail (font != NULL, -1);  g_return_val_if_fail (text != NULL, -1);  private = (GdkFontPrivate*) font;  switch (font->type)    {    case GDK_FONT_FONT:      xfont = (XFontStruct *) private->xfont;      if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))	{	  width = XTextWidth (xfont, text, text_length);	}      else	{	  width = XTextWidth16 (xfont, (XChar2b *) text, text_length / 2);	}      break;    case GDK_FONT_FONTSET:      fontset = (XFontSet) private->xfont;      width = XmbTextEscapement (fontset, text, text_length);      break;    default:      width = 0;    }  return width;}gintgdk_text_width_wc (GdkFont	  *font,		   const GdkWChar *text,		   gint		   text_length){  GdkFontPrivate *private;  gint width;  XFontStruct *xfont;  XFontSet fontset;  g_return_val_if_fail (font != NULL, -1);  g_return_val_if_fail (text != NULL, -1);  private = (GdkFontPrivate*) font;  switch (font->type)    {    case GDK_FONT_FONT:      xfont = (XFontStruct *) private->xfont;      if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))        {          gchar *text_8bit;          gint i;          text_8bit = g_new (gchar, text_length);          for (i=0; i<text_length; i++) text_8bit[i] = text[i];          width = XTextWidth (xfont, text_8bit, text_length);          g_free (text_8bit);        }      else        {          width = 0;        }      break;    case GDK_FONT_FONTSET:      if (sizeof(GdkWChar) == sizeof(wchar_t))	{	  fontset = (XFontSet) private->xfont;	  width = XwcTextEscapement (fontset, (wchar_t *)text, text_length);	}      else	{	  wchar_t *text_wchar;	  gint i;	  fontset = (XFontSet) private->xfont;	  text_wchar = g_new(wchar_t, text_length);	  for (i=0; i<text_length; i++) text_wchar[i] = text[i];

⌨️ 快捷键说明

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