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

📄 gtkrc.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 4 页
字号:
  if (rc_style->engine)    {      style->engine = rc_style->engine;      gtk_theme_engine_ref (style->engine);      rc_style->engine->rc_style_to_style (style, rc_style);    }  return style;}/* Reuses or frees rc_styles */static GtkStyle *gtk_rc_style_init (GSList *rc_styles){  gint i;  GtkStyle *style = NULL;  if (!realized_style_ht)    realized_style_ht = g_hash_table_new ((GHashFunc)gtk_rc_styles_hash,					   (GCompareFunc)gtk_rc_styles_compare);  style = g_hash_table_lookup (realized_style_ht, rc_styles);  if (!style)    {      GtkRcStyle *proto_style;      GSList *tmp_styles;            proto_style = gtk_rc_style_new ();      tmp_styles = rc_styles;      while (tmp_styles)	{	  GtkRcStyle *rc_style = tmp_styles->data;	  GtkRcStylePrivate *rc_style_private;	  for (i=0; i<5; i++)	    {	      if (!proto_style->bg_pixmap_name[i] && rc_style->bg_pixmap_name[i])		proto_style->bg_pixmap_name[i] = g_strdup (rc_style->bg_pixmap_name[i]);	      if (!(proto_style->color_flags[i] & GTK_RC_FG) && 		    rc_style->color_flags[i] & GTK_RC_FG)		{		  proto_style->fg[i] = rc_style->fg[i];		  proto_style->color_flags[i] |= GTK_RC_FG;		}	      if (!(proto_style->color_flags[i] & GTK_RC_BG) && 		    rc_style->color_flags[i] & GTK_RC_BG)		{		  proto_style->bg[i] = rc_style->bg[i];		  proto_style->color_flags[i] |= GTK_RC_BG;		}	      if (!(proto_style->color_flags[i] & GTK_RC_TEXT) && 		    rc_style->color_flags[i] & GTK_RC_TEXT)		{		  proto_style->text[i] = rc_style->text[i];		  proto_style->color_flags[i] |= GTK_RC_TEXT;		}	      if (!(proto_style->color_flags[i] & GTK_RC_BASE) && 		    rc_style->color_flags[i] & GTK_RC_BASE)		{		  proto_style->base[i] = rc_style->base[i];		  proto_style->color_flags[i] |= GTK_RC_BASE;		}	    }	  if (!proto_style->font_name && rc_style->font_name)	    proto_style->font_name = g_strdup (rc_style->font_name);	  if (!proto_style->fontset_name && rc_style->fontset_name)	    proto_style->fontset_name = g_strdup (rc_style->fontset_name);	  if (!proto_style->engine && rc_style->engine)	    {	      proto_style->engine = rc_style->engine;	      gtk_theme_engine_ref (proto_style->engine);	    }	  	  if (proto_style->engine &&	      (proto_style->engine == rc_style->engine))	    proto_style->engine->merge_rc_style (proto_style, rc_style);	  /* Point from each rc_style to the list of styles */	  rc_style_private = (GtkRcStylePrivate *)rc_style;	  if (!g_slist_find (rc_style_private->rc_style_lists, rc_styles))	    rc_style_private->rc_style_lists = g_slist_prepend (rc_style_private->rc_style_lists, rc_styles);	  tmp_styles = tmp_styles->next;	}      for (i=0; i<5; i++)	if (proto_style->bg_pixmap_name[i] &&	    (strcmp (proto_style->bg_pixmap_name[i], "<none>") == 0))	  {	    g_free (proto_style->bg_pixmap_name[i]);	    proto_style->bg_pixmap_name[i] = NULL;	  }      style = gtk_rc_style_to_style (proto_style);      g_hash_table_insert (realized_style_ht, rc_styles, style);    }  else    g_slist_free (rc_styles);  return style;}/********************* * Parsing functions * *********************/static guintgtk_rc_parse_statement (GScanner *scanner){  guint token;    token = g_scanner_peek_next_token (scanner);  switch (token)    {    case GTK_RC_TOKEN_INCLUDE:      token = g_scanner_get_next_token (scanner);      if (token != GTK_RC_TOKEN_INCLUDE)	return GTK_RC_TOKEN_INCLUDE;      token = g_scanner_get_next_token (scanner);      if (token != G_TOKEN_STRING)	return G_TOKEN_STRING;      gtk_rc_parse_file (scanner->value.v_string, FALSE);      return G_TOKEN_NONE;    case GTK_RC_TOKEN_STYLE:      return gtk_rc_parse_style (scanner);    case GTK_RC_TOKEN_BINDING:      return gtk_binding_parse_binding (scanner);    case GTK_RC_TOKEN_PIXMAP_PATH:      return gtk_rc_parse_pixmap_path (scanner);    case GTK_RC_TOKEN_WIDGET:      return gtk_rc_parse_path_pattern (scanner);    case GTK_RC_TOKEN_WIDGET_CLASS:      return gtk_rc_parse_path_pattern (scanner);    case GTK_RC_TOKEN_CLASS:      return gtk_rc_parse_path_pattern (scanner);    case GTK_RC_TOKEN_MODULE_PATH:      return gtk_rc_parse_module_path (scanner);           default:      g_scanner_get_next_token (scanner);      return /* G_TOKEN_SYMBOL */ GTK_RC_TOKEN_STYLE;    }}static guintgtk_rc_parse_style (GScanner *scanner){  GtkRcStyle *rc_style;  GtkRcStyle *parent_style;  guint token;  gint insert;  gint i;    token = g_scanner_get_next_token (scanner);  if (token != GTK_RC_TOKEN_STYLE)    return GTK_RC_TOKEN_STYLE;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_STRING)    return G_TOKEN_STRING;    insert = FALSE;  rc_style = gtk_rc_style_find (scanner->value.v_string);    if (!rc_style)    {      insert = TRUE;      rc_style = gtk_rc_style_new ();      rc_style->name = g_strdup (scanner->value.v_string);            for (i = 0; i < 5; i++)	rc_style->bg_pixmap_name[i] = NULL;      for (i = 0; i < 5; i++)	rc_style->color_flags[i] = 0;      rc_style->engine = NULL;      rc_style->engine_data = NULL;    }    token = g_scanner_peek_next_token (scanner);  if (token == G_TOKEN_EQUAL_SIGN)    {      token = g_scanner_get_next_token (scanner);            token = g_scanner_get_next_token (scanner);      if (token != G_TOKEN_STRING)	{	  if (insert)	    g_free (rc_style);	  return G_TOKEN_STRING;	}            parent_style = gtk_rc_style_find (scanner->value.v_string);      if (parent_style)	{	  for (i = 0; i < 5; i++)	    {	      rc_style->color_flags[i] = parent_style->color_flags[i];	      rc_style->fg[i] = parent_style->fg[i];	      rc_style->bg[i] = parent_style->bg[i];	      rc_style->text[i] = parent_style->text[i];	      rc_style->base[i] = parent_style->base[i];	    }	  	  if (parent_style->fontset_name)	    {	      if (rc_style->fontset_name)		g_free (rc_style->fontset_name);	      rc_style->fontset_name = g_strdup (parent_style->fontset_name);	    }	  else if (parent_style->font_name)	    {	      if (rc_style->font_name)		g_free (rc_style->font_name);	      rc_style->font_name = g_strdup (parent_style->font_name);	    }	  	  for (i = 0; i < 5; i++)	    {	      if (rc_style->bg_pixmap_name[i])		g_free (rc_style->bg_pixmap_name[i]);	      rc_style->bg_pixmap_name[i] = g_strdup (parent_style->bg_pixmap_name[i]);	    }	}    }    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_LEFT_CURLY)    {      if (insert)	g_free (rc_style);      return G_TOKEN_LEFT_CURLY;    }    token = g_scanner_peek_next_token (scanner);  while (token != G_TOKEN_RIGHT_CURLY)    {      switch (token)	{	case GTK_RC_TOKEN_BASE:	  token = gtk_rc_parse_base (scanner, rc_style);	  break;	case GTK_RC_TOKEN_BG:	  token = gtk_rc_parse_bg (scanner, rc_style);	  break;	case GTK_RC_TOKEN_FG:	  token = gtk_rc_parse_fg (scanner, rc_style);	  break;	case GTK_RC_TOKEN_TEXT:	  token = gtk_rc_parse_text (scanner, rc_style);	  break;	case GTK_RC_TOKEN_BG_PIXMAP:	  token = gtk_rc_parse_bg_pixmap (scanner, rc_style);	  break;	case GTK_RC_TOKEN_FONT:	  token = gtk_rc_parse_font (scanner, rc_style);	  break;	case GTK_RC_TOKEN_FONTSET:	  token = gtk_rc_parse_fontset (scanner, rc_style);	  break;	case GTK_RC_TOKEN_ENGINE:	  token = gtk_rc_parse_engine (scanner, rc_style);	  break;	default:	  g_scanner_get_next_token (scanner);	  token = G_TOKEN_RIGHT_CURLY;	  break;	}      if (token != G_TOKEN_NONE)	{	  if (insert)	    {	      if (rc_style->fontset_name)		g_free (rc_style->fontset_name);	      if (rc_style->font_name)		g_free (rc_style->font_name);	      for (i = 0; i < 5; i++)		if (rc_style->bg_pixmap_name[i])		  g_free (rc_style->bg_pixmap_name[i]);	      g_free (rc_style);	    }	  return token;	}      token = g_scanner_peek_next_token (scanner);    }    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_RIGHT_CURLY)    {      if (insert)	{	  if (rc_style->fontset_name)	    g_free (rc_style->fontset_name);	  if (rc_style->font_name)	    g_free (rc_style->font_name);	  	  for (i = 0; i < 5; i++)	    if (rc_style->bg_pixmap_name[i])	      g_free (rc_style->bg_pixmap_name[i]);	  	  g_free (rc_style);	}      return G_TOKEN_RIGHT_CURLY;    }    if (insert)    {      if (!rc_style_ht)	rc_style_ht = g_hash_table_new ((GHashFunc) gtk_rc_style_hash,					(GCompareFunc) gtk_rc_style_compare);            g_hash_table_insert (rc_style_ht, rc_style->name, rc_style);    }    return G_TOKEN_NONE;}static guintgtk_rc_parse_base (GScanner   *scanner,		   GtkRcStyle *style){  GtkStateType state;  guint token;    token = g_scanner_get_next_token (scanner);  if (token != GTK_RC_TOKEN_BASE)    return GTK_RC_TOKEN_BASE;    token = gtk_rc_parse_state (scanner, &state);  if (token != G_TOKEN_NONE)    return token;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_EQUAL_SIGN)    return G_TOKEN_EQUAL_SIGN;  style->color_flags[state] |= GTK_RC_BASE;  return gtk_rc_parse_color (scanner, &style->base[state]);}static guintgtk_rc_parse_bg (GScanner   *scanner,		 GtkRcStyle *style){  GtkStateType state;  guint token;    token = g_scanner_get_next_token (scanner);  if (token != GTK_RC_TOKEN_BG)    return GTK_RC_TOKEN_BG;    token = gtk_rc_parse_state (scanner, &state);  if (token != G_TOKEN_NONE)    return token;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_EQUAL_SIGN)    return G_TOKEN_EQUAL_SIGN;  style->color_flags[state] |= GTK_RC_BG;  return gtk_rc_parse_color (scanner, &style->bg[state]);}static guintgtk_rc_parse_fg (GScanner   *scanner,		 GtkRcStyle *style){  GtkStateType state;  guint token;    token = g_scanner_get_next_token (scanner);  if (token != GTK_RC_TOKEN_FG)    return GTK_RC_TOKEN_FG;    token = gtk_rc_parse_state (scanner, &state);  if (token != G_TOKEN_NONE)    return token;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_EQUAL_SIGN)    return G_TOKEN_EQUAL_SIGN;    style->color_flags[state] |= GTK_RC_FG;  return gtk_rc_parse_color (scanner, &style->fg[state]);}static guintgtk_rc_parse_text (GScanner   *scanner,		   GtkRcStyle *style){  GtkStateType state;  guint token;    token = g_scanner_get_next_token (scanner);  if (token != GTK_RC_TOKEN_TEXT)    return GTK_RC_TOKEN_TEXT;    token = gtk_rc_parse_state (scanner, &state);  if (token != G_TOKEN_NONE)    return token;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_EQUAL_SIGN)    return G_TOKEN_EQUAL_SIGN;    style->color_flags[state] |= GTK_RC_TEXT;  return gtk_rc_parse_color (scanner, &style->text[state]);}static guintgtk_rc_parse_bg_pixmap (GScanner   *scanner,			GtkRcStyle *rc_style){  GtkStateType state;  guint token;  gchar *pixmap_file;    token = g_scanner_get_next_token (scanner);  if (token != GTK_RC_TOKEN_BG_PIXMAP)    return GTK_RC_TOKEN_BG_PIXMAP;    token = gtk_rc_parse_state (scanner, &state);  if (token != G_TOKEN_NONE)    return token;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_EQUAL_SIGN)    return G_TOKEN_EQUAL_SIGN;    token = g_scanner_get_next_token (scanner);  if (token != G_TOKEN_STRING)    return G_TOKEN_STRING;    if ((strcmp (scanner->value.v_string, "<parent>") == 0) ||      (strcmp (scanner->value.v_string, "<none>") == 0))    pixmap_file = g_strdup (scanner->value.v_string);  else    pixmap_file = gtk_rc_find_pixmap_in_path (scanner, scanner->value.v_string);    if (pixmap_file)    {      if (rc_style->bg_pixmap_name[state])	g_free (rc_style->bg_pixmap_name[state]);      rc_style->bg_pixmap_name[state] = pixmap_file;    }    return G_TOKEN_NONE;}static gchar*gtk_rc_check_pixmap_dir (const gchar *dir, const gchar *pixmap_file){  gchar *buf;  gint fd;  buf = g_strdup_printf ("%s%c%s", dir, '/', pixmap_file);    fd = open (buf, O_RDONLY);  if (fd >= 0)    {      close (fd);      return buf;    }    g_free (buf);  return NULL;}gchar*gtk_rc_find_pixmap_in_path (GScanner *scanner,			    const gchar *pixmap_file){  gint i;  gchar *filename;  GSList *tmp_list;    for (i = 0; (i < GTK_RC_MAX_PIXMAP_PATHS) && (pixmap_path[i] != NULL); i++)    {      filename = gtk_rc_check_pixmap_dir (pixmap_path[i], pixmap_file);      if (filename)	return filename;    }  tmp_list = rc_dir_stack;  while (tmp_list)    {      filename = gtk_rc_check_pixmap_dir (tmp_list->data, pixmap_file);      if (filename)	return filename;            tmp_list = tmp_list->next;    }  if (scanner)    g_warning (_("Unable to locate image file in pixmap_path: \"%s\" line %d"),	       pixmap_file, scanner->line);  else    g_warning (_("Unable to locate image file in pixmap_path: \"%s\""),	       pixmap_file);      return NULL;}gchar*gtk_rc_find_module_in_path (const gchar *module_file){  gint i;  gint fd;  gchar *buf;    for (i = 0; (i < GTK_RC_MAX_MODULE_PATHS) && (module_path[i] != NULL); i++)    {      buf = g_strdup_printf ("%s%c%s", module_path[i], '/', module_file);            fd = open (buf, O_RDONLY);      if (fd >= 0)	{	  close (fd);	  return buf;	}            g_free (buf);    }      return NULL;}static guintgtk_rc_parse_font (GScanner   *scanner,		   GtkRcStyle *rc_style)

⌨️ 快捷键说明

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