1
0
mirror of https://github.com/irssi/irssi.git synced 2024-09-29 04:45:57 -04:00

"print text finished" -> "gui print text finished". Added %[options] format

for printing text. The syntax for options is [+-]<option>[+-]<option>...
Currently supports options 't' = timestamp, 'T' = server tag, 's' =
line_start, 'S' = line_start_irssi. -s or -S means don't print the
line_start. For example %[-st+T] would never print line_start or timestamp
to line, but would always print server tag to line.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1569 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2001-06-26 21:28:00 +00:00 committed by cras
parent f1a0aabdf4
commit 6362ab86f6
6 changed files with 177 additions and 92 deletions

View File

@ -224,7 +224,7 @@ FE common
"gui window goto", int number
(Can be used to determine when all "gui print text"s are sent (not required))
"print text finished", WINDOW_REC
"gui print text finished", WINDOW_REC
* Provides signals:

View File

@ -59,11 +59,51 @@ int format_find_tag(const char *module, const char *tag)
return -1;
}
int format_expand_styles(GString *out, char format)
static void format_expand_code(const char **format, int *flags)
{
char *p;
int set;
switch (format) {
if (flags == NULL) {
/* flags are being ignored - skip the code */
while (**format != ']')
(*format)++;
return;
}
set = TRUE;
(*format)++;
while (**format != ']') {
if (**format == '+')
set = TRUE;
else if (**format == '-')
set = FALSE;
else switch (**format) {
case 's':
case 'S':
*flags |= !set ? PRINT_FLAG_UNSET_LINE_START :
**format == 's' ? PRINT_FLAG_SET_LINE_START :
PRINT_FLAG_SET_LINE_START_IRSSI;
break;
case 't':
*flags |= set ? PRINT_FLAG_SET_TIMESTAMP :
PRINT_FLAG_UNSET_TIMESTAMP;
break;
case 'T':
*flags |= set ? PRINT_FLAG_SET_SERVERTAG :
PRINT_FLAG_UNSET_SERVERTAG;
break;
}
(*format)++;
}
}
int format_expand_styles(GString *out, const char **format, int *flags)
{
char *p, fmt;
fmt = **format;
switch (fmt) {
case 'U':
/* Underline on/off */
g_string_append_c(out, 4);
@ -103,9 +143,13 @@ int format_expand_styles(GString *out, char format)
g_string_append_c(out, 4);
g_string_append_c(out, FORMAT_STYLE_DEFAULTS);
break;
case '[':
/* code */
format_expand_code(format, flags);
break;
default:
/* check if it's a background color */
p = strchr(format_backs, format);
p = strchr(format_backs, fmt);
if (p != NULL) {
g_string_append_c(out, 4);
g_string_append_c(out, FORMAT_COLOR_NOCHANGE);
@ -114,8 +158,8 @@ int format_expand_styles(GString *out, char format)
}
/* check if it's a foreground color */
if (format == 'p') format = 'm';
p = strchr(format_fores, format);
if (fmt == 'p') fmt = 'm';
p = strchr(format_fores, fmt);
if (p != NULL) {
g_string_append_c(out, 4);
g_string_append_c(out, (char) ((int) (p-format_fores)+'0'));
@ -124,8 +168,8 @@ int format_expand_styles(GString *out, char format)
}
/* check if it's a bold foreground color */
if (format == 'P') format = 'M';
p = strchr(format_boldfores, format);
if (fmt == 'P') fmt = 'M';
p = strchr(format_boldfores, fmt);
if (p != NULL) {
g_string_append_c(out, 4);
g_string_append_c(out, (char) (8+(int) (p-format_boldfores)+'0'));
@ -208,14 +252,13 @@ void format_create_dest(TEXT_DEST_REC *dest,
void *server, const char *target,
int level, WINDOW_REC *window)
{
memset(dest, 0, sizeof(TEXT_DEST_REC));
dest->server = server;
dest->target = target;
dest->level = level;
dest->window = window != NULL ? window :
window_find_closest(server, target, level);
dest->hilight_priority = 0;
dest->hilight_color = NULL;
}
/* Return length of text part in string (ie. without % codes) */
@ -231,7 +274,8 @@ int format_get_length(const char *str)
while (*str != '\0') {
if (*str == '%' && str[1] != '\0') {
str++;
if (*str != '%' && format_expand_styles(tmp, *str)) {
if (*str != '%' &&
format_expand_styles(tmp, &str, NULL)) {
str++;
continue;
}
@ -265,7 +309,8 @@ int format_real_length(const char *str, int len)
while (*str != '\0' && len > 0) {
if (*str == '%' && str[1] != '\0') {
str++;
if (*str != '%' && format_expand_styles(tmp, *str)) {
if (*str != '%' &&
format_expand_styles(tmp, &str, NULL)) {
str++;
continue;
}
@ -285,7 +330,7 @@ int format_real_length(const char *str, int len)
return (int) (str-start);
}
char *format_string_expand(const char *text)
char *format_string_expand(const char *text, int *flags)
{
GString *out;
char code, *ret;
@ -294,11 +339,12 @@ char *format_string_expand(const char *text)
out = g_string_new(NULL);
if (flags != NULL) *flags = 0;
code = 0;
while (*text != '\0') {
if (code == '%') {
/* color code */
if (!format_expand_styles(out, *text)) {
if (!format_expand_styles(out, &text, flags)) {
g_string_append_c(out, '%');
g_string_append_c(out, '%');
g_string_append_c(out, *text);
@ -332,7 +378,7 @@ static char *format_get_text_args(TEXT_DEST_REC *dest,
while (*text != '\0') {
if (code == '%') {
/* color code */
if (!format_expand_styles(out, *text)) {
if (!format_expand_styles(out, &text, &dest->flags)) {
g_string_append_c(out, '%');
g_string_append_c(out, '%');
g_string_append_c(out, *text);
@ -487,19 +533,29 @@ char *format_get_level_tag(THEME_REC *theme, TEXT_DEST_REC *dest)
{
int format;
if (dest->level & LINE_START_IRSSI_LEVEL)
format = TXT_LINE_START_IRSSI;
else if ((dest->level & NOT_LINE_START_LEVEL) == 0)
format = TXT_LINE_START;
else
/* check for flags if we want to override defaults */
if (dest->flags & PRINT_FLAG_UNSET_LINE_START)
return NULL;
if (dest->flags & PRINT_FLAG_SET_LINE_START)
format = TXT_LINE_START;
else if (dest->flags & PRINT_FLAG_SET_LINE_START_IRSSI)
format = TXT_LINE_START_IRSSI;
else {
/* use defaults */
if (dest->level & LINE_START_IRSSI_LEVEL)
format = TXT_LINE_START_IRSSI;
else if ((dest->level & NOT_LINE_START_LEVEL) == 0)
format = TXT_LINE_START;
else
return NULL;
}
return format_get_text_theme(theme, MODULE_NAME, dest, format);
}
#define show_timestamp(level) \
((level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) == 0 && \
(timestamps || (msgs_timestamps && ((level) & MSGLEVEL_MSGS))))
(timestamps || (msgs_timestamps && ((level) & MSGLEVEL_MSGS)))
static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
{
@ -509,6 +565,15 @@ static char *get_timestamp(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
if (!show_timestamp(dest->level))
return NULL;
/* check for flags if we want to override defaults */
if (dest->flags & PRINT_FLAG_UNSET_TIMESTAMP)
return NULL;
if ((dest->flags & PRINT_FLAG_SET_TIMESTAMP) == 0 &&
(dest->level & (MSGLEVEL_NEVER|MSGLEVEL_LASTLOG)) != 0)
return NULL;
if (timestamp_timeout > 0) {
diff = t - dest->window->last_timestamp;
dest->window->last_timestamp = t;
@ -530,25 +595,35 @@ static char *get_server_tag(THEME_REC *theme, TEXT_DEST_REC *dest)
server = dest->server;
if (server == NULL || hide_server_tags ||
(dest->window->active != NULL &&
dest->window->active->server == server))
if (server == NULL || hide_server_tags)
return NULL;
/* check for flags if we want to override defaults */
if (dest->flags & PRINT_FLAG_UNSET_SERVERTAG)
return NULL;
if (servers != NULL) {
count++;
if (servers->next != NULL)
if ((dest->flags & PRINT_FLAG_SET_SERVERTAG) == 0) {
if (dest->window->active != NULL &&
dest->window->active->server == server)
return NULL;
if (servers != NULL) {
count++;
}
if (count < 2 && lookup_servers != NULL) {
count++;
if (lookup_servers->next != NULL)
if (servers->next != NULL)
count++;
}
if (count < 2 && lookup_servers != NULL) {
count++;
if (lookup_servers->next != NULL)
count++;
}
if (count < 2)
return NULL;
}
return count < 2 ? NULL :
format_get_text_theme(theme, MODULE_NAME, dest,
TXT_SERVERTAG, server->tag);
return format_get_text_theme(theme, MODULE_NAME, dest,
TXT_SERVERTAG, server->tag);
}
char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t)
@ -576,7 +651,7 @@ void format_newline(WINDOW_REC *window)
signal_emit_id(signal_gui_print_text, 6, window,
GINT_TO_POINTER(-1), GINT_TO_POINTER(-1),
GINT_TO_POINTER(PRINTFLAG_NEWLINE),
GINT_TO_POINTER(GUI_PRINT_FLAG_NEWLINE),
"", GINT_TO_POINTER(-1));
}
@ -613,19 +688,19 @@ static char *get_ansi_color(THEME_REC *theme, char *str,
/* reset colors back to default */
fg = theme->default_color;
bg = -1;
flags &= ~PRINTFLAG_INDENT;
flags &= ~GUI_PRINT_FLAG_INDENT;
break;
case 1:
/* hilight */
flags |= PRINTFLAG_BOLD;
flags |= GUI_PRINT_FLAG_BOLD;
break;
case 5:
/* blink */
flags |= PRINTFLAG_BLINK;
flags |= GUI_PRINT_FLAG_BLINK;
break;
case 7:
/* reverse */
flags |= PRINTFLAG_REVERSE;
flags |= GUI_PRINT_FLAG_REVERSE;
break;
default:
if (num >= 30 && num <= 37)
@ -817,7 +892,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
GINT_TO_POINTER(bgcolor),
GINT_TO_POINTER(flags), str,
dest->level);
flags &= ~PRINTFLAG_INDENT;
flags &= ~GUI_PRINT_FLAG_INDENT;
}
if (type == '\n')
@ -831,7 +906,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
case 2:
/* bold */
if (!hide_text_style)
flags ^= PRINTFLAG_BOLD;
flags ^= GUI_PRINT_FLAG_BOLD;
break;
case 3:
/* MIRC color */
@ -839,40 +914,40 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
hide_text_style ? NULL : &fgcolor,
hide_text_style ? NULL : &bgcolor);
if (!hide_text_style)
flags |= PRINTFLAG_MIRC_COLOR;
flags |= GUI_PRINT_FLAG_MIRC_COLOR;
break;
case 4:
/* user specific colors */
flags &= ~PRINTFLAG_MIRC_COLOR;
flags &= ~GUI_PRINT_FLAG_MIRC_COLOR;
switch (*ptr) {
case FORMAT_STYLE_BLINK:
flags ^= PRINTFLAG_BLINK;
flags ^= GUI_PRINT_FLAG_BLINK;
break;
case FORMAT_STYLE_UNDERLINE:
flags ^= PRINTFLAG_UNDERLINE;
flags ^= GUI_PRINT_FLAG_UNDERLINE;
break;
case FORMAT_STYLE_BOLD:
flags ^= PRINTFLAG_BOLD;
flags ^= GUI_PRINT_FLAG_BOLD;
break;
case FORMAT_STYLE_REVERSE:
flags ^= PRINTFLAG_REVERSE;
flags ^= GUI_PRINT_FLAG_REVERSE;
break;
case FORMAT_STYLE_INDENT:
flags |= PRINTFLAG_INDENT;
flags |= GUI_PRINT_FLAG_INDENT;
break;
case FORMAT_STYLE_DEFAULTS:
fgcolor = bgcolor = -1;
flags &= PRINTFLAG_INDENT;
flags &= GUI_PRINT_FLAG_INDENT;
break;
default:
if (*ptr != FORMAT_COLOR_NOCHANGE) {
fgcolor = (unsigned char) *ptr-'0';
if (fgcolor <= 7)
flags &= ~PRINTFLAG_BOLD;
flags &= ~GUI_PRINT_FLAG_BOLD;
else {
/* bold */
if (fgcolor != 8) fgcolor -= 8;
flags |= PRINTFLAG_BOLD;
flags |= GUI_PRINT_FLAG_BOLD;
}
}
ptr++;
@ -884,22 +959,22 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
case 6:
/* blink */
if (!hide_text_style)
flags ^= PRINTFLAG_BLINK;
flags ^= GUI_PRINT_FLAG_BLINK;
break;
case 15:
/* remove all styling */
fgcolor = bgcolor = -1;
flags &= PRINTFLAG_INDENT;
flags &= GUI_PRINT_FLAG_INDENT;
break;
case 22:
/* reverse */
if (!hide_text_style)
flags ^= PRINTFLAG_REVERSE;
flags ^= GUI_PRINT_FLAG_REVERSE;
break;
case 31:
/* underline */
if (!hide_text_style)
flags ^= PRINTFLAG_UNDERLINE;
flags ^= GUI_PRINT_FLAG_UNDERLINE;
break;
case 27:
/* ansi color code */

View File

@ -4,13 +4,13 @@
#include "themes.h"
#include "fe-windows.h"
#define PRINTFLAG_BOLD 0x01
#define PRINTFLAG_REVERSE 0x02
#define PRINTFLAG_UNDERLINE 0x04
#define PRINTFLAG_BLINK 0x08
#define PRINTFLAG_MIRC_COLOR 0x10
#define PRINTFLAG_INDENT 0x20
#define PRINTFLAG_NEWLINE 0x40
#define GUI_PRINT_FLAG_BOLD 0x01
#define GUI_PRINT_FLAG_REVERSE 0x02
#define GUI_PRINT_FLAG_UNDERLINE 0x04
#define GUI_PRINT_FLAG_BLINK 0x08
#define GUI_PRINT_FLAG_MIRC_COLOR 0x10
#define GUI_PRINT_FLAG_INDENT 0x20
#define GUI_PRINT_FLAG_NEWLINE 0x40
#define MAX_FORMAT_PARAMS 10
#define DEFAULT_FORMAT_ARGLIST_SIZE 200
@ -30,6 +30,16 @@ struct _FORMAT_REC {
int paramtypes[MAX_FORMAT_PARAMS];
};
#define PRINT_FLAG_SET_LINE_START 0x0001
#define PRINT_FLAG_SET_LINE_START_IRSSI 0x0002
#define PRINT_FLAG_UNSET_LINE_START 0x0003
#define PRINT_FLAG_SET_TIMESTAMP 0x0004
#define PRINT_FLAG_UNSET_TIMESTAMP 0x0008
#define PRINT_FLAG_SET_SERVERTAG 0x0010
#define PRINT_FLAG_UNSET_SERVERTAG 0x0020
typedef struct {
WINDOW_REC *window;
SERVER_REC *server;
@ -38,6 +48,7 @@ typedef struct {
int hilight_priority;
char *hilight_color;
int flags;
} TEXT_DEST_REC;
int format_find_tag(const char *module, const char *tag);
@ -49,7 +60,7 @@ int format_get_length(const char *str);
handles %codes. */
int format_real_length(const char *str, int len);
char *format_string_expand(const char *text);
char *format_string_expand(const char *text, int *flags);
char *format_get_text(const char *module, WINDOW_REC *window,
void *server, const char *target,
@ -107,7 +118,7 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text);
#define FORMAT_STYLE_REVERSE (0x04 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_INDENT (0x05 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_DEFAULTS (0x06 + FORMAT_STYLE_SPECIAL)
int format_expand_styles(GString *out, char format);
int format_expand_styles(GString *out, const char **format, int *flags);
void formats_init(void);
void formats_deinit(void);

View File

@ -263,7 +263,7 @@ static char *hilight_get_color(HILIGHT_REC *rec)
color = rec->color != NULL ? rec->color :
settings_get_str("hilight_color");
return format_string_expand(color);
return format_string_expand(color, NULL);
}
static void hilight_update_text_dest(TEXT_DEST_REC *dest, HILIGHT_REC *rec)

View File

@ -34,11 +34,10 @@
static int beep_msg_level, beep_when_away, beep_when_window_active;
static int signal_gui_print_text;
static int signal_print_text;
static int signal_print_text_finished;
static int signal_print_format;
static int signal_gui_print_text, signal_gui_print_text_finished;
static int signal_print_starting;
static int signal_print_text;
static int signal_print_format;
static int sending_print_starting;
@ -235,7 +234,7 @@ static char *printtext_get_args(TEXT_DEST_REC *dest, const char *str,
break;
}
default:
if (!format_expand_styles(out, *str)) {
if (!format_expand_styles(out, &str, &dest->flags)) {
g_string_append_c(out, '%');
g_string_append_c(out, *str);
}
@ -248,7 +247,7 @@ static char *printtext_get_args(TEXT_DEST_REC *dest, const char *str,
return ret;
}
static char *printtext_expand_formats(const char *str)
static char *printtext_expand_formats(const char *str, int *flags)
{
GString *out;
char *ret;
@ -263,7 +262,7 @@ static char *printtext_expand_formats(const char *str)
if (*++str == '\0')
break;
if (!format_expand_styles(out, *str)) {
if (!format_expand_styles(out, &str, flags)) {
g_string_append_c(out, '%');
g_string_append_c(out, *str);
}
@ -320,7 +319,7 @@ void printtext_string(void *server, const char *target, int level, const char *t
sending_print_starting = FALSE;
}
str = printtext_expand_formats(text);
str = printtext_expand_formats(text, &dest.flags);
print_line(&dest, str);
g_free(str);
}
@ -349,7 +348,7 @@ void printtext_gui(const char *text)
memset(&dest, 0, sizeof(dest));
str = printtext_expand_formats(text);
str = printtext_expand_formats(text, &dest.flags);
format_send_to_gui(&dest, str);
g_free(str);
}
@ -385,7 +384,7 @@ static void sig_print_text(TEXT_DEST_REC *dest, const char *text)
format_send_to_gui(dest, str);
g_free(str);
signal_emit_id(signal_print_text_finished, 1, dest->window);
signal_emit_id(signal_gui_print_text_finished, 1, dest->window);
}
static void sig_print_text_free(TEXT_DEST_REC *dest, const char *text)
@ -432,10 +431,10 @@ void printtext_init(void)
{
sending_print_starting = FALSE;
signal_gui_print_text = signal_get_uniq_id("gui print text");
signal_print_text = signal_get_uniq_id("print text");
signal_print_text_finished = signal_get_uniq_id("print text finished");
signal_print_format = signal_get_uniq_id("print format");
signal_gui_print_text_finished = signal_get_uniq_id("gui print text finished");
signal_print_starting = signal_get_uniq_id("print starting");
signal_print_text = signal_get_uniq_id("print text");
signal_print_format = signal_get_uniq_id("print format");
read_settings();
signal_add("print text", (SIGNAL_FUNC) sig_print_text);

View File

@ -72,7 +72,7 @@ static void remove_old_lines(TEXT_BUFFER_VIEW_REC *view)
static void get_colors(int flags, int *fg, int *bg)
{
if (flags & PRINTFLAG_MIRC_COLOR) {
if (flags & GUI_PRINT_FLAG_MIRC_COLOR) {
/* mirc colors - real range is 0..15, but after 16
colors wrap to 0, 1, ... */
*bg = *bg < 0 ? 0 : mirc_colors[*bg % 16];
@ -88,19 +88,19 @@ static void get_colors(int flags, int *fg, int *bg)
current_theme->default_real_color;
}
if (flags & PRINTFLAG_REVERSE) {
if (flags & GUI_PRINT_FLAG_REVERSE) {
int tmp;
tmp = *fg; *fg = *bg; *bg = tmp;
}
if (*fg == 8) *fg |= ATTR_COLOR8;
if (flags & PRINTFLAG_BOLD) {
if (flags & GUI_PRINT_FLAG_BOLD) {
if (*fg == 0) *fg = current_theme->default_real_color;
*fg |= 8;
}
if (flags & PRINTFLAG_UNDERLINE) *fg |= ATTR_UNDERLINE;
if (flags & PRINTFLAG_BLINK) *bg |= 0x08;
if (flags & GUI_PRINT_FLAG_UNDERLINE) *fg |= ATTR_UNDERLINE;
if (flags & GUI_PRINT_FLAG_BLINK) *bg |= 0x08;
}
static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line,
@ -120,7 +120,7 @@ static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line,
data[pos++] = color == 0 ? LINE_CMD_COLOR0 : color;
}
if ((flags & PRINTFLAG_UNDERLINE) != (last_flags & PRINTFLAG_UNDERLINE)) {
if ((flags & GUI_PRINT_FLAG_UNDERLINE) != (last_flags & GUI_PRINT_FLAG_UNDERLINE)) {
data[pos++] = 0;
data[pos++] = LINE_CMD_UNDERLINE;
}
@ -132,7 +132,7 @@ static void line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line,
data[pos++] = 0;
data[pos++] = LINE_CMD_BLINK;
}
if (flags & PRINTFLAG_INDENT) {
if (flags & GUI_PRINT_FLAG_INDENT) {
data[pos++] = 0;
data[pos++] = LINE_CMD_INDENT;
}
@ -182,14 +182,14 @@ static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor,
insert_after = WINDOW_GUI(window)->use_insert_after ?
WINDOW_GUI(window)->insert_after : view->buffer->cur_line;
if (flags & PRINTFLAG_NEWLINE)
if (flags & GUI_PRINT_FLAG_NEWLINE)
view_add_eol(view, &insert_after);
line_add_colors(view->buffer, &insert_after, fg, bg, flags);
textbuffer_insert(view->buffer, insert_after,
str, strlen(str), &lineinfo);
}
static void sig_printtext_finished(WINDOW_REC *window)
static void sig_gui_printtext_finished(WINDOW_REC *window)
{
TEXT_BUFFER_VIEW_REC *view;
LINE_REC *insert_after;
@ -258,7 +258,7 @@ void gui_printtext_init(void)
settings_add_bool("history", "scrollback_save_formats", FALSE);
signal_add("gui print text", (SIGNAL_FUNC) sig_gui_print_text);
signal_add("print text finished", (SIGNAL_FUNC) sig_printtext_finished);
signal_add("gui print text finished", (SIGNAL_FUNC) sig_gui_printtext_finished);
signal_add("print format", (SIGNAL_FUNC) sig_print_format);
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
@ -270,7 +270,7 @@ void gui_printtext_deinit(void)
g_string_free(format, TRUE);
signal_remove("gui print text", (SIGNAL_FUNC) sig_gui_print_text);
signal_remove("print text finished", (SIGNAL_FUNC) sig_printtext_finished);
signal_remove("print text finished", (SIGNAL_FUNC) sig_gui_printtext_finished);
signal_remove("print format", (SIGNAL_FUNC) sig_print_format);
signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
}