X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Ffe-common%2Fcore%2Fthemes.c;h=437b118faeccf36a8a08eb1b6823c39164ecec22;hp=baa1d3e599d112d554dee9dfbf571801d6b8efb2;hb=382d15d447b7a95390decfa783836ae4fe255b3d;hpb=3cf38201f9ffaad2da53757ed48a5546e1d03636 diff --git a/apps/irssi/src/fe-common/core/themes.c b/apps/irssi/src/fe-common/core/themes.c index baa1d3e5..437b118f 100644 --- a/apps/irssi/src/fe-common/core/themes.c +++ b/apps/irssi/src/fe-common/core/themes.c @@ -301,12 +301,51 @@ static int data_is_empty(const char **data) return FALSE; } +/* return "data" from {abstract data} string */ +char *theme_format_expand_get(THEME_REC *theme, const char **format) +{ + GString *str; + char *ret, dummy; + int braces = 1; /* we start with one brace opened */ + + str = g_string_new(NULL); + while ((**format != '\0') && (braces)) { + if (**format == '{') + braces++; + else if (**format == '}') + braces--; + else if ((braces > 1) && (**format == ' ')) { + g_string_append(str, "\\x20"); + (*format)++; + continue; + } else { + theme_format_append_next(theme, str, format, + 'n', 'n', + &dummy, &dummy, 0); + continue; + } + + if (!braces) { + (*format)++; + break; + } + + g_string_append_c(str, **format); + (*format)++; + } + + ret = str->str; + g_string_free(str, FALSE); + return ret; +} + /* expand a single {abstract ...data... } */ static char *theme_format_expand_abstract(THEME_REC *theme, const char **formatp, char default_fg, char default_bg, int flags) { + GString *str; const char *p, *format; char *abstract, *data, *ret; int len; @@ -345,9 +384,8 @@ static char *theme_format_expand_abstract(THEME_REC *theme, abstract = g_strdup(data); /* we'll need to get the data part. it may contain - more abstracts, they are automatically expanded. */ - data = theme_format_expand_data(theme, formatp, default_fg, default_bg, - NULL, NULL, flags); + more abstracts, they are _NOT_ expanded. */ + data = theme_format_expand_get(theme, formatp); len = strlen(data); if (len > 1 && i_isdigit(data[len-1]) && data[len-2] == '$') { @@ -367,7 +405,21 @@ static char *theme_format_expand_abstract(THEME_REC *theme, PARSE_FLAG_ONLY_ARGS); g_free(abstract); g_free(data); - abstract = ret; + str = g_string_new(NULL); + p = ret; + while (*p != '\0') { + if (*p == '\\') { + int chr; + p++; + chr = expand_escape(&p); + g_string_append_c(str, chr != -1 ? chr : *p); + } else + g_string_append_c(str, *p); + p++; + } + g_free(ret); + abstract = str->str; + g_string_free(str, FALSE); /* abstract may itself contain abstracts or replaces */ p = abstract;