mirror of
https://github.com/irssi/irssi.git
synced 2024-10-27 05:20:20 -04:00
Beginnings of configurable statusbar. The existing items can be configured
in default.theme. If some abstract isn't set in theme, it fallbacks to the one in default.theme now. This should help with old themes, and maybe themes that don't change something should just keep those parts commented out.. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1386 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
2680011ad7
commit
87777968c3
@ -229,4 +229,26 @@ abstracts = {
|
|||||||
dccmsg = "[%G$1-%K(%g$0%K)%n] ";
|
dccmsg = "[%G$1-%K(%g$0%K)%n] ";
|
||||||
dccquerynick = "%G$0-%n";
|
dccquerynick = "%G$0-%n";
|
||||||
dccaction = "%W (*dcc*) $0-%n %|";
|
dccaction = "%W (*dcc*) $0-%n %|";
|
||||||
|
|
||||||
|
##
|
||||||
|
## statusbar
|
||||||
|
##
|
||||||
|
|
||||||
|
# background of statusbar
|
||||||
|
sb_background = "%4";
|
||||||
|
|
||||||
|
# default statusbar item style
|
||||||
|
sb = "%c[%n$0-%c]%n";
|
||||||
|
|
||||||
|
sbmode = "(%c+%n$0-)";
|
||||||
|
sbaway = " (%GzZzZ%n)";
|
||||||
|
sbservertag = ":$0 (change with ^X)";
|
||||||
|
sbmore = "%_-- more --%_";
|
||||||
|
sblag = "{sb Lag: $0-}";
|
||||||
|
sbmail = "{sb Mail: $0-}";
|
||||||
|
|
||||||
|
# activity. Det is used for hilights when display doesn't support colors
|
||||||
|
sbact = "{sb {sbact_act $0}{sbact_det $1}}";
|
||||||
|
sbact_act = "Act: $0-";
|
||||||
|
sbact_det = " Det: $0-";
|
||||||
};
|
};
|
||||||
|
@ -94,8 +94,6 @@ void theme_destroy(THEME_REC *rec)
|
|||||||
g_hash_table_foreach(rec->modules, (GHFunc) theme_module_destroy, NULL);
|
g_hash_table_foreach(rec->modules, (GHFunc) theme_module_destroy, NULL);
|
||||||
g_hash_table_destroy(rec->modules);
|
g_hash_table_destroy(rec->modules);
|
||||||
|
|
||||||
g_slist_foreach(rec->replace_keys, (GFunc) g_free, NULL);
|
|
||||||
g_slist_free(rec->replace_keys);
|
|
||||||
g_slist_foreach(rec->replace_values, (GFunc) g_free, NULL);
|
g_slist_foreach(rec->replace_values, (GFunc) g_free, NULL);
|
||||||
g_slist_free(rec->replace_values);
|
g_slist_free(rec->replace_values);
|
||||||
|
|
||||||
@ -104,30 +102,10 @@ void theme_destroy(THEME_REC *rec)
|
|||||||
g_free(rec);
|
g_free(rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EXPAND_FLAG_ROOT 0x01
|
|
||||||
#define EXPAND_FLAG_LASTCOLOR_ARG 0x02
|
|
||||||
static char *theme_format_expand_data(THEME_REC *theme,
|
|
||||||
const char **format,
|
|
||||||
char default_color,
|
|
||||||
char *save_color, int flags);
|
|
||||||
|
|
||||||
static int theme_replace_find(THEME_REC *theme, char chr)
|
|
||||||
{
|
|
||||||
GSList *tmp;
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
for (tmp = theme->replace_keys; tmp != NULL; tmp = tmp->next) {
|
|
||||||
if (strchr(tmp->data, chr) != NULL)
|
|
||||||
return index;
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *theme_replace_expand(THEME_REC *theme, int index,
|
static char *theme_replace_expand(THEME_REC *theme, int index,
|
||||||
char default_color, char *last_color,
|
char default_fg, char default_bg,
|
||||||
char chr)
|
char *last_fg, char *last_bg,
|
||||||
|
char chr, int flags)
|
||||||
{
|
{
|
||||||
GSList *rec;
|
GSList *rec;
|
||||||
char *ret, *abstract, data[2];
|
char *ret, *abstract, data[2];
|
||||||
@ -139,16 +117,20 @@ static char *theme_replace_expand(THEME_REC *theme, int index,
|
|||||||
|
|
||||||
abstract = rec->data;
|
abstract = rec->data;
|
||||||
abstract = theme_format_expand_data(theme, (const char **) &abstract,
|
abstract = theme_format_expand_data(theme, (const char **) &abstract,
|
||||||
default_color, last_color, 0);
|
default_fg, default_bg,
|
||||||
|
last_fg, last_bg, flags);
|
||||||
ret = parse_special_string(abstract, NULL, NULL, data, NULL, 0);
|
ret = parse_special_string(abstract, NULL, NULL, data, NULL, 0);
|
||||||
g_free(abstract);
|
g_free(abstract);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *colorformats = "n01234567krgybmpcwKRGYBMPCW";
|
static const char *fgcolorformats = "nkrgybmpcwKRGYBMPCW";
|
||||||
|
static const char *bgcolorformats = "n01234567";
|
||||||
|
|
||||||
#define IS_COLOR_FORMAT(c) \
|
#define IS_FGCOLOR_FORMAT(c) \
|
||||||
((c) != '\0' && strchr(colorformats, c) != NULL)
|
((c) != '\0' && strchr(fgcolorformats, c) != NULL)
|
||||||
|
#define IS_BGCOLOR_FORMAT(c) \
|
||||||
|
((c) != '\0' && strchr(bgcolorformats, c) != NULL)
|
||||||
|
|
||||||
/* append "variable" part in $variable, ie. not the contents of the variable */
|
/* append "variable" part in $variable, ie. not the contents of the variable */
|
||||||
static void theme_format_append_variable(GString *str, const char **format)
|
static void theme_format_append_variable(GString *str, const char **format)
|
||||||
@ -174,7 +156,9 @@ static void theme_format_append_variable(GString *str, const char **format)
|
|||||||
/* append next "item", either a character, $variable or %format */
|
/* append next "item", either a character, $variable or %format */
|
||||||
static void theme_format_append_next(THEME_REC *theme, GString *str,
|
static void theme_format_append_next(THEME_REC *theme, GString *str,
|
||||||
const char **format,
|
const char **format,
|
||||||
char default_color, char *last_color)
|
char default_fg, char default_bg,
|
||||||
|
char *last_fg, char *last_bg,
|
||||||
|
int flags)
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
char chr;
|
char chr;
|
||||||
@ -200,14 +184,32 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
|
|||||||
(*format)++;
|
(*format)++;
|
||||||
if (**format != '{' && **format != '}') {
|
if (**format != '{' && **format != '}') {
|
||||||
chr = **format;
|
chr = **format;
|
||||||
if (**format == 'n')
|
if (**format == 'n') {
|
||||||
chr = default_color;
|
/* %n = change to default color */
|
||||||
|
if (default_fg == 'n' || default_bg == 'n') {
|
||||||
|
if (*last_fg != 'n')
|
||||||
|
g_string_append(str, "%n");
|
||||||
|
*last_bg = *last_fg = 'n';
|
||||||
|
}
|
||||||
|
if (default_bg != *last_bg) {
|
||||||
|
g_string_append_c(str, '%');
|
||||||
|
g_string_append_c(str, default_bg);
|
||||||
|
}
|
||||||
|
if (default_fg != *last_fg) {
|
||||||
|
g_string_append_c(str, '%');
|
||||||
|
g_string_append_c(str, default_fg);
|
||||||
|
}
|
||||||
|
|
||||||
if (IS_COLOR_FORMAT(chr))
|
*last_fg = default_fg;
|
||||||
*last_color = chr;
|
*last_bg = default_bg;
|
||||||
|
} else {
|
||||||
g_string_append_c(str, '%');
|
if (IS_FGCOLOR_FORMAT(chr))
|
||||||
g_string_append_c(str, chr);
|
*last_fg = chr;
|
||||||
|
if (IS_BGCOLOR_FORMAT(chr))
|
||||||
|
*last_bg = chr;
|
||||||
|
g_string_append_c(str, '%');
|
||||||
|
g_string_append_c(str, chr);
|
||||||
|
}
|
||||||
(*format)++;
|
(*format)++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -216,14 +218,16 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
|
|||||||
chr = **format;
|
chr = **format;
|
||||||
}
|
}
|
||||||
|
|
||||||
index = theme_replace_find(theme, chr);
|
index = (flags & EXPAND_FLAG_IGNORE_REPLACES) ? -1 :
|
||||||
|
theme->replace_keys[(int) chr];
|
||||||
if (index == -1)
|
if (index == -1)
|
||||||
g_string_append_c(str, chr);
|
g_string_append_c(str, chr);
|
||||||
else {
|
else {
|
||||||
char *value;
|
char *value;
|
||||||
|
|
||||||
value = theme_replace_expand(theme, index, default_color,
|
value = theme_replace_expand(theme, index,
|
||||||
last_color, chr);
|
default_fg, default_bg,
|
||||||
|
last_fg, last_bg, chr, flags);
|
||||||
g_string_append(str, value);
|
g_string_append(str, value);
|
||||||
g_free(value);
|
g_free(value);
|
||||||
}
|
}
|
||||||
@ -234,7 +238,8 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
|
|||||||
/* expand a single {abstract ...data... } */
|
/* expand a single {abstract ...data... } */
|
||||||
static char *theme_format_expand_abstract(THEME_REC *theme,
|
static char *theme_format_expand_abstract(THEME_REC *theme,
|
||||||
const char **formatp,
|
const char **formatp,
|
||||||
char default_color)
|
char default_fg, char default_bg,
|
||||||
|
int flags)
|
||||||
{
|
{
|
||||||
const char *p, *format;
|
const char *p, *format;
|
||||||
char *abstract, *data, *ret;
|
char *abstract, *data, *ret;
|
||||||
@ -252,9 +257,23 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
|
|||||||
len = (int) (p-format);
|
len = (int) (p-format);
|
||||||
abstract = g_strndup(format, len);
|
abstract = g_strndup(format, len);
|
||||||
|
|
||||||
/* skip the following space */
|
/* skip the following space, if there's any more spaces they're
|
||||||
if (*p == ' ') len++;
|
treated as arguments */
|
||||||
*formatp = format + len;
|
if (*p == ' ') {
|
||||||
|
len++;
|
||||||
|
if ((flags & EXPAND_FLAG_IGNORE_EMPTY)) {
|
||||||
|
/* if the data is empty, ignore the abstract */
|
||||||
|
p = format+len;
|
||||||
|
while (*p == ' ') p++;
|
||||||
|
if (*p == '}') {
|
||||||
|
*formatp = p+1;
|
||||||
|
g_free(abstract);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*formatp = format+len;
|
||||||
|
|
||||||
/* get the abstract data */
|
/* get the abstract data */
|
||||||
data = g_hash_table_lookup(theme->abstracts, abstract);
|
data = g_hash_table_lookup(theme->abstracts, abstract);
|
||||||
@ -265,19 +284,12 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
|
|||||||
}
|
}
|
||||||
abstract = g_strdup(data);
|
abstract = g_strdup(data);
|
||||||
|
|
||||||
/* abstract may itself contain abstracts or replaces :) */
|
/* we'll need to get the data part. it may contain
|
||||||
p = data = abstract;
|
|
||||||
abstract = theme_format_expand_data(theme, &p, default_color,
|
|
||||||
&default_color,
|
|
||||||
EXPAND_FLAG_LASTCOLOR_ARG);
|
|
||||||
g_free(data);
|
|
||||||
|
|
||||||
/* now we'll need to get the data part. it may contain
|
|
||||||
more abstracts, they are automatically expanded. */
|
more abstracts, they are automatically expanded. */
|
||||||
data = theme_format_expand_data(theme, formatp, default_color,
|
data = theme_format_expand_data(theme, formatp, default_fg, default_bg,
|
||||||
NULL, 0);
|
NULL, NULL, flags);
|
||||||
|
|
||||||
len = strlen(data);
|
len = strlen(data);
|
||||||
|
|
||||||
if (len > 1 && isdigit(data[len-1]) && data[len-2] == '$') {
|
if (len > 1 && isdigit(data[len-1]) && data[len-2] == '$') {
|
||||||
/* ends with $<digit> .. this breaks things if next
|
/* ends with $<digit> .. this breaks things if next
|
||||||
character is digit or '-' */
|
character is digit or '-' */
|
||||||
@ -293,23 +305,34 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
|
|||||||
|
|
||||||
ret = parse_special_string(abstract, NULL, NULL, data, NULL, 0);
|
ret = parse_special_string(abstract, NULL, NULL, data, NULL, 0);
|
||||||
g_free(abstract);
|
g_free(abstract);
|
||||||
g_free(data);
|
g_free(data);
|
||||||
|
abstract = ret;
|
||||||
|
|
||||||
|
/* abstract may itself contain abstracts or replaces */
|
||||||
|
p = abstract;
|
||||||
|
ret = theme_format_expand_data(theme, &p, default_fg, default_bg,
|
||||||
|
&default_fg, &default_bg,
|
||||||
|
flags | EXPAND_FLAG_LASTCOLOR_ARG);
|
||||||
|
g_free(abstract);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* expand the data part in {abstract data} */
|
/* expand the data part in {abstract data} */
|
||||||
static char *theme_format_expand_data(THEME_REC *theme,
|
char *theme_format_expand_data(THEME_REC *theme, const char **format,
|
||||||
const char **format,
|
char default_fg, char default_bg,
|
||||||
char default_color,
|
char *save_last_fg, char *save_last_bg,
|
||||||
char *save_last_color,
|
int flags)
|
||||||
int flags)
|
|
||||||
{
|
{
|
||||||
GString *str;
|
GString *str;
|
||||||
char *ret, *abstract;
|
char *ret, *abstract;
|
||||||
char last_color = default_color;
|
char last_fg, last_bg;
|
||||||
|
int recurse_flags;
|
||||||
|
|
||||||
|
last_fg = default_fg;
|
||||||
|
last_bg = default_bg;
|
||||||
|
recurse_flags = flags & EXPAND_FLAG_RECURSIVE_MASK;
|
||||||
|
|
||||||
str = g_string_new(NULL);
|
str = g_string_new(NULL);
|
||||||
|
|
||||||
while (**format != '\0') {
|
while (**format != '\0') {
|
||||||
if ((flags & EXPAND_FLAG_ROOT) == 0 && **format == '}') {
|
if ((flags & EXPAND_FLAG_ROOT) == 0 && **format == '}') {
|
||||||
/* ignore } if we're expanding original string */
|
/* ignore } if we're expanding original string */
|
||||||
@ -318,17 +341,24 @@ static char *theme_format_expand_data(THEME_REC *theme,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (**format != '{') {
|
if (**format != '{') {
|
||||||
if (save_last_color != NULL &&
|
if ((flags & EXPAND_FLAG_LASTCOLOR_ARG) &&
|
||||||
(flags & EXPAND_FLAG_LASTCOLOR_ARG) &&
|
|
||||||
**format == '$' && (*format)[1] == '0') {
|
**format == '$' && (*format)[1] == '0') {
|
||||||
/* save the color before $0 ..
|
/* save the color before $0 ..
|
||||||
this is for the %n replacing */
|
this is for the %n replacing */
|
||||||
*save_last_color = last_color;
|
if (save_last_fg != NULL) {
|
||||||
save_last_color = NULL;
|
*save_last_fg = last_fg;
|
||||||
|
save_last_fg = NULL;
|
||||||
|
}
|
||||||
|
if (save_last_bg != NULL) {
|
||||||
|
*save_last_bg = last_bg;
|
||||||
|
save_last_bg = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
theme_format_append_next(theme, str, format,
|
theme_format_append_next(theme, str, format,
|
||||||
default_color, &last_color);
|
default_fg, default_bg,
|
||||||
|
&last_fg, &last_bg,
|
||||||
|
recurse_flags);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,17 +368,20 @@ static char *theme_format_expand_data(THEME_REC *theme,
|
|||||||
|
|
||||||
/* get a single {...} */
|
/* get a single {...} */
|
||||||
abstract = theme_format_expand_abstract(theme, format,
|
abstract = theme_format_expand_abstract(theme, format,
|
||||||
last_color);
|
last_fg, last_bg,
|
||||||
|
recurse_flags);
|
||||||
if (abstract != NULL) {
|
if (abstract != NULL) {
|
||||||
g_string_append(str, abstract);
|
g_string_append(str, abstract);
|
||||||
g_free(abstract);
|
g_free(abstract);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (save_last_color != NULL &&
|
if ((flags & EXPAND_FLAG_LASTCOLOR_ARG) == 0) {
|
||||||
(flags & EXPAND_FLAG_LASTCOLOR_ARG) == 0) {
|
|
||||||
/* save the last color */
|
/* save the last color */
|
||||||
*save_last_color = last_color;
|
if (save_last_fg != NULL)
|
||||||
|
*save_last_fg = last_fg;
|
||||||
|
if (save_last_bg != NULL)
|
||||||
|
*save_last_bg = last_bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = str->str;
|
ret = str->str;
|
||||||
@ -356,18 +389,23 @@ static char *theme_format_expand_data(THEME_REC *theme,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define IS_OLD_FORMAT(code, last_fg, last_bg) \
|
||||||
|
(((code) == 'n' && (last_fg) == 'n' && (last_bg) == 'n') || \
|
||||||
|
((code) != 'n' && ((code) == (last_fg) || (code) == (last_bg))))
|
||||||
|
|
||||||
static char *theme_format_compress_colors(THEME_REC *theme, const char *format)
|
static char *theme_format_compress_colors(THEME_REC *theme, const char *format)
|
||||||
{
|
{
|
||||||
GString *str;
|
GString *str;
|
||||||
char *ret, last_color = 'n';
|
char *ret, last_fg, last_bg;
|
||||||
|
|
||||||
str = g_string_new(NULL);
|
str = g_string_new(NULL);
|
||||||
|
|
||||||
|
last_fg = last_bg = 'n';
|
||||||
while (*format != '\0') {
|
while (*format != '\0') {
|
||||||
if (*format == '$') {
|
if (*format == '$') {
|
||||||
/* $variable, skrip it entirely */
|
/* $variable, skrip it entirely */
|
||||||
theme_format_append_variable(str, &format);
|
theme_format_append_variable(str, &format);
|
||||||
last_color = '\0';
|
last_fg = last_bg = '\0';
|
||||||
} else if (*format != '%') {
|
} else if (*format != '%') {
|
||||||
/* a normal character */
|
/* a normal character */
|
||||||
g_string_append_c(str, *format);
|
g_string_append_c(str, *format);
|
||||||
@ -375,19 +413,24 @@ static char *theme_format_compress_colors(THEME_REC *theme, const char *format)
|
|||||||
} else {
|
} else {
|
||||||
/* %format */
|
/* %format */
|
||||||
format++;
|
format++;
|
||||||
if (*format == last_color) {
|
if (IS_OLD_FORMAT(*format, last_fg, last_bg)) {
|
||||||
/* active color set again */
|
/* active color set again */
|
||||||
} else if (IS_COLOR_FORMAT(*format) &&
|
} else if (IS_FGCOLOR_FORMAT(*format) &&
|
||||||
|
(*format != 'n' || format[2] == 'n') &&
|
||||||
format[1] == '%' &&
|
format[1] == '%' &&
|
||||||
IS_COLOR_FORMAT(format[2])) {
|
IS_FGCOLOR_FORMAT(format[2])) {
|
||||||
/* two colors in a row */
|
/* two fg colors in a row. bg colors are
|
||||||
|
so rare that we don't bother checking
|
||||||
|
them */
|
||||||
} else {
|
} else {
|
||||||
/* some format, add it */
|
/* some format, add it */
|
||||||
g_string_append_c(str, '%');
|
g_string_append_c(str, '%');
|
||||||
g_string_append_c(str, *format);
|
g_string_append_c(str, *format);
|
||||||
|
|
||||||
if (IS_COLOR_FORMAT(*format))
|
if (IS_FGCOLOR_FORMAT(*format))
|
||||||
last_color = *format;
|
last_fg = *format;
|
||||||
|
if (IS_BGCOLOR_FORMAT(*format))
|
||||||
|
last_bg = *format;
|
||||||
}
|
}
|
||||||
format++;
|
format++;
|
||||||
}
|
}
|
||||||
@ -398,16 +441,16 @@ static char *theme_format_compress_colors(THEME_REC *theme, const char *format)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *theme_format_expand(THEME_REC *theme, const char *format)
|
char *theme_format_expand(THEME_REC *theme, const char *format)
|
||||||
{
|
{
|
||||||
char *data, *ret;
|
char *data, *ret;
|
||||||
|
|
||||||
g_return_val_if_fail(theme != NULL, NULL);
|
g_return_val_if_fail(theme != NULL, NULL);
|
||||||
g_return_val_if_fail(format != NULL, NULL);
|
g_return_val_if_fail(format != NULL, NULL);
|
||||||
|
|
||||||
data = theme_format_expand_data(theme, &format, 'n', NULL,
|
data = theme_format_expand_data(theme, &format, 'n', 'n', NULL, NULL,
|
||||||
EXPAND_FLAG_ROOT);
|
EXPAND_FLAG_ROOT);
|
||||||
ret = theme_format_compress_colors(theme, data);
|
ret = theme_format_compress_colors(theme, data);
|
||||||
g_free(data);
|
g_free(data);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -438,20 +481,28 @@ static void theme_read_replaces(CONFIG_REC *config, THEME_REC *theme)
|
|||||||
{
|
{
|
||||||
GSList *tmp;
|
GSList *tmp;
|
||||||
CONFIG_NODE *node;
|
CONFIG_NODE *node;
|
||||||
|
const char *p;
|
||||||
|
int index;
|
||||||
|
|
||||||
node = config_node_traverse(config, "replaces", FALSE);
|
node = config_node_traverse(config, "replaces", FALSE);
|
||||||
if (node == NULL || node->type != NODE_TYPE_BLOCK) return;
|
if (node == NULL || node->type != NODE_TYPE_BLOCK) return;
|
||||||
|
|
||||||
|
/* reset replace keys */
|
||||||
|
for (index = 0; index < 256; index++)
|
||||||
|
theme->replace_keys[index] = -1;
|
||||||
|
index = 0;
|
||||||
|
|
||||||
for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
|
for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
|
||||||
node = tmp->data;
|
node = tmp->data;
|
||||||
|
|
||||||
if (node->key != NULL && node->value != NULL) {
|
if (node->key != NULL && node->value != NULL) {
|
||||||
theme->replace_keys =
|
for (p = node->key; *p != '\0'; p++)
|
||||||
g_slist_append(theme->replace_keys,
|
theme->replace_keys[(int) *p] = index;
|
||||||
g_strdup(node->key));
|
|
||||||
theme->replace_values =
|
theme->replace_values =
|
||||||
g_slist_append(theme->replace_values,
|
g_slist_append(theme->replace_values,
|
||||||
g_strdup(node->value));
|
g_strdup(node->value));
|
||||||
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -460,6 +511,7 @@ static void theme_read_abstracts(CONFIG_REC *config, THEME_REC *theme)
|
|||||||
{
|
{
|
||||||
GSList *tmp;
|
GSList *tmp;
|
||||||
CONFIG_NODE *node;
|
CONFIG_NODE *node;
|
||||||
|
gpointer oldkey, oldvalue;
|
||||||
|
|
||||||
node = config_node_traverse(config, "abstracts", FALSE);
|
node = config_node_traverse(config, "abstracts", FALSE);
|
||||||
if (node == NULL || node->type != NODE_TYPE_BLOCK) return;
|
if (node == NULL || node->type != NODE_TYPE_BLOCK) return;
|
||||||
@ -467,12 +519,19 @@ static void theme_read_abstracts(CONFIG_REC *config, THEME_REC *theme)
|
|||||||
for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
|
for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
|
||||||
node = tmp->data;
|
node = tmp->data;
|
||||||
|
|
||||||
if (node->key != NULL && node->value != NULL &&
|
if (node->key == NULL || node->value == NULL)
|
||||||
g_hash_table_lookup(theme->abstracts, node->key) == NULL) {
|
continue;
|
||||||
g_hash_table_insert(theme->abstracts,
|
|
||||||
g_strdup(node->key),
|
if (g_hash_table_lookup_extended(theme->abstracts, node->key,
|
||||||
g_strdup(node->value));
|
&oldkey, &oldvalue)) {
|
||||||
|
/* new values override old ones */
|
||||||
|
g_hash_table_remove(theme->abstracts, oldkey);
|
||||||
|
g_free(oldkey);
|
||||||
|
g_free(oldvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_hash_table_insert(theme->abstracts, g_strdup(node->key),
|
||||||
|
g_strdup(node->value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,7 +801,17 @@ static int theme_read(THEME_REC *theme, const char *path, const char *data)
|
|||||||
config_get_int(config, NULL, "default_color", 0);
|
config_get_int(config, NULL, "default_color", 0);
|
||||||
theme->default_real_color =
|
theme->default_real_color =
|
||||||
config_get_int(config, NULL, "default_real_color", 7);
|
config_get_int(config, NULL, "default_real_color", 7);
|
||||||
theme_read_replaces(config, theme);
|
theme_read_replaces(config, theme);
|
||||||
|
|
||||||
|
if (data == NULL) {
|
||||||
|
/* get the default abstracts from default theme. */
|
||||||
|
CONFIG_REC *default_config;
|
||||||
|
|
||||||
|
default_config = config_open(NULL, -1);
|
||||||
|
config_parse_data(default_config, default_theme, "internal");
|
||||||
|
theme_read_abstracts(default_config, theme);
|
||||||
|
config_close(default_config);
|
||||||
|
}
|
||||||
theme_read_abstracts(config, theme);
|
theme_read_abstracts(config, theme);
|
||||||
|
|
||||||
rec.theme = theme;
|
rec.theme = theme;
|
||||||
|
@ -23,7 +23,7 @@ typedef struct {
|
|||||||
wanted. default is 7 (white). */
|
wanted. default is 7 (white). */
|
||||||
GHashTable *modules;
|
GHashTable *modules;
|
||||||
|
|
||||||
GSList *replace_keys;
|
int replace_keys[256]; /* index to replace_values for each char */
|
||||||
GSList *replace_values;
|
GSList *replace_values;
|
||||||
GHashTable *abstracts;
|
GHashTable *abstracts;
|
||||||
|
|
||||||
@ -46,6 +46,19 @@ THEME_REC *theme_load(const char *name);
|
|||||||
void theme_register_module(const char *module, FORMAT_REC *formats);
|
void theme_register_module(const char *module, FORMAT_REC *formats);
|
||||||
void theme_unregister_module(const char *module);
|
void theme_unregister_module(const char *module);
|
||||||
|
|
||||||
|
#define EXPAND_FLAG_IGNORE_REPLACES 0x01 /* don't use the character replaces when expanding */
|
||||||
|
#define EXPAND_FLAG_IGNORE_EMPTY 0x02 /* if abstract's argument is empty, don't try to expand it (ie. {xx }, but not {xx}) */
|
||||||
|
#define EXPAND_FLAG_RECURSIVE_MASK 0x0f
|
||||||
|
/* private */
|
||||||
|
#define EXPAND_FLAG_ROOT 0x10
|
||||||
|
#define EXPAND_FLAG_LASTCOLOR_ARG 0x20
|
||||||
|
|
||||||
|
char *theme_format_expand(THEME_REC *theme, const char *format);
|
||||||
|
char *theme_format_expand_data(THEME_REC *theme, const char **format,
|
||||||
|
char default_fg, char default_bg,
|
||||||
|
char *save_last_fg, char *save_last_bg,
|
||||||
|
int flags);
|
||||||
|
|
||||||
void themes_init(void);
|
void themes_init(void);
|
||||||
void themes_deinit(void);
|
void themes_deinit(void);
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ typedef struct {
|
|||||||
int first_line, last_line, lines;
|
int first_line, last_line, lines;
|
||||||
int statusbar_lines;
|
int statusbar_lines;
|
||||||
void *statusbar;
|
void *statusbar;
|
||||||
void *statusbar_channel_item;
|
void *statusbar_window_item;
|
||||||
} MAIN_WINDOW_REC;
|
} MAIN_WINDOW_REC;
|
||||||
|
|
||||||
extern GSList *mainwindows;
|
extern GSList *mainwindows;
|
||||||
|
@ -116,7 +116,11 @@ static void read_settings(void)
|
|||||||
|
|
||||||
use_colors = settings_get_bool("colors");
|
use_colors = settings_get_bool("colors");
|
||||||
read_signals();
|
read_signals();
|
||||||
if (use_colors != old_colors) irssi_redraw();
|
if (use_colors && !has_colors())
|
||||||
|
use_colors = FALSE;
|
||||||
|
|
||||||
|
if (use_colors != old_colors)
|
||||||
|
irssi_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_curses(void)
|
static int init_curses(void)
|
||||||
@ -151,8 +155,8 @@ static int init_curses(void)
|
|||||||
|
|
||||||
if (has_colors())
|
if (has_colors())
|
||||||
start_color();
|
start_color();
|
||||||
else
|
else if (use_colors)
|
||||||
use_colors = FALSE;
|
use_colors = FALSE;
|
||||||
|
|
||||||
#ifdef HAVE_NCURSES_USE_DEFAULT_COLORS
|
#ifdef HAVE_NCURSES_USE_DEFAULT_COLORS
|
||||||
/* this lets us to use the "default" background color for colors <= 7 so
|
/* this lets us to use the "default" background color for colors <= 7 so
|
||||||
|
@ -20,25 +20,14 @@
|
|||||||
|
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "signals.h"
|
#include "signals.h"
|
||||||
#include "servers.h"
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "special-vars.h"
|
#include "special-vars.h"
|
||||||
|
|
||||||
#include "irc.h"
|
|
||||||
#include "channels.h"
|
|
||||||
#include "queries.h"
|
|
||||||
#include "irc-servers.h"
|
|
||||||
#include "nicklist.h"
|
|
||||||
|
|
||||||
#include "fe-windows.h"
|
|
||||||
#include "window-items.h"
|
#include "window-items.h"
|
||||||
#include "printtext.h"
|
|
||||||
#include "formats.h"
|
#include "formats.h"
|
||||||
|
|
||||||
#include "screen.h"
|
|
||||||
#include "statusbar.h"
|
#include "statusbar.h"
|
||||||
#include "gui-windows.h"
|
|
||||||
#include "gui-printtext.h"
|
#include "gui-printtext.h"
|
||||||
|
|
||||||
/* how often to redraw lagging time (seconds) */
|
/* how often to redraw lagging time (seconds) */
|
||||||
@ -51,9 +40,6 @@
|
|||||||
the lag */
|
the lag */
|
||||||
#define MAX_LAG_UNKNOWN_TIME 30
|
#define MAX_LAG_UNKNOWN_TIME 30
|
||||||
|
|
||||||
static int sbar_color_dim, sbar_color_normal, sbar_color_bold;
|
|
||||||
static int sbar_color_background, sbar_color_away, sbar_color_act_highlight;
|
|
||||||
|
|
||||||
static STATUSBAR_REC *mainbar;
|
static STATUSBAR_REC *mainbar;
|
||||||
static MAIN_WINDOW_REC *mainbar_window;
|
static MAIN_WINDOW_REC *mainbar_window;
|
||||||
static int use_colors;
|
static int use_colors;
|
||||||
@ -67,7 +53,7 @@ static time_t clock_last;
|
|||||||
static SBAR_ITEM_REC *nick_item;
|
static SBAR_ITEM_REC *nick_item;
|
||||||
|
|
||||||
/* channel */
|
/* channel */
|
||||||
static SBAR_ITEM_REC *channel_item;
|
static SBAR_ITEM_REC *window_item;
|
||||||
|
|
||||||
/* activity */
|
/* activity */
|
||||||
static SBAR_ITEM_REC *activity_item;
|
static SBAR_ITEM_REC *activity_item;
|
||||||
@ -92,11 +78,11 @@ static SBAR_ITEM_REC *topic_item;
|
|||||||
static STATUSBAR_REC *topic_bar;
|
static STATUSBAR_REC *topic_bar;
|
||||||
|
|
||||||
static void item_default(SBAR_ITEM_REC *item, int get_size_only,
|
static void item_default(SBAR_ITEM_REC *item, int get_size_only,
|
||||||
const char *str)
|
const char *str, const char *data)
|
||||||
{
|
{
|
||||||
SERVER_REC *server;
|
SERVER_REC *server;
|
||||||
WI_ITEM_REC *wiitem;
|
WI_ITEM_REC *wiitem;
|
||||||
char *stripped, *parsed, *printstr;
|
char *tmpstr, *tmpstr2;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (active_win == NULL) {
|
if (active_win == NULL) {
|
||||||
@ -107,31 +93,44 @@ static void item_default(SBAR_ITEM_REC *item, int get_size_only,
|
|||||||
wiitem = active_win->active;
|
wiitem = active_win->active;
|
||||||
}
|
}
|
||||||
|
|
||||||
parsed = parse_special_string(str, server, wiitem, "", NULL,
|
/* expand $variables */
|
||||||
|
tmpstr = parse_special_string(str, server, wiitem, data, NULL,
|
||||||
PARSE_FLAG_ESCAPE_VARS);
|
PARSE_FLAG_ESCAPE_VARS);
|
||||||
stripped = strip_codes(parsed);
|
|
||||||
g_free(parsed); parsed = stripped;
|
/* expand templates */
|
||||||
|
str = tmpstr;
|
||||||
|
tmpstr2 = theme_format_expand_data(current_theme, &str,
|
||||||
|
'n', '0' + item->bar->color,
|
||||||
|
NULL, NULL,
|
||||||
|
EXPAND_FLAG_ROOT |
|
||||||
|
EXPAND_FLAG_IGNORE_REPLACES |
|
||||||
|
EXPAND_FLAG_IGNORE_EMPTY);
|
||||||
|
g_free(tmpstr);
|
||||||
|
|
||||||
|
/* remove color codes */
|
||||||
|
tmpstr = strip_codes(tmpstr2);
|
||||||
|
g_free(tmpstr2);
|
||||||
|
|
||||||
if (get_size_only) {
|
if (get_size_only) {
|
||||||
item->min_size = item->max_size = format_get_length(parsed);
|
item->min_size = item->max_size = format_get_length(tmpstr);
|
||||||
} else {
|
} else {
|
||||||
if (item->size < item->min_size) {
|
if (item->size < item->min_size) {
|
||||||
/* they're forcing us smaller than minimum size.. */
|
/* they're forcing us smaller than minimum size.. */
|
||||||
len = format_real_length(parsed, item->size);
|
len = format_real_length(tmpstr, item->size);
|
||||||
parsed[len] = '\0';
|
tmpstr[len] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
printstr = g_strconcat("%n%4", parsed, NULL);
|
tmpstr2 = g_strconcat(item->bar->color_string, tmpstr, NULL);
|
||||||
gui_printtext(item->xpos, item->bar->ypos, printstr);
|
gui_printtext(item->xpos, item->bar->ypos, tmpstr2);
|
||||||
g_free(printstr);
|
g_free(tmpstr2);
|
||||||
}
|
}
|
||||||
g_free(parsed);
|
g_free(tmpstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* redraw clock */
|
/* redraw clock */
|
||||||
static void statusbar_clock(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_clock(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
item_default(item, get_size_only, "%c[%w$Z%c]");
|
item_default(item, get_size_only, "{sb $Z}", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if we need to redraw clock.. */
|
/* check if we need to redraw clock.. */
|
||||||
@ -158,20 +157,8 @@ static int statusbar_clock_timeout(void)
|
|||||||
/* redraw nick */
|
/* redraw nick */
|
||||||
static void statusbar_nick(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_nick(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
IRC_SERVER_REC *server;
|
item_default(item, get_size_only,
|
||||||
char *str, *usermode, *away;
|
"{sb $P$N{sbmode $usermode}{sbaway $A}}", "");
|
||||||
|
|
||||||
server = IRC_SERVER(active_win->active_server);
|
|
||||||
usermode = server == NULL || server->usermode == NULL ||
|
|
||||||
*server->usermode == '\0' ? "" :
|
|
||||||
g_strdup_printf("(%%c+%%w%s)", server->usermode);
|
|
||||||
away = server == NULL || !server->usermode_away ? "" :
|
|
||||||
"(%GzZzZ%w)";
|
|
||||||
|
|
||||||
str = g_strconcat("%c[%w$P$N", usermode, away, "%c]", NULL);
|
|
||||||
item_default(item, get_size_only, str);
|
|
||||||
g_free(str);
|
|
||||||
if (*usermode != '\0') g_free(usermode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_nick_redraw(void)
|
static void sig_statusbar_nick_redraw(void)
|
||||||
@ -179,52 +166,36 @@ static void sig_statusbar_nick_redraw(void)
|
|||||||
statusbar_item_redraw(nick_item);
|
statusbar_item_redraw(nick_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* redraw channel */
|
/* redraw window */
|
||||||
static void statusbar_channel(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_window(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
SERVER_REC *server;
|
|
||||||
CHANNEL_REC *channel;
|
|
||||||
char *str, *tmp;
|
|
||||||
|
|
||||||
if (active_win->active != NULL) {
|
if (active_win->active != NULL) {
|
||||||
/* channel/query */
|
item_default(item, get_size_only,
|
||||||
channel = CHANNEL(active_win->active);
|
"{sb $winref:$T{sbmode $M}}", "");
|
||||||
tmp = channel == NULL || channel->mode == NULL ||
|
|
||||||
*channel->mode == '\0' ? "" :
|
|
||||||
g_strdup_printf("(%%c+%%w%s)", channel->mode);
|
|
||||||
str = g_strconcat("%c[%w$winref:$[.15]T", tmp, "%c]", NULL);
|
|
||||||
} else {
|
} else {
|
||||||
/* empty window */
|
item_default(item, get_size_only,
|
||||||
server = active_win->active_server;
|
"{sb $winref{sbservertag $tag}}", "");
|
||||||
tmp = server == NULL ? "" :
|
|
||||||
g_strdup_printf(":%s (change with ^X)", server->tag);
|
|
||||||
str = g_strconcat("%c[%w$winref", tmp, "%c]", NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
item_default(item, get_size_only, str);
|
|
||||||
|
|
||||||
g_free(str);
|
|
||||||
if (*tmp != '\0') g_free(tmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_channel_redraw(void)
|
static void sig_statusbar_window_redraw(void)
|
||||||
{
|
{
|
||||||
statusbar_item_redraw(channel_item);
|
statusbar_item_redraw(window_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_channel_redraw_window(WINDOW_REC *window)
|
static void sig_statusbar_window_redraw_window(WINDOW_REC *window)
|
||||||
{
|
{
|
||||||
if (is_window_visible(window))
|
if (is_window_visible(window))
|
||||||
statusbar_item_redraw(channel_item);
|
statusbar_item_redraw(window_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_channel_redraw_window_item(WI_ITEM_REC *item)
|
static void sig_statusbar_window_redraw_window_item(WI_ITEM_REC *item)
|
||||||
{
|
{
|
||||||
WINDOW_REC *window;
|
WINDOW_REC *window;
|
||||||
|
|
||||||
window = window_item_window(item);
|
window = window_item_window(item);
|
||||||
if (window->active == item && is_window_visible(window))
|
if (window->active == item && is_window_visible(window))
|
||||||
statusbar_item_redraw(channel_item);
|
statusbar_item_redraw(window_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_activity_list(int normal, int hilight)
|
static char *get_activity_list(int normal, int hilight)
|
||||||
@ -281,8 +252,7 @@ static char *get_activity_list(int normal, int hilight)
|
|||||||
act list so that the highest priority items comes first. */
|
act list so that the highest priority items comes first. */
|
||||||
static void statusbar_activity(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_activity(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
GString *str;
|
char *actlist, *detlist, *data;
|
||||||
char *actlist, *detlist;
|
|
||||||
|
|
||||||
if (use_colors) {
|
if (use_colors) {
|
||||||
actlist = get_activity_list(TRUE, TRUE);
|
actlist = get_activity_list(TRUE, TRUE);
|
||||||
@ -298,24 +268,13 @@ static void statusbar_activity(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
str = g_string_new("%c[%w");
|
data = g_strconcat("{sbact ", actlist != NULL ? actlist : "",
|
||||||
|
" ", detlist != NULL ? detlist : "", "}", NULL);
|
||||||
|
item_default(item, get_size_only, data, "");
|
||||||
|
g_free(data);
|
||||||
|
|
||||||
if (actlist != NULL) {
|
g_free_not_null(actlist);
|
||||||
g_string_append(str, "Act: ");
|
g_free_not_null(detlist);
|
||||||
g_string_append(str, actlist);
|
|
||||||
g_free(actlist);
|
|
||||||
}
|
|
||||||
if (detlist != NULL) {
|
|
||||||
if (actlist != NULL)
|
|
||||||
g_string_append(str, " ");
|
|
||||||
g_string_append(str, "Det: ");
|
|
||||||
g_string_append(str, detlist);
|
|
||||||
g_free(detlist);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_string_append(str, "%c]");
|
|
||||||
item_default(item, get_size_only, str->str);
|
|
||||||
g_string_free(str, TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_activity_hilight(WINDOW_REC *window, gpointer oldlevel)
|
static void sig_statusbar_activity_hilight(WINDOW_REC *window, gpointer oldlevel)
|
||||||
@ -387,7 +346,7 @@ static void sig_statusbar_activity_updated(void)
|
|||||||
/* redraw -- more -- */
|
/* redraw -- more -- */
|
||||||
static void statusbar_more(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_more(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
item_default(item, get_size_only, "%_-- more --%_");
|
item_default(item, get_size_only, "{sbmore}", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_more_check_remove(WINDOW_REC *window)
|
static void sig_statusbar_more_check_remove(WINDOW_REC *window)
|
||||||
@ -435,7 +394,7 @@ static void statusbar_lag(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
}
|
}
|
||||||
|
|
||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
str = g_string_new("%c[%wLag: %_");
|
str = g_string_new(NULL);
|
||||||
|
|
||||||
/* FIXME: ugly ugly.. */
|
/* FIXME: ugly ugly.. */
|
||||||
if (server->lag_sent == 0 || now-server->lag_sent < 5) {
|
if (server->lag_sent == 0 || now-server->lag_sent < 5) {
|
||||||
@ -443,8 +402,7 @@ static void statusbar_lag(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
MAX_LAG_UNKNOWN_TIME+settings_get_int("lag_check_time");
|
MAX_LAG_UNKNOWN_TIME+settings_get_int("lag_check_time");
|
||||||
|
|
||||||
if (lag_min_show < 0 || (server->lag < lag_min_show && !lag_unknown)) {
|
if (lag_min_show < 0 || (server->lag < lag_min_show && !lag_unknown)) {
|
||||||
/* small, lag, don't display */
|
/* small lag, don't display */
|
||||||
g_string_truncate(str, 0);
|
|
||||||
} else {
|
} else {
|
||||||
g_string_sprintfa(str, "%d.%02d", server->lag/1000,
|
g_string_sprintfa(str, "%d.%02d", server->lag/1000,
|
||||||
(server->lag % 1000)/10);
|
(server->lag % 1000)/10);
|
||||||
@ -457,10 +415,7 @@ static void statusbar_lag(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
(long) (now-server->lag_sent));
|
(long) (now-server->lag_sent));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str->len > 0)
|
item_default(item, get_size_only, "{sblag $0-}", str->str);
|
||||||
g_string_append(str, "%c]");
|
|
||||||
|
|
||||||
item_default(item, get_size_only, str->str);
|
|
||||||
|
|
||||||
g_string_free(str, TRUE);
|
g_string_free(str, TRUE);
|
||||||
}
|
}
|
||||||
@ -531,7 +486,7 @@ static int get_mail_count(void)
|
|||||||
|
|
||||||
static void statusbar_mail(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_mail(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
char countstr[MAX_INT_STRLEN], *str;
|
char countstr[MAX_INT_STRLEN];
|
||||||
int mail_count;
|
int mail_count;
|
||||||
|
|
||||||
mail_count = settings_get_bool("mail_counter") ? get_mail_count() : 0;
|
mail_count = settings_get_bool("mail_counter") ? get_mail_count() : 0;
|
||||||
@ -543,10 +498,7 @@ static void statusbar_mail(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ltoa(countstr, mail_count);
|
ltoa(countstr, mail_count);
|
||||||
str = g_strconcat("%c[%wMail: %_", countstr, "%_%c]", NULL);
|
item_default(item, get_size_only, "{sbmail $0-}", countstr);
|
||||||
|
|
||||||
item_default(item, get_size_only, str);
|
|
||||||
g_free(str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int statusbar_mail_timeout(void)
|
static int statusbar_mail_timeout(void)
|
||||||
@ -557,7 +509,7 @@ static int statusbar_mail_timeout(void)
|
|||||||
|
|
||||||
static void statusbar_topic(SBAR_ITEM_REC *item, int get_size_only)
|
static void statusbar_topic(SBAR_ITEM_REC *item, int get_size_only)
|
||||||
{
|
{
|
||||||
item_default(item, get_size_only, "$topic");
|
item_default(item, get_size_only, "$topic", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_statusbar_topic_redraw(void)
|
static void sig_statusbar_topic_redraw(void)
|
||||||
@ -572,8 +524,8 @@ static void sig_sidebars_redraw(void)
|
|||||||
for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) {
|
for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) {
|
||||||
MAIN_WINDOW_REC *rec = tmp->data;
|
MAIN_WINDOW_REC *rec = tmp->data;
|
||||||
|
|
||||||
if (rec->statusbar_channel_item != NULL)
|
if (rec->statusbar_window_item != NULL)
|
||||||
statusbar_item_redraw(rec->statusbar_channel_item);
|
statusbar_item_redraw(rec->statusbar_window_item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -612,7 +564,7 @@ static void mainbar_remove_items(void)
|
|||||||
{
|
{
|
||||||
statusbar_item_remove(clock_item);
|
statusbar_item_remove(clock_item);
|
||||||
statusbar_item_remove(nick_item);
|
statusbar_item_remove(nick_item);
|
||||||
statusbar_item_remove(channel_item);
|
statusbar_item_remove(window_item);
|
||||||
statusbar_item_remove(mail_item);
|
statusbar_item_remove(mail_item);
|
||||||
statusbar_item_remove(lag_item);
|
statusbar_item_remove(lag_item);
|
||||||
statusbar_item_remove(activity_item);
|
statusbar_item_remove(activity_item);
|
||||||
@ -625,7 +577,7 @@ static void mainbar_add_items(MAIN_WINDOW_REC *window)
|
|||||||
|
|
||||||
clock_item = statusbar_item_create(mainbar, SBAR_PRIORITY_HIGH, FALSE, statusbar_clock);
|
clock_item = statusbar_item_create(mainbar, SBAR_PRIORITY_HIGH, FALSE, statusbar_clock);
|
||||||
nick_item = statusbar_item_create(mainbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_nick);
|
nick_item = statusbar_item_create(mainbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_nick);
|
||||||
channel_item = statusbar_item_create(mainbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_channel);
|
window_item = statusbar_item_create(mainbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_window);
|
||||||
mail_item = statusbar_item_create(mainbar, SBAR_PRIORITY_LOW, FALSE, statusbar_mail);
|
mail_item = statusbar_item_create(mainbar, SBAR_PRIORITY_LOW, FALSE, statusbar_mail);
|
||||||
lag_item = statusbar_item_create(mainbar, SBAR_PRIORITY_LOW, FALSE, statusbar_lag);
|
lag_item = statusbar_item_create(mainbar, SBAR_PRIORITY_LOW, FALSE, statusbar_lag);
|
||||||
activity_item = statusbar_item_create(mainbar, SBAR_PRIORITY_HIGH, FALSE, statusbar_activity);
|
activity_item = statusbar_item_create(mainbar, SBAR_PRIORITY_HIGH, FALSE, statusbar_activity);
|
||||||
@ -633,15 +585,15 @@ static void mainbar_add_items(MAIN_WINDOW_REC *window)
|
|||||||
|
|
||||||
static void sidebar_add_items(MAIN_WINDOW_REC *window)
|
static void sidebar_add_items(MAIN_WINDOW_REC *window)
|
||||||
{
|
{
|
||||||
window->statusbar_channel_item =
|
window->statusbar_window_item =
|
||||||
statusbar_item_create(window->statusbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_channel);
|
statusbar_item_create(window->statusbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sidebar_remove_items(MAIN_WINDOW_REC *window)
|
static void sidebar_remove_items(MAIN_WINDOW_REC *window)
|
||||||
{
|
{
|
||||||
if (window->statusbar_channel_item != NULL) {
|
if (window->statusbar_window_item != NULL) {
|
||||||
statusbar_item_remove(window->statusbar_channel_item);
|
statusbar_item_remove(window->statusbar_window_item);
|
||||||
window->statusbar_channel_item = NULL;
|
window->statusbar_window_item = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -683,25 +635,13 @@ static void sig_main_statusbar_changed(WINDOW_REC *window)
|
|||||||
|
|
||||||
static void read_settings(void)
|
static void read_settings(void)
|
||||||
{
|
{
|
||||||
use_colors = settings_get_bool("colors");
|
use_colors = settings_get_bool("colors") && has_colors();
|
||||||
if (settings_get_bool("topicbar"))
|
if (settings_get_bool("topicbar"))
|
||||||
topicbar_create();
|
topicbar_create();
|
||||||
else if (!settings_get_bool("topicbar"))
|
else if (!settings_get_bool("topicbar"))
|
||||||
topicbar_destroy();
|
topicbar_destroy();
|
||||||
|
|
||||||
lag_min_show = settings_get_int("lag_min_show")*10;
|
lag_min_show = settings_get_int("lag_min_show")*10;
|
||||||
|
|
||||||
sbar_color_background = settings_get_int("statusbar_background") << 4;
|
|
||||||
sbar_color_dim = sbar_color_background |
|
|
||||||
settings_get_int("statusbar_dim");
|
|
||||||
sbar_color_normal = sbar_color_background |
|
|
||||||
settings_get_int("statusbar_normal");
|
|
||||||
sbar_color_bold = sbar_color_background |
|
|
||||||
settings_get_int("statusbar_bold");
|
|
||||||
sbar_color_away = sbar_color_background |
|
|
||||||
settings_get_int("statusbar_away");
|
|
||||||
sbar_color_act_highlight = sbar_color_background |
|
|
||||||
settings_get_int("statusbar_act_highlight");
|
|
||||||
statusbar_redraw(NULL);
|
statusbar_redraw(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -714,13 +654,6 @@ void statusbar_items_init(void)
|
|||||||
settings_add_bool("lookandfeel", "actlist_moves", FALSE);
|
settings_add_bool("lookandfeel", "actlist_moves", FALSE);
|
||||||
settings_add_bool("misc", "mail_counter", TRUE);
|
settings_add_bool("misc", "mail_counter", TRUE);
|
||||||
|
|
||||||
settings_add_int("colors", "statusbar_background", 1);
|
|
||||||
settings_add_int("colors", "statusbar_dim", 3);
|
|
||||||
settings_add_int("colors", "statusbar_normal", 7);
|
|
||||||
settings_add_int("colors", "statusbar_bold", 15);
|
|
||||||
settings_add_int("colors", "statusbar_away", 10);
|
|
||||||
settings_add_int("colors", "statusbar_act_highlight", 13);
|
|
||||||
|
|
||||||
/* clock */
|
/* clock */
|
||||||
clock_timetag = g_timeout_add(1000, (GSourceFunc) statusbar_clock_timeout, NULL);
|
clock_timetag = g_timeout_add(1000, (GSourceFunc) statusbar_clock_timeout, NULL);
|
||||||
|
|
||||||
@ -736,11 +669,11 @@ void statusbar_items_init(void)
|
|||||||
signal_add("away mode changed", (SIGNAL_FUNC) sig_statusbar_nick_redraw);
|
signal_add("away mode changed", (SIGNAL_FUNC) sig_statusbar_nick_redraw);
|
||||||
|
|
||||||
/* channel */
|
/* channel */
|
||||||
signal_add("window changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw);
|
signal_add("window changed", (SIGNAL_FUNC) sig_statusbar_window_redraw);
|
||||||
signal_add("window item changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
|
signal_add("window item changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
|
||||||
signal_add("channel mode changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window_item);
|
signal_add("channel mode changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window_item);
|
||||||
signal_add("window server changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
|
signal_add("window server changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
|
||||||
signal_add("window refnum changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
|
signal_add("window refnum changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
|
||||||
|
|
||||||
/* activity */
|
/* activity */
|
||||||
activity_list = NULL;
|
activity_list = NULL;
|
||||||
@ -798,11 +731,11 @@ void statusbar_items_deinit(void)
|
|||||||
signal_remove("away mode changed", (SIGNAL_FUNC) sig_statusbar_nick_redraw);
|
signal_remove("away mode changed", (SIGNAL_FUNC) sig_statusbar_nick_redraw);
|
||||||
|
|
||||||
/* channel */
|
/* channel */
|
||||||
signal_remove("window changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw);
|
signal_remove("window changed", (SIGNAL_FUNC) sig_statusbar_window_redraw);
|
||||||
signal_remove("window item changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
|
signal_remove("window item changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
|
||||||
signal_remove("channel mode changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window_item);
|
signal_remove("channel mode changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window_item);
|
||||||
signal_remove("window server changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
|
signal_remove("window server changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
|
||||||
signal_remove("window refnum changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
|
signal_remove("window refnum changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
|
||||||
|
|
||||||
/* activity */
|
/* activity */
|
||||||
signal_remove("window activity", (SIGNAL_FUNC) sig_statusbar_activity_hilight);
|
signal_remove("window activity", (SIGNAL_FUNC) sig_statusbar_activity_hilight);
|
||||||
|
@ -21,14 +21,16 @@
|
|||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "signals.h"
|
#include "signals.h"
|
||||||
#include "servers.h"
|
#include "servers.h"
|
||||||
#include "settings.h"
|
|
||||||
|
|
||||||
#include "fe-windows.h"
|
#include "fe-windows.h"
|
||||||
|
#include "themes.h"
|
||||||
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "statusbar.h"
|
#include "statusbar.h"
|
||||||
#include "gui-windows.h"
|
#include "gui-windows.h"
|
||||||
|
|
||||||
|
static int backs[] = { 0, 4, 2, 6, 1, 5, 3, 7 }; /* FIXME: should be in some more generic place.. */
|
||||||
|
|
||||||
void statusbar_items_init(void);
|
void statusbar_items_init(void);
|
||||||
void statusbar_items_deinit(void);
|
void statusbar_items_deinit(void);
|
||||||
|
|
||||||
@ -190,7 +192,7 @@ void statusbar_redraw(STATUSBAR_REC *bar)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_bg(stdscr, settings_get_int("statusbar_background") << 4);
|
set_bg(stdscr, backs[bar->color] << 4);
|
||||||
move(bar->ypos, 0); clrtoeol();
|
move(bar->ypos, 0); clrtoeol();
|
||||||
set_bg(stdscr, 0);
|
set_bg(stdscr, 0);
|
||||||
|
|
||||||
@ -212,10 +214,27 @@ void statusbar_item_redraw(SBAR_ITEM_REC *item)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_last_bg(const char *str)
|
||||||
|
{
|
||||||
|
int last = -1;
|
||||||
|
|
||||||
|
while (*str != '\0') {
|
||||||
|
if (*str == '%' && str[1] != '\0') {
|
||||||
|
str++;
|
||||||
|
if (*str >= '0' && *str <= '7')
|
||||||
|
last = *str-'0';
|
||||||
|
}
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
/* ypos is used only when pos == STATUSBAR_POS_MIDDLE */
|
/* ypos is used only when pos == STATUSBAR_POS_MIDDLE */
|
||||||
STATUSBAR_REC *statusbar_create(int pos, int ypos)
|
STATUSBAR_REC *statusbar_create(int pos, int ypos)
|
||||||
{
|
{
|
||||||
STATUSBAR_REC *rec;
|
STATUSBAR_REC *rec;
|
||||||
|
char *str;
|
||||||
|
|
||||||
rec = g_new0(STATUSBAR_REC, 1);
|
rec = g_new0(STATUSBAR_REC, 1);
|
||||||
statusbars = g_slist_append(statusbars, rec);
|
statusbars = g_slist_append(statusbars, rec);
|
||||||
@ -226,6 +245,15 @@ STATUSBAR_REC *statusbar_create(int pos, int ypos)
|
|||||||
rec->ypos = pos == STATUSBAR_POS_MIDDLE ? ypos :
|
rec->ypos = pos == STATUSBAR_POS_MIDDLE ? ypos :
|
||||||
pos == STATUSBAR_POS_UP ? rec->line : LINES-1-rec->line;
|
pos == STATUSBAR_POS_UP ? rec->line : LINES-1-rec->line;
|
||||||
|
|
||||||
|
/* get background color from sb_background abstract */
|
||||||
|
str = theme_format_expand(current_theme, "{sb_background}");
|
||||||
|
if (str == NULL) str = g_strdup("%n%8");
|
||||||
|
rec->color_string = g_strconcat("%n", str, NULL);
|
||||||
|
g_free(str);
|
||||||
|
|
||||||
|
rec->color = get_last_bg(rec->color_string);
|
||||||
|
if (rec->color < 0) rec->color = current_theme->default_real_color;
|
||||||
|
|
||||||
if (pos == STATUSBAR_POS_UP) {
|
if (pos == STATUSBAR_POS_UP) {
|
||||||
if (sbars_up == 0) sbar_uppest = rec->line;
|
if (sbars_up == 0) sbar_uppest = rec->line;
|
||||||
sbars_up++;
|
sbars_up++;
|
||||||
@ -236,7 +264,7 @@ STATUSBAR_REC *statusbar_create(int pos, int ypos)
|
|||||||
rec->line -= sbar_lowest;
|
rec->line -= sbar_lowest;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_bg(stdscr, settings_get_int("statusbar_background") << 4);
|
set_bg(stdscr, backs[rec->color] << 4);
|
||||||
move(rec->ypos, 0); clrtoeol();
|
move(rec->ypos, 0); clrtoeol();
|
||||||
set_bg(stdscr, 0);
|
set_bg(stdscr, 0);
|
||||||
|
|
||||||
@ -273,6 +301,7 @@ void statusbar_destroy(STATUSBAR_REC *bar)
|
|||||||
|
|
||||||
if (bar->pos != STATUSBAR_POS_MIDDLE)
|
if (bar->pos != STATUSBAR_POS_MIDDLE)
|
||||||
statusbars_pack(bar->pos, bar->pos);
|
statusbars_pack(bar->pos, bar->pos);
|
||||||
|
g_free(bar->color_string);
|
||||||
g_free(bar);
|
g_free(bar);
|
||||||
|
|
||||||
if (!quitting) statusbar_redraw_all();
|
if (!quitting) statusbar_redraw_all();
|
||||||
|
@ -18,6 +18,9 @@ typedef struct {
|
|||||||
int pos;
|
int pos;
|
||||||
int line;
|
int line;
|
||||||
|
|
||||||
|
char *color_string;
|
||||||
|
int color;
|
||||||
|
|
||||||
int ypos; /* real position in screen at the moment */
|
int ypos; /* real position in screen at the moment */
|
||||||
GSList *items;
|
GSList *items;
|
||||||
} STATUSBAR_REC;
|
} STATUSBAR_REC;
|
||||||
|
Loading…
Reference in New Issue
Block a user