static void theme_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 guint theme_parse_image(GtkSettings *settings, GScanner *scanner, RsvgRcStyle *rsvg_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; 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; }