summaryrefslogtreecommitdiff
path: root/src/fe-common/core/formats.h
blob: a4b2685279f9fb024150452fdf06c8e30a45dc8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#ifndef __FORMATS_H
#define __FORMATS_H

#include "themes.h"
#include "fe-windows.h"

#define GUI_PRINT_FLAG_BOLD          0x0001
#define GUI_PRINT_FLAG_REVERSE       0x0002
#define GUI_PRINT_FLAG_UNDERLINE     0x0004
#define GUI_PRINT_FLAG_BLINK         0x0008
#define GUI_PRINT_FLAG_MIRC_COLOR    0x0010
#define GUI_PRINT_FLAG_INDENT        0x0020
#define GUI_PRINT_FLAG_ITALIC        0x0040
#define GUI_PRINT_FLAG_NEWLINE       0x0080
#define GUI_PRINT_FLAG_CLRTOEOL      0x0100
#define GUI_PRINT_FLAG_MONOSPACE     0x0200
#define GUI_PRINT_FLAG_COLOR_24_FG   0x0400
#define GUI_PRINT_FLAG_COLOR_24_BG   0x0800

#define MAX_FORMAT_PARAMS 10
#define DEFAULT_FORMAT_ARGLIST_SIZE 200

enum {
	FORMAT_STRING,
	FORMAT_INT,
	FORMAT_LONG,
	FORMAT_FLOAT
};

struct _FORMAT_REC {
	char *tag;
	char *def;

	int params;
	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	0x0040

#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 _HILIGHT_REC HILIGHT_REC;

typedef struct _TEXT_DEST_REC {
	WINDOW_REC *window;
	SERVER_REC *server;
        const char *server_tag; /* if server is non-NULL, must be server->tag */
	const char *target;
	int level;

	HILIGHT_REC *hilight;
	int match_beg;
	int match_end;
	int hilight_priority;
	char *hilight_color;
        int flags;
} TEXT_DEST_REC;

#define window_get_theme(window) \
	(window != NULL && (window)->theme != NULL ? \
	(window)->theme : current_theme)

int format_find_tag(const char *module, const char *tag);

/* Return length of text part in string (ie. without % codes) */
int format_get_length(const char *str);
/* Return how many characters in `str' must be skipped before `len'
   characters of text is skipped. Like strip_real_length(), except this
   handles %codes. */
int format_real_length(const char *str, int len);

char *format_string_expand(const char *text, int *flags);

char *format_get_text(const char *module, WINDOW_REC *window,
		      void *server, const char *target,
		      int formatnum, ...);

/* good size for buffer is DEFAULT_FORMAT_ARGLIST_SIZE */
void format_read_arglist(va_list va, FORMAT_REC *format,
			 char **arglist, int arglist_size,
			 char *buffer, int buffer_size);
char *format_get_text_theme(THEME_REC *theme, const char *module,
			    TEXT_DEST_REC *dest, int formatnum, ...);
char *format_get_text_theme_args(THEME_REC *theme, const char *module,
				 TEXT_DEST_REC *dest, int formatnum,
				 va_list va);
char *format_get_text_theme_charargs(THEME_REC *theme, const char *module,
				     TEXT_DEST_REC *dest, int formatnum,
				     char **args);

/* add `linestart' to start/end of each line in `text'. `text' may contain
   multiple lines separated with \n. */
char *format_add_linestart(const char *text, const char *linestart);
char *format_add_lineend(const char *text, const char *linestart);

/* return the "-!- " text at the start of the line */
char *format_get_level_tag(THEME_REC *theme, TEXT_DEST_REC *dest);

/* return timestamp + server tag */
char *format_get_line_start(THEME_REC *theme, TEXT_DEST_REC *dest, time_t t);


/* "private" functions for printtext */
void format_create_dest(TEXT_DEST_REC *dest,
			void *server, const char *target,
			int level, WINDOW_REC *window);
void format_create_dest_tag(TEXT_DEST_REC *dest, void *server,
			    const char *server_tag, const char *target,
			    int level, WINDOW_REC *window);

void format_newline(WINDOW_REC *window);

/* Return how many characters in `str' must be skipped before `len'
   characters of text is skipped. */
int strip_real_length(const char *str, int len,
		      int *last_color_pos, int *last_color_len);

/* strip all color (etc.) codes from `input'.
   Returns newly allocated string. */
char *strip_codes(const char *input);

/* send a fully parsed text string for GUI to print */
void format_send_to_gui(TEXT_DEST_REC *dest, const char *text);

#define FORMAT_COLOR_NOCHANGE	('0'-1) /* don't change this, at least hilighting depends this value */
#define FORMAT_COLOR_EXT1	('0'-2)
#define FORMAT_COLOR_EXT2	('0'-3)
#define FORMAT_COLOR_EXT3	('0'-4)
#define FORMAT_COLOR_EXT1_BG	('0'-5)
#define FORMAT_COLOR_EXT2_BG	('0'-9)
#define FORMAT_COLOR_EXT3_BG	('0'-10)
#ifdef TERM_TRUECOLOR
#define FORMAT_COLOR_24	('0'-13)
#endif

#define FORMAT_STYLE_SPECIAL	0x60
#define FORMAT_STYLE_BLINK	(0x01 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_UNDERLINE	(0x02 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_BOLD	(0x03 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_REVERSE	(0x04 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_INDENT	(0x05 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_ITALIC	(0x06 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_DEFAULTS	(0x07 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_CLRTOEOL	(0x08 + FORMAT_STYLE_SPECIAL)
#define FORMAT_STYLE_MONOSPACE	(0x09 + FORMAT_STYLE_SPECIAL)
int format_expand_styles(GString *out, const char **format, int *flags);
void format_ext_color(GString *out, int bg, int color);
void format_24bit_color(GString *out, int bg, unsigned int color);

void formats_init(void);
void formats_deinit(void);

#endif