📄 gtkrc.c
字号:
{ guint token; token = g_scanner_get_next_token (scanner); if (token != GTK_RC_TOKEN_FONT) return GTK_RC_TOKEN_FONT; 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 (rc_style->font_name) g_free (rc_style->font_name); rc_style->font_name = g_strdup (scanner->value.v_string); return G_TOKEN_NONE;}static guintgtk_rc_parse_fontset (GScanner *scanner, GtkRcStyle *rc_style){ guint token; token = g_scanner_get_next_token (scanner); if (token != GTK_RC_TOKEN_FONTSET) return GTK_RC_TOKEN_FONTSET; 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 (rc_style->fontset_name) g_free (rc_style->fontset_name); rc_style->fontset_name = g_strdup (scanner->value.v_string); return G_TOKEN_NONE;}static guint gtk_rc_parse_engine (GScanner *scanner, GtkRcStyle *rc_style){ guint token; token = g_scanner_get_next_token (scanner); if (token != GTK_RC_TOKEN_ENGINE) return GTK_RC_TOKEN_ENGINE; token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_STRING) return G_TOKEN_STRING; rc_style->engine = gtk_theme_engine_get (scanner->value.v_string); token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_LEFT_CURLY) return G_TOKEN_LEFT_CURLY; if (rc_style->engine) return rc_style->engine->parse_rc_style (scanner, rc_style); else { /* Skip over remainder, looking for nested {}'s */ guint count = 1; while ((token = g_scanner_get_next_token (scanner)) != G_TOKEN_EOF) { if (token == G_TOKEN_LEFT_CURLY) count++; else if (token == G_TOKEN_RIGHT_CURLY) count--; if (count == 0) return G_TOKEN_NONE; } return G_TOKEN_RIGHT_CURLY; }}guintgtk_rc_parse_state (GScanner *scanner, GtkStateType *state){ guint old_scope; guint token; g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); g_return_val_if_fail (state != NULL, G_TOKEN_ERROR); /* we don't know where we got called from, so we reset the scope here. * if we bail out due to errors, we *don't* reset the scope, so the * error messaging code can make sense of our tokens. */ old_scope = g_scanner_set_scope (scanner, 0); token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_LEFT_BRACE) return G_TOKEN_LEFT_BRACE; token = g_scanner_get_next_token (scanner); switch (token) { case GTK_RC_TOKEN_ACTIVE: *state = GTK_STATE_ACTIVE; break; case GTK_RC_TOKEN_INSENSITIVE: *state = GTK_STATE_INSENSITIVE; break; case GTK_RC_TOKEN_NORMAL: *state = GTK_STATE_NORMAL; break; case GTK_RC_TOKEN_PRELIGHT: *state = GTK_STATE_PRELIGHT; break; case GTK_RC_TOKEN_SELECTED: *state = GTK_STATE_SELECTED; break; default: return /* G_TOKEN_SYMBOL */ GTK_RC_TOKEN_NORMAL; } token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_RIGHT_BRACE) return G_TOKEN_RIGHT_BRACE; g_scanner_set_scope (scanner, old_scope); return G_TOKEN_NONE;}guintgtk_rc_parse_priority (GScanner *scanner, GtkPathPriorityType *priority){ guint old_scope; guint token; g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); g_return_val_if_fail (priority != NULL, G_TOKEN_ERROR); /* we don't know where we got called from, so we reset the scope here. * if we bail out due to errors, we *don't* reset the scope, so the * error messaging code can make sense of our tokens. */ old_scope = g_scanner_set_scope (scanner, 0); token = g_scanner_get_next_token (scanner); if (token != ':') return ':'; token = g_scanner_get_next_token (scanner); switch (token) { case GTK_RC_TOKEN_LOWEST: *priority = GTK_PATH_PRIO_LOWEST; break; case GTK_RC_TOKEN_GTK: *priority = GTK_PATH_PRIO_GTK; break; case GTK_RC_TOKEN_APPLICATION: *priority = GTK_PATH_PRIO_APPLICATION; break; case GTK_RC_TOKEN_RC: *priority = GTK_PATH_PRIO_RC; break; case GTK_RC_TOKEN_HIGHEST: *priority = GTK_PATH_PRIO_HIGHEST; break; default: return /* G_TOKEN_SYMBOL */ GTK_RC_TOKEN_APPLICATION; } g_scanner_set_scope (scanner, old_scope); return G_TOKEN_NONE;}guintgtk_rc_parse_color (GScanner *scanner, GdkColor *color){ guint token; g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); /* we don't need to set our own scop here, because * we don't need own symbols */ token = g_scanner_get_next_token (scanner); switch (token) { gint token_int; gint length; gint temp; gchar buf[9]; gint i, j; case G_TOKEN_LEFT_CURLY: token = g_scanner_get_next_token (scanner); if (token == G_TOKEN_INT) token_int = scanner->value.v_int; else if (token == G_TOKEN_FLOAT) token_int = scanner->value.v_float * 65535.0; else return G_TOKEN_FLOAT; color->red = CLAMP (token_int, 0, 65535); token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_COMMA) return G_TOKEN_COMMA; token = g_scanner_get_next_token (scanner); if (token == G_TOKEN_INT) token_int = scanner->value.v_int; else if (token == G_TOKEN_FLOAT) token_int = scanner->value.v_float * 65535.0; else return G_TOKEN_FLOAT; color->green = CLAMP (token_int, 0, 65535); token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_COMMA) return G_TOKEN_COMMA; token = g_scanner_get_next_token (scanner); if (token == G_TOKEN_INT) token_int = scanner->value.v_int; else if (token == G_TOKEN_FLOAT) token_int = scanner->value.v_float * 65535.0; else return G_TOKEN_FLOAT; color->blue = CLAMP (token_int, 0, 65535); token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_RIGHT_CURLY) return G_TOKEN_RIGHT_CURLY; return G_TOKEN_NONE; case G_TOKEN_STRING: if (scanner->value.v_string[0] != '#') return G_TOKEN_STRING; length = strlen (scanner->value.v_string) - 1; if (((length % 3) != 0) || (length > 12)) return G_TOKEN_STRING; length /= 3; for (i = 0, j = 1; i < length; i++, j++) buf[i] = scanner->value.v_string[j]; buf[i] = '\0'; sscanf (buf, "%x", &temp); color->red = temp; for (i = 0; i < length; i++, j++) buf[i] = scanner->value.v_string[j]; buf[i] = '\0'; sscanf (buf, "%x", &temp); color->green = temp; for (i = 0; i < length; i++, j++) buf[i] = scanner->value.v_string[j]; buf[i] = '\0'; sscanf (buf, "%x", &temp); color->blue = temp; if (length == 1) { color->red *= 4369; color->green *= 4369; color->blue *= 4369; } else if (length == 2) { color->red *= 257; color->green *= 257; color->blue *= 257; } else if (length == 3) { color->red *= 16; color->green *= 16; color->blue *= 16; } return G_TOKEN_NONE; default: return G_TOKEN_STRING; }}static guintgtk_rc_parse_pixmap_path (GScanner *scanner){ guint token; token = g_scanner_get_next_token (scanner); if (token != GTK_RC_TOKEN_PIXMAP_PATH) return GTK_RC_TOKEN_PIXMAP_PATH; token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_STRING) return G_TOKEN_STRING; gtk_rc_parse_pixmap_path_string (scanner->value.v_string); return G_TOKEN_NONE;}static voidgtk_rc_parse_pixmap_path_string (gchar *pix_path){ gchar *buf; gint end_offset; gint start_offset = 0; gint path_len; gint path_num; /* free the old one, or just add to the old one ? */ for (path_num=0; pixmap_path[path_num]; path_num++) { g_free (pixmap_path[path_num]); pixmap_path[path_num] = NULL; } path_num = 0; path_len = strlen (pix_path); buf = g_strdup (pix_path); for (end_offset = 0; end_offset <= path_len; end_offset++) { if ((buf[end_offset] == ':') || (end_offset == path_len)) { buf[end_offset] = '\0'; pixmap_path[path_num] = g_strdup (buf + start_offset); path_num++; pixmap_path[path_num] = NULL; start_offset = end_offset + 1; } } g_free (buf); gtk_rc_append_default_pixmap_path();}static guintgtk_rc_parse_module_path (GScanner *scanner){ guint token; token = g_scanner_get_next_token (scanner); if (token != GTK_RC_TOKEN_MODULE_PATH) return GTK_RC_TOKEN_MODULE_PATH; token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_STRING) return G_TOKEN_STRING; gtk_rc_parse_module_path_string (scanner->value.v_string); return G_TOKEN_NONE;}static voidgtk_rc_parse_module_path_string (gchar *mod_path){ gchar *buf; gint end_offset; gint start_offset = 0; gint path_len; gint path_num; /* free the old one, or just add to the old one ? */ for (path_num=0; module_path[path_num]; path_num++) { g_free (module_path[path_num]); module_path[path_num] = NULL; } path_num = 0; path_len = strlen (mod_path); buf = g_strdup (mod_path); for (end_offset = 0; end_offset <= path_len; end_offset++) { if ((buf[end_offset] == ':') || (end_offset == path_len)) { buf[end_offset] = '\0'; module_path[path_num] = g_strdup (buf + start_offset); path_num++; module_path[path_num] = NULL; start_offset = end_offset + 1; } } g_free (buf); gtk_rc_append_default_module_path();}static guintgtk_rc_parse_path_pattern (GScanner *scanner){ guint token; GtkPathType path_type; gchar *pattern; gboolean is_binding; GtkPathPriorityType priority = GTK_PATH_PRIO_RC; token = g_scanner_get_next_token (scanner); switch (token) { case GTK_RC_TOKEN_WIDGET: path_type = GTK_PATH_WIDGET; break; case GTK_RC_TOKEN_WIDGET_CLASS: path_type = GTK_PATH_WIDGET_CLASS; break; case GTK_RC_TOKEN_CLASS: path_type = GTK_PATH_CLASS; break; default: return GTK_RC_TOKEN_WIDGET_CLASS; } token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_STRING) return G_TOKEN_STRING; pattern = g_strdup (scanner->value.v_string); token = g_scanner_get_next_token (scanner); if (token == GTK_RC_TOKEN_STYLE) is_binding = FALSE; else if (token == GTK_RC_TOKEN_BINDING) { is_binding = TRUE; if (g_scanner_peek_next_token (scanner) == ':') { token = gtk_rc_parse_priority (scanner, &priority); if (token != G_TOKEN_NONE) { g_free (pattern); return token; } } } else { g_free (pattern); return GTK_RC_TOKEN_STYLE; } token = g_scanner_get_next_token (scanner); if (token != G_TOKEN_STRING) { g_free (pattern); return G_TOKEN_STRING; } if (is_binding) { GtkBindingSet *binding; binding = gtk_binding_set_find (scanner->value.v_string); if (!binding) { g_free (pattern); return G_TOKEN_STRING; } gtk_binding_set_add_path (binding, path_type, pattern, priority); } else { GtkRcStyle *rc_style; GtkRcSet *rc_set; rc_style = gtk_rc_style_find (scanner->value.v_string); if (!rc_style) { g_free (pattern); return G_TOKEN_STRING; } rc_set = g_new (GtkRcSet, 1); gtk_pattern_spec_init (&rc_set->pspec, pattern); rc_set->rc_style = rc_style; if (path_type == GTK_PATH_WIDGET) gtk_rc_sets_widget = g_slist_prepend (gtk_rc_sets_widget, rc_set); else if (path_type == GTK_PATH_WIDGET_CLASS) gtk_rc_sets_widget_class = g_slist_prepend (gtk_rc_sets_widget_class, rc_set); else gtk_rc_sets_class = g_slist_prepend (gtk_rc_sets_class, rc_set); } g_free (pattern); return G_TOKEN_NONE;}/*typedef GdkPixmap * (*GtkImageLoader) (GdkWindow *window, GdkColormap *colormap, GdkBitmap **mask, GdkColor *transparent_color, const gchar *filename);*/voidgtk_rc_set_image_loader(GtkImageLoader loader){ image_loader = loader;}GdkPixmap *gtk_rc_load_image (GdkColormap *colormap, GdkColor *transparent_color, const gchar *filename){ if (strcmp (filename, "<parent>") == 0) return (GdkPixmap*) GDK_PARENT_RELATIVE; else { if(image_loader) return image_loader(NULL, colormap, NULL, transparent_color, filename); else return gdk_pixmap_colormap_create_from_xpm (NULL, colormap, NULL, transparent_color, filename); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -