📄 pixbuf-rc-style.c
字号:
guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_ARROW_DIRECTION) return TOKEN_ARROW_DIRECTION; 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 == TOKEN_UP) data->match_data.arrow_direction = GTK_ARROW_UP; else if (token == TOKEN_DOWN) data->match_data.arrow_direction = GTK_ARROW_DOWN; else if (token == TOKEN_LEFT) data->match_data.arrow_direction = GTK_ARROW_LEFT; else if (token == TOKEN_RIGHT) data->match_data.arrow_direction = GTK_ARROW_RIGHT; else return TOKEN_UP; data->match_data.flags |= THEME_MATCH_ARROW_DIRECTION; return G_TOKEN_NONE;}static guinttheme_parse_gap_side(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_GAP_SIDE) return TOKEN_GAP_SIDE; 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 == TOKEN_TOP) data->match_data.gap_side = GTK_POS_TOP; else if (token == TOKEN_BOTTOM) data->match_data.gap_side = GTK_POS_BOTTOM; else if (token == TOKEN_LEFT) data->match_data.gap_side = GTK_POS_LEFT; else if (token == TOKEN_RIGHT) data->match_data.gap_side = GTK_POS_RIGHT; else return TOKEN_TOP; data->match_data.flags |= THEME_MATCH_GAP_SIDE; return G_TOKEN_NONE;}static guinttheme_parse_orientation(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_ORIENTATION) return TOKEN_ORIENTATION; 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 == TOKEN_HORIZONTAL) data->match_data.orientation = GTK_ORIENTATION_HORIZONTAL; else if (token == TOKEN_VERTICAL) data->match_data.orientation = GTK_ORIENTATION_VERTICAL; else return TOKEN_HORIZONTAL; data->match_data.flags |= THEME_MATCH_ORIENTATION; return G_TOKEN_NONE;}static guinttheme_parse_expander_style(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_EXPANDER_STYLE) return TOKEN_EXPANDER_STYLE; 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 == TOKEN_COLLAPSED) data->match_data.expander_style = GTK_EXPANDER_COLLAPSED; else if (token == TOKEN_SEMI_COLLAPSED) data->match_data.expander_style = GTK_EXPANDER_SEMI_COLLAPSED; else if (token == TOKEN_SEMI_EXPANDED) data->match_data.expander_style = GTK_EXPANDER_SEMI_EXPANDED; else if (token == TOKEN_EXPANDED) data->match_data.expander_style = GTK_EXPANDER_EXPANDED; else return TOKEN_COLLAPSED; data->match_data.flags |= THEME_MATCH_EXPANDER_STYLE; return G_TOKEN_NONE;}static guinttheme_parse_window_edge(GScanner * scanner, ThemeImage * data){ guint token; token = g_scanner_get_next_token(scanner); if (token != TOKEN_WINDOW_EDGE) return TOKEN_WINDOW_EDGE; 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 == TOKEN_NORTH_WEST) data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH_WEST; else if (token == TOKEN_NORTH) data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH; else if (token == TOKEN_NORTH_EAST) data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH_EAST; else if (token == TOKEN_WEST) data->match_data.window_edge = GDK_WINDOW_EDGE_WEST; else if (token == TOKEN_EAST) data->match_data.window_edge = GDK_WINDOW_EDGE_EAST; else if (token == TOKEN_SOUTH_WEST) data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH_WEST; else if (token == TOKEN_SOUTH) data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH; else if (token == TOKEN_SOUTH_EAST) data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH_EAST; else return TOKEN_NORTH_WEST; data->match_data.flags |= THEME_MATCH_WINDOW_EDGE; return G_TOKEN_NONE;}static voidtheme_image_ref (ThemeImage *data){ data->refcount++;}static voidtheme_image_unref (ThemeImage *data){ data->refcount--; if (data->refcount == 0) { g_free (data->match_data.detail); if (data->background) theme_pixbuf_destroy (data->background); if (data->overlay) theme_pixbuf_destroy (data->overlay); if (data->gap_start) theme_pixbuf_destroy (data->gap_start); if (data->gap) theme_pixbuf_destroy (data->gap); if (data->gap_end) theme_pixbuf_destroy (data->gap_end); g_free (data); }}static guinttheme_parse_image(GtkSettings *settings, GScanner *scanner, PixbufRcStyle *pixbuf_style, ThemeImage **data_return){ guint token; ThemeImage *data; data = NULL; token = g_scanner_get_next_token(scanner); if (token != TOKEN_IMAGE) return TOKEN_IMAGE; token = g_scanner_get_next_token(scanner); if (token != G_TOKEN_LEFT_CURLY) return G_TOKEN_LEFT_CURLY; data = g_malloc(sizeof(ThemeImage)); data->refcount = 1; data->background = NULL; data->overlay = NULL; data->gap_start = NULL; data->gap = NULL; data->gap_end = NULL; data->recolorable = FALSE; data->match_data.function = 0; data->match_data.detail = NULL; data->match_data.flags = 0; token = g_scanner_peek_next_token(scanner); while (token != G_TOKEN_RIGHT_CURLY) { switch (token) { case TOKEN_FUNCTION: token = theme_parse_function(scanner, data); break; case TOKEN_RECOLORABLE: token = theme_parse_recolorable(scanner, data); break; case TOKEN_DETAIL: token = theme_parse_detail(scanner, data); break; case TOKEN_STATE: token = theme_parse_state(scanner, data); break; case TOKEN_SHADOW: token = theme_parse_shadow(scanner, data); break; case TOKEN_GAP_SIDE: token = theme_parse_gap_side(scanner, data); break; case TOKEN_ARROW_DIRECTION: token = theme_parse_arrow_direction(scanner, data); break; case TOKEN_ORIENTATION: token = theme_parse_orientation(scanner, data); break; case TOKEN_FILE: token = theme_parse_file(settings, scanner, &data->background); break; case TOKEN_BORDER: token = theme_parse_border(scanner, &data->background); break; case TOKEN_STRETCH: token = theme_parse_stretch(scanner, &data->background); break; case TOKEN_GAP_FILE: token = theme_parse_file(settings, scanner, &data->gap); break; case TOKEN_GAP_BORDER: token = theme_parse_border(scanner, &data->gap); break; case TOKEN_GAP_START_FILE: token = theme_parse_file(settings, scanner, &data->gap_start); break; case TOKEN_GAP_START_BORDER: token = theme_parse_border(scanner, &data->gap_start); break; case TOKEN_GAP_END_FILE: token = theme_parse_file(settings, scanner, &data->gap_end); break; case TOKEN_GAP_END_BORDER: token = theme_parse_border(scanner, &data->gap_end); break; case TOKEN_OVERLAY_FILE: token = theme_parse_file(settings, scanner, &data->overlay); break; case TOKEN_OVERLAY_BORDER: token = theme_parse_border(scanner, &data->overlay); break; case TOKEN_OVERLAY_STRETCH: token = theme_parse_stretch(scanner, &data->overlay); break; case TOKEN_EXPANDER_STYLE: token = theme_parse_expander_style(scanner, data); break; case TOKEN_WINDOW_EDGE: token = theme_parse_window_edge(scanner, data); break; default: g_scanner_get_next_token(scanner); token = G_TOKEN_RIGHT_CURLY; break; } if (token != G_TOKEN_NONE) { /* error - cleanup for exit */ theme_image_unref (data); *data_return = NULL; return token; } token = g_scanner_peek_next_token(scanner); } token = g_scanner_get_next_token(scanner); if (data->background && !data->background->filename) { g_scanner_warn (scanner, "Background image options specified without filename"); theme_pixbuf_destroy (data->background); data->background = NULL; } if (data->overlay && !data->overlay->filename) { g_scanner_warn (scanner, "Overlay image options specified without filename"); theme_pixbuf_destroy (data->overlay); data->overlay = NULL; } if (token != G_TOKEN_RIGHT_CURLY) { /* error - cleanup for exit */ theme_image_unref (data); *data_return = NULL; return G_TOKEN_RIGHT_CURLY; } /* everything is fine now - insert yer cruft */ *data_return = data; return G_TOKEN_NONE;}static guintpixbuf_rc_style_parse (GtkRcStyle *rc_style, GtkSettings *settings, GScanner *scanner) { static GQuark scope_id = 0; PixbufRcStyle *pixbuf_style = PIXBUF_RC_STYLE (rc_style); guint old_scope; guint token; gint i; ThemeImage *img; /* Set up a new scope in this scanner. */ if (!scope_id) scope_id = g_quark_from_string("pixbuf_theme_engine"); /* 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, scope_id); /* Now check if we already added our symbols to this scope * (in some previous call to theme_parse_rc_style for the * same scanner. */ if (!g_scanner_lookup_symbol(scanner, theme_symbols[0].name)) { for (i = 0; i < G_N_ELEMENTS (theme_symbols); i++) g_scanner_scope_add_symbol(scanner, scope_id, theme_symbols[i].name, GINT_TO_POINTER(theme_symbols[i].token)); } /* We're ready to go, now parse the top level */ token = g_scanner_peek_next_token(scanner); while (token != G_TOKEN_RIGHT_CURLY) { switch (token) { case TOKEN_IMAGE: img = NULL; token = theme_parse_image(settings, scanner, pixbuf_style, &img); break; default: g_scanner_get_next_token(scanner); token = G_TOKEN_RIGHT_CURLY; break; } if (token != G_TOKEN_NONE) return token; else pixbuf_style->img_list = g_list_append(pixbuf_style->img_list, img); token = g_scanner_peek_next_token(scanner); } g_scanner_get_next_token(scanner); g_scanner_set_scope(scanner, old_scope); return G_TOKEN_NONE;}static voidpixbuf_rc_style_merge (GtkRcStyle *dest, GtkRcStyle *src){ if (PIXBUF_IS_RC_STYLE (src)) { PixbufRcStyle *pixbuf_dest = PIXBUF_RC_STYLE (dest); PixbufRcStyle *pixbuf_src = PIXBUF_RC_STYLE (src); GList *tmp_list1, *tmp_list2; if (pixbuf_src->img_list) { /* Copy src image list and append to dest image list */ tmp_list2 = g_list_last (pixbuf_dest->img_list); tmp_list1 = pixbuf_src->img_list; while (tmp_list1) { if (tmp_list2) { tmp_list2->next = g_list_alloc(); tmp_list2->next->data = tmp_list1->data; tmp_list2->next->prev = tmp_list2; tmp_list2 = tmp_list2->next; } else { pixbuf_dest->img_list = g_list_append (NULL, tmp_list1->data); tmp_list2 = pixbuf_dest->img_list; } theme_image_ref (tmp_list1->data); tmp_list1 = tmp_list1->next; } } } parent_class->merge (dest, src);}/* Create an empty style suitable to this RC style */static GtkStyle *pixbuf_rc_style_create_style (GtkRcStyle *rc_style){ return g_object_new (PIXBUF_TYPE_STYLE, NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -