📄 gtkrc.c
字号:
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 + -