1
0
mirror of https://github.com/irssi/irssi.git synced 2024-09-01 04:14:16 -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:
Timo Sirainen 2001-03-15 02:26:12 +00:00 committed by cras
parent 2680011ad7
commit 87777968c3
8 changed files with 316 additions and 243 deletions

View File

@ -229,4 +229,26 @@ abstracts = {
dccmsg = "[%G$1-%K(%g$0%K)%n] ";
dccquerynick = "%G$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-";
};

View File

@ -94,8 +94,6 @@ void theme_destroy(THEME_REC *rec)
g_hash_table_foreach(rec->modules, (GHFunc) theme_module_destroy, NULL);
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_free(rec->replace_values);
@ -104,30 +102,10 @@ void theme_destroy(THEME_REC *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,
char default_color, char *last_color,
char chr)
char default_fg, char default_bg,
char *last_fg, char *last_bg,
char chr, int flags)
{
GSList *rec;
char *ret, *abstract, data[2];
@ -139,16 +117,20 @@ static char *theme_replace_expand(THEME_REC *theme, int index,
abstract = rec->data;
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);
g_free(abstract);
return ret;
}
static const char *colorformats = "n01234567krgybmpcwKRGYBMPCW";
static const char *fgcolorformats = "nkrgybmpcwKRGYBMPCW";
static const char *bgcolorformats = "n01234567";
#define IS_COLOR_FORMAT(c) \
((c) != '\0' && strchr(colorformats, c) != NULL)
#define IS_FGCOLOR_FORMAT(c) \
((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 */
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 */
static void theme_format_append_next(THEME_REC *theme, GString *str,
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;
char chr;
@ -200,14 +184,32 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
(*format)++;
if (**format != '{' && **format != '}') {
chr = **format;
if (**format == 'n')
chr = default_color;
if (**format == 'n') {
/* %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_color = chr;
g_string_append_c(str, '%');
g_string_append_c(str, chr);
*last_fg = default_fg;
*last_bg = default_bg;
} else {
if (IS_FGCOLOR_FORMAT(chr))
*last_fg = chr;
if (IS_BGCOLOR_FORMAT(chr))
*last_bg = chr;
g_string_append_c(str, '%');
g_string_append_c(str, chr);
}
(*format)++;
return;
}
@ -216,14 +218,16 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
chr = **format;
}
index = theme_replace_find(theme, chr);
index = (flags & EXPAND_FLAG_IGNORE_REPLACES) ? -1 :
theme->replace_keys[(int) chr];
if (index == -1)
g_string_append_c(str, chr);
else {
char *value;
value = theme_replace_expand(theme, index, default_color,
last_color, chr);
value = theme_replace_expand(theme, index,
default_fg, default_bg,
last_fg, last_bg, chr, flags);
g_string_append(str, value);
g_free(value);
}
@ -234,7 +238,8 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
/* expand a single {abstract ...data... } */
static char *theme_format_expand_abstract(THEME_REC *theme,
const char **formatp,
char default_color)
char default_fg, char default_bg,
int flags)
{
const char *p, *format;
char *abstract, *data, *ret;
@ -252,9 +257,23 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
len = (int) (p-format);
abstract = g_strndup(format, len);
/* skip the following space */
if (*p == ' ') len++;
*formatp = format + len;
/* skip the following space, if there's any more spaces they're
treated as arguments */
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 */
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 may itself contain abstracts or replaces :) */
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
/* 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_color,
NULL, 0);
data = theme_format_expand_data(theme, formatp, default_fg, default_bg,
NULL, NULL, flags);
len = strlen(data);
if (len > 1 && isdigit(data[len-1]) && data[len-2] == '$') {
/* ends with $<digit> .. this breaks things if next
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);
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;
}
/* expand the data part in {abstract data} */
static char *theme_format_expand_data(THEME_REC *theme,
const char **format,
char default_color,
char *save_last_color,
int flags)
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)
{
GString *str;
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);
while (**format != '\0') {
if ((flags & EXPAND_FLAG_ROOT) == 0 && **format == '}') {
/* ignore } if we're expanding original string */
@ -318,17 +341,24 @@ static char *theme_format_expand_data(THEME_REC *theme,
}
if (**format != '{') {
if (save_last_color != NULL &&
(flags & EXPAND_FLAG_LASTCOLOR_ARG) &&
if ((flags & EXPAND_FLAG_LASTCOLOR_ARG) &&
**format == '$' && (*format)[1] == '0') {
/* save the color before $0 ..
this is for the %n replacing */
*save_last_color = last_color;
save_last_color = NULL;
if (save_last_fg != 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,
default_color, &last_color);
default_fg, default_bg,
&last_fg, &last_bg,
recurse_flags);
continue;
}
@ -338,17 +368,20 @@ static char *theme_format_expand_data(THEME_REC *theme,
/* get a single {...} */
abstract = theme_format_expand_abstract(theme, format,
last_color);
last_fg, last_bg,
recurse_flags);
if (abstract != NULL) {
g_string_append(str, abstract);
g_free(abstract);
}
}
if (save_last_color != NULL &&
(flags & EXPAND_FLAG_LASTCOLOR_ARG) == 0) {
if ((flags & EXPAND_FLAG_LASTCOLOR_ARG) == 0) {
/* 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;
@ -356,18 +389,23 @@ static char *theme_format_expand_data(THEME_REC *theme,
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)
{
GString *str;
char *ret, last_color = 'n';
char *ret, last_fg, last_bg;
str = g_string_new(NULL);
last_fg = last_bg = 'n';
while (*format != '\0') {
if (*format == '$') {
/* $variable, skrip it entirely */
theme_format_append_variable(str, &format);
last_color = '\0';
last_fg = last_bg = '\0';
} else if (*format != '%') {
/* a normal character */
g_string_append_c(str, *format);
@ -375,19 +413,24 @@ static char *theme_format_compress_colors(THEME_REC *theme, const char *format)
} else {
/* %format */
format++;
if (*format == last_color) {
if (IS_OLD_FORMAT(*format, last_fg, last_bg)) {
/* active color set again */
} else if (IS_COLOR_FORMAT(*format) &&
} else if (IS_FGCOLOR_FORMAT(*format) &&
(*format != 'n' || format[2] == 'n') &&
format[1] == '%' &&
IS_COLOR_FORMAT(format[2])) {
/* two colors in a row */
IS_FGCOLOR_FORMAT(format[2])) {
/* two fg colors in a row. bg colors are
so rare that we don't bother checking
them */
} else {
/* some format, add it */
g_string_append_c(str, '%');
g_string_append_c(str, *format);
if (IS_COLOR_FORMAT(*format))
last_color = *format;
if (IS_FGCOLOR_FORMAT(*format))
last_fg = *format;
if (IS_BGCOLOR_FORMAT(*format))
last_bg = *format;
}
format++;
}
@ -398,16 +441,16 @@ static char *theme_format_compress_colors(THEME_REC *theme, const char *format)
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;
g_return_val_if_fail(theme != 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);
ret = theme_format_compress_colors(theme, data);
ret = theme_format_compress_colors(theme, data);
g_free(data);
return ret;
}
@ -438,20 +481,28 @@ static void theme_read_replaces(CONFIG_REC *config, THEME_REC *theme)
{
GSList *tmp;
CONFIG_NODE *node;
const char *p;
int index;
node = config_node_traverse(config, "replaces", FALSE);
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) {
node = tmp->data;
if (node->key != NULL && node->value != NULL) {
theme->replace_keys =
g_slist_append(theme->replace_keys,
g_strdup(node->key));
for (p = node->key; *p != '\0'; p++)
theme->replace_keys[(int) *p] = index;
theme->replace_values =
g_slist_append(theme->replace_values,
g_strdup(node->value));
index++;
}
}
}
@ -460,6 +511,7 @@ static void theme_read_abstracts(CONFIG_REC *config, THEME_REC *theme)
{
GSList *tmp;
CONFIG_NODE *node;
gpointer oldkey, oldvalue;
node = config_node_traverse(config, "abstracts", FALSE);
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) {
node = tmp->data;
if (node->key != NULL && node->value != NULL &&
g_hash_table_lookup(theme->abstracts, node->key) == NULL) {
g_hash_table_insert(theme->abstracts,
g_strdup(node->key),
g_strdup(node->value));
if (node->key == NULL || node->value == NULL)
continue;
if (g_hash_table_lookup_extended(theme->abstracts, node->key,
&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);
theme->default_real_color =
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);
rec.theme = theme;

View File

@ -23,7 +23,7 @@ typedef struct {
wanted. default is 7 (white). */
GHashTable *modules;
GSList *replace_keys;
int replace_keys[256]; /* index to replace_values for each char */
GSList *replace_values;
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_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_deinit(void);

View File

@ -16,7 +16,7 @@ typedef struct {
int first_line, last_line, lines;
int statusbar_lines;
void *statusbar;
void *statusbar_channel_item;
void *statusbar_window_item;
} MAIN_WINDOW_REC;
extern GSList *mainwindows;

View File

@ -116,7 +116,11 @@ static void read_settings(void)
use_colors = settings_get_bool("colors");
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)
@ -151,8 +155,8 @@ static int init_curses(void)
if (has_colors())
start_color();
else
use_colors = FALSE;
else if (use_colors)
use_colors = FALSE;
#ifdef HAVE_NCURSES_USE_DEFAULT_COLORS
/* this lets us to use the "default" background color for colors <= 7 so

View File

@ -20,25 +20,14 @@
#include "module.h"
#include "signals.h"
#include "servers.h"
#include "misc.h"
#include "settings.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 "printtext.h"
#include "formats.h"
#include "screen.h"
#include "statusbar.h"
#include "gui-windows.h"
#include "gui-printtext.h"
/* how often to redraw lagging time (seconds) */
@ -51,9 +40,6 @@
the lag */
#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 MAIN_WINDOW_REC *mainbar_window;
static int use_colors;
@ -67,7 +53,7 @@ static time_t clock_last;
static SBAR_ITEM_REC *nick_item;
/* channel */
static SBAR_ITEM_REC *channel_item;
static SBAR_ITEM_REC *window_item;
/* activity */
static SBAR_ITEM_REC *activity_item;
@ -92,11 +78,11 @@ static SBAR_ITEM_REC *topic_item;
static STATUSBAR_REC *topic_bar;
static void item_default(SBAR_ITEM_REC *item, int get_size_only,
const char *str)
const char *str, const char *data)
{
SERVER_REC *server;
WI_ITEM_REC *wiitem;
char *stripped, *parsed, *printstr;
WI_ITEM_REC *wiitem;
char *tmpstr, *tmpstr2;
int len;
if (active_win == NULL) {
@ -107,31 +93,44 @@ static void item_default(SBAR_ITEM_REC *item, int get_size_only,
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);
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) {
item->min_size = item->max_size = format_get_length(parsed);
item->min_size = item->max_size = format_get_length(tmpstr);
} else {
if (item->size < item->min_size) {
/* they're forcing us smaller than minimum size.. */
len = format_real_length(parsed, item->size);
parsed[len] = '\0';
len = format_real_length(tmpstr, item->size);
tmpstr[len] = '\0';
}
printstr = g_strconcat("%n%4", parsed, NULL);
gui_printtext(item->xpos, item->bar->ypos, printstr);
g_free(printstr);
tmpstr2 = g_strconcat(item->bar->color_string, tmpstr, NULL);
gui_printtext(item->xpos, item->bar->ypos, tmpstr2);
g_free(tmpstr2);
}
g_free(parsed);
g_free(tmpstr);
}
/* redraw clock */
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.. */
@ -158,20 +157,8 @@ static int statusbar_clock_timeout(void)
/* redraw nick */
static void statusbar_nick(SBAR_ITEM_REC *item, int get_size_only)
{
IRC_SERVER_REC *server;
char *str, *usermode, *away;
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);
item_default(item, get_size_only,
"{sb $P$N{sbmode $usermode}{sbaway $A}}", "");
}
static void sig_statusbar_nick_redraw(void)
@ -179,52 +166,36 @@ static void sig_statusbar_nick_redraw(void)
statusbar_item_redraw(nick_item);
}
/* redraw channel */
static void statusbar_channel(SBAR_ITEM_REC *item, int get_size_only)
/* redraw window */
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) {
/* channel/query */
channel = CHANNEL(active_win->active);
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);
item_default(item, get_size_only,
"{sb $winref:$T{sbmode $M}}", "");
} else {
/* empty window */
server = active_win->active_server;
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,
"{sb $winref{sbservertag $tag}}", "");
}
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))
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 = window_item_window(item);
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)
@ -281,8 +252,7 @@ static char *get_activity_list(int normal, int hilight)
act list so that the highest priority items comes first. */
static void statusbar_activity(SBAR_ITEM_REC *item, int get_size_only)
{
GString *str;
char *actlist, *detlist;
char *actlist, *detlist, *data;
if (use_colors) {
actlist = get_activity_list(TRUE, TRUE);
@ -298,24 +268,13 @@ static void statusbar_activity(SBAR_ITEM_REC *item, int get_size_only)
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_string_append(str, "Act: ");
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);
g_free_not_null(actlist);
g_free_not_null(detlist);
}
static void sig_statusbar_activity_hilight(WINDOW_REC *window, gpointer oldlevel)
@ -387,7 +346,7 @@ static void sig_statusbar_activity_updated(void)
/* redraw -- more -- */
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)
@ -435,7 +394,7 @@ static void statusbar_lag(SBAR_ITEM_REC *item, int get_size_only)
}
now = time(NULL);
str = g_string_new("%c[%wLag: %_");
str = g_string_new(NULL);
/* FIXME: ugly ugly.. */
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");
if (lag_min_show < 0 || (server->lag < lag_min_show && !lag_unknown)) {
/* small, lag, don't display */
g_string_truncate(str, 0);
/* small lag, don't display */
} else {
g_string_sprintfa(str, "%d.%02d", server->lag/1000,
(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));
}
if (str->len > 0)
g_string_append(str, "%c]");
item_default(item, get_size_only, str->str);
item_default(item, get_size_only, "{sblag $0-}", str->str);
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)
{
char countstr[MAX_INT_STRLEN], *str;
char countstr[MAX_INT_STRLEN];
int mail_count;
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);
str = g_strconcat("%c[%wMail: %_", countstr, "%_%c]", NULL);
item_default(item, get_size_only, str);
g_free(str);
item_default(item, get_size_only, "{sbmail $0-}", countstr);
}
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)
{
item_default(item, get_size_only, "$topic");
item_default(item, get_size_only, "$topic", "");
}
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) {
MAIN_WINDOW_REC *rec = tmp->data;
if (rec->statusbar_channel_item != NULL)
statusbar_item_redraw(rec->statusbar_channel_item);
if (rec->statusbar_window_item != NULL)
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(nick_item);
statusbar_item_remove(channel_item);
statusbar_item_remove(window_item);
statusbar_item_remove(mail_item);
statusbar_item_remove(lag_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);
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);
lag_item = statusbar_item_create(mainbar, SBAR_PRIORITY_LOW, FALSE, statusbar_lag);
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)
{
window->statusbar_channel_item =
statusbar_item_create(window->statusbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_channel);
window->statusbar_window_item =
statusbar_item_create(window->statusbar, SBAR_PRIORITY_NORMAL, FALSE, statusbar_window);
}
static void sidebar_remove_items(MAIN_WINDOW_REC *window)
{
if (window->statusbar_channel_item != NULL) {
statusbar_item_remove(window->statusbar_channel_item);
window->statusbar_channel_item = NULL;
if (window->statusbar_window_item != NULL) {
statusbar_item_remove(window->statusbar_window_item);
window->statusbar_window_item = NULL;
}
}
@ -683,25 +635,13 @@ static void sig_main_statusbar_changed(WINDOW_REC *window)
static void read_settings(void)
{
use_colors = settings_get_bool("colors");
use_colors = settings_get_bool("colors") && has_colors();
if (settings_get_bool("topicbar"))
topicbar_create();
else if (!settings_get_bool("topicbar"))
topicbar_destroy();
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);
}
@ -714,13 +654,6 @@ void statusbar_items_init(void)
settings_add_bool("lookandfeel", "actlist_moves", FALSE);
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_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);
/* channel */
signal_add("window changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw);
signal_add("window item changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
signal_add("channel mode changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window_item);
signal_add("window server changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
signal_add("window refnum changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
signal_add("window changed", (SIGNAL_FUNC) sig_statusbar_window_redraw);
signal_add("window item changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
signal_add("channel mode changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window_item);
signal_add("window server changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
signal_add("window refnum changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
/* activity */
activity_list = NULL;
@ -798,11 +731,11 @@ void statusbar_items_deinit(void)
signal_remove("away mode changed", (SIGNAL_FUNC) sig_statusbar_nick_redraw);
/* channel */
signal_remove("window changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw);
signal_remove("window item changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
signal_remove("channel mode changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window_item);
signal_remove("window server changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
signal_remove("window refnum changed", (SIGNAL_FUNC) sig_statusbar_channel_redraw_window);
signal_remove("window changed", (SIGNAL_FUNC) sig_statusbar_window_redraw);
signal_remove("window item changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
signal_remove("channel mode changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window_item);
signal_remove("window server changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
signal_remove("window refnum changed", (SIGNAL_FUNC) sig_statusbar_window_redraw_window);
/* activity */
signal_remove("window activity", (SIGNAL_FUNC) sig_statusbar_activity_hilight);

View File

@ -21,14 +21,16 @@
#include "module.h"
#include "signals.h"
#include "servers.h"
#include "settings.h"
#include "fe-windows.h"
#include "themes.h"
#include "screen.h"
#include "statusbar.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_deinit(void);
@ -190,7 +192,7 @@ void statusbar_redraw(STATUSBAR_REC *bar)
return;
}
set_bg(stdscr, settings_get_int("statusbar_background") << 4);
set_bg(stdscr, backs[bar->color] << 4);
move(bar->ypos, 0); clrtoeol();
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 */
STATUSBAR_REC *statusbar_create(int pos, int ypos)
{
STATUSBAR_REC *rec;
char *str;
rec = g_new0(STATUSBAR_REC, 1);
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 :
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 (sbars_up == 0) sbar_uppest = rec->line;
sbars_up++;
@ -236,7 +264,7 @@ STATUSBAR_REC *statusbar_create(int pos, int ypos)
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();
set_bg(stdscr, 0);
@ -273,6 +301,7 @@ void statusbar_destroy(STATUSBAR_REC *bar)
if (bar->pos != STATUSBAR_POS_MIDDLE)
statusbars_pack(bar->pos, bar->pos);
g_free(bar->color_string);
g_free(bar);
if (!quitting) statusbar_redraw_all();

View File

@ -18,6 +18,9 @@ typedef struct {
int pos;
int line;
char *color_string;
int color;
int ypos; /* real position in screen at the moment */
GSList *items;
} STATUSBAR_REC;