summaryrefslogtreecommitdiff
path: root/src/fe-common
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe-common')
-rw-r--r--src/fe-common/core/Makefile.am3
-rw-r--r--src/fe-common/core/fe-common-core.c18
-rw-r--r--src/fe-common/core/fe-core-commands.c17
-rw-r--r--src/fe-common/core/fe-log.c20
-rw-r--r--src/fe-common/core/hilight-text.c6
-rw-r--r--src/fe-common/core/keyboard.c10
-rw-r--r--src/fe-common/core/module-formats.c140
-rw-r--r--src/fe-common/core/module-formats.h3
-rw-r--r--src/fe-common/core/printformat.h25
-rw-r--r--src/fe-common/core/printtext.c888
-rw-r--r--src/fe-common/core/printtext.h58
-rw-r--r--src/fe-common/core/themes.c380
-rw-r--r--src/fe-common/core/themes.h18
-rw-r--r--src/fe-common/core/window-activity.c4
-rw-r--r--src/fe-common/core/window-commands.c370
-rw-r--r--src/fe-common/core/window-items.c69
-rw-r--r--src/fe-common/core/window-items.h5
-rw-r--r--src/fe-common/core/windows.c474
-rw-r--r--src/fe-common/core/windows.h4
-rw-r--r--src/fe-common/irc/dcc/Makefile.am1
-rw-r--r--src/fe-common/irc/dcc/fe-dcc.c5
-rw-r--r--src/fe-common/irc/dcc/module-formats.c71
-rw-r--r--src/fe-common/irc/dcc/module-formats.h3
-rw-r--r--src/fe-common/irc/dcc/module.h3
-rw-r--r--src/fe-common/irc/fe-common-irc.c6
-rw-r--r--src/fe-common/irc/flood/Makefile.am3
-rw-r--r--src/fe-common/irc/flood/fe-flood.c6
-rw-r--r--src/fe-common/irc/flood/module-formats.c12
-rw-r--r--src/fe-common/irc/flood/module-formats.h3
-rw-r--r--src/fe-common/irc/flood/module.h3
-rw-r--r--src/fe-common/irc/module-formats.c340
-rw-r--r--src/fe-common/irc/module-formats.h3
-rw-r--r--src/fe-common/irc/notifylist/Makefile.am3
-rw-r--r--src/fe-common/irc/notifylist/fe-notifylist.c6
-rw-r--r--src/fe-common/irc/notifylist/module-formats.c28
-rw-r--r--src/fe-common/irc/notifylist/module-formats.h3
-rw-r--r--src/fe-common/irc/notifylist/module.h3
37 files changed, 1706 insertions, 1308 deletions
diff --git a/src/fe-common/core/Makefile.am b/src/fe-common/core/Makefile.am
index c8931435..c8e24dad 100644
--- a/src/fe-common/core/Makefile.am
+++ b/src/fe-common/core/Makefile.am
@@ -17,10 +17,11 @@ libfe_common_core_la_SOURCES = \
hilight-text.c \
keyboard.c \
module-formats.c \
- window-activity.c \
printtext.c \
themes.c \
translation.c \
+ window-activity.c \
+ window-commands.c \
window-items.c \
windows.c
diff --git a/src/fe-common/core/fe-common-core.c b/src/fe-common/core/fe-common-core.c
index a348583d..02c67010 100644
--- a/src/fe-common/core/fe-common-core.c
+++ b/src/fe-common/core/fe-common-core.c
@@ -18,6 +18,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "module.h"
+#include "module-formats.h"
#include "levels.h"
#include "settings.h"
@@ -50,6 +51,9 @@ void fe_settings_deinit(void);
void window_activity_init(void);
void window_activity_deinit(void);
+void window_commands_init(void);
+void window_commands_deinit(void);
+
void fe_core_commands_init(void);
void fe_core_commands_deinit(void);
@@ -73,8 +77,10 @@ void fe_common_core_init(void)
settings_add_int("lookandfeel", "tab_orientation", 3);*/
settings_add_str("lookandfeel", "current_theme", "default");
+ themes_init();
+ theme_register(fecommon_core_formats);
+
autorun_init();
- window_activity_init();
hilight_text_init();
command_history_init();
keyboard_init();
@@ -82,9 +88,10 @@ void fe_common_core_init(void)
fe_log_init();
fe_server_init();
fe_settings_init();
- themes_init();
translation_init();
windows_init();
+ window_activity_init();
+ window_commands_init();
window_items_init();
fe_core_commands_init();
}
@@ -92,7 +99,6 @@ void fe_common_core_init(void)
void fe_common_core_deinit(void)
{
autorun_deinit();
- window_activity_deinit();
hilight_text_deinit();
command_history_deinit();
keyboard_deinit();
@@ -100,11 +106,15 @@ void fe_common_core_deinit(void)
fe_log_deinit();
fe_server_deinit();
fe_settings_deinit();
- themes_deinit();
translation_deinit();
windows_deinit();
+ window_activity_deinit();
+ window_commands_deinit();
window_items_deinit();
fe_core_commands_deinit();
+
+ theme_unregister();
+ themes_deinit();
}
void fe_common_core_finish_init(void)
diff --git a/src/fe-common/core/fe-core-commands.c b/src/fe-common/core/fe-core-commands.c
index 41320eed..c4af0f7c 100644
--- a/src/fe-common/core/fe-core-commands.c
+++ b/src/fe-common/core/fe-core-commands.c
@@ -30,16 +30,11 @@
#include "windows.h"
static const char *ret_texts[] = {
- "Invalid parameter",
+ NULL,
"Not enough parameters given",
"Not connected to IRC server yet",
"Not joined to any channels yet",
- "Error: getsockname() failed",
- "Error: listen() failed",
- "Multiple matches found, be more specific",
- "Nick not found",
"Not joined to such channel",
- "Server not found",
"Channel not fully synchronized yet, try again after a while",
"Doing this is not a good idea. Add -YES if you really mean it",
};
@@ -269,9 +264,15 @@ static void cmd_unknown(const char *data, void *server, WI_ITEM_REC *item)
signal_stop();
}
-static void event_cmderror(gpointer error)
+static void event_cmderror(gpointer errorp)
{
- printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, ret_texts[GPOINTER_TO_INT(error)]);
+ int error;
+
+ error = GPOINTER_TO_INT(errorp);
+ if (error == CMDERR_ERRNO)
+ printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, g_strerror(errno));
+ else
+ printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, ret_texts[error]);
}
void fe_core_commands_init(void)
diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c
index f3fc6f56..58cd28fe 100644
--- a/src/fe-common/core/fe-log.c
+++ b/src/fe-common/core/fe-log.c
@@ -297,25 +297,27 @@ static void autolog_log(void *server, const char *target)
g_free(fname);
}
-/* write to logs created with /WINDOW LOG */
-static void sig_printtext_stripped(void *server, const char *target, gpointer levelp, const char *text)
+static void sig_printtext_stripped(WINDOW_REC *window, void *server, const char *target, gpointer levelp, const char *text)
{
char windownum[MAX_INT_STRLEN];
- WINDOW_REC *window;
LOG_REC *log;
int level;
level = GPOINTER_TO_INT(levelp);
+ if (level == MSGLEVEL_NEVER) return;
+
+ /* let autolog create the log records */
if ((autolog_level & level) && target != NULL && *target != '\0')
autolog_log(server, target);
- window = window_find_closest(server, target, level);
- if (window != NULL) {
- ltoa(windownum, window->refnum);
+ /* save to log created with /WINDOW LOG */
+ ltoa(windownum, window->refnum);
+ log = log_find_item(windownum);
+ if (log != NULL) log_write_rec(log, text);
- log = log_find_item(windownum);
- if (log != NULL) log_write_rec(log, text);
- }
+ /* save line to logs */
+ if (logs != NULL)
+ log_write(target, level, text);
}
static int sig_autoremove(void)
diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c
index 307f9f02..6b5735b0 100644
--- a/src/fe-common/core/hilight-text.c
+++ b/src/fe-common/core/hilight-text.c
@@ -132,7 +132,7 @@ static HILIGHT_REC *hilight_find(const char *text, char **channels)
return NULL;
}
-static void sig_print_text(SERVER_REC *server, const char *channel, gpointer level, const char *str)
+static void sig_print_text(WINDOW_REC *window, SERVER_REC *server, const char *channel, gpointer level, const char *str)
{
if (hilight_next) {
hilight_next = FALSE;
@@ -140,7 +140,7 @@ static void sig_print_text(SERVER_REC *server, const char *channel, gpointer lev
}
}
-static void sig_print_text_stripped(SERVER_REC *server, const char *channel, gpointer plevel, const char *str)
+static void sig_print_text_stripped(WINDOW_REC *window, SERVER_REC *server, const char *channel, gpointer plevel, const char *str)
{
GSList *tmp;
char *color, *newstr;
@@ -184,7 +184,7 @@ static void sig_print_text_stripped(SERVER_REC *server, const char *channel, gpo
if (color == NULL) color = "\00316";
newstr = g_strconcat(isdigit(*color) ? "\003" : "", color, str, NULL);
- signal_emit("print text", 4, server, channel, GINT_TO_POINTER(level | MSGLEVEL_HILIGHT), newstr);
+ signal_emit("print text", 5, window, server, channel, GINT_TO_POINTER(level | MSGLEVEL_HILIGHT), newstr);
g_free(newstr);
hilight_next = TRUE;
diff --git a/src/fe-common/core/keyboard.c b/src/fe-common/core/keyboard.c
index 854d4d7e..0406c758 100644
--- a/src/fe-common/core/keyboard.c
+++ b/src/fe-common/core/keyboard.c
@@ -258,12 +258,6 @@ static void read_keyboard_config(void)
CONFIG_NODE *node;
GSList *tmp;
- while (keyinfos != NULL)
- keyinfo_remove(keyinfos->data);
- if (keys != NULL) g_hash_table_destroy(keys);
-
- keys = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
-
node = iconfig_node_traverse("keyboard", FALSE);
if (node == NULL) return;
@@ -280,7 +274,9 @@ static void read_keyboard_config(void)
void keyboard_init(void)
{
- keyinfos = NULL; keys = NULL;
+ keys = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
+ keyinfos = NULL;
+
key_bind("command", NULL, "Run any IRC command", NULL, (SIGNAL_FUNC) sig_command);
read_keyboard_config();
diff --git a/src/fe-common/core/module-formats.c b/src/fe-common/core/module-formats.c
index 5a12f6fc..a224a809 100644
--- a/src/fe-common/core/module-formats.c
+++ b/src/fe-common/core/module-formats.c
@@ -21,73 +21,75 @@
#include "module.h"
#include "printtext.h"
-FORMAT_REC fecommon_core_formats[] =
-{
- { MODULE_NAME, "Core", 0 },
-
- /* ---- */
- { NULL, "Windows", 0 },
-
- { "line_start", "%B-%W!%B-%n ", 0 },
- { "line_start_irssi", "%B-%W!%B- %WIrssi:%n ", 0 },
- { "timestamp", "[$[-2.0]3:$[-2.0]4] ", 6, { 1, 1, 1, 1, 1, 1 } },
- { "daychange", "Day changed to ${[-2.0]1}-$[-2.0]0 $2", 3, { 1, 1, 1 } },
- { "talking_with", "You are now talking with %_$0%_", 1, { 0 } },
- { "refnum_too_low", "Window number must be greater than 1", 0 },
- { "windowlist_header", "Ref Name Active item Server Level", 0 },
- { "windowlist_line", "$[3]0 %|$[20]1 $[15]2 $[15]3 $4", 5, { 1, 0, 0, 0, 0 } },
- { "windowlist_footer", "", 0 },
-
- /* ---- */
- { NULL, "Server", 0 },
-
- { "looking_up", "Looking up %_$0%_", 1, { 0 } },
- { "connecting", "Connecting to %_$0%_ %K[%n$1%K]%n port %_$2%_", 3, { 0, 0, 1 } },
- { "connection_established", "Connection to %_$0%_ established", 1, { 0 } },
- { "cant_connect", "Unable to connect server %_$0%_ port %_$1%_ %K[%n$2%K]", 3, { 0, 1, 0 } },
- { "connection_lost", "Connection lost to %_$0%_", 1, { 0 } },
- { "server_quit", "Disconnecting from server $0: %K[%n$1%K]", 2, { 0, 0 } },
- { "server_changed", "Changed to %_$2%_ server %_$1%_", 3, { 0, 0, 0 } },
- { "unknown_server_tag", "Unknown server tag %_$0%_", 1, { 0 } },
-
- /* ---- */
- { NULL, "Highlighting", 0 },
-
- { "hilight_header", "Highlights:", 0 },
- { "hilight_line", "$[-4]0 $1 $2 $3$3$4$5", 7, { 1, 0, 0, 0, 0, 0, 0 } },
- { "hilight_footer", "", 0 },
- { "hilight_not_found", "Highlight not found: $0", 1, { 0 } },
- { "hilight_removed", "Highlight removed: $0", 1, { 0 } },
-
- /* ---- */
- { NULL, "Aliases", 0 },
-
- { "alias_added", "Alias $0 added", 1, { 0 } },
- { "alias_removed", "Alias $0 removed", 1, { 0 } },
- { "alias_not_found", "No such alias: $0", 1, { 0 } },
- { "aliaslist_header", "Aliases:", 0 },
- { "aliaslist_line", "$[10]0 $1", 2, { 0, 0 } },
- { "aliaslist_footer", "", 0 },
-
- /* ---- */
- { NULL, "Logging", 0 },
-
- { "log_opened", "Log file %W$0%n opened", 1, { 0 } },
- { "log_closed", "Log file %W$0%n closed", 1, { 0 } },
- { "log_create_failed", "Couldn't create log file %W$0", 1, { 0 } },
- { "log_locked", "Log file %W$0%n is locked, probably by another running Irssi", 1, { 0 } },
- { "log_not_open", "Log file %W$0%n not open", 1, { 0 } },
- { "log_started", "Started logging to file %W$0", 1, { 0 } },
- { "log_stopped", "Stopped logging to file %W$0", 1, { 0 } },
- { "log_list_header", "Logs:", 0 },
- { "log_list", "$0: $1 $2$3$4", 5, { 0, 0, 0, 0, 0 } },
- { "log_list_footer", "", 0 },
- { "windowlog_file", "Window LOGFILE set to $0", 1, { 0 } },
- { "windowlog_file_logging", "Can't change window's logfile while log is on", 0 },
-
- /* ---- */
- { NULL, "Misc", 0 },
-
- { "not_toggle", "Value must be either ON, OFF or TOGGLE", 0 },
- { "perl_error", "Perl error: $0", 1, { 0 } }
+FORMAT_REC fecommon_core_formats[] = {
+ { MODULE_NAME, "Core", 0 },
+
+ /* ---- */
+ { NULL, "Windows", 0 },
+
+ { "line_start", "%B-%W!%B-%n ", 0 },
+ { "line_start_irssi", "%B-%W!%B- %WIrssi:%n ", 0 },
+ { "timestamp", "[$[-2.0]3:$[-2.0]4] ", 6, { 1, 1, 1, 1, 1, 1 } },
+ { "daychange", "Day changed to $[-2.0]{0}-$[-2.0]1 $2", 3, { 1, 1, 1 } },
+ { "talking_with", "You are now talking with %_$0%_", 1, { 0 } },
+ { "refnum_too_low", "Window number must be greater than 1", 0 },
+ { "refnum_not_found", "No such window: $0", 1, { 0 } }, /*REMOVE!!!!!!!!*/
+ { "windowlist_header", "Ref Name Active item Server Level", 0 },
+ { "windowlist_line", "$[3]0 %|$[20]1 $[15]2 $[15]3 $4", 5, { 1, 0, 0, 0, 0 } },
+ { "windowlist_footer", "", 0 },
+
+ /* ---- */
+ { NULL, "Server", 0 },
+
+ { "looking_up", "Looking up %_$0%_", 1, { 0 } },
+ { "connecting", "Connecting to %_$0%_ %K[%n$1%K]%n port %_$2%_", 3, { 0, 0, 1 } },
+ { "connection_established", "Connection to %_$0%_ established", 1, { 0 } },
+ { "cant_connect", "Unable to connect server %_$0%_ port %_$1%_ %K[%n$2%K]", 3, { 0, 1, 0 } },
+ { "connection_lost", "Connection lost to %_$0%_", 1, { 0 } },
+ { "server_quit", "Disconnecting from server $0: %K[%n$1%K]", 2, { 0, 0 } },
+ { "server_changed", "Changed to %_$2%_ server %_$1%_", 3, { 0, 0, 0 } },
+ { "unknown_server_tag", "Unknown server tag %_$0%_", 1, { 0 } },
+
+ /* ---- */
+ { NULL, "Highlighting", 0 },
+
+ { "hilight_header", "Highlights:", 0 },
+ { "hilight_line", "$[-4]0 $1 $2 $3$3$4$5", 7, { 1, 0, 0, 0, 0, 0, 0 } },
+ { "hilight_footer", "", 0 },
+ { "hilight_not_found", "Highlight not found: $0", 1, { 0 } },
+ { "hilight_removed", "Highlight removed: $0", 1, { 0 } },
+
+ /* ---- */
+ { NULL, "Aliases", 0 },
+
+ { "alias_added", "Alias $0 added", 1, { 0 } },
+ { "alias_removed", "Alias $0 removed", 1, { 0 } },
+ { "alias_not_found", "No such alias: $0", 1, { 0 } },
+ { "aliaslist_header", "Aliases:", 0 },
+ { "aliaslist_line", "$[10]0 $1", 2, { 0, 0 } },
+ { "aliaslist_footer", "", 0 },
+
+ /* ---- */
+ { NULL, "Logging", 0 },
+
+ { "log_opened", "Log file %W$0%n opened", 1, { 0 } },
+ { "log_closed", "Log file %W$0%n closed", 1, { 0 } },
+ { "log_create_failed", "Couldn't create log file %W$0", 1, { 0 } },
+ { "log_locked", "Log file %W$0%n is locked, probably by another running Irssi", 1, { 0 } },
+ { "log_not_open", "Log file %W$0%n not open", 1, { 0 } },
+ { "log_started", "Started logging to file %W$0", 1, { 0 } },
+ { "log_stopped", "Stopped logging to file %W$0", 1, { 0 } },
+ { "log_list_header", "Logs:", 0 },
+ { "log_list", "$0: $1 $2$3$4", 5, { 0, 0, 0, 0, 0 } },
+ { "log_list_footer", "", 0 },
+ { "windowlog_file", "Window LOGFILE set to $0", 1, { 0 } },
+ { "windowlog_file_logging", "Can't change window's logfile while log is on", 0 },
+
+ /* ---- */
+ { NULL, "Misc", 0 },
+
+ { "not_toggle", "Value must be either ON, OFF or TOGGLE", 0 },
+ { "perl_error", "Perl error: $0", 1, { 0 } },
+
+ { NULL, NULL, 0 }
};
diff --git a/src/fe-common/core/module-formats.h b/src/fe-common/core/module-formats.h
index 94392763..137c718f 100644
--- a/src/fe-common/core/module-formats.h
+++ b/src/fe-common/core/module-formats.h
@@ -65,6 +65,3 @@ enum {
};
extern FORMAT_REC fecommon_core_formats[];
-#define MODULE_FORMATS fecommon_core_formats
-
-#include "printformat.h"
diff --git a/src/fe-common/core/printformat.h b/src/fe-common/core/printformat.h
deleted file mode 100644
index e1dcf761..00000000
--- a/src/fe-common/core/printformat.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* printformat(...) = printformat_format(module_formats, ...)
-
- Could this be any harder? :) With GNU C compiler and C99 compilers,
- use #define. With others use either inline functions if they are
- supported or static functions if they are not..
- */
-#if defined (__GNUC__) && !defined (__STRICT_ANSI__)
-/* GCC */
-# define printformat(server, channel, level, formatnum...) \
- printformat_format(MODULE_FORMATS, server, channel, level, ##formatnum)
-#elif defined (_ISOC99_SOURCE)
-/* C99 */
-# define printformat(server, channel, level, formatnum, ...) \
- printformat_format(MODULE_FORMATS, server, channel, level, formatnum, __VA_ARGS__)
-#else
-/* inline/static */
-static
-#ifdef G_CAN_INLINE
-inline
-#endif
-void printformat(void *server, const char *channel, int level, int formatnum, ...)
-{
- printformat_format(MODULE_FORMATS, server, channel, level, formatnum);
-}
-#endif
diff --git a/src/fe-common/core/printtext.c b/src/fe-common/core/printtext.c
index 7152e910..c499388f 100644
--- a/src/fe-common/core/printtext.c
+++ b/src/fe-common/core/printtext.c
@@ -33,251 +33,242 @@
#include "themes.h"
#include "windows.h"
-static gboolean timestamps, msgs_timestamps, hide_text_style;
-static gint printtag;
-static gchar ansitab[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
+typedef struct {
+ WINDOW_REC *window;
+ void *server;
+ const char *channel;
+ int level;
+} TEXT_DEST_REC;
-static gint signal_gui_print_text;
-static gint signal_print_text_stripped;
-static gint signal_print_text;
-static gint signal_print_text_finished;
+static int timestamps, msgs_timestamps, hide_text_style;
+static int timestamp_timeout;
+
+static int signal_gui_print_text;
+static int signal_print_text_stripped;
+static int signal_print_text;
+static int signal_print_text_finished;
+
+static void print_string(TEXT_DEST_REC *dest, const char *text);
void printbeep(void)
{
- signal_emit_id(signal_gui_print_text, 6, active_win, NULL, NULL,
- GINT_TO_POINTER(PRINTFLAG_BEEP), "", MSGLEVEL_NEVER);
+ signal_emit_id(signal_gui_print_text, 6, active_win, NULL, NULL,
+ GINT_TO_POINTER(PRINTFLAG_BEEP), "", MSGLEVEL_NEVER);
}
-/* parse ANSI color string */
-static char *convert_ansi(char *str, int *fgcolor, int *bgcolor, int *flags)
+static void skip_mirc_color(char **str)
{
- gchar *start;
- gint fg, bg, fl, num;
+ if (!isdigit((int) **str))
+ return;
- if (*str != '[') return str;
+ /* foreground */
+ (*str)++;
+ if (isdigit((int) **str)) (*str)++;
- start = str;
+ if (**str != ',' || !isdigit((int) (*str)[1])) return;
- fg = *fgcolor < 0 ? current_theme->default_color : *fgcolor;
- bg = *bgcolor < 0 ? -1 : *bgcolor;
- fl = *flags;
+ /* background */
+ (*str) += 2;
+ if (isdigit((int) **str)) (*str)++;
+}
- str++; num = 0;
- for (;; str++)
- {
- if (*str == '\0') return start;
+#define is_color_code(c) \
+ ((c) == 2 || (c) == 3 || (c) == 4 || (c) == 6 || (c) == 7 || \
+ (c) == 15 || (c) == 22 || (c) == 27 || (c) == 31)
- if (isdigit((gint) *str))
- {
- num = num*10 + (*str-'0');
- continue;
- }
+char *strip_codes(const char *input)
+{
+ const char *p;
+ char *str, *out;
+
+ out = str = g_strdup(input);
+ for (p = input; *p != '\0'; p++) {
+ if (*p == 3) {
+ p++;
+
+ if (*p < 17 && *p > 0) {
+ /* irssi color */
+ if (p[1] < 17 && p[1] > 0) p++;
+ continue;
+ }
- if (*str != ';' && *str != 'm') return start;
+ /* mirc color */
+ skip_mirc_color((char **) &p);
+ p--;
+ continue;
+ }
- switch (num)
- {
- case 0:
- /* reset colors back to default */
- fg = current_theme->default_color;
- bg = -1;
- break;
- case 1:
- /* hilight */
- fg |= 8;
- break;
- case 5:
- /* blink */
- bg = bg == -1 ? 8 : bg | 8;
- break;
- case 7:
- /* reverse */
- fl |= PRINTFLAG_REVERSE;
- break;
- default:
- if (num >= 30 && num <= 37)
- fg = (fg & 0xf8) + ansitab[num-30];
- if (num >= 40 && num <= 47)
- {
- if (bg == -1) bg = 0;
- bg = (bg & 0xf8) + ansitab[num-40];
- }
- break;
- }
- num = 0;
+ if (*p == 4 && p[1] != '\0' && p[2] != '\0') {
+ /* irssi color */
+ p += 2;
+ continue;
+ }
- if (*str == 'm')
- {
- if (!hide_text_style)
- {
- *fgcolor = fg;
- *bgcolor = bg == -1 ? -1 : bg;
- *flags = fl;
- }
- str++;
- break;
- }
- }
+ if (!is_color_code(*p))
+ *out++ = *p;
+ }
- return str;
+ *out = '\0';
+ return str;
}
-#define IN_COLOR_CODE 2
-#define IN_SECOND_CODE 4
-char *strip_codes(const char *input)
+/* parse ANSI color string */
+static char *convert_ansi(char *str, int *fgcolor, int *bgcolor, int *flags)
{
- const char *p;
- gchar *str, *out;
- gint loop_state;
+ static char ansitab[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
+ char *start;
+ int fg, bg, fl, num;
- loop_state = 0;
- out = str = g_strdup(input);
- for (p = input; *p != '\0'; p++) /* Going through the string till the end k? */
- {
- if (*p == '\003')
- {
- if (p[1] < 17 && p[1] > 0)
- {
- p++;
- if (p[1] < 17 && p[1] > 0) p++;
- continue;
- }
- loop_state = IN_COLOR_CODE;
- continue;
- }
+ if (*str != '[')
+ return str;
+ start = str++;
- if (loop_state & IN_COLOR_CODE)
- {
- if (isdigit( (gint) *p )) continue;
- if (*p != ',' || (loop_state & IN_SECOND_CODE))
- {
- /* we're no longer in a color code */
- *out++ = *p;
- loop_state &= ~IN_COLOR_CODE|IN_SECOND_CODE;
- continue;
- }
+ fg = *fgcolor < 0 ? current_theme->default_color : *fgcolor;
+ bg = *bgcolor < 0 ? -1 : *bgcolor;
+ fl = *flags;
- /* we're in the second code */
- loop_state |= IN_SECOND_CODE;
- continue;
+ num = 0;
+ for (;; str++) {
+ if (*str == '\0') return start;
- }
+ if (isdigit((int) *str)) {
+ num = num*10 + (*str-'0');
+ continue;
+ }
- /* we're not in a color code that means we should add the character */
- if (*p == 4 && p[1] != '\0' && p[2] != '\0')
- {
- p += 2;
- continue;
- }
+ if (*str != ';' && *str != 'm')
+ return start;
- if (*p == 2 || *p == 22 || *p == 27 || *p == 31 || *p == 15)
- continue;
- *out++ = *p;
- }
+ switch (num) {
+ case 0:
+ /* reset colors back to default */
+ fg = current_theme->default_color;
+ bg = -1;
+ break;
+ case 1:
+ /* hilight */
+ fg |= 8;
+ break;
+ case 5:
+ /* blink */
+ bg = bg == -1 ? 8 : bg | 8;
+ break;
+ case 7:
+ /* reverse */
+ fl |= PRINTFLAG_REVERSE;
+ break;
+ default:
+ if (num >= 30 && num <= 37)
+ fg = (fg & 0xf8) + ansitab[num-30];
+ if (num >= 40 && num <= 47) {
+ if (bg == -1) bg = 0;
+ bg = (bg & 0xf8) + ansitab[num-40];
+ }
+ break;
+ }
+ num = 0;
+
+ if (*str == 'm') {
+ if (!hide_text_style) {
+ *fgcolor = fg;
+ *bgcolor = bg == -1 ? -1 : bg;
+ *flags = fl;
+ }
+ str++;
+ break;
+ }
+ }
- *out = '\0';
- return str;
+ return str;
}
-static gboolean expand_styles(GString *out, char format, void *server, const char *channel, int level)
+static int expand_styles(GString *out, char format, TEXT_DEST_REC *dest)
{
- static const char *backs = "01234567";
- static const char *fores = "krgybmcw";
- static const char *boldfores = "KRGYBMCW";
- gchar *p;
-
- /* p/P -> m/M */
- if (format == 'p')
- format = 'm';
- else if (format == 'P')
- format = 'M';
-
- switch (format)
- {
- case 'U':
- /* Underline on/off */
- g_string_append_c(out, 4);
- g_string_append_c(out, -1);
- g_string_append_c(out, 2);
- break;
+ static const char *backs = "04261537";
+ static const char *fores = "kbgcrmyw";
+ static const char *boldfores = "KBGCRMYW";
+ char *p;
+
+ switch (format) {
+ case 'U':
+ /* Underline on/off */
+ g_string_append_c(out, 4);
+ g_string_append_c(out, -1);
+ g_string_append_c(out, 2);
+ break;
case '9':
case '_':
- /* bold on/off */
- g_string_append_c(out, 4);
- g_string_append_c(out, -1);
- g_string_append_c(out, 1);
- break;
+ /* bold on/off */
+ g_string_append_c(out, 4);
+ g_string_append_c(out, -1);
+ g_string_append_c(out, 1);
+ break;
case '8':
- /* reverse */
- g_string_append_c(out, 4);
- g_string_append_c(out, -1);
- g_string_append_c(out, 3);
- break;
+ /* reverse */
+ g_string_append_c(out, 4);
+ g_string_append_c(out, -1);
+ g_string_append_c(out, 3);
+ break;
case '%':
- g_string_append_c(out, '%');
- break;
+ g_string_append_c(out, '%');
+ break;
case ':':
- /* Newline */
- printtext(server, channel, level, out->str);
- g_string_truncate(out, 0);
- break;
-
+ /* Newline */
+ print_string(dest, out->str);
+ g_string_truncate(out, 0);
+ break;
case '|':
- /* Indent here mark */
- g_string_append_c(out, 4);
- g_string_append_c(out, -1);
- g_string_append_c(out, 4);
- break;
-
+ /* Indent here */
+ g_string_append_c(out, 4);
+ g_string_append_c(out, -1);
+ g_string_append_c(out, 4);
+ break;
case 'F':
- /* flashing - ignore */
- break;
-
+ /* flashing - ignore */
+ break;
case 'N':
- /* don't put clear-color tag at the end of the output - ignore */
- break;
-
+ /* don't put clear-color tag at the end of the output - ignore */
+ break;
case 'n':
- /* default color */
- g_string_append_c(out, 4);
- g_string_append_c(out, -1);
- g_string_append_c(out, -1);
- break;
-
- default:
- /* check if it's a background color */
- p = strchr(backs, format);
- if (p != NULL)
- {
+ /* default color */
g_string_append_c(out, 4);
- g_string_append_c(out, -2);
- g_string_append_c(out, ansitab[(gint) (p-backs)]+1);
+ g_string_append_c(out, -1);
+ g_string_append_c(out, -1);
break;
- }
+ default:
+ /* check if it's a background color */
+ p = strchr(backs, format);
+ if (p != NULL) {
+ g_string_append_c(out, 4);
+ g_string_append_c(out, -2);
+ g_string_append_c(out, (int) (p-backs)+1);
+ break;
+ }
- /* check if it's a foreground color */
- p = strchr(fores, format);
- if (p != NULL)
- {
- g_string_append_c(out, 4);
- g_string_append_c(out, ansitab[(gint) (p-fores)]+1);
- g_string_append_c(out, -2);
- break;
- }
+ /* check if it's a foreground color */
+ if (format == 'p') format = 'm';
+ p = strchr(fores, format);
+ if (p != NULL) {
+ g_string_append_c(out, 4);
+ g_string_append_c(out, (int) (p-fores)+1);
+ g_string_append_c(out, -2);
+ break;
+ }
- /* check if it's a bold foreground color */
- p = strchr(boldfores, format);
- if (p != NULL)
- {
- g_string_append_c(out, 4);
- g_string_append_c(out, 8+ansitab[(gint) (p-boldfores)]+1);
- g_string_append_c(out, -2);
- break;
- }
- return FALSE;
- }
+ /* check if it's a bold foreground color */
+ if (format == 'P') format = 'M';
+ p = strchr(boldfores, format);
+ if (p != NULL) {
+ g_string_append_c(out, 4);
+ g_string_append_c(out, 8+(int) (p-boldfores)+1);
+ g_string_append_c(out, -2);
+ break;
+ }
+
+ return FALSE;
+ }
- return TRUE;
+ return TRUE;
}
static void read_arglist(va_list va, FORMAT_REC *format,
@@ -287,12 +278,13 @@ static void read_arglist(va_list va, FORMAT_REC *format,
int num, len, bufpos;
bufpos = 0;
+ arglist[format->params] = NULL;
for (num = 0; num < format->params && num < arglist_size; num++) {
switch (format->paramtypes[num]) {
case FORMAT_STRING:
arglist[num] = (char *) va_arg(va, char *);
if (arglist[num] == NULL) {
- g_warning("output_format_text_args() : parameter %d is NULL", num);
+ g_warning("read_arglist() : parameter %d is NULL", num);
arglist[num] = "";
}
break;
@@ -342,28 +334,32 @@ static void read_arglist(va_list va, FORMAT_REC *format,
}
}
-static void output_format_text_args(GString *out, void *server, const char *channel, int level, FORMAT_REC *format, const char *text, va_list args)
+static char *output_format_text_args(TEXT_DEST_REC *dest, FORMAT_REC *format, const char *text, va_list args)
{
+ GString *out;
char *arglist[10];
char buffer[200]; /* should be enough? (won't overflow even if it isn't) */
const char *str;
- char code;
+ char code, *ret;
int need_free;
str = current_theme != NULL && text != NULL ? text : format->def;
/* read all optional arguments to arglist[] list
so they can be used in any order.. */
+ memset(arglist, 0, sizeof(arglist)); /*REMOVE!!!!!!!*/
read_arglist(args, format,
arglist, sizeof(arglist)/sizeof(void*),
buffer, sizeof(buffer));
+ out = g_string_new(NULL);
+
code = 0;
while (*str != '\0') {
if (code == '%') {
/* color code */
- if (!expand_styles(out, *str, server, channel, level)) {
+ if (!expand_styles(out, *str, dest)) {
g_string_append_c(out, '%');
g_string_append_c(out, '%');
g_string_append_c(out, *str);
@@ -373,7 +369,8 @@ static void output_format_text_args(GString *out, void *server, const char *chan
/* argument */
char *ret;
- ret = parse_special((char **) &str, active_win->active_server, active_win->active, arglist, &need_free, NULL);
+ ret = parse_special((char **) &str, active_win->active_server,
+ active_win->active, arglist, &need_free, NULL);
if (ret != NULL) {
g_string_append(out, ret);
if (need_free) g_free(ret);
@@ -388,165 +385,233 @@ static void output_format_text_args(GString *out, void *server, const char *chan
str++;
}
+
+ ret = out->str;
+ g_string_free(out, FALSE);
+ return ret;
}
-static void output_format_text(GString *out, void *server, const char *channel, int level, int formatnum, ...)
+static char *output_format_text(TEXT_DEST_REC *dest, int formatnum, ...)
{
MODULE_THEME_REC *theme;
va_list args;
+ char *ret;
- theme = g_hash_table_lookup(current_theme->modules, MODULE_FORMATS->tag);
+ theme = g_hash_table_lookup(current_theme->modules, MODULE_NAME);
va_start(args, formatnum);
- output_format_text_args(out, server, channel, level,
- &MODULE_FORMATS[formatnum],
- theme == NULL ? NULL : theme->format[formatnum], args);
+ ret = output_format_text_args(dest, &fecommon_core_formats[formatnum],
+ theme == NULL ? NULL : theme->formats[formatnum], args);
va_end(args);
+
+ return ret;
}
-static void add_timestamp(WINDOW_REC *window, GString *out, void *server, const char *channel, int level)
+void printformat_module_args(const char *module, void *server, const char *channel, int level, int formatnum, va_list va)
{
- time_t t;
- struct tm *tm;
- GString *tmp;
+ MODULE_THEME_REC *theme;
+ TEXT_DEST_REC dest;
+ FORMAT_REC *formats;
+ char *str;
- if (!(level != MSGLEVEL_NEVER && (timestamps || (msgs_timestamps && (level & MSGLEVEL_MSGS) != 0))))
- return;
+ dest.window = NULL;
+ dest.server = server;
+ dest.channel = channel;
+ dest.level = level;
- t = time(NULL);
+ theme = g_hash_table_lookup(current_theme->modules, module);
+ formats = g_hash_table_lookup(default_formats, module);
- if ((t - window->last_timestamp) < settings_get_int("timestamp_timeout")) {
- window->last_timestamp = t;
- return;
- }
- window->last_timestamp = t;
+ str = output_format_text_args(&dest, &formats[formatnum],
+ theme == NULL ? NULL : theme->formats[formatnum], va);
+ if (*str != '\0') print_string(&dest, str);
+ g_free(str);
+}
- tmp = g_string_new(NULL);
- tm = localtime(&t);
- output_format_text(tmp, server, channel, level, IRCTXT_TIMESTAMP,
- tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+void printformat_module(const char *module, void *server, const char *channel, int level, int formatnum, ...)
+{
+ va_list va;
- /* insert the timestamp right after \n */
- g_string_prepend(out, tmp->str);
- g_string_free(tmp, TRUE);
+ va_start(va, formatnum);
+ printformat_module_args(module, server, channel, level, formatnum, va);
+ va_end(va);
}
-static void new_line_stuff(GString *out, void *server, const char *channel, int level)
+void printformat_module_window_args(const char *module, WINDOW_REC *window, int level, int formatnum, va_list va)
{
- if ((level & (MSGLEVEL_CLIENTERROR|MSGLEVEL_CLIENTNOTICE)) != 0)
- output_format_text(out, server, channel, level, IRCTXT_LINE_START_IRSSI);
- else if ((level & (MSGLEVEL_MSGS|MSGLEVEL_PUBLIC|MSGLEVEL_NOTICES|MSGLEVEL_SNOTES|MSGLEVEL_CTCPS|MSGLEVEL_ACTIONS|MSGLEVEL_DCC|MSGLEVEL_CLIENTCRAP)) == 0 && level != MSGLEVEL_NEVER)
- output_format_text(out, server, channel, level, IRCTXT_LINE_START);
+ MODULE_THEME_REC *theme;
+ TEXT_DEST_REC dest;
+ FORMAT_REC *formats;
+ char *str;
+
+ dest.window = window;
+ dest.server = NULL;
+ dest.channel = NULL;
+ dest.level = level;
+
+ theme = g_hash_table_lookup(current_theme->modules, module);
+ formats = g_hash_table_lookup(default_formats, module);
+
+ str = output_format_text_args(&dest, &formats[formatnum],
+ theme == NULL ? NULL : theme->formats[formatnum], va);
+ if (*str != '\0') print_string(&dest, str);
+ g_free(str);
}
-/* Write text to channel - convert color codes */
-void printtext(void *server, const char *channel, int level, const char *str, ...)
+void printformat_module_window(const char *module, WINDOW_REC *window, int level, int formatnum, ...)
+{
+ va_list va;
+
+ va_start(va, formatnum);
+ printformat_module_window_args(module, window, level, formatnum, va);
+ va_end(va);
+}
+
+/* return the "-!- " text at the start of the line */
+static char *get_line_start_text(TEXT_DEST_REC *dest)
{
- va_list args;
- GString *out;
- gchar *tmpstr;
- gint pros;
+ if ((dest->level & (MSGLEVEL_CLIENTERROR|MSGLEVEL_CLIENTNOTICE)) != 0)
+ return output_format_text(dest, IRCTXT_LINE_START_IRSSI);
- g_return_if_fail(str != NULL);
+ if ((dest->level & (MSGLEVEL_MSGS|MSGLEVEL_PUBLIC|MSGLEVEL_NOTICES|MSGLEVEL_SNOTES|MSGLEVEL_CTCPS|MSGLEVEL_ACTIONS|MSGLEVEL_DCC|MSGLEVEL_CLIENTCRAP)) == 0 && dest->level != MSGLEVEL_NEVER)
+ return output_format_text(dest, IRCTXT_LINE_START);
- va_start(args, str);
+ return NULL;
+}
- pros = 0;
- out = g_string_new(NULL);
+static void print_string(TEXT_DEST_REC *dest, const char *text)
+{
+ gpointer levelp;
+ char *str, *tmp;
- new_line_stuff(out, server, channel, level);
- for (; *str != '\0'; str++)
- {
- if (*str != '%')
- {
- g_string_append_c(out, *str);
- continue;
- }
+ g_return_if_fail(dest != NULL);
+ g_return_if_fail(text != NULL);
- if (*++str == '\0') break;
- switch (*str)
- {
- /* standard parameters */
- case 's':
- {
- gchar *s = (gchar *) va_arg(args, gchar *);
- if (s && *s) g_string_append(out, s);
- break;
- }
- case 'd':
- {
- gint d = (gint) va_arg(args, gint);
- g_string_sprintfa(out, "%d", d);
- break;
- }
- case 'f':
- {
- gdouble f = (gdouble) va_arg(args, gdouble);
- g_string_sprintfa(out, "%0.2f", f);
- break;
- }
- case 'u':
- {
- guint d = (guint) va_arg(args, guint);
- g_string_sprintfa(out, "%u", d);
- break;
- }
- case 'l':
- {
- gulong d = (gulong) va_arg(args, gulong);
- if (*++str != 'd' && *str != 'u')
- {
- g_string_sprintfa(out, "%ld", d);
- str--;
- }
- else
- {
- if (*str == 'd')
- g_string_sprintfa(out, "%ld", d);
- else
- g_string_sprintfa(out, "%lu", d);
- }
- break;
- }
- default:
- if (!expand_styles(out, *str, server, channel, level))
- {
- g_string_append_c(out, '%');
- g_string_append_c(out, *str);
- }
- break;
- }
- }
- va_end(args);
+ if (dest->window == NULL)
+ dest->window = window_find_closest(dest->server, dest->channel, dest->level);
+
+ tmp = get_line_start_text(dest);
+ str = tmp == NULL ? (char *) text :
+ g_strconcat(tmp, text, NULL);
+ g_free_not_null(tmp);
- /* send the plain text version for logging.. */
- tmpstr = strip_codes(out->str);
- signal_emit_id(signal_print_text_stripped, 4, server, channel, GINT_TO_POINTER(level), tmpstr);
- g_free(tmpstr);
+ levelp = GINT_TO_POINTER(dest->level);
- signal_emit_id(signal_print_text, 4, server, channel, GINT_TO_POINTER(level), out->str);
+ /* send the plain text version for logging etc.. */
+ tmp = strip_codes(str);
+ signal_emit_id(signal_print_text_stripped, 5, dest->window, dest->server, dest->channel, levelp, tmp);
+ g_free(tmp);
- g_string_free(out, TRUE);
+ signal_emit_id(signal_print_text, 5, dest->window, dest->server, dest->channel, levelp, str);
+ if (str != text) g_free(str);
}
-void printformat_format(FORMAT_REC *formats, void *server, const char *channel, int level, int formatnum, ...)
+static char *printtext_get_args(TEXT_DEST_REC *dest, const char *str, va_list va)
{
- MODULE_THEME_REC *theme;
GString *out;
- va_list args;
+ char *ret;
- va_start(args, formatnum);
out = g_string_new(NULL);
+ for (; *str != '\0'; str++) {
+ if (*str != '%') {
+ g_string_append_c(out, *str);
+ continue;
+ }
- theme = g_hash_table_lookup(current_theme->modules, formats->tag);
+ if (*++str == '\0')
+ break;
- output_format_text_args(out, server, channel, level,
- &formats[formatnum],
- theme == NULL ? NULL : theme->format[formatnum], args);
- if (out->len > 0) printtext(server, channel, level, "%s", out->str);
+ /* standard parameters */
+ switch (*str) {
+ case 's': {
+ char *s = (char *) va_arg(va, char *);
+ if (s && *s) g_string_append(out, s);
+ break;
+ }
+ case 'd': {
+ int d = (int) va_arg(va, int);
+ g_string_sprintfa(out, "%d", d);
+ break;
+ }
+ case 'f': {
+ double f = (double) va_arg(va, double);
+ g_string_sprintfa(out, "%0.2f", f);
+ break;
+ }
+ case 'u': {
+ unsigned int d = (unsigned int) va_arg(va, unsigned int);
+ g_string_sprintfa(out, "%u", d);
+ break;
+ }
+ case 'l': {
+ long d = (long) va_arg(va, long);
+
+ if (*++str != 'd' && *str != 'u') {
+ g_string_sprintfa(out, "%ld", d);
+ str--;
+ } else {
+ if (*str == 'd')
+ g_string_sprintfa(out, "%ld", d);
+ else
+ g_string_sprintfa(out, "%lu", d);
+ }
+ break;
+ }
+ default:
+ if (!expand_styles(out, *str, dest)) {
+ g_string_append_c(out, '%');
+ g_string_append_c(out, *str);
+ }
+ break;
+ }
+ }
- g_string_free(out, TRUE);
- va_end(args);
+ ret = out->str;
+ g_string_free(out, FALSE);
+ return ret;
+}
+
+/* Write text to channel - convert color codes */
+void printtext(void *server, const char *channel, int level, const char *text, ...)
+{
+ TEXT_DEST_REC dest;
+ char *str;
+ va_list va;
+
+ g_return_if_fail(text != NULL);
+
+ dest.window = NULL;
+ dest.server = server;
+ dest.channel = channel;
+ dest.level = level;
+
+ va_start(va, text);
+ str = printtext_get_args(&dest, text, va);
+ va_end(va);
+
+ print_string(&dest, str);
+ g_free(str);
+}
+
+void printtext_window(WINDOW_REC *window, int level, const char *text, ...)
+{
+ TEXT_DEST_REC dest;
+ char *str;
+ va_list va;
+
+ g_return_if_fail(text != NULL);
+
+ dest.window = window != NULL ? window : active_win;
+ dest.server = NULL;
+ dest.channel = NULL;
+ dest.level = level;
+
+ va_start(va, text);
+ str = printtext_get_args(&dest, text, va);
+ va_end(va);
+
+ print_string(&dest, str);
+ g_free(str);
}
static void newline(WINDOW_REC *window)
@@ -559,48 +624,74 @@ static void newline(WINDOW_REC *window)
}
}
-static void sig_print_text(void *server, const char *target, gpointer level, const char *text)
+#define show_timestamp(level) \
+ ((level) != MSGLEVEL_NEVER && \
+ (timestamps || (msgs_timestamps && ((level) & MSGLEVEL_MSGS))))
+
+static char *get_timestamp(TEXT_DEST_REC *dest)
{
- WINDOW_REC *window;
- GString *out;
- gchar *dup, *ptr, type, *str;
+ struct tm *tm;
+ time_t t;
+ int diff;
+
+ if (!show_timestamp(dest->level))
+ return NULL;
+
+ t = time(NULL);
+
+ diff = t - dest->window->last_timestamp;
+ dest->window->last_timestamp = t;
+ if (diff < timestamp_timeout)
+ return NULL;
+
+ tm = localtime(&t);
+ return output_format_text(dest, IRCTXT_TIMESTAMP,
+ tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+}
+
+static char *get_server_tag(WINDOW_REC *window, SERVER_REC *server)
+{
+ if (server == NULL || servers == NULL || servers->next == NULL ||
+ (window->active != NULL && window->active->server == server))
+ return NULL;
+
+ return g_strdup_printf("[%s] ", server->tag);
+}
+
+static void sig_print_text(WINDOW_REC *window, SERVER_REC *server, const char *target, gpointer level, const char *text)
+{
+ TEXT_DEST_REC dest;
+ gchar *dup, *ptr, type, *str, *timestamp, *servertag;
gint fgcolor, bgcolor;
gint flags;
g_return_if_fail(text != NULL);
-
- window = window_find_closest(server, target, GPOINTER_TO_INT(level));
g_return_if_fail(window != NULL);
- flags = 0; fgcolor = -1; bgcolor = -1; type = '\0';
+ dest.window = window;
+ dest.server = server;
+ dest.channel = target;
+ dest.level = GPOINTER_TO_INT(level);
+ flags = 0; fgcolor = -1; bgcolor = -1; type = '\0';
window->last_line = time(NULL);
newline(window);
- out = g_string_new(text);
- if (server != NULL && servers != NULL && servers->next != NULL &&
- (window->active == NULL || window->active->server != server))
- {
- /* connected to more than one server and active server isn't the
- same where the message came or we're in status/msgs/empty window -
- prefix with a [server tag] */
- gchar *str;
-
- str = g_strdup_printf("[%s] ", ((SERVER_REC *) server)->tag);
- g_string_prepend(out, str);
- g_free(str);
- }
-
- add_timestamp(window, out, server, target, GPOINTER_TO_INT(level));
-
- dup = str = out->str;
- g_string_free(out, FALSE);
+ timestamp = get_timestamp(&dest);
+ servertag = get_server_tag(window, server);
+ str = g_strconcat(timestamp != NULL ? timestamp : "",
+ servertag != NULL ? servertag : "",
+ text, NULL);
+ g_free_not_null(timestamp);
+ g_free_not_null(servertag);
+ dup = str;
while (*str != '\0')
{
for (ptr = str; *ptr != '\0'; ptr++)
{
- if (*ptr == 2 || *ptr == 3 || *ptr == 4 || *ptr == 6 || *ptr == 7 || *ptr == 15 || *ptr == 22 || *ptr == 27 || *ptr == 31)
+ if (is_color_code(*ptr))
{
type = *ptr;
*ptr++ = '\0';
@@ -715,20 +806,7 @@ static void sig_print_text(void *server, const char *target, gpointer level, con
if (hide_text_style)
{
/* don't show them. */
- if (isdigit((gint) *ptr))
- {
- ptr++;
- if (isdigit((gint) *ptr)) ptr++;
- if (*ptr == ',')
- {
- ptr++;
- if (isdigit((gint) *ptr))
- {
- ptr++;
- if (isdigit((gint) *ptr)) ptr++;
- }
- }
- }
+ skip_mirc_color(&ptr);
break;
}
@@ -770,47 +848,6 @@ static void sig_print_text(void *server, const char *target, gpointer level, con
signal_emit_id(signal_print_text_finished, 1, window);
}
-static int sig_check_daychange(void)
-{
- static gint lastday = -1;
- GSList *tmp;
- time_t t;
- struct tm *tm;
-
- if (!timestamps)
- {
- /* display day change notice only when using timestamps */
- return TRUE;
- }
-
- t = time(NULL);
- tm = localtime(&t);
-
- if (lastday == -1)
- {
- /* First check, don't display. */
- lastday = tm->tm_mday;
- return TRUE;
- }
-
- if (tm->tm_mday == lastday)
- return TRUE;
-
- /* day changed, print notice about it to every window */
- for (tmp = windows; tmp != NULL; tmp = tmp->next)
- {
- WINDOW_REC *win = tmp->data;
-
- if (win->active == NULL)
- continue; /* FIXME: how to print in these windows? */
-
- printformat(win->active->server, win->active->name, MSGLEVEL_NEVER,
- IRCTXT_DAYCHANGE, tm->tm_mday, tm->tm_mon+1, 1900+tm->tm_year);
- }
- lastday = tm->tm_mday;
- return TRUE;
-}
-
void printtext_multiline(void *server, const char *channel, int level, const char *format, const char *text)
{
char **lines, **tmp;
@@ -837,31 +874,30 @@ static void sig_gui_dialog(const char *type, const char *text)
static void read_settings(void)
{
- timestamps = settings_get_bool("timestamps");
- msgs_timestamps = settings_get_bool("msgs_timestamps");
- hide_text_style = settings_get_bool("hide_text_style");
+ timestamps = settings_get_bool("timestamps");
+ timestamp_timeout = settings_get_bool("timestamp_timeout");
+ msgs_timestamps = settings_get_bool("msgs_timestamps");
+ hide_text_style = settings_get_bool("hide_text_style");
}
void printtext_init(void)
{
- settings_add_int("misc", "timestamp_timeout", 0);
-
- signal_gui_print_text = module_get_uniq_id_str("signals", "gui print text");
- signal_print_text_stripped = module_get_uniq_id_str("signals", "print text stripped");
- signal_print_text = module_get_uniq_id_str("signals", "print text");
- signal_print_text_finished = module_get_uniq_id_str("signals", "print text finished");
-
- read_settings();
- printtag = g_timeout_add(30000, (GSourceFunc) sig_check_daychange, NULL);
- signal_add("print text", (SIGNAL_FUNC) sig_print_text);
- signal_add("gui dialog", (SIGNAL_FUNC) sig_gui_dialog);
- signal_add("setup changed", (SIGNAL_FUNC) read_settings);
+ settings_add_int("misc", "timestamp_timeout", 0);
+
+ signal_gui_print_text = module_get_uniq_id_str("signals", "gui print text");
+ signal_print_text_stripped = module_get_uniq_id_str("signals", "print text stripped");
+ signal_print_text = module_get_uniq_id_str("signals", "print text");
+ signal_print_text_finished = module_get_uniq_id_str("signals", "print text finished");
+
+ read_settings();
+ signal_add("print text", (SIGNAL_FUNC) sig_print_text);
+ signal_add("gui dialog", (SIGNAL_FUNC) sig_gui_dialog);
+ signal_add("setup changed", (SIGNAL_FUNC) read_settings);
}
void printtext_deinit(void)
{
- g_source_remove(printtag);
- signal_remove("print text", (SIGNAL_FUNC) sig_print_text);
- signal_remove("gui dialog", (SIGNAL_FUNC) sig_gui_dialog);
- signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
+ signal_remove("print text", (SIGNAL_FUNC) sig_print_text);
+ signal_remove("gui dialog", (SIGNAL_FUNC) sig_gui_dialog);
+ signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
}
diff --git a/src/fe-common/core/printtext.h b/src/fe-common/core/printtext.h
index acd6a03e..71c5d88e 100644
--- a/src/fe-common/core/printtext.h
+++ b/src/fe-common/core/printtext.h
@@ -1,6 +1,8 @@
#ifndef __PRINTTEXT_H
#define __PRINTTEXT_H
+#include "windows.h"
+
enum {
FORMAT_STRING,
FORMAT_INT,
@@ -24,9 +26,14 @@ typedef struct {
#define PRINTFLAG_MIRC_COLOR 0x20
#define PRINTFLAG_INDENT 0x40
-void printformat_format(FORMAT_REC *formats, void *server, const char *channel, int level, int formatnum, ...);
+void printformat_module(const char *module, void *server, const char *channel, int level, int formatnum, ...);
+void printformat_module_window(const char *module, WINDOW_REC *window, int level, int formatnum, ...);
+
+void printformat_module_args(const char *module, void *server, const char *channel, int level, int formatnum, va_list va);
+void printformat_module_window_args(const char *module, WINDOW_REC *window, int level, int formatnum, va_list va);
-void printtext(void *server, const char *channel, int level, const char *str, ...);
+void printtext(void *server, const char *channel, int level, const char *text, ...);
+void printtext_window(WINDOW_REC *window, int level, const char *text, ...);
void printtext_multiline(void *server, const char *channel, int level, const char *format, const char *text);
void printbeep(void);
@@ -36,4 +43,51 @@ char *strip_codes(const char *input);
void printtext_init(void);
void printtext_deinit(void);
+/* printformat(...) = printformat_format(MODULE_NAME, ...)
+
+ Could this be any harder? :) With GNU C compiler and C99 compilers,
+ use #define. With others use either inline functions if they are
+ supported or static functions if they are not..
+ */
+#if defined (__GNUC__) && !defined (__STRICT_ANSI__)
+/* GCC */
+# define printformat(server, channel, level, formatnum...) \
+ printformat_module(MODULE_NAME, server, channel, level, ##formatnum)
+# define printformat_window(window, level, formatnum...) \
+ printformat_module_window(MODULE_NAME, window, level, ##formatnum)
+#elif defined (_ISOC99_SOURCE)
+/* C99 */
+# define printformat(server, channel, level, formatnum, ...) \
+ printformat_module(MODULE_NAME, server, channel, level, formatnum, __VA_ARGS__)
+# define printformat_window(window, level, formatnum, ...) \
+ printformat_module_window(MODULE_NAME, window, level, formatnum, __VA_ARGS__)
+#else
+/* inline/static */
+static
+#ifdef G_CAN_INLINE
+inline
+#endif
+void printformat(void *server, const char *channel, int level, int formatnum, ...)
+{
+ va_list va;
+
+ va_start(va, formatnum);
+ printformat_module_args(MODULE_NAME, server, channel, level, formatnum, va);
+ va_end(va);
+}
+
+static
+#ifdef G_CAN_INLINE
+inline
+#endif
+void printformat_window(WINDOW_REC *window, int level, int formatnum, ...)
+{
+ va_list va;
+
+ va_start(va, formatnum);
+ printformat_module_window_args(MODULE_NAME, window, level, formatnum, va);
+ va_end(va);
+}
+#endif
+
#endif
diff --git a/src/fe-common/core/themes.c b/src/fe-common/core/themes.c
index 0d9735ab..879f558c 100644
--- a/src/fe-common/core/themes.c
+++ b/src/fe-common/core/themes.c
@@ -20,6 +20,8 @@
#include "module.h"
#include "signals.h"
+#include "commands.h"
+#include "levels.h"
#include "misc.h"
#include "lib-config/iconfig.h"
#include "settings.h"
@@ -29,6 +31,7 @@
GSList *themes;
THEME_REC *current_theme;
+GHashTable *default_formats;
THEME_REC *theme_create(const char *path, const char *name)
{
@@ -46,17 +49,15 @@ THEME_REC *theme_create(const char *path, const char *name)
return rec;
}
-static void theme_destroy_hash(const char *key, MODULE_THEME_REC *rec)
+static void theme_module_destroy(const char *key, MODULE_THEME_REC *rec)
{
- int n, max;
+ int n;
- max = strarray_length(rec->formatlist);
- for (n = 0; n < max; n++)
- if (rec->format[n] != NULL)
- g_free(rec->format[n]);
- g_free(rec->format);
+ for (n = 0; n < rec->count; n++)
+ if (rec->formats[n] != NULL)
+ g_free(rec->formats[n]);
+ g_free(rec->formats);
- g_strfreev(rec->formatlist);
g_free(rec->name);
g_free(rec);
}
@@ -64,7 +65,7 @@ static void theme_destroy_hash(const char *key, MODULE_THEME_REC *rec)
void theme_destroy(THEME_REC *rec)
{
signal_emit("theme destroyed", 1, rec);
- g_hash_table_foreach(rec->modules, (GHFunc) theme_destroy_hash, NULL);
+ g_hash_table_foreach(rec->modules, (GHFunc) theme_module_destroy, NULL);
g_hash_table_destroy(rec->modules);
if (rec->bg_pixmap != NULL) g_free(rec->bg_pixmap);
@@ -74,6 +75,119 @@ void theme_destroy(THEME_REC *rec)
g_free(rec);
}
+static MODULE_THEME_REC *theme_module_create(THEME_REC *theme, const char *module)
+{
+ MODULE_THEME_REC *rec;
+ FORMAT_REC *formats;
+
+ rec = g_hash_table_lookup(theme->modules, module);
+ if (rec != NULL) return rec;
+
+ formats = g_hash_table_lookup(default_formats, module);
+ g_return_val_if_fail(formats != NULL, NULL);
+
+ rec = g_new0(MODULE_THEME_REC, 1);
+ rec->name = g_strdup(module);
+
+ for (rec->count = 0; formats[rec->count].def != NULL; rec->count++) ;
+ rec->formats = g_new0(char *, rec->count);
+
+ g_hash_table_insert(theme->modules, rec->name, rec);
+ return rec;
+}
+
+static void theme_read_formats(CONFIG_REC *config, THEME_REC *theme, const char *module)
+{
+ MODULE_THEME_REC *rec;
+ FORMAT_REC *formats;
+ CONFIG_NODE *node;
+ GSList *tmp;
+ int n;
+
+ formats = g_hash_table_lookup(default_formats, module);
+ if (formats == NULL) return;
+
+ node = config_node_traverse(config, "formats", FALSE);
+ if (node == NULL) return;
+ node = config_node_section(node, module, -1);
+ if (node == NULL) return;
+
+ rec = theme_module_create(theme, module);
+
+ for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
+ node = tmp->data;
+
+ if (node->key == NULL || node->value == NULL)
+ continue;
+
+ for (n = 0; formats[n].def != NULL; n++) {
+ if (formats[n].tag != NULL &&
+ g_strcasecmp(formats[n].tag, node->key) == 0) {
+ rec->formats[n] = g_strdup(node->value);
+ break;
+ }
+ }
+ }
+}
+
+static void theme_read_module(THEME_REC *theme, const char *module)
+{
+ CONFIG_REC *config;
+ char *msg;
+
+ config = config_open(theme->path, -1);
+ if (config == NULL) return;
+
+ config_parse(config);
+
+ if (config_last_error(mainconfig) != NULL) {
+ msg = g_strdup_printf(_("Ignored errors in theme:\n%s"),
+ config_last_error(mainconfig));
+ signal_emit("gui dialog", 2, "error", msg);
+ g_free(msg);
+ }
+
+ theme_read_formats(config, theme, module);
+
+ config_close(config);
+}
+
+static void theme_remove_module(THEME_REC *theme, const char *module)
+{
+ MODULE_THEME_REC *rec;
+
+ rec = g_hash_table_lookup(theme->modules, module);
+ if (rec == NULL) return;
+
+ g_hash_table_remove(theme->modules, module);
+ theme_module_destroy(module, rec);
+}
+
+void theme_register_module(const char *module, FORMAT_REC *formats)
+{
+ if (g_hash_table_lookup(default_formats, module) != NULL)
+ return;
+
+ g_hash_table_insert(default_formats, g_strdup(module), formats);
+
+ if (current_theme != NULL)
+ theme_read_module(current_theme, module);
+}
+
+void theme_unregister_module(const char *module)
+{
+ gpointer key, value;
+
+ if (!g_hash_table_lookup_extended(default_formats, module, &key, &value))
+ return;
+
+ g_hash_table_remove(default_formats, key);
+ g_free(key);
+
+ if (current_theme != NULL)
+ theme_remove_module(current_theme, module);
+}
+
static THEME_REC *theme_find(const char *name)
{
GSList *tmp;
@@ -115,49 +229,19 @@ static void find_themes(gchar *path)
closedir(dirp);
}
-/* Read module texts into theme */
-static void theme_read_module_texts(const char *hashkey, MODULE_THEME_REC *rec, CONFIG_REC *config)
+static void theme_read(THEME_REC *theme, const char *path)
{
- CONFIG_NODE *formats;
- GSList *tmp;
- char **flist;
- int n;
-
- formats = config_node_traverse(config, "moduleformats", FALSE);
- if (formats == NULL) return;
-
- for (tmp = formats->value; tmp != NULL; tmp = tmp->next) {
- CONFIG_NODE *node = tmp->data;
-
- if (node->key == NULL || node->value == NULL)
- continue;
-
- for (n = 0, flist = rec->formatlist; *flist != NULL; flist++, n++) {
- if (g_strcasecmp(*flist, node->key) == 0) {
- rec->format[n] = g_strdup(node->value);
- break;
- }
- }
- }
-}
-
-static int theme_read(THEME_REC *theme, const char *path)
-{
- MODULE_THEME_REC *mrec;
CONFIG_REC *config;
- CONFIG_NODE *formats;
- GSList *tmp;
char *value;
- int errors;
config = config_open(path, -1);
if (config == NULL) {
/* didn't exist or no access? */
theme->default_color = 15;
- return FALSE;
+ return;
}
- errors = config_parse(config) == -1;
+ config_parse(config);
/* default color */
theme->default_color = config_get_int(config, NULL, "default_color", 15);
@@ -175,58 +259,172 @@ static int theme_read(THEME_REC *theme, const char *path)
theme->flags |= THEME_FLAG_BG_SCALED;
if (config_get_bool(config, NULL, "bg_shaded", FALSE))
theme->flags |= THEME_FLAG_BG_SHADED;
+ config_close(config);
+}
- /* Read modules that are defined in this theme. */
- formats = config_node_traverse(config, "modules", FALSE);
- if (formats != NULL) {
- for (tmp = formats->value; tmp != NULL; tmp = tmp->next) {
- CONFIG_NODE *node = tmp->data;
+typedef struct {
+ char *name;
+ char *short_name;
+} THEME_SEARCH_REC;
+
+static int theme_search_equal(THEME_SEARCH_REC *r1, THEME_SEARCH_REC *r2)
+{
+ return g_strcasecmp(r1->short_name, r2->short_name);
+}
- if (node->key == NULL || node->value == NULL)
- continue;
+static void theme_get_modules(char *module, FORMAT_REC *formats, GSList **list)
+{
+ THEME_SEARCH_REC *rec;
+
+ rec = g_new(THEME_SEARCH_REC, 1);
+ rec->name = module;
+ rec->short_name = strrchr(module, '/');
+ if (rec->short_name != NULL)
+ rec->short_name++; else rec->short_name = module;
+ *list = g_slist_insert_sorted(*list, rec, (GCompareFunc) theme_search_equal);
+}
- mrec = g_new0(MODULE_THEME_REC, 1);
- mrec->name = g_strdup(node->key);
- mrec->formatlist = g_strsplit(node->value, " ", -1);
- mrec->format = g_new0(char*, strarray_length(mrec->formatlist));
- g_hash_table_insert(theme->modules, mrec->name, mrec);
- }
+static GSList *get_sorted_modules(void)
+{
+ GSList *list;
+
+ list = NULL;
+ g_hash_table_foreach(default_formats, (GHFunc) theme_get_modules, &list);
+ return list;
+}
+
+static THEME_SEARCH_REC *theme_search(GSList *list, const char *module)
+{
+ THEME_SEARCH_REC *rec;
+
+ while (list != NULL) {
+ rec = list->data;
+
+ if (g_strcasecmp(rec->short_name, module) == 0)
+ return rec;
+ list = list->next;
}
- /* Read the texts inside the plugin */
- g_hash_table_foreach(theme->modules, (GHFunc) theme_read_module_texts, config);
-
- if (errors) {
- /* errors fixed - save the theme */
- if (config_write(config, NULL, 0660) == -1) {
- /* we probably tried to save to global directory
- where we didn't have access.. try saving it to
- home dir instead. */
- char *str;
-
- /* check that we really didn't try to save
- it to home dir.. */
- str = g_strdup_printf("%s/.irssi/", g_get_home_dir());
- if (strncmp(path, str, strlen(str)) != 0) {
- g_free(str);
- str = g_strdup_printf("%s/.irssi/%s", g_get_home_dir(), g_basename(path));
-
- config_write(config, str, 0660);
+ return NULL;
+}
+
+static void theme_show(THEME_SEARCH_REC *rec, const char *key, const char *value)
+{
+ MODULE_THEME_REC *theme;
+ FORMAT_REC *formats;
+ const char *text, *last_title;
+ int n, first;
+
+ formats = g_hash_table_lookup(default_formats, rec->name);
+ theme = g_hash_table_lookup(current_theme->modules, rec->name);
+
+ last_title = NULL; first = TRUE;
+ for (n = 1; formats[n].def != NULL; n++) {
+ text = theme != NULL && theme->formats[n] != NULL ?
+ theme->formats[n] : formats[n].def;
+
+ if (formats[n].tag == NULL)
+ last_title = text;
+ else if ((value != NULL && key != NULL && g_strcasecmp(formats[n].tag, key) == 0) ||
+ (value == NULL && (key == NULL || stristr(formats[n].tag, key) != NULL))) {
+ if (first) {
+ printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "");
+ printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "%K[%W%s%K] - [%W%s%K]", rec->short_name, formats[0].def);
+ printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "");
+ first = FALSE;
}
- g_free(str);
+ if (last_title != NULL)
+ printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "%K[%W%s%K]", last_title);
+ if (value != NULL) {
+ theme = theme_module_create(current_theme, rec->name);
+ theme->formats[n] = g_strdup(value);
+ text = value;
+ }
+ printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "%s %K=%n %s", formats[n].tag, text);
+ last_title = NULL;
}
}
- config_close(config);
+}
+
+static void cmd_format(const char *data)
+{
+ char *params, *module, *key, *value;
+ GSList *tmp, *modules;
+
+ /* /FORMAT [<module>] [<key> [<value>]] */
+ params = cmd_get_params(data, 3 | PARAM_FLAG_GETREST, &module, &key, &value);
+
+ modules = get_sorted_modules();
+ if (*module != '\0' && theme_search(modules, module) == NULL) {
+ /* first argument isn't module.. */
+ g_free(params);
+ params = cmd_get_params(data, 2 | PARAM_FLAG_GETREST, &key, &value);
+ module = "";
+ }
+
+ if (*key == '\0') key = NULL;
+ if (*value == '\0') value = NULL;
+
+ for (tmp = modules; tmp != NULL; tmp = tmp->next) {
+ THEME_SEARCH_REC *rec = tmp->data;
+
+ if (*module == '\0' || g_strcasecmp(rec->short_name, module) == 0)
+ theme_show(rec, key, value);
+ }
+ g_slist_foreach(modules, (GFunc) g_free, NULL);
+ g_slist_free(modules);
- return errors;
+ g_free(params);
}
-static void sig_formats_error(void)
+static void module_save(const char *module, MODULE_THEME_REC *rec, CONFIG_NODE *fnode)
{
- signal_emit("gui dialog", 2, "warning",
- "Your theme(s) had some old format strings, "
- "these have been changed back to their default values.");
- signal_remove("irssi init finished", (SIGNAL_FUNC) sig_formats_error);
+ CONFIG_NODE *node;
+ FORMAT_REC *formats;
+ int n;
+
+ formats = g_hash_table_lookup(default_formats, rec->name);
+ if (formats == NULL) return;
+
+ node = config_node_section(fnode, rec->name, NODE_TYPE_BLOCK);
+ for (n = 0; formats[n].def != NULL; n++) {
+ if (rec->formats[n] != NULL)
+ iconfig_node_set_str(node, formats[n].tag, rec->formats[n]);
+ }
+}
+
+/* save changed formats */
+static void cmd_save(void)
+{
+ CONFIG_REC *config;
+ CONFIG_NODE *fnode;
+
+ config = config_open(current_theme->path, 0660);
+ if (config == NULL) return;
+
+ config_parse(config);
+
+ fnode = config_node_traverse(config, "formats", TRUE);
+ g_hash_table_foreach(current_theme->modules, (GHFunc) module_save, fnode);
+
+ if (config_write(config, NULL, 0660) == -1) {
+ /* we probably tried to save to global directory
+ where we didn't have access.. try saving it to
+ home dir instead. */
+ char *str;
+
+ /* check that we really didn't try to save
+ it to home dir.. */
+ str = g_strdup_printf("%s/.irssi/", g_get_home_dir());
+ if (strncmp(current_theme->path, str, strlen(str)) != 0) {
+ g_free(str);
+ str = g_strdup_printf("%s/.irssi/%s", g_get_home_dir(), g_basename(current_theme->path));
+
+ config_write(config, str, 0660);
+ }
+ g_free(str);
+ }
+ config_close(config);
}
void themes_init(void)
@@ -235,7 +433,8 @@ void themes_init(void)
GSList *tmp;
const char *value;
char *str;
- int errors;
+
+ default_formats = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
/* first there's default theme.. */
str = g_strdup_printf("%s/.irssi/default.theme", g_get_home_dir());
@@ -251,22 +450,20 @@ void themes_init(void)
find_themes(SYSCONFDIR"/irssi");
/* read formats for all themes */
- errors = FALSE;
for (tmp = themes; tmp != NULL; tmp = tmp->next) {
rec = tmp->data;
- if (theme_read(rec, rec->path))
- errors = TRUE;
+ theme_read(rec, rec->path);
}
- if (errors)
- signal_add("irssi init finished", (SIGNAL_FUNC) sig_formats_error);
-
/* find the current theme to use */
value = settings_get_str("current_theme");
rec = theme_find(value);
if (rec != NULL) current_theme = rec;
+
+ command_bind("format", NULL, (SIGNAL_FUNC) cmd_format);
+ command_bind("save", NULL, (SIGNAL_FUNC) cmd_save);
}
void themes_deinit(void)
@@ -275,4 +472,9 @@ void themes_deinit(void)
g_slist_foreach(themes, (GFunc) theme_destroy, NULL);
g_slist_free(themes);
themes = NULL;
+
+ g_hash_table_destroy(default_formats);
+
+ command_unbind("format", (SIGNAL_FUNC) cmd_format);
+ command_unbind("save", (SIGNAL_FUNC) cmd_save);
}
diff --git a/src/fe-common/core/themes.h b/src/fe-common/core/themes.h
index 7bd4a8f8..5b5331f8 100644
--- a/src/fe-common/core/themes.h
+++ b/src/fe-common/core/themes.h
@@ -1,18 +1,18 @@
#ifndef __THEMES_H
#define __THEMES_H
+#include "printtext.h"
+
#define THEME_FLAG_BG_SCROLLABLE 0x0001
#define THEME_FLAG_BG_SCALED 0x0002
#define THEME_FLAG_BG_SHADED 0x0004
-typedef struct
-{
+typedef struct {
char *name;
- char **formatlist;
- char **format;
-}
-MODULE_THEME_REC;
+ int count;
+ char **formats; /* in same order as in module's default formats */
+} MODULE_THEME_REC;
typedef struct {
char *path;
@@ -30,10 +30,16 @@ typedef struct {
extern GSList *themes;
extern THEME_REC *current_theme;
+extern GHashTable *default_formats;
THEME_REC *theme_create(const char *path, const char *name);
void theme_destroy(THEME_REC *rec);
+#define theme_register(formats) theme_register_module(MODULE_NAME, formats)
+#define theme_unregister() theme_unregister_module(MODULE_NAME)
+void theme_register_module(const char *module, FORMAT_REC *formats);
+void theme_unregister_module(const char *module);
+
void themes_init(void);
void themes_deinit(void);
diff --git a/src/fe-common/core/window-activity.c b/src/fe-common/core/window-activity.c
index ba3adb13..420261a0 100644
--- a/src/fe-common/core/window-activity.c
+++ b/src/fe-common/core/window-activity.c
@@ -26,13 +26,11 @@
#include "windows.h"
#include "window-items.h"
-static void sig_hilight_text(SERVER_REC *server, const char *channel, gpointer levelptr, const char *msg)
+static void sig_hilight_text(WINDOW_REC *window, SERVER_REC *server, const char *channel, gpointer levelptr, const char *msg)
{
- WINDOW_REC *window;
int level, oldlevel;
level = GPOINTER_TO_INT(levelptr);
- window = window_find_closest(server, channel, level);
if (window == active_win || (level & (MSGLEVEL_NEVER|MSGLEVEL_NO_ACT|MSGLEVEL_MSGS)))
return;
diff --git a/src/fe-common/core/window-commands.c b/src/fe-common/core/window-commands.c
new file mode 100644
index 00000000..507cfe90
--- /dev/null
+++ b/src/fe-common/core/window-commands.c
@@ -0,0 +1,370 @@
+/*
+ window-commands.c : irssi
+
+ Copyright (C) 2000 Timo Sirainen
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "module.h"
+#include "module-formats.h"
+#include "signals.h"
+#include "commands.h"
+#include "misc.h"
+#include "server.h"
+
+#include "levels.h"
+
+#include "windows.h"
+#include "window-items.h"
+
+static void cmd_window(const char *data, void *server, WI_ITEM_REC *item)
+{
+ command_runsub("window", data, server, item);
+}
+
+static void cmd_window_new(const char *data, void *server, WI_ITEM_REC *item)
+{
+ WINDOW_REC *window;
+ int type;
+
+ g_return_if_fail(data != NULL);
+
+ type = (g_strncasecmp(data, "hid", 3) == 0 || g_strcasecmp(data, "tab") == 0) ? 1 :
+ (g_strcasecmp(data, "split") == 0 ? 2 : 0);
+ signal_emit("gui window create override", 1, GINT_TO_POINTER(type));
+
+ window = window_create(NULL, FALSE);
+ window_change_server(window, server);
+}
+
+static void cmd_window_close(const char *data)
+{
+ /* destroy window unless it's the last one */
+ if (windows->next != NULL)
+ window_destroy(active_win);
+}
+
+static void cmd_window_refnum(const char *data)
+{
+ WINDOW_REC *window;
+
+ if (!is_numeric(data, 0))
+ return;
+
+ window = window_find_refnum(atoi(data));
+ if (window != NULL)
+ window_set_active(window);
+}
+
+/* return the first window number with the highest activity */
+static WINDOW_REC *window_highest_activity(WINDOW_REC *window)
+{
+ WINDOW_REC *rec, *max_win;
+ GSList *tmp;
+ int max_act, through;
+
+ g_return_val_if_fail(window != NULL, NULL);
+
+ max_win = NULL; max_act = 0; through = FALSE;
+
+ tmp = g_slist_find(windows, window);
+ for (;; tmp = tmp->next) {
+ if (tmp == NULL) {
+ tmp = windows;
+ through = TRUE;
+ }
+
+ if (through && tmp->data == window)
+ break;
+
+ rec = tmp->data;
+
+ if (rec->new_data && max_act < rec->new_data) {
+ max_act = rec->new_data;
+ max_win = rec;
+ }
+ }
+
+ return max_win;
+}
+
+static void cmd_window_goto(const char *data)
+{
+ WINDOW_REC *window;
+
+ g_return_if_fail(data != NULL);
+
+ if (is_numeric(data, 0)) {
+ cmd_window_refnum(data);
+ return;
+ }
+
+ if (g_strcasecmp(data, "active") == 0)
+ window = window_highest_activity(active_win);
+ else
+ window = window_find_item(active_win, data);
+
+ if (window != NULL)
+ window_set_active(window);
+}
+
+static void cmd_window_next(void)
+{
+ int num;
+
+ num = window_refnum_next(active_win->refnum);
+ if (num < 1) num = windows_refnum_last();
+
+ window_set_active(window_find_refnum(num));
+}
+
+static void cmd_window_prev(void)
+{
+ int num;
+
+ num = window_refnum_prev(active_win->refnum);
+ if (num < 1) num = window_refnum_next(0);
+
+ window_set_active(window_find_refnum(num));
+}
+
+static void cmd_window_level(const char *data)
+{
+ g_return_if_fail(data != NULL);
+
+ window_set_level(active_win, combine_level(active_win->level, data));
+ printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, "Window level is now %s",
+ bits2level(active_win->level));
+}
+
+static void cmd_window_server(const char *data)
+{
+ SERVER_REC *server;
+
+ g_return_if_fail(data != NULL);
+
+ server = server_find_tag(data);
+ if (server == NULL)
+ printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_UNKNOWN_SERVER_TAG, data);
+ else if (active_win->active == NULL) {
+ window_change_server(active_win, server);
+ printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_SERVER_CHANGED, server->tag, server->connrec->address,
+ server->connrec->ircnet == NULL ? "" : server->connrec->ircnet);
+ }
+}
+
+static void cmd_window_item_prev(void)
+{
+ window_item_prev(active_win);
+}
+
+static void cmd_window_item_next(void)
+{
+ window_item_next(active_win);
+}
+
+static void cmd_window_number(const char *data)
+{
+ int num;
+
+ num = atoi(data);
+ if (num < 1)
+ printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_REFNUM_TOO_LOW);
+ else
+ window_set_refnum(active_win, num);
+}
+
+static void cmd_window_name(const char *data)
+{
+ window_set_name(active_win, data);
+}
+
+/* we're moving the first window to last - move the first contiguous block
+ of refnums to left. Like if there's windows 1..5 and 7..10, move 1 to
+ 11, 2..5 to 1..4 and leave 7..10 alone */
+static void windows_move_left(WINDOW_REC *move_window)
+{
+ WINDOW_REC *window;
+ int refnum;
+
+ window_set_refnum(move_window, windows_refnum_last()+1);
+ for (refnum = 2;; refnum++) {
+ window = window_find_refnum(refnum);
+ if (window == NULL) break;
+
+ window_set_refnum(window, refnum-1);
+ }
+}
+
+/* we're moving the last window to first - make some space so we can use the
+ refnum 1 */
+static void windows_move_right(WINDOW_REC *move_window)
+{
+ WINDOW_REC *window;
+ int refnum;
+
+ /* find the first unused refnum, like if there's windows
+ 1..5 and 7..10, we only need to move 1..5 to 2..6 */
+ refnum = 1;
+ while (window_find_refnum(refnum) != NULL) refnum++;
+
+ refnum--;
+ while (refnum > 0) {
+ window = window_find_refnum(refnum);
+ g_return_if_fail(window != NULL);
+ window_set_refnum(window, window == move_window ? 1 : refnum+1);
+
+ refnum--;
+ }
+}
+
+static void cmd_window_move_left(void)
+{
+ int refnum;
+
+ refnum = window_refnum_prev(active_win->refnum);
+ if (refnum != -1) {
+ window_set_refnum(active_win, active_win->refnum-1);
+ return;
+ }
+
+ windows_move_left(active_win);
+}
+
+static void cmd_window_move_right(void)
+{
+ int refnum;
+
+ refnum = window_refnum_next(active_win->refnum);
+ if (refnum != -1) {
+ window_set_refnum(active_win, active_win->refnum+1);
+ return;
+ }
+
+ windows_move_right(active_win);
+}
+
+static void cmd_window_move(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
+{
+ int new_refnum, refnum;
+
+ if (!is_numeric(data, 0)) {
+ command_runsub("window move", data, server, item);
+ return;
+ }
+
+ new_refnum = atoi(data);
+ if (new_refnum > active_win->refnum) {
+ for (;;) {
+ refnum = window_refnum_next(active_win->refnum);
+ if (refnum == -1 || refnum > new_refnum)
+ break;
+
+ window_set_refnum(active_win, refnum);
+ }
+ } else {
+ for (;;) {
+ refnum = window_refnum_prev(active_win->refnum);
+ if (refnum == -1 || refnum < new_refnum)
+ break;
+
+ window_set_refnum(active_win, refnum);
+ }
+ }
+}
+
+static int windows_compare(WINDOW_REC *w1, WINDOW_REC *w2)
+{
+ return w1->refnum < w2->refnum ? -1 : 1;
+}
+
+static GSList *windows_get_sorted(void)
+{
+ GSList *tmp, *list;
+
+ list = NULL;
+ for (tmp = windows; tmp != NULL; tmp = tmp->next) {
+ list = g_slist_insert_sorted(list, tmp->data, (GCompareFunc) windows_compare);
+ }
+
+ return list;
+}
+
+static void cmd_window_list(void)
+{
+ GSList *tmp, *sorted;
+ char *levelstr;
+
+ sorted = windows_get_sorted();
+ printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_WINDOWLIST_HEADER);
+ for (tmp = sorted; tmp != NULL; tmp = tmp->next) {
+ WINDOW_REC *rec = tmp->data;
+
+ levelstr = bits2level(rec->level);
+ printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_WINDOWLIST_LINE,
+ rec->refnum, rec->name == NULL ? "" : rec->name,
+ rec->active == NULL ? "" : rec->active->name,
+ rec->active_server == NULL ? "" : ((SERVER_REC *) rec->active_server)->tag,
+ levelstr);
+ g_free(levelstr);
+ }
+ g_slist_free(sorted);
+ printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_WINDOWLIST_FOOTER);
+}
+
+void window_commands_init(void)
+{
+ command_bind("window", NULL, (SIGNAL_FUNC) cmd_window);
+ command_bind("window new", NULL, (SIGNAL_FUNC) cmd_window_new);
+ command_bind("window close", NULL, (SIGNAL_FUNC) cmd_window_close);
+ command_bind("window kill", NULL, (SIGNAL_FUNC) cmd_window_close);
+ command_bind("window server", NULL, (SIGNAL_FUNC) cmd_window_server);
+ command_bind("window refnum", NULL, (SIGNAL_FUNC) cmd_window_refnum);
+ command_bind("window goto", NULL, (SIGNAL_FUNC) cmd_window_goto);
+ command_bind("window prev", NULL, (SIGNAL_FUNC) cmd_window_prev);
+ command_bind("window next", NULL, (SIGNAL_FUNC) cmd_window_next);
+ command_bind("window level", NULL, (SIGNAL_FUNC) cmd_window_level);
+ command_bind("window item prev", NULL, (SIGNAL_FUNC) cmd_window_item_prev);
+ command_bind("window item next", NULL, (SIGNAL_FUNC) cmd_window_item_next);
+ command_bind("window number", NULL, (SIGNAL_FUNC) cmd_window_number);
+ command_bind("window name", NULL, (SIGNAL_FUNC) cmd_window_name);
+ command_bind("window move", NULL, (SIGNAL_FUNC) cmd_window_move);
+ command_bind("window move left", NULL, (SIGNAL_FUNC) cmd_window_move_left);
+ command_bind("window move right", NULL, (SIGNAL_FUNC) cmd_window_move_right);
+ command_bind("window list", NULL, (SIGNAL_FUNC) cmd_window_list);
+}
+
+void window_commands_deinit(void)
+{
+ command_unbind("window", (SIGNAL_FUNC) cmd_window);
+ command_unbind("window new", (SIGNAL_FUNC) cmd_window_new);
+ command_unbind("window close", (SIGNAL_FUNC) cmd_window_close);
+ command_unbind("window kill", (SIGNAL_FUNC) cmd_window_close);
+ command_unbind("window server", (SIGNAL_FUNC) cmd_window_server);
+ command_unbind("window refnum", (SIGNAL_FUNC) cmd_window_refnum);
+ command_unbind("window goto", (SIGNAL_FUNC) cmd_window_goto);
+ command_unbind("window prev", (SIGNAL_FUNC) cmd_window_prev);
+ command_unbind("window next", (SIGNAL_FUNC) cmd_window_next);
+ command_unbind("window level", (SIGNAL_FUNC) cmd_window_level);
+ command_unbind("window item prev", (SIGNAL_FUNC) cmd_window_item_prev);
+ command_unbind("window item next", (SIGNAL_FUNC) cmd_window_item_next);
+ command_unbind("window number", (SIGNAL_FUNC) cmd_window_number);
+ command_unbind("window name", (SIGNAL_FUNC) cmd_window_name);
+ command_unbind("window move", (SIGNAL_FUNC) cmd_window_move);
+ command_unbind("window move left", (SIGNAL_FUNC) cmd_window_move_left);
+ command_unbind("window move right", (SIGNAL_FUNC) cmd_window_move_right);
+ command_unbind("window list", (SIGNAL_FUNC) cmd_window_list);
+}
diff --git a/src/fe-common/core/window-items.c b/src/fe-common/core/window-items.c
index ac4c30d5..b8633461 100644
--- a/src/fe-common/core/window-items.c
+++ b/src/fe-common/core/window-items.c
@@ -27,7 +27,6 @@
#include "levels.h"
-#include "printtext.h"
#include "windows.h"
#include "window-items.h"
@@ -86,6 +85,19 @@ WINDOW_REC *window_item_window(WI_ITEM_REC *item)
return MODULE_DATA(item);
}
+void window_item_change_server(WI_ITEM_REC *item, void *server)
+{
+ WINDOW_REC *window;
+
+ g_return_if_fail(item != NULL);
+
+ window = MODULE_DATA(item);
+ item->server = server;
+
+ signal_emit("window item server changed", 2, window, item);
+ if (window->active == item) window_change_server(window, item->server);
+}
+
void window_item_set_active(WINDOW_REC *window, WI_ITEM_REC *item)
{
g_return_if_fail(window != NULL);
@@ -97,17 +109,58 @@ void window_item_set_active(WINDOW_REC *window, WI_ITEM_REC *item)
}
}
-void window_item_change_server(WI_ITEM_REC *item, void *server)
+void window_item_prev(WINDOW_REC *window)
{
- WINDOW_REC *window;
+ WI_ITEM_REC *last;
+ GSList *tmp;
- g_return_if_fail(item != NULL);
+ g_return_if_fail(window != NULL);
- window = MODULE_DATA(item);
- item->server = server;
+ last = NULL;
+ for (tmp = window->items; tmp != NULL; tmp = tmp->next) {
+ WI_ITEM_REC *rec = tmp->data;
- signal_emit("window item server changed", 2, window, item);
- if (window->active == item) window_change_server(window, item->server);
+ if (rec != window->active)
+ last = rec;
+ else {
+ /* current channel. did we find anything?
+ if not, go to the last channel */
+ if (last != NULL) break;
+ }
+ }
+
+ if (last != NULL)
+ window_item_set_active(window, last);
+}
+
+void window_item_next(WINDOW_REC *window)
+{
+ WI_ITEM_REC *next;
+ GSList *tmp;
+ int gone;
+
+ g_return_if_fail(window != NULL);
+
+ next = NULL; gone = FALSE;
+ for (tmp = window->items; tmp != NULL; tmp = tmp->next) {
+ WI_ITEM_REC *rec = tmp->data;
+
+ if (rec == window->active)
+ gone = TRUE;
+ else {
+ if (gone) {
+ /* found the next channel */
+ next = rec;
+ break;
+ }
+
+ if (next == NULL)
+ next = rec; /* fallback to first channel */
+ }
+ }
+
+ if (next != NULL)
+ window_item_set_active(window, next);
}
static WI_ITEM_REC *window_item_find_window(WINDOW_REC *window, void *server, const char *name)
diff --git a/src/fe-common/core/window-items.h b/src/fe-common/core/window-items.h
index c760ee36..34d61c2e 100644
--- a/src/fe-common/core/window-items.h
+++ b/src/fe-common/core/window-items.h
@@ -10,9 +10,12 @@ void window_remove_item(WINDOW_REC *window, WI_ITEM_REC *item);
void window_item_create(WI_ITEM_REC *item, int automatic);
WINDOW_REC *window_item_window(WI_ITEM_REC *item);
-void window_item_set_active(WINDOW_REC *window, WI_ITEM_REC *item);
void window_item_change_server(WI_ITEM_REC *item, void *server);
+void window_item_set_active(WINDOW_REC *window, WI_ITEM_REC *item);
+void window_item_prev(WINDOW_REC *window);
+void window_item_next(WINDOW_REC *window);
+
/* Find wanted window item by name. `server' can be NULL. */
WI_ITEM_REC *window_item_find(void *server, const char *name);
diff --git a/src/fe-common/core/windows.c b/src/fe-common/core/windows.c
index bbe6a740..da6de6aa 100644
--- a/src/fe-common/core/windows.c
+++ b/src/fe-common/core/windows.c
@@ -37,6 +37,8 @@ GSList *windows; /* first in the list is the active window,
next is the last active, etc. */
WINDOW_REC *active_win;
+static int daytag;
+
static int window_get_new_refnum(void)
{
WINDOW_REC *win;
@@ -247,117 +249,6 @@ WINDOW_REC *window_find_refnum(int refnum)
return NULL;
}
-static int windows_refnum_last(void)
-{
- GSList *tmp;
- int max;
-
- max = -1;
- for (tmp = windows; tmp != NULL; tmp = tmp->next) {
- WINDOW_REC *rec = tmp->data;
-
- if (rec->refnum > max)
- max = rec->refnum;
- }
-
- return max;
-}
-
-static int window_refnum_prev(int refnum)
-{
- GSList *tmp;
- int prev, max;
-
- max = prev = -1;
- for (tmp = windows; tmp != NULL; tmp = tmp->next) {
- WINDOW_REC *rec = tmp->data;
-
- if (rec->refnum < refnum && (prev == -1 || rec->refnum > prev))
- prev = rec->refnum;
- if (max == -1 || rec->refnum > max)
- max = rec->refnum;
- }
-
- return prev != -1 ? prev : max;
-}
-
-static int window_refnum_next(int refnum)
-{
- GSList *tmp;
- int min, next;
-
- min = next = -1;
- for (tmp = windows; tmp != NULL; tmp = tmp->next) {
- WINDOW_REC *rec = tmp->data;
-
- if (rec->refnum > refnum && (next == -1 || rec->refnum < next))
- next = rec->refnum;
- if (min == -1 || rec->refnum < min)
- min = rec->refnum;
- }
-
- return next != -1 ? next : min;
-}
-
-static void cmd_window(const char *data, void *server, WI_ITEM_REC *item)
-{
- command_runsub("window", data, server, item);
-}
-
-static void cmd_window_new(const char *data, void *server, WI_ITEM_REC *item)
-{
- WINDOW_REC *window;
- int type;
-
- g_return_if_fail(data != NULL);
-
- type = (g_strncasecmp(data, "hid", 3) == 0 || g_strcasecmp(data, "tab") == 0) ? 1 :
- (g_strcasecmp(data, "split") == 0 ? 2 : 0);
- signal_emit("gui window create override", 1, GINT_TO_POINTER(type));
-
- window = window_create(NULL, FALSE);
- window_change_server(window, server);
-}
-
-static void cmd_window_close(const char *data)
-{
- /* destroy window unless it's the last one */
- if (windows->next != NULL)
- window_destroy(active_win);
-}
-
-/* return the first window number with the highest activity */
-static WINDOW_REC *window_highest_activity(WINDOW_REC *window)
-{
- WINDOW_REC *rec, *max_win;
- GSList *tmp;
- int max_act, through;
-
- g_return_val_if_fail(window != NULL, NULL);
-
- max_win = NULL; max_act = 0; through = FALSE;
-
- tmp = g_slist_find(windows, window);
- for (;; tmp = tmp->next) {
- if (tmp == NULL) {
- tmp = windows;
- through = TRUE;
- }
-
- if (through && tmp->data == window)
- break;
-
- rec = tmp->data;
-
- if (rec->new_data && max_act < rec->new_data) {
- max_act = rec->new_data;
- max_win = rec;
- }
- }
-
- return max_win;
-}
-
WINDOW_REC *window_find_name(const char *name)
{
GSList *tmp;
@@ -409,288 +300,56 @@ WINDOW_REC *window_find_item(WINDOW_REC *window, const char *name)
return MODULE_DATA(item);
}
-static void cmd_window_refnum(const char *data)
-{
- WINDOW_REC *window;
-
- if (!is_numeric(data, 0))
- return;
-
- window = window_find_refnum(atoi(data));
- if (window != NULL)
- window_set_active(window);
-}
-
-static void cmd_window_goto(const char *data)
-{
- WINDOW_REC *window;
-
- g_return_if_fail(data != NULL);
-
- if (is_numeric(data, 0)) {
- cmd_window_refnum(data);
- return;
- }
-
- if (g_strcasecmp(data, "active") == 0)
- window = window_highest_activity(active_win);
- else
- window = window_find_item(active_win, data);
-
- if (window != NULL)
- window_set_active(window);
-}
-
-static void cmd_window_next(void)
-{
- int num;
-
- num = window_refnum_next(active_win->refnum);
- if (num < 1) num = windows_refnum_last();
-
- window_set_active(window_find_refnum(num));
-}
-
-static void cmd_window_prev(void)
-{
- int num;
-
- num = window_refnum_prev(active_win->refnum);
- if (num < 1) num = window_refnum_next(0);
-
- window_set_active(window_find_refnum(num));
-}
-
-static void cmd_window_level(const char *data)
-{
- g_return_if_fail(data != NULL);
-
- window_set_level(active_win, combine_level(active_win->level, data));
- printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, "Window level is now %s",
- bits2level(active_win->level));
-}
-
-static void cmd_window_server(const char *data)
-{
- SERVER_REC *server;
-
- g_return_if_fail(data != NULL);
-
- server = server_find_tag(data);
- if (server == NULL)
- printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_UNKNOWN_SERVER_TAG, data);
- else if (active_win->active == NULL) {
- window_change_server(active_win, server);
- printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_SERVER_CHANGED, server->tag, server->connrec->address,
- server->connrec->ircnet == NULL ? "" : server->connrec->ircnet);
- }
-}
-
-static void cmd_window_item_prev(const char *data, void *server, WI_ITEM_REC *item)
+int window_refnum_prev(int refnum)
{
- WINDOW_REC *window;
- WI_ITEM_REC *last;
GSList *tmp;
+ int prev, max;
- window = item == NULL ? NULL : MODULE_DATA(item);
- if (window == NULL) return;
-
- last = NULL;
- for (tmp = window->items; tmp != NULL; tmp = tmp->next) {
- WI_ITEM_REC *rec = tmp->data;
+ max = prev = -1;
+ for (tmp = windows; tmp != NULL; tmp = tmp->next) {
+ WINDOW_REC *rec = tmp->data;
- if (rec != item)
- last = rec;
- else {
- /* current channel. did we find anything?
- if not, go to the last channel */
- if (last != NULL) break;
- }
+ if (rec->refnum < refnum && (prev == -1 || rec->refnum > prev))
+ prev = rec->refnum;
+ if (max == -1 || rec->refnum > max)
+ max = rec->refnum;
}
- if (last != NULL)
- window_item_set_active(window, last);
+ return prev != -1 ? prev : max;
}
-static void cmd_window_item_next(const char *data, void *server, WI_ITEM_REC *item)
+int window_refnum_next(int refnum)
{
- WINDOW_REC *window;
- WI_ITEM_REC *next;
GSList *tmp;
- int gone;
-
- window = item == NULL ? NULL : MODULE_DATA(item);
- if (window == NULL) return;
-
- next = NULL; gone = FALSE;
- for (tmp = window->items; tmp != NULL; tmp = tmp->next) {
- WI_ITEM_REC *rec = tmp->data;
-
- if (rec == item)
- gone = TRUE;
- else {
- if (gone) {
- /* found the next channel */
- next = rec;
- break;
- }
-
- if (next == NULL)
- next = rec; /* fallback to first channel */
- }
- }
-
- if (next != NULL)
- window_item_set_active(window, next);
-}
-
-static void cmd_window_number(const char *data)
-{
- int num;
-
- num = atoi(data);
- if (num < 1)
- printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_REFNUM_TOO_LOW);
- else
- window_set_refnum(active_win, num);
-}
-
-static void cmd_window_name(const char *data)
-{
- window_set_name(active_win, data);
-}
-
-/* we're moving the first window to last - move the first contiguous block
- of refnums to left. Like if there's windows 1..5 and 7..10, move 1 to
- 11, 2..5 to 1..4 and leave 7..10 alone */
-static void windows_move_left(WINDOW_REC *move_window)
-{
- WINDOW_REC *window;
- int refnum;
-
- window_set_refnum(move_window, windows_refnum_last()+1);
- for (refnum = 2;; refnum++) {
- window = window_find_refnum(refnum);
- if (window == NULL) break;
-
- window_set_refnum(window, refnum-1);
- }
-}
-
-/* we're moving the last window to first - make some space so we can use the
- refnum 1 */
-static void windows_move_right(WINDOW_REC *move_window)
-{
- WINDOW_REC *window;
- int refnum;
-
- /* find the first unused refnum, like if there's windows
- 1..5 and 7..10, we only need to move 1..5 to 2..6 */
- refnum = 1;
- while (window_find_refnum(refnum) != NULL) refnum++;
-
- refnum--;
- while (refnum > 0) {
- window = window_find_refnum(refnum);
- g_return_if_fail(window != NULL);
- window_set_refnum(window, window == move_window ? 1 : refnum+1);
-
- refnum--;
- }
-}
-
-static void cmd_window_move_left(void)
-{
- int refnum;
-
- refnum = window_refnum_prev(active_win->refnum);
- if (refnum != -1) {
- window_set_refnum(active_win, active_win->refnum-1);
- return;
- }
-
- windows_move_left(active_win);
-}
-
-static void cmd_window_move_right(void)
-{
- int refnum;
-
- refnum = window_refnum_next(active_win->refnum);
- if (refnum != -1) {
- window_set_refnum(active_win, active_win->refnum+1);
- return;
- }
-
- windows_move_right(active_win);
-}
-
-static void cmd_window_move(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
-{
- int new_refnum, refnum;
-
- if (!is_numeric(data, 0)) {
- command_runsub("window move", data, server, item);
- return;
- }
-
- new_refnum = atoi(data);
- if (new_refnum > active_win->refnum) {
- for (;;) {
- refnum = window_refnum_next(active_win->refnum);
- if (refnum == -1 || refnum > new_refnum)
- break;
+ int min, next;
- window_set_refnum(active_win, refnum);
- }
- } else {
- for (;;) {
- refnum = window_refnum_prev(active_win->refnum);
- if (refnum == -1 || refnum < new_refnum)
- break;
+ min = next = -1;
+ for (tmp = windows; tmp != NULL; tmp = tmp->next) {
+ WINDOW_REC *rec = tmp->data;
- window_set_refnum(active_win, refnum);
- }
+ if (rec->refnum > refnum && (next == -1 || rec->refnum < next))
+ next = rec->refnum;
+ if (min == -1 || rec->refnum < min)
+ min = rec->refnum;
}
-}
-static int windows_compare(WINDOW_REC *w1, WINDOW_REC *w2)
-{
- return w1->refnum < w2->refnum ? -1 : 1;
+ return next != -1 ? next : min;
}
-GSList *windows_get_sorted(void)
+int windows_refnum_last(void)
{
- GSList *tmp, *list;
+ GSList *tmp;
+ int max;
- list = NULL;
+ max = -1;
for (tmp = windows; tmp != NULL; tmp = tmp->next) {
- list = g_slist_insert_sorted(list, tmp->data, (GCompareFunc) windows_compare);
- }
-
- return list;
-}
-
-static void cmd_window_list(void)
-{
- GSList *tmp, *sorted;
- char *levelstr;
-
- sorted = windows_get_sorted();
- printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_WINDOWLIST_HEADER);
- for (tmp = sorted; tmp != NULL; tmp = tmp->next) {
WINDOW_REC *rec = tmp->data;
- levelstr = bits2level(rec->level);
- printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_WINDOWLIST_LINE,
- rec->refnum, rec->name == NULL ? "" : rec->name,
- rec->active == NULL ? "" : rec->active->name,
- rec->active_server == NULL ? "" : ((SERVER_REC *) rec->active_server)->tag,
- levelstr);
- g_free(levelstr);
+ if (rec->refnum > max)
+ max = rec->refnum;
}
- g_slist_free(sorted);
- printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_WINDOWLIST_FOOTER);
+
+ return max;
}
static void sig_server_looking(void *server)
@@ -722,29 +381,46 @@ static void sig_server_disconnected(void *server)
}
}
+static int sig_check_daychange(void)
+{
+ static int lastday = -1;
+ GSList *tmp;
+ time_t t;
+ struct tm *tm;
+
+ if (!settings_get_bool("timestamps")) {
+ /* display day change notice only when using timestamps */
+ return TRUE;
+ }
+
+ t = time(NULL);
+ tm = localtime(&t);
+
+ if (lastday == -1) {
+ /* First check, don't display. */
+ lastday = tm->tm_mday;
+ return TRUE;
+ }
+
+ if (tm->tm_mday == lastday)
+ return TRUE;
+
+ /* day changed, print notice about it to every window */
+ for (tmp = windows; tmp != NULL; tmp = tmp->next) {
+ printformat_window(tmp->data, MSGLEVEL_NEVER, IRCTXT_DAYCHANGE,
+ tm->tm_mday, tm->tm_mon+1, 1900+tm->tm_year);
+ }
+
+ lastday = tm->tm_mday;
+ return TRUE;
+}
+
void windows_init(void)
{
active_win = NULL;
settings_add_bool("lookandfeel", "window_auto_change", FALSE);
- command_bind("window", NULL, (SIGNAL_FUNC) cmd_window);
- command_bind("window new", NULL, (SIGNAL_FUNC) cmd_window_new);
- command_bind("window close", NULL, (SIGNAL_FUNC) cmd_window_close);
- command_bind("window kill", NULL, (SIGNAL_FUNC) cmd_window_close);
- command_bind("window server", NULL, (SIGNAL_FUNC) cmd_window_server);
- command_bind("window refnum", NULL, (SIGNAL_FUNC) cmd_window_refnum);
- command_bind("window goto", NULL, (SIGNAL_FUNC) cmd_window_goto);
- command_bind("window prev", NULL, (SIGNAL_FUNC) cmd_window_prev);
- command_bind("window next", NULL, (SIGNAL_FUNC) cmd_window_next);
- command_bind("window level", NULL, (SIGNAL_FUNC) cmd_window_level);
- command_bind("window item prev", NULL, (SIGNAL_FUNC) cmd_window_item_prev);
- command_bind("window item next", NULL, (SIGNAL_FUNC) cmd_window_item_next);
- command_bind("window number", NULL, (SIGNAL_FUNC) cmd_window_number);
- command_bind("window name", NULL, (SIGNAL_FUNC) cmd_window_name);
- command_bind("window move", NULL, (SIGNAL_FUNC) cmd_window_move);
- command_bind("window move left", NULL, (SIGNAL_FUNC) cmd_window_move_left);
- command_bind("window move right", NULL, (SIGNAL_FUNC) cmd_window_move_right);
- command_bind("window list", NULL, (SIGNAL_FUNC) cmd_window_list);
+ daytag = g_timeout_add(30000, (GSourceFunc) sig_check_daychange, NULL);
signal_add("server looking", (SIGNAL_FUNC) sig_server_looking);
signal_add("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_add("server connect failed", (SIGNAL_FUNC) sig_server_disconnected);
@@ -752,24 +428,8 @@ void windows_init(void)
void windows_deinit(void)
{
- command_unbind("window", (SIGNAL_FUNC) cmd_window);
- command_unbind("window new", (SIGNAL_FUNC) cmd_window_new);
- command_unbind("window close", (SIGNAL_FUNC) cmd_window_close);
- command_unbind("window kill", (SIGNAL_FUNC) cmd_window_close);
- command_unbind("window server", (SIGNAL_FUNC) cmd_window_server);
- command_unbind("window refnum", (SIGNAL_FUNC) cmd_window_refnum);
- command_unbind("window goto", (SIGNAL_FUNC) cmd_window_goto);
- command_unbind("window prev", (SIGNAL_FUNC) cmd_window_prev);
- command_unbind("window next", (SIGNAL_FUNC) cmd_window_next);
- command_unbind("window level", (SIGNAL_FUNC) cmd_window_level);
- command_unbind("window item prev", (SIGNAL_FUNC) cmd_window_item_prev);
- command_unbind("window item next", (SIGNAL_FUNC) cmd_window_item_next);
- command_unbind("window number", (SIGNAL_FUNC) cmd_window_number);
- command_unbind("window name", (SIGNAL_FUNC) cmd_window_name);
- command_unbind("window move", (SIGNAL_FUNC) cmd_window_move);
- command_unbind("window move left", (SIGNAL_FUNC) cmd_window_move_left);
- command_unbind("window move right", (SIGNAL_FUNC) cmd_window_move_right);
- command_unbind("window list", (SIGNAL_FUNC) cmd_window_list);
+ g_source_remove(daytag);
+
signal_remove("server looking", (SIGNAL_FUNC) sig_server_looking);
signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
signal_remove("server connect failed", (SIGNAL_FUNC) sig_server_disconnected);
diff --git a/src/fe-common/core/windows.h b/src/fe-common/core/windows.h
index 2b13101b..98ef9425 100644
--- a/src/fe-common/core/windows.h
+++ b/src/fe-common/core/windows.h
@@ -69,6 +69,10 @@ WINDOW_REC *window_find_refnum(int refnum);
WINDOW_REC *window_find_name(const char *name);
WINDOW_REC *window_find_item(WINDOW_REC *window, const char *name);
+int window_refnum_prev(int refnum);
+int window_refnum_next(int refnum);
+int windows_refnum_last(void);
+
void windows_init(void);
void windows_deinit(void);
diff --git a/src/fe-common/irc/dcc/Makefile.am b/src/fe-common/irc/dcc/Makefile.am
index 0424c7b2..54647bc9 100644
--- a/src/fe-common/irc/dcc/Makefile.am
+++ b/src/fe-common/irc/dcc/Makefile.am
@@ -14,4 +14,5 @@ libfe_common_irc_dcc_la_SOURCES = \
module-formats.c
noinst_HEADERS = \
+ module.h \
module-formats.h
diff --git a/src/fe-common/irc/dcc/fe-dcc.c b/src/fe-common/irc/dcc/fe-dcc.c
index b89e44b9..5cdcd28d 100644
--- a/src/fe-common/irc/dcc/fe-dcc.c
+++ b/src/fe-common/irc/dcc/fe-dcc.c
@@ -30,6 +30,7 @@
#include "irc/dcc/dcc.h"
+#include "themes.h"
#include "windows.h"
static void dcc_connected(DCC_REC *dcc)
@@ -427,10 +428,14 @@ void fe_dcc_init(void)
command_bind("dcc ", NULL, (SIGNAL_FUNC) cmd_dcc_list);
command_bind("dcc list", NULL, (SIGNAL_FUNC) cmd_dcc_list);
signal_add("window item remove", (SIGNAL_FUNC) dcc_chat_closed);
+
+ theme_register(fecommon_irc_dcc_formats);
}
void fe_dcc_deinit(void)
{
+ theme_unregister();
+
signal_remove("dcc connected", (SIGNAL_FUNC) dcc_connected);
signal_remove("dcc rejected", (SIGNAL_FUNC) dcc_rejected);
signal_remove("dcc closed", (SIGNAL_FUNC) dcc_closed);
diff --git a/src/fe-common/irc/dcc/module-formats.c b/src/fe-common/irc/dcc/module-formats.c
index 40313010..4dee15f7 100644
--- a/src/fe-common/irc/dcc/module-formats.c
+++ b/src/fe-common/irc/dcc/module-formats.c
@@ -21,39 +21,40 @@
#include "module.h"
#include "printtext.h"
-FORMAT_REC fecommon_irc_dcc_formats[] =
-{
- { MODULE_NAME, "IRC", 0 },
-
- /* ---- */
- { NULL, "DCC", 0 },
-
- { "own_dcc", "%K[%rdcc%K(%R$0%K)]%n $1", 2, { 0, 0 } },
- { "own_dcc_me", "%W * $0%n $1", 2, { 0, 0 } },
- { "own_dcc_ctcp", "%K[%rctcp%K(%R$0%K)]%n $1 $2", 3, { 0, 0, 0 } },
- { "dcc_msg", "%K[%G$0%K(%gdcc%K)]%n $1", 2, { 0, 0 } },
- { "action_dcc", "%W (*dcc*) $0%n $1", 2, { 0, 0 } },
- { "dcc_ctcp", "%g>>> DCC CTCP received from %_$0%_%K: %g$1", 2, { 0, 0 } },
- { "dcc_chat", "%gDCC CHAT from %_$0%_ %K[%g$1 port $2%K]", 3, { 0, 0, 1 } },
- { "dcc_chat_not_found", "%gNo DCC CHAT connection open to %_$0", 1, { 0 } },
- { "dcc_chat_connected", "%gDCC %_CHAT%_ connection with %_$0%_ %K%K[%g$1 port $2%K]%g established", 3, { 0, 0, 1 } },
- { "dcc_chat_disconnected", "%gDCC lost chat to %_$0", 1, { 0 } },
- { "dcc_send", "%gDCC SEND from %_$0%_ %K[%g$1 port $2%K]: %g$3 %K[%g$4 bytes%K]", 5, { 0, 0, 1, 0, 2 } },
- { "dcc_send_exists", "%gDCC already sending file %G$0%g for %_$1%_", 2, { 0, 0 } },
- { "dcc_send_not_found", "%gDCC not sending file %G$1%g to %_$0", 2, { 0, 0 } },
- { "dcc_send_file_not_found", "%gDCC file not found: %G$0%g", 1, { 0 } },
- { "dcc_send_connected", "%gDCC sending file %G$0%g for %_$1%_ %K[%g$2 port $3%K]", 4, { 0, 0, 0, 1 } },
- { "dcc_send_complete", "%gDCC sent file $0 %K[%g%_$1%_kb%K]%g for %_$2%_ in %_$3%_ secs %K[%g%_$4kb/s%_%K]", 5, { 0, 2, 0, 2, 3 } },
- { "dcc_send_aborted", "%gDCC aborted sending file $0 for %_$1%_", 2, { 0, 0 } },
- { "dcc_get_not_found", "%gDCC no file offered by %_$0", 1, { 0 } },
- { "dcc_get_connected", "%gDCC receiving file %G$0%g from %_$1%_ %K[%g$2 port $3%K]", 4, { 0, 0, 0, 1 } },
- { "dcc_get_complete", "%gDCC received file %G$0%g %K[%g$1kb%K]%g from %_$2%_ in %_$3%_ secs %K[%g$4kb/s%K]", 5, { 0, 2, 0, 2, 3 } },
- { "dcc_get_aborted", "%gDCC aborted receiving file $0 from %_$1%_", 2, { 0, 0 } },
- { "dcc_unknown_ctcp", "%gDCC unknown ctcp %G$0%g from %_$1%_ %K[%g$2%K]", 3, { 0, 0, 0 } },
- { "dcc_unknown_reply", "%gDCC unknown reply %G$0%g from %_$1%_ %K[%g$2%K]", 3, { 0, 0, 0 } },
- { "dcc_unknown_type", "%gDCC unknown type %_$0", 1, { 0 } },
- { "dcc_connect_error", "%gDCC can't connect to %_$0%_ port %_$1", 2, { 0, 1 } },
- { "dcc_cant_create", "%gDCC can't create file %G$0%g", 1, { 0 } },
- { "dcc_rejected", "%gDCC %G$0%g was rejected by %_$1%_ %K[%G$2%K]", 3, { 0, 0, 0 } },
- { "dcc_close", "%gDCC %G$0%g close for %_$1%_ %K[%G$2%K]", 3, { 0, 0, 0 } }
+FORMAT_REC fecommon_irc_dcc_formats[] = {
+ { MODULE_NAME, "IRC", 0 },
+
+ /* ---- */
+ { NULL, "DCC", 0 },
+
+ { "own_dcc", "%K[%rdcc%K(%R$0%K)]%n $1", 2, { 0, 0 } },
+ { "own_dcc_me", "%W * $0%n $1", 2, { 0, 0 } },
+ { "own_dcc_ctcp", "%K[%rctcp%K(%R$0%K)]%n $1 $2", 3, { 0, 0, 0 } },
+ { "dcc_msg", "%K[%G$0%K(%gdcc%K)]%n $1", 2, { 0, 0 } },
+ { "action_dcc", "%W (*dcc*) $0%n $1", 2, { 0, 0 } },
+ { "dcc_ctcp", "%g>>> DCC CTCP received from %_$0%_%K: %g$1", 2, { 0, 0 } },
+ { "dcc_chat", "%gDCC CHAT from %_$0%_ %K[%g$1 port $2%K]", 3, { 0, 0, 1 } },
+ { "dcc_chat_not_found", "%gNo DCC CHAT connection open to %_$0", 1, { 0 } },
+ { "dcc_chat_connected", "%gDCC %_CHAT%_ connection with %_$0%_ %K%K[%g$1 port $2%K]%g established", 3, { 0, 0, 1 } },
+ { "dcc_chat_disconnected", "%gDCC lost chat to %_$0", 1, { 0 } },
+ { "dcc_send", "%gDCC SEND from %_$0%_ %K[%g$1 port $2%K]: %g$3 %K[%g$4 bytes%K]", 5, { 0, 0, 1, 0, 2 } },
+ { "dcc_send_exists", "%gDCC already sending file %G$0%g for %_$1%_", 2, { 0, 0 } },
+ { "dcc_send_not_found", "%gDCC not sending file %G$1%g to %_$0", 2, { 0, 0 } },
+ { "dcc_send_file_not_found", "%gDCC file not found: %G$0%g", 1, { 0 } },
+ { "dcc_send_connected", "%gDCC sending file %G$0%g for %_$1%_ %K[%g$2 port $3%K]", 4, { 0, 0, 0, 1 } },
+ { "dcc_send_complete", "%gDCC sent file $0 %K[%g%_$1%_kb%K]%g for %_$2%_ in %_$3%_ secs %K[%g%_$4kb/s%_%K]", 5, { 0, 2, 0, 2, 3 } },
+ { "dcc_send_aborted", "%gDCC aborted sending file $0 for %_$1%_", 2, { 0, 0 } },
+ { "dcc_get_not_found", "%gDCC no file offered by %_$0", 1, { 0 } },
+ { "dcc_get_connected", "%gDCC receiving file %G$0%g from %_$1%_ %K[%g$2 port $3%K]", 4, { 0, 0, 0, 1 } },
+ { "dcc_get_complete", "%gDCC received file %G$0%g %K[%g$1kb%K]%g from %_$2%_ in %_$3%_ secs %K[%g$4kb/s%K]", 5, { 0, 2, 0, 2, 3 } },
+ { "dcc_get_aborted", "%gDCC aborted receiving file $0 from %_$1%_", 2, { 0, 0 } },
+ { "dcc_unknown_ctcp", "%gDCC unknown ctcp %G$0%g from %_$1%_ %K[%g$2%K]", 3, { 0, 0, 0 } },
+ { "dcc_unknown_reply", "%gDCC unknown reply %G$0%g from %_$1%_ %K[%g$2%K]", 3, { 0, 0, 0 } },
+ { "dcc_unknown_type", "%gDCC unknown type %_$0", 1, { 0 } },
+ { "dcc_connect_error", "%gDCC can't connect to %_$0%_ port %_$1", 2, { 0, 1 } },
+ { "dcc_cant_create", "%gDCC can't create file %G$0%g", 1, { 0 } },
+ { "dcc_rejected", "%gDCC %G$0%g was rejected by %_$1%_ %K[%G$2%K]", 3, { 0, 0, 0 } },
+ { "dcc_close", "%gDCC %G$0%g close for %_$1%_ %K[%G$2%K]", 3, { 0, 0, 0 } },
+
+ { NULL, NULL, 0 }
};
diff --git a/src/fe-common/irc/dcc/module-formats.h b/src/fe-common/irc/dcc/module-formats.h
index de01511f..d7fe8eff 100644
--- a/src/fe-common/irc/dcc/module-formats.h
+++ b/src/fe-common/irc/dcc/module-formats.h
@@ -36,6 +36,3 @@ enum {
};
extern FORMAT_REC fecommon_irc_dcc_formats[];
-#define MODULE_FORMATS fecommon_irc_dcc_formats
-
-#include "printformat.h"
diff --git a/src/fe-common/irc/dcc/module.h b/src/fe-common/irc/dcc/module.h
new file mode 100644
index 00000000..966a37cb
--- /dev/null
+++ b/src/fe-common/irc/dcc/module.h
@@ -0,0 +1,3 @@
+#include "common.h"
+
+#define MODULE_NAME "fe-common/irc/dcc"
diff --git a/src/fe-common/irc/fe-common-irc.c b/src/fe-common/irc/fe-common-irc.c
index bde1d9fe..87a0655e 100644
--- a/src/fe-common/irc/fe-common-irc.c
+++ b/src/fe-common/irc/fe-common-irc.c
@@ -19,6 +19,7 @@
*/
#include "module.h"
+#include "module-formats.h"
#include "signals.h"
#include "args.h"
#include "misc.h"
@@ -27,6 +28,7 @@
#include "server-setup.h"
+#include "themes.h"
#include "completion.h"
void fe_channels_init(void);
@@ -100,6 +102,8 @@ void fe_common_irc_init(void)
settings_add_bool("lookandfeel", "show_away_once", TRUE);
settings_add_bool("lookandfeel", "show_quit_once", FALSE);
+ theme_register(fecommon_irc_formats);
+
fe_channels_init();
fe_irc_commands_init();
fe_irc_server_init();
@@ -132,6 +136,8 @@ void fe_common_irc_deinit(void)
fe_query_deinit();
completion_deinit();
irc_window_activity_deinit();
+
+ theme_unregister();
}
void fe_common_irc_finish_init(void)
diff --git a/src/fe-common/irc/flood/Makefile.am b/src/fe-common/irc/flood/Makefile.am
index c802dfd9..46ca4f25 100644
--- a/src/fe-common/irc/flood/Makefile.am
+++ b/src/fe-common/irc/flood/Makefile.am
@@ -13,5 +13,6 @@ libfe_common_irc_flood_la_SOURCES = \
fe-flood.c \
module-formats.c
-noinst_headers = \
+noinst_HEADERS = \
+ module.h \
module-formats.h
diff --git a/src/fe-common/irc/flood/fe-flood.c b/src/fe-common/irc/flood/fe-flood.c
index d21d6952..b7937fe9 100644
--- a/src/fe-common/irc/flood/fe-flood.c
+++ b/src/fe-common/irc/flood/fe-flood.c
@@ -26,6 +26,8 @@
#include "irc-server.h"
#include "irc/flood/autoignore.h"
+#include "themes.h"
+
static void event_autoignore_new(IRC_SERVER_REC *server, AUTOIGNORE_REC *ignore)
{
g_return_if_fail(ignore != NULL);
@@ -45,10 +47,14 @@ void fe_flood_init(void)
{
signal_add("autoignore new", (SIGNAL_FUNC) event_autoignore_new);
signal_add("autoignore remove", (SIGNAL_FUNC) event_autoignore_remove);
+
+ theme_register(fecommon_irc_flood_formats);
}
void fe_flood_deinit(void)
{
+ theme_unregister();
+
signal_remove("autoignore new", (SIGNAL_FUNC) event_autoignore_new);
signal_remove("autoignore remove", (SIGNAL_FUNC) event_autoignore_remove);
}
diff --git a/src/fe-common/irc/flood/module-formats.c b/src/fe-common/irc/flood/module-formats.c
index ea8ec653..2d0293bc 100644
--- a/src/fe-common/irc/flood/module-formats.c
+++ b/src/fe-common/irc/flood/module-formats.c
@@ -23,11 +23,13 @@
FORMAT_REC fecommon_irc_flood_formats[] =
{
- { MODULE_NAME, "Flood", 0 },
+ { MODULE_NAME, "Flood", 0 },
- /* ---- */
- { NULL, "Autoignore", 0 },
+ /* ---- */
+ { NULL, "Autoignore", 0 },
- { "autoignore", "Flood detected from %_$0%_, autoignoring for %_$1%_ minutes", 2, { 0, 1 } },
- { "autounignore", "Unignoring %_$0", 1, { 0 } }
+ { "autoignore", "Flood detected from %_$0%_, autoignoring for %_$1%_ minutes", 2, { 0, 1 } },
+ { "autounignore", "Unignoring %_$0", 1, { 0 } },
+
+ { NULL, NULL, 0 }
};
diff --git a/src/fe-common/irc/flood/module-formats.h b/src/fe-common/irc/flood/module-formats.h
index 8311b021..7386dd2a 100644
--- a/src/fe-common/irc/flood/module-formats.h
+++ b/src/fe-common/irc/flood/module-formats.h
@@ -10,6 +10,3 @@ enum {
};
extern FORMAT_REC fecommon_irc_flood_formats[];
-#define MODULE_FORMATS fecommon_irc_flood_formats
-
-#include "printformat.h"
diff --git a/src/fe-common/irc/flood/module.h b/src/fe-common/irc/flood/module.h
new file mode 100644
index 00000000..a5d9528f
--- /dev/null
+++ b/src/fe-common/irc/flood/module.h
@@ -0,0 +1,3 @@
+#include "common.h"
+
+#define MODULE_NAME "fe-common/irc/flood"
diff --git a/src/fe-common/irc/module-formats.c b/src/fe-common/irc/module-formats.c
index 0a76bb22..403c1a52 100644
--- a/src/fe-common/irc/module-formats.c
+++ b/src/fe-common/irc/module-formats.c
@@ -21,173 +21,173 @@
#include "module.h"
#include "printtext.h"
-FORMAT_REC fecommon_irc_formats[] =
-{
- { MODULE_NAME, "IRC", 0 },
-
- /* ---- */
- { NULL, "Server", 0 },
-
- { "lag_disconnected", "No PONG reply from server %_$0%_ in $1 seconds, disconnecting", 2, { 0, 1 } },
- { "disconnected", "Disconnected from %_$0%_ %K[%n$1%K]", 2, { 0, 0 } },
- { "server_list", "%_$0%_: $1:$2 ($3)", 5, { 0, 0, 1, 0, 0 } },
- { "server_lookup_list", "%_$0%_: $1:$2 ($3) (connecting...)", 5, { 0, 0, 1, 0, 0 } },
- { "server_reconnect_list", "%_$0%_: $1:$2 ($3) ($5 left before reconnecting)", 6, { 0, 0, 1, 0, 0, 0 } },
- { "server_reconnect_removed", "Removed reconnection to server %_$0%_ port %_$1%_", 3, { 0, 1, 0 } },
- { "server_reconnect_not_found", "Reconnection tag %_$0%_ not found", 1, { 0 } },
- { "query_server_changed", "Query with %_$2%_ changed to server %_$1%_", 3, { 0, 0, 0 } },
- { "setupserver_added", "Server $0 saved", 2, { 0, 0 } },
- { "setupserver_removed", "Server $0 removed", 2, { 0, 0 } },
- { "setupserver_not_found", "Server $0 not found", 2, { 0, 0 } },
- { "setupserver_header", "Server Port IRC Net Settings", 0 },
- { "setupserver_line", "%|$[!20]0 $[5]1 $[10]2 $3", 4, { 0, 1, 0, 0 } },
- { "setupserver_footer", "", 0 },
- { "netsplit", "[%_$2%_] %RNetsplit%n detected between servers %_$0%_ and %_$1%_%:Use /NETSPLIT to see who left", 3, { 0, 0, 0 } },
- { "no_netsplits", "There are no net splits", 0 },
- { "netsplits_header", "Nick Channel Server Splitted server", 0 },
- { "netsplits_line", "$[9]0 $[10]1 $[20]2 $3", 4, { 0, 0, 0, 0 } },
- { "netsplits_footer", "", 0 },
-
- /* ---- */
- { NULL, "Channels", 0 },
-
- { "join", "%c%_$0%_ %K[%c$1%K]%n has joined %_$2", 3, { 0, 0, 0 } },
- { "part", "%c$0 %K[%n$1%K]%n has left %_$2%_ %K[%n$3%K]", 4, { 0, 0, 0, 0 } },
- { "joinerror_toomany", "Cannot join to channel %_$0%_ %K(%nYou have joined to too many channels%K)", 1, { 0 } },
- { "joinerror_full", "Cannot join to channel %_$0%_ %K(%nChannel is full%K)", 1, { 0 } },
- { "joinerror_invite", "Cannot join to channel %_$0%_ %K(%nYou must be invited%K)", 1, { 0 } },
- { "joinerror_banned", "Cannot join to channel %_$0%_ %K(%nYou are banned%K)", 1, { 0 } },
- { "joinerror_bad_key", "Cannot join to channel %_$0%_ %K(%nBad channel key%K)", 1, { 0 } },
- { "joinerror_bad_mask", "Cannot join to channel %_$0%_ %K(%nBad channel mask%K)", 1, { 0 } },
- { "joinerror_unavail", "Cannot join to channel %_$0%_ %K(%nChannel is temporarily unavailable%K)", 1, { 0 } },
- { "kick", "%c$0%n was kicked from %_$1%_ by %_$2%_ %K[%n$3%K]", 4, { 0, 0, 0, 0 } },
- { "quit", "%c$0 %K[%n$1%K]%n has quit IRC %K[%n$2%K]", 3, { 0, 0, 0 } },
- { "quit_once", "%_$3%_ %c$0 %K[%n$1%K]%n has quit IRC %K[%n$2%K]", 4, { 0, 0, 0, 0 } },
- { "invite", "%_$0%_ invites you to %_$1", 2, { 0, 0 } },
- { "inviting", "Inviting $0 to %_$1", 2, { 0, 0 } },
- { "not_invited", "You have not been invited to a channel!", 0 },
- { "names", "%K[%g%_Users%_%K(%g$0%K)]%n $1", 2, { 0, 0 } },
- { "endofnames", "%g%_$0%_%K:%n Total of %_$1%_ nicks %K[%n%_$2%_ ops, %_$3%_ voices, %_$4%_ normal%K]", 5, { 0, 1, 1, 1, 1 } },
- { "channel_created", "Channel %_$0%_ created $1", 2, { 0, 0 } },
- { "topic", "Topic for %c$0%K:%n $1", 2, { 0, 0 } },
- { "no_topic", "No topic set for %c$0", 1, { 0 } },
- { "new_topic", "%_$0%_ changed the topic of %c$1%n to%K:%n $2", 3, { 0, 0, 0 } },
- { "topic_unset", "Topic unset by %_$0%_ on %c$1", 2, { 0, 0 } },
- { "topic_info", "Topic set by %_$0%_ %K[%n$1%K]", 2, { 0, 0 } },
- { "chanmode_change", "mode/%c$0 %K[%n$1%K]%n by %_$2", 3, { 0, 0, 0 } },
- { "server_chanmode_change", "%RServerMode/%c$0 %K[%n$1%K]%n by %_$2", 3, { 0, 0, 0 } },
- { "channel_mode", "mode/%c$0 %K[%n$1%K]", 2, { 0, 0 } },
- { "bantype", "Ban type changed to %_$0", 1, { 0 } },
- { "banlist", "%_$0%_: ban %c$1", 2, { 0, 0 } },
- { "banlist_long", "%_$0%_: ban %c$1 %K[%nby %_$2%_, $3 secs ago%K]", 4, { 0, 0, 0, 1 } },
- { "ebanlist", "%_$0%_: ban exception %c$1", 2, { 0, 0 } },
- { "ebanlist_long", "%_$0%_: ban exception %c$1 %K[%nby %_$2%_, $3 secs ago%K]", 4, { 0, 0, 0, 1 } },
- { "invitelist", "%_$0%_: invite %c$1", 2, { 0, 0 } },
- { "no_such_channel", "$0: No such channel", 1, { 0 } },
- { "channel_synced", "Join to %_$0%_ was synced in %_$1%_ secs", 2, { 0, 2 } },
- { "not_in_channels", "You are not on any channels", 0 },
- { "current_channel", "Current channel $0", 1, { 0 } },
- { "chanlist_header", "You are on the following channels:", 0 },
- { "chanlist_line", "$[-10]0 %|+$1 ($2): $3", 4, { 0, 0, 0, 0 } },
- { "chansetup_not_found", "Channel $0 not found", 2, { 0, 0 } },
- { "chansetup_added", "Channel $0 saved", 2, { 0, 0 } },
- { "chansetup_removed", "Channel $0 removed", 2, { 0, 0 } },
- { "chansetup_header", "Channel IRC net Password Settings", 0 },
- { "chansetup_line", "$[15]0 %|$[10]1 $[10]2 $3", 4, { 0, 0, 0, 0 } },
- { "chansetup_footer", "", 0 },
-
- /* ---- */
- { NULL, "Nick", 0 },
-
- { "usermode_change", "Mode change %K[%n%_$0%_%K]%n for user %c$1", 2, { 0, 0 } },
- { "user_mode", "Your user mode is %K[%n%_$0%_%K]", 1, { 0 } },
- { "away", "You have been marked as being away", 0 },
- { "unaway", "You are no longer marked as being away", 0 },
- { "nick_away", "$0 is away: $1", 2, { 0, 0 } },
- { "no_such_nick", "$0: No such nick/channel", 1, { 0 } },
- { "your_nick", "Your nickname is $0", 1, { 0 } },
- { "your_nick_changed", "You're now known as %c$0", 1, { 0 } },
- { "nick_changed", "%_$0%_ is now known as %c$1", 2, { 0, 0 } },
- { "nick_in_use", "Nick %_$0%_ is already in use", 1, { 0 } },
- { "nick_unavailable", "Nick %_$0%_ is temporarily unavailable", 1, { 0 } },
- { "your_nick_owned", "Your nick is owned by %_$3%_ %K[%n$1@$2%K]", 4, { 0, 0, 0, 0 } },
-
- /* ---- */
- { NULL, "Who queries", 0 },
-
- { "whois", "%_$0%_ %K[%n$1@$2%K]%n%: ircname : $3", 4, { 0, 0, 0, 0 } },
- { "whois_idle", " idle : $1 hours $2 mins $3 secs", 4, { 0, 1, 1, 1 } },
- { "whois_idle_signon", " idle : $1 hours $2 mins $3 secs %K[%nsignon: $4%K]", 5, { 0, 1, 1, 1, 0 } },
- { "whois_server", " server : $1 %K[%n$2%K]", 3, { 0, 0, 0 } },
- { "whois_oper", " : %_IRC operator%_", 1, { 0 } },
- { "whois_channels", " channels : $1", 2, { 0, 0 } },
- { "whois_away", " away : $1", 2, { 0, 0 } },
- { "end_of_whois", "End of WHOIS", 1, { 0 } },
- { "who", "$[-10]0 %|%_$[!9]1%_ $[!3]2 $[!2]3 $4@$5 %K(%W$6%K)", 7, { 0, 0, 0, 0, 0, 0, 0 } },
- { "end_of_who", "End of /WHO list", 1, { 0 } },
-
- /* ---- */
- { NULL, "Your messages", 0 },
-
- { "own_msg", "%K<%n$2%W$0%K>%n %|$1", 3, { 0, 0, 0 } },
- { "own_msg_channel", "%K<%n$3%W$0%K:%c$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
- { "own_msg_private", "%K[%rmsg%K(%R$0%K)]%n $1", 2, { 0, 0 } },
- { "own_msg_private_query", "%K<%W$2%K>%n %|$1", 3, { 0, 0, 0 } },
- { "own_notice", "%K[%rnotice%K(%R$0%K)]%n $1", 2, { 0, 0 } },
- { "own_me", "%W * $0%n $1", 2, { 0, 0 } },
- { "own_ctcp", "%K[%rctcp%K(%R$0%K)]%n $1 $2", 3, { 0, 0, 0 } },
-
- /* ---- */
- { NULL, "Received messages", 0 },
-
- { "pubmsg_me", "%K<%n$2%Y$0%K>%n %|$1", 3, { 0, 0, 0 } },
- { "pubmsg_me_channel", "%K<%n$3%Y$0%K:%c$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
- { "pubmsg_hilight", "%K<%n$3$0$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
- { "pubmsg_hilight_channel", "%K<%n$4$0$1%K:%c$2%K>%n %|$3", 5, { 0, 0, 0, 0, 0 } },
- { "pubmsg", "%K<%n$2$0%K>%n %|$1", 3, { 0, 0, 0 } },
- { "pubmsg_channel", "%K<%n$3$0%K:%c$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
- { "msg_private", "%K[%R$0%K(%r$1%K)]%n $2", 3, { 0, 0, 0 } },
- { "msg_private_query", "%K<%R$0%K>%n %|$2", 3, { 0, 0, 0 } },
- { "notice_server", "%g!$0%n $1", 2, { 0, 0 } },
- { "notice_public", "%K-%M$0%K:%m$1%K-%n $2", 3, { 0, 0, 0 } },
- { "notice_public_ops", "%K-%M$0%K:%m@$1%K-%n $2", 3, { 0, 0, 0 } },
- { "notice_private", "%K-%M$0%K(%m$1%K)-%n $2", 3, { 0, 0, 0 } },
- { "action_private", "%W (*) $0%n $2", 3, { 0, 0, 0 } },
- { "action_private_query", "%W * $0%n $2", 3, { 0, 0, 0 } },
- { "action_public", "%W * $0%n $1", 2, { 0, 0 } },
- { "action_public_channel", "%W * $0%K:%c$1%n $2", 3, { 0, 0, 0 } },
-
- /* ---- */
- { NULL, "CTCPs", 0 },
-
- { "ctcp_reply", "CTCP %_$0%_ reply from %_$1%_%K:%n $2", 3, { 0, 0, 0 } },
- { "ctcp_reply_channel", "CTCP %_$0%_ reply from %_$1%_ in channel %_$4%_%K:%n $2", 4, { 0, 0, 0, 0 } },
- { "ctcp_ping_reply", "CTCP %_PING%_ reply from %_$0%_: $1.$2 seconds", 3, { 0, 2, 2 } },
- { "ctcp_requested", "%g>>> %_$0%_ %K[%g$1%K] %grequested %_$2%_ from %_$3", 4, { 0, 0, 0, 0 } },
-
- /* ---- */
- { NULL, "Other server events", 0 },
-
- { "online", "Users online: %_$0", 1, { 0 } },
- { "pong", "PONG received from $0: $1", 2, { 0, 0 } },
- { "wallops", "%WWALLOP%n $0: $1", 2, { 0, 0 } },
- { "action_wallops", "%WWALLOP * $0%n $1", 2, { 0, 0 } },
- { "error", "%_ERROR%_ $0", 1, { 0 } },
- { "unknown_mode", "Unknown mode character $0", 1, { 0 } },
- { "not_chanop", "You're not channel operator in $0", 1, { 0 } },
-
- /* ---- */
- { NULL, "Misc", 0 },
-
- { "ignored", "Ignoring %_$1%_ from %_$0%_", 2, { 0, 0 } },
- { "unignored", "Unignored %_$0%_", 1, { 0 } },
- { "ignore_not_found", "%_$0%_ is not being ignored", 1, { 0 } },
- { "ignore_no_ignores", "There are no ignores", 0 },
- { "ignore_header", "Ignorance List:", 0 },
- { "ignore_line", "$[-4]0 $1: $2 $3 $4", 5, { 1, 0, 0, 0, 0 } },
- { "ignore_footer", "", 0 },
- { "talking_in", "You are now talking in %_$0%_", 1, { 0 } },
- { "no_query", "No query with %_$0%_", 1, { 0 } },
- { "no_msgs_got", "You have not received a message from anyone yet", 0 },
- { "no_msgs_sent", "You have not sent a message to anyone yet", 0 }
-};
+FORMAT_REC fecommon_irc_formats[] = {
+ { MODULE_NAME, "IRC", 0 },
+
+ /* ---- */
+ { NULL, "Server", 0 },
+
+ { "lag_disconnected", "No PONG reply from server %_$0%_ in $1 seconds, disconnecting", 2, { 0, 1 } },
+ { "disconnected", "Disconnected from %_$0%_ %K[%n$1%K]", 2, { 0, 0 } },
+ { "server_list", "%_$0%_: $1:$2 ($3)", 5, { 0, 0, 1, 0, 0 } },
+ { "server_lookup_list", "%_$0%_: $1:$2 ($3) (connecting...)", 5, { 0, 0, 1, 0, 0 } },
+ { "server_reconnect_list", "%_$0%_: $1:$2 ($3) ($5 left before reconnecting)", 6, { 0, 0, 1, 0, 0, 0 } },
+ { "server_reconnect_removed", "Removed reconnection to server %_$0%_ port %_$1%_", 3, { 0, 1, 0 } },
+ { "server_reconnect_not_found", "Reconnection tag %_$0%_ not found", 1, { 0 } },
+ { "query_server_changed", "Query with %_$2%_ changed to server %_$1%_", 3, { 0, 0, 0 } },
+ { "setupserver_added", "Server $0 saved", 2, { 0, 0 } },
+ { "setupserver_removed", "Server $0 removed", 2, { 0, 0 } },
+ { "setupserver_not_found", "Server $0 not found", 2, { 0, 0 } },
+ { "setupserver_header", "Server Port IRC Net Settings", 0 },
+ { "setupserver_line", "%|$[!20]0 $[5]1 $[10]2 $3", 4, { 0, 1, 0, 0 } },
+ { "setupserver_footer", "", 0 },
+ { "netsplit", "%RNetsplit%n detected between servers %_$0%_ and %_$1%_%:Use /NETSPLIT to see who left", 2, { 0, 0 } },
+ { "no_netsplits", "There are no net splits", 0 },
+ { "netsplits_header", "Nick Channel Server Splitted server", 0 },
+ { "netsplits_line", "$[9]0 $[10]1 $[20]2 $3", 4, { 0, 0, 0, 0 } },
+ { "netsplits_footer", "", 0 },
+
+ /* ---- */
+ { NULL, "Channels", 0 },
+
+ { "join", "%c%_$0%_ %K[%c$1%K]%n has joined %_$2", 3, { 0, 0, 0 } },
+ { "part", "%c$0 %K[%n$1%K]%n has left %_$2%_ %K[%n$3%K]", 4, { 0, 0, 0, 0 } },
+ { "joinerror_toomany", "Cannot join to channel %_$0%_ %K(%nYou have joined to too many channels%K)", 1, { 0 } },
+ { "joinerror_full", "Cannot join to channel %_$0%_ %K(%nChannel is full%K)", 1, { 0 } },
+ { "joinerror_invite", "Cannot join to channel %_$0%_ %K(%nYou must be invited%K)", 1, { 0 } },
+ { "joinerror_banned", "Cannot join to channel %_$0%_ %K(%nYou are banned%K)", 1, { 0 } },
+ { "joinerror_bad_key", "Cannot join to channel %_$0%_ %K(%nBad channel key%K)", 1, { 0 } },
+ { "joinerror_bad_mask", "Cannot join to channel %_$0%_ %K(%nBad channel mask%K)", 1, { 0 } },
+ { "joinerror_unavail", "Cannot join to channel %_$0%_ %K(%nChannel is temporarily unavailable%K)", 1, { 0 } },
+ { "kick", "%c$0%n was kicked from %_$1%_ by %_$2%_ %K[%n$3%K]", 4, { 0, 0, 0, 0 } },
+ { "quit", "%c$0 %K[%n$1%K]%n has quit IRC %K[%n$2%K]", 3, { 0, 0, 0 } },
+ { "quit_once", "%_$3%_ %c$0 %K[%n$1%K]%n has quit IRC %K[%n$2%K]", 4, { 0, 0, 0, 0 } },
+ { "invite", "%_$0%_ invites you to %_$1", 2, { 0, 0 } },
+ { "inviting", "Inviting $0 to %_$1", 2, { 0, 0 } },
+ { "not_invited", "You have not been invited to a channel!", 0 },
+ { "names", "%K[%g%_Users%_%K(%g$0%K)]%n $1", 2, { 0, 0 } },
+ { "endofnames", "%g%_$0%_%K:%n Total of %_$1%_ nicks %K[%n%_$2%_ ops, %_$3%_ voices, %_$4%_ normal%K]", 5, { 0, 1, 1, 1, 1 } },
+ { "channel_created", "Channel %_$0%_ created $1", 2, { 0, 0 } },
+ { "topic", "Topic for %c$0%K:%n $1", 2, { 0, 0 } },
+ { "no_topic", "No topic set for %c$0", 1, { 0 } },
+ { "new_topic", "%_$0%_ changed the topic of %c$1%n to%K:%n $2", 3, { 0, 0, 0 } },
+ { "topic_unset", "Topic unset by %_$0%_ on %c$1", 2, { 0, 0 } },
+ { "topic_info", "Topic set by %_$0%_ %K[%n$1%K]", 2, { 0, 0 } },
+ { "chanmode_change", "mode/%c$0 %K[%n$1%K]%n by %_$2", 3, { 0, 0, 0 } },
+ { "server_chanmode_change", "%RServerMode/%c$0 %K[%n$1%K]%n by %_$2", 3, { 0, 0, 0 } },
+ { "channel_mode", "mode/%c$0 %K[%n$1%K]", 2, { 0, 0 } },
+ { "bantype", "Ban type changed to %_$0", 1, { 0 } },
+ { "banlist", "%_$0%_: ban %c$1", 2, { 0, 0 } },
+ { "banlist_long", "%_$0%_: ban %c$1 %K[%nby %_$2%_, $3 secs ago%K]", 4, { 0, 0, 0, 1 } },
+ { "ebanlist", "%_$0%_: ban exception %c$1", 2, { 0, 0 } },
+ { "ebanlist_long", "%_$0%_: ban exception %c$1 %K[%nby %_$2%_, $3 secs ago%K]", 4, { 0, 0, 0, 1 } },
+ { "invitelist", "%_$0%_: invite %c$1", 2, { 0, 0 } },
+ { "no_such_channel", "$0: No such channel", 1, { 0 } },
+ { "channel_synced", "Join to %_$0%_ was synced in %_$1%_ secs", 2, { 0, 2 } },
+ { "not_in_channels", "You are not on any channels", 0 },
+ { "current_channel", "Current channel $0", 1, { 0 } },
+ { "chanlist_header", "You are on the following channels:", 0 },
+ { "chanlist_line", "$[-10]0 %|+$1 ($2): $3", 4, { 0, 0, 0, 0 } },
+ { "chansetup_not_found", "Channel $0 not found", 2, { 0, 0 } },
+ { "chansetup_added", "Channel $0 saved", 2, { 0, 0 } },
+ { "chansetup_removed", "Channel $0 removed", 2, { 0, 0 } },
+ { "chansetup_header", "Channel IRC net Password Settings", 0 },
+ { "chansetup_line", "$[15]0 %|$[10]1 $[10]2 $3", 4, { 0, 0, 0, 0 } },
+ { "chansetup_footer", "", 0 },
+
+ /* ---- */
+ { NULL, "Nick", 0 },
+
+ { "usermode_change", "Mode change %K[%n%_$0%_%K]%n for user %c$1", 2, { 0, 0 } },
+ { "user_mode", "Your user mode is %K[%n%_$0%_%K]", 1, { 0 } },
+ { "away", "You have been marked as being away", 0 },
+ { "unaway", "You are no longer marked as being away", 0 },
+ { "nick_away", "$0 is away: $1", 2, { 0, 0 } },
+ { "no_such_nick", "$0: No such nick/channel", 1, { 0 } },
+ { "your_nick", "Your nickname is $0", 1, { 0 } },
+ { "your_nick_changed", "You're now known as %c$0", 1, { 0 } },
+ { "nick_changed", "%_$0%_ is now known as %c$1", 2, { 0, 0 } },
+ { "nick_in_use", "Nick %_$0%_ is already in use", 1, { 0 } },
+ { "nick_unavailable", "Nick %_$0%_ is temporarily unavailable", 1, { 0 } },
+ { "your_nick_owned", "Your nick is owned by %_$3%_ %K[%n$1@$2%K]", 4, { 0, 0, 0, 0 } },
+
+ /* ---- */
+ { NULL, "Who queries", 0 },
+
+ { "whois", "%_$0%_ %K[%n$1@$2%K]%n%: ircname : $3", 4, { 0, 0, 0, 0 } },
+ { "whois_idle", " idle : $1 hours $2 mins $3 secs", 4, { 0, 1, 1, 1 } },
+ { "whois_idle_signon", " idle : $1 hours $2 mins $3 secs %K[%nsignon: $4%K]", 5, { 0, 1, 1, 1, 0 } },
+ { "whois_server", " server : $1 %K[%n$2%K]", 3, { 0, 0, 0 } },
+ { "whois_oper", " : %_IRC operator%_", 1, { 0 } },
+ { "whois_channels", " channels : $1", 2, { 0, 0 } },
+ { "whois_away", " away : $1", 2, { 0, 0 } },
+ { "end_of_whois", "End of WHOIS", 1, { 0 } },
+ { "who", "$[-10]0 %|%_$[!9]1%_ $[!3]2 $[!2]3 $4@$5 %K(%W$6%K)", 7, { 0, 0, 0, 0, 0, 0, 0 } },
+ { "end_of_who", "End of /WHO list", 1, { 0 } },
+
+ /* ---- */
+ { NULL, "Your messages", 0 },
+
+ { "own_msg", "%K<%n$2%W$0%K>%n %|$1", 3, { 0, 0, 0 } },
+ { "own_msg_channel", "%K<%n$3%W$0%K:%c$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
+ { "own_msg_private", "%K[%rmsg%K(%R$0%K)]%n $1", 2, { 0, 0 } },
+ { "own_msg_private_query", "%K<%W$2%K>%n %|$1", 3, { 0, 0, 0 } },
+ { "own_notice", "%K[%rnotice%K(%R$0%K)]%n $1", 2, { 0, 0 } },
+ { "own_me", "%W * $0%n $1", 2, { 0, 0 } },
+ { "own_ctcp", "%K[%rctcp%K(%R$0%K)]%n $1 $2", 3, { 0, 0, 0 } },
+
+ /* ---- */
+ { NULL, "Received messages", 0 },
+
+ { "pubmsg_me", "%K<%n$2%Y$0%K>%n %|$1", 3, { 0, 0, 0 } },
+ { "pubmsg_me_channel", "%K<%n$3%Y$0%K:%c$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
+ { "pubmsg_hilight", "%K<%n$3$0$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
+ { "pubmsg_hilight_channel", "%K<%n$4$0$1%K:%c$2%K>%n %|$3", 5, { 0, 0, 0, 0, 0 } },
+ { "pubmsg", "%K<%n$2$0%K>%n %|$1", 3, { 0, 0, 0 } },
+ { "pubmsg_channel", "%K<%n$3$0%K:%c$1%K>%n %|$2", 4, { 0, 0, 0, 0 } },
+ { "msg_private", "%K[%R$0%K(%r$1%K)]%n $2", 3, { 0, 0, 0 } },
+ { "msg_private_query", "%K<%R$0%K>%n %|$2", 3, { 0, 0, 0 } },
+ { "notice_server", "%g!$0%n $1", 2, { 0, 0 } },
+ { "notice_public", "%K-%M$0%K:%m$1%K-%n $2", 3, { 0, 0, 0 } },
+ { "notice_public_ops", "%K-%M$0%K:%m@$1%K-%n $2", 3, { 0, 0, 0 } },
+ { "notice_private", "%K-%M$0%K(%m$1%K)-%n $2", 3, { 0, 0, 0 } },
+ { "action_private", "%W (*) $0%n $2", 3, { 0, 0, 0 } },
+ { "action_private_query", "%W * $0%n $2", 3, { 0, 0, 0 } },
+ { "action_public", "%W * $0%n $1", 2, { 0, 0 } },
+ { "action_public_channel", "%W * $0%K:%c$1%n $2", 3, { 0, 0, 0 } },
+
+ /* ---- */
+ { NULL, "CTCPs", 0 },
+
+ { "ctcp_reply", "CTCP %_$0%_ reply from %_$1%_%K:%n $2", 3, { 0, 0, 0 } },
+ { "ctcp_reply_channel", "CTCP %_$0%_ reply from %_$1%_ in channel %_$4%_%K:%n $2", 4, { 0, 0, 0, 0 } },
+ { "ctcp_ping_reply", "CTCP %_PING%_ reply from %_$0%_: $1.$2 seconds", 3, { 0, 2, 2 } },
+ { "ctcp_requested", "%g>>> %_$0%_ %K[%g$1%K] %grequested %_$2%_ from %_$3", 4, { 0, 0, 0, 0 } },
+
+ /* ---- */
+ { NULL, "Other server events", 0 },
+
+ { "online", "Users online: %_$0", 1, { 0 } },
+ { "pong", "PONG received from $0: $1", 2, { 0, 0 } },
+ { "wallops", "%WWALLOP%n $0: $1", 2, { 0, 0 } },
+ { "action_wallops", "%WWALLOP * $0%n $1", 2, { 0, 0 } },
+ { "error", "%_ERROR%_ $0", 1, { 0 } },
+ { "unknown_mode", "Unknown mode character $0", 1, { 0 } },
+ { "not_chanop", "You're not channel operator in $0", 1, { 0 } },
+
+ /* ---- */
+ { NULL, "Misc", 0 },
+
+ { "ignored", "Ignoring %_$1%_ from %_$0%_", 2, { 0, 0 } },
+ { "unignored", "Unignored %_$0%_", 1, { 0 } },
+ { "ignore_not_found", "%_$0%_ is not being ignored", 1, { 0 } },
+ { "ignore_no_ignores", "There are no ignores", 0 },
+ { "ignore_header", "Ignorance List:", 0 },
+ { "ignore_line", "$[-4]0 $1: $2 $3 $4", 5, { 1, 0, 0, 0, 0 } },
+ { "ignore_footer", "", 0 },
+ { "talking_in", "You are now talking in %_$0%_", 1, { 0 } },
+ { "no_query", "No query with %_$0%_", 1, { 0 } },
+ { "no_msgs_got", "You have not received a message from anyone yet", 0 },
+ { "no_msgs_sent", "You have not sent a message to anyone yet", 0 },
+
+ { NULL, NULL, 0 }
diff --git a/src/fe-common/irc/module-formats.h b/src/fe-common/irc/module-formats.h
index ea615d2d..b811a2de 100644
--- a/src/fe-common/irc/module-formats.h
+++ b/src/fe-common/irc/module-formats.h
@@ -162,6 +162,3 @@ enum {
};
extern FORMAT_REC fecommon_irc_formats[];
-#define MODULE_FORMATS fecommon_irc_formats
-
-#include "printformat.h"
diff --git a/src/fe-common/irc/notifylist/Makefile.am b/src/fe-common/irc/notifylist/Makefile.am
index c44da278..53dd7374 100644
--- a/src/fe-common/irc/notifylist/Makefile.am
+++ b/src/fe-common/irc/notifylist/Makefile.am
@@ -13,5 +13,6 @@ libfe_common_irc_notifylist_la_SOURCES = \
fe-notifylist.c \
module-formats.c
-noinst_headers = \
+noinst_HEADERS = \
+ module.h \
module-formats.h
diff --git a/src/fe-common/irc/notifylist/fe-notifylist.c b/src/fe-common/irc/notifylist/fe-notifylist.c
index 7520cdb8..3a799de3 100644
--- a/src/fe-common/irc/notifylist/fe-notifylist.c
+++ b/src/fe-common/irc/notifylist/fe-notifylist.c
@@ -31,6 +31,8 @@
#include "ircnet-setup.h"
#include "irc/notifylist/notifylist.h"
+#include "themes.h"
+
/* add the nick of a hostmask to list if it isn't there already */
static GSList *mask_add_once(GSList *list, const char *mask)
{
@@ -224,6 +226,8 @@ static void notifylist_unidle(IRC_SERVER_REC *server, const char *nick,
void fe_notifylist_init(void)
{
+ theme_register(fecommon_irc_notifylist_formats);
+
command_bind("notify", NULL, (SIGNAL_FUNC) cmd_notify);
signal_add("notifylist joined", (SIGNAL_FUNC) notifylist_joined);
signal_add("notifylist left", (SIGNAL_FUNC) notifylist_left);
@@ -233,6 +237,8 @@ void fe_notifylist_init(void)
void fe_notifylist_deinit(void)
{
+ theme_unregister();
+
command_unbind("notify", (SIGNAL_FUNC) cmd_notify);
signal_remove("notifylist joined", (SIGNAL_FUNC) notifylist_joined);
signal_remove("notifylist left", (SIGNAL_FUNC) notifylist_left);
diff --git a/src/fe-common/irc/notifylist/module-formats.c b/src/fe-common/irc/notifylist/module-formats.c
index 7a673457..e369d52c 100644
--- a/src/fe-common/irc/notifylist/module-formats.c
+++ b/src/fe-common/irc/notifylist/module-formats.c
@@ -23,17 +23,19 @@
FORMAT_REC fecommon_irc_notifylist_formats[] =
{
- { MODULE_NAME, "Notifylist", 0 },
-
- /* ---- */
- { NULL, "Notifylist", 0 },
-
- { "notify_join", "%_$0%_ %K[%n$1@$2%K] [%n%_$3%_%K]%n has joined to $4", 5, { 0, 0, 0, 0, 0 } },
- { "notify_part", "%_$0%_ has left $4", 5, { 0, 0, 0, 0, 0 } },
- { "notify_away", "%_$0%_ %K[%n$5%K]%n %K[%n$1@$2%K] [%n%_$3%_%K]%n is now away: $4", 6, { 0, 0, 0, 0, 0, 0 } },
- { "notify_unaway", "%_$0%_ %K[%n$4%K]%n %K[%n$1@$2%K] [%n%_$3%_%K]%n is now unaway", 5, { 0, 0, 0, 0, 0 } },
- { "notify_unidle", "%_$0%_ %K[%n$5%K]%n %K[%n$1@$2%K] [%n%_$3%_%K]%n just stopped idling", 6, { 0, 0, 0, 0, 0, 0 } },
- { "notify_online", "On $0: %_$1%_", 2, { 0, 0 } },
- { "notify_offline", "Offline: $0", 1, { 0 } },
- { "notify_list", "$0: $1 $2 $3", 4, { 0, 0, 0, 0 } }
+ { MODULE_NAME, "Notifylist", 0 },
+
+ /* ---- */
+ { NULL, "Notifylist", 0 },
+
+ { "notify_join", "%_$0%_ %K[%n$1@$2%K] [%n%_$3%_%K]%n has joined to $4", 5, { 0, 0, 0, 0, 0 } },
+ { "notify_part", "%_$0%_ has left $4", 5, { 0, 0, 0, 0, 0 } },
+ { "notify_away", "%_$0%_ %K[%n$5%K]%n %K[%n$1@$2%K] [%n%_$3%_%K]%n is now away: $4", 6, { 0, 0, 0, 0, 0, 0 } },
+ { "notify_unaway", "%_$0%_ %K[%n$4%K]%n %K[%n$1@$2%K] [%n%_$3%_%K]%n is now unaway", 5, { 0, 0, 0, 0, 0 } },
+ { "notify_unidle", "%_$0%_ %K[%n$5%K]%n %K[%n$1@$2%K] [%n%_$3%_%K]%n just stopped idling", 6, { 0, 0, 0, 0, 0, 0 } },
+ { "notify_online", "On $0: %_$1%_", 2, { 0, 0 } },
+ { "notify_offline", "Offline: $0", 1, { 0 } },
+ { "notify_list", "$0: $1 $2 $3", 4, { 0, 0, 0, 0 } },
+
+ { NULL, NULL, 0 },
};
diff --git a/src/fe-common/irc/notifylist/module-formats.h b/src/fe-common/irc/notifylist/module-formats.h
index f5f855dc..e37045f1 100644
--- a/src/fe-common/irc/notifylist/module-formats.h
+++ b/src/fe-common/irc/notifylist/module-formats.h
@@ -16,6 +16,3 @@ enum {
};
extern FORMAT_REC fecommon_irc_notifylist_formats[];
-#define MODULE_FORMATS fecommon_irc_notifylist_formats
-
-#include "printformat.h"
diff --git a/src/fe-common/irc/notifylist/module.h b/src/fe-common/irc/notifylist/module.h
new file mode 100644
index 00000000..00aa01e3
--- /dev/null
+++ b/src/fe-common/irc/notifylist/module.h
@@ -0,0 +1,3 @@
+#include "common.h"
+
+#define MODULE_NAME "fe-common/irc/notifylist"