diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2010-10-29 23:25:05 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2010-10-29 23:25:05 +0200 |
commit | fcc209a8bf14da3ce4bb8b81feff9b4713fef002 (patch) | |
tree | 21975847c96927cd1ae8111b21ef656cc356e4d6 /src/plugins/irc | |
parent | 90c99339b486ebf5d587e33e0d9d406deac9ea2d (diff) | |
download | weechat-fcc209a8bf14da3ce4bb8b81feff9b4713fef002.zip |
Add new option irc.look.nick_color_force
Diffstat (limited to 'src/plugins/irc')
-rw-r--r-- | src/plugins/irc/irc-config.c | 94 | ||||
-rw-r--r-- | src/plugins/irc/irc-config.h | 5 | ||||
-rw-r--r-- | src/plugins/irc/irc-nick.c | 46 | ||||
-rw-r--r-- | src/plugins/irc/irc-nick.h | 2 |
4 files changed, 128 insertions, 19 deletions
diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index c7a48cc97..f64048ab4 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -56,6 +56,8 @@ struct t_config_option *irc_config_look_new_channel_position; struct t_config_option *irc_config_look_new_pv_position; struct t_config_option *irc_config_look_nick_prefix; struct t_config_option *irc_config_look_nick_suffix; +struct t_config_option *irc_config_look_nick_color_force; +struct t_config_option *irc_config_look_nick_color_stop_chars; struct t_config_option *irc_config_look_nick_completion_smart; struct t_config_option *irc_config_look_display_away; struct t_config_option *irc_config_look_display_ctcp_blocked; @@ -76,7 +78,6 @@ struct t_config_option *irc_config_look_hide_nickserv_pwd; struct t_config_option *irc_config_look_highlight_tags; struct t_config_option *irc_config_look_item_display_server; struct t_config_option *irc_config_look_msgbuffer_fallback; -struct t_config_option *irc_config_look_nick_color_stop_chars; struct t_config_option *irc_config_look_notice_as_pv; struct t_config_option *irc_config_look_part_closes_buffer; struct t_config_option *irc_config_look_raw_messages; @@ -121,6 +122,7 @@ struct t_config_option *irc_config_network_send_unknown_commands; struct t_config_option *irc_config_server_default[IRC_SERVER_NUM_OPTIONS]; struct t_hook *hook_config_color_nicks_number = NULL; +struct t_hashtable *irc_config_hashtable_nick_color_force = NULL; int irc_config_write_temp_servers = 0; @@ -171,7 +173,9 @@ irc_config_compute_nick_colors () for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick) { - ptr_nick->color = irc_nick_find_color (ptr_nick->name); + if (ptr_nick->color) + free (ptr_nick->color); + ptr_nick->color = strdup (irc_nick_find_color (ptr_nick->name)); } } } @@ -363,6 +367,54 @@ irc_config_change_look_highlight_tags (void *data, } /* + * irc_config_change_look_nick_color_force: called when the "nick color force" + * option is changed + */ + +void +irc_config_change_look_nick_color_force (void *data, + struct t_config_option *option) +{ + char **items, *pos; + int num_items, i; + + /* make C compiler happy */ + (void) data; + (void) option; + + if (!irc_config_hashtable_nick_color_force) + { + irc_config_hashtable_nick_color_force = weechat_hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + } + else + weechat_hashtable_remove_all (irc_config_hashtable_nick_color_force); + + items = weechat_string_split (weechat_config_string (irc_config_look_nick_color_force), + ";", 0, 0, &num_items); + if (items) + { + for (i = 0; i < num_items; i++) + { + pos = strchr (items[i], ':'); + if (pos) + { + pos[0] = '\0'; + weechat_hashtable_set (irc_config_hashtable_nick_color_force, + items[i], + pos + 1); + } + } + weechat_string_free_split (items); + } + + irc_config_compute_nick_colors (); +} + +/* * irc_config_change_look_nick_color_stop_chars: called when the "nick color * stop chars" option is changed */ @@ -1591,6 +1643,12 @@ irc_config_init () { struct t_config_section *ptr_section; + irc_config_hashtable_nick_color_force = weechat_hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + irc_config_file = weechat_config_new (IRC_CONFIG_NAME, &irc_config_reload, NULL); if (!irc_config_file) @@ -1655,6 +1713,23 @@ irc_config_init () "nick_suffix", "string", N_("text to display after nick in chat window"), NULL, 0, 0, "", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); + irc_config_look_nick_color_force = weechat_config_new_option ( + irc_config_file, ptr_section, + "nick_color_force", "string", + N_("force color for some nicks: hash computed with nickname " + "to find color will not be used for these nicks (format is: " + "\"nick1:color1;nick2:color2\")"), + NULL, 0, 0, "", NULL, 0, NULL, NULL, + &irc_config_change_look_nick_color_force, NULL, NULL, NULL); + irc_config_look_nick_color_stop_chars = weechat_config_new_option ( + irc_config_file, ptr_section, + "nick_color_stop_chars", "string", + N_("chars used to stop in nick when computing color with letters of " + "nick (at least one char outside this list must be in string before " + "stopping) (example: nick \"|nick|away\" with \"|\" in chars will " + "return color of nick \"|nick\")"), + NULL, 0, 0, "_|[", NULL, 0, NULL, NULL, + &irc_config_change_look_nick_color_stop_chars, NULL, NULL, NULL); irc_config_look_nick_completion_smart = weechat_config_new_option ( irc_config_file, ptr_section, "nick_completion_smart", "integer", @@ -1778,15 +1853,6 @@ irc_config_init () "private and that private buffer is not found"), "current|server", 0, 0, "current", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); - irc_config_look_nick_color_stop_chars = weechat_config_new_option ( - irc_config_file, ptr_section, - "nick_color_stop_chars", "string", - N_("chars used to stop in nick when computing color with letters of " - "nick (at least one char outside this list must be in string before " - "stopping) (example: nick \"|nick|away\" with \"|\" in chars will " - "return color of nick \"|nick\")"), - NULL, 0, 0, "_|[", NULL, 0, NULL, NULL, - &irc_config_change_look_nick_color_stop_chars, NULL, NULL, NULL); irc_config_look_notice_as_pv = weechat_config_new_option ( irc_config_file, ptr_section, "notice_as_pv", "integer", @@ -2121,4 +2187,10 @@ irc_config_free () weechat_unhook (hook_config_color_nicks_number); hook_config_color_nicks_number = NULL; } + + if (irc_config_hashtable_nick_color_force) + { + weechat_hashtable_free (irc_config_hashtable_nick_color_force); + irc_config_hashtable_nick_color_force = NULL; + } } diff --git a/src/plugins/irc/irc-config.h b/src/plugins/irc/irc-config.h index 9a85862ce..043a56129 100644 --- a/src/plugins/irc/irc-config.h +++ b/src/plugins/irc/irc-config.h @@ -82,6 +82,8 @@ extern struct t_config_option *irc_config_look_new_channel_position; extern struct t_config_option *irc_config_look_new_pv_position; extern struct t_config_option *irc_config_look_nick_prefix; extern struct t_config_option *irc_config_look_nick_suffix; +extern struct t_config_option *irc_config_look_nick_color_force; +extern struct t_config_option *irc_config_look_nick_color_stop_chars; extern struct t_config_option *irc_config_look_nick_completion_smart; extern struct t_config_option *irc_config_look_display_away; extern struct t_config_option *irc_config_look_display_ctcp_blocked; @@ -102,7 +104,6 @@ extern struct t_config_option *irc_config_look_hide_nickserv_pwd; extern struct t_config_option *irc_config_look_highlight_tags; extern struct t_config_option *irc_config_look_item_display_server; extern struct t_config_option *irc_config_look_msgbuffer_fallback; -extern struct t_config_option *irc_config_look_nick_color_stop_chars; extern struct t_config_option *irc_config_look_notice_as_pv; extern struct t_config_option *irc_config_look_part_closes_buffer; extern struct t_config_option *irc_config_look_raw_messages; @@ -140,6 +141,8 @@ extern struct t_config_option *irc_config_network_send_unknown_commands; extern struct t_config_option *irc_config_server_default[]; +extern struct t_hashtable *irc_config_hashtable_nick_color_force; + extern void irc_config_server_change_cb (void *data, struct t_config_option *option); struct t_config_option *irc_config_server_new_option (struct t_config_file *config_file, diff --git a/src/plugins/irc/irc-nick.c b/src/plugins/irc/irc-nick.c index f368aab90..b350616cb 100644 --- a/src/plugins/irc/irc-nick.c +++ b/src/plugins/irc/irc-nick.c @@ -162,15 +162,32 @@ irc_nick_find_color (const char *nickname) { int color; char *nickname2, color_name[64]; + const char *forced_color; nickname2 = irc_nick_strdup_for_color (nickname); + + /* look if color is forced */ + forced_color = weechat_hashtable_get (irc_config_hashtable_nick_color_force, + (nickname2) ? nickname2 : nickname); + if (forced_color) + { + forced_color = weechat_color (forced_color); + if (forced_color && forced_color[0]) + { + if (nickname2) + free (nickname2); + return forced_color; + } + } + + /* hash nickname to get color */ color = irc_nick_hash_color ((nickname2) ? nickname2 : nickname); if (nickname2) free (nickname2); + /* return color */ snprintf (color_name, sizeof (color_name), "chat_nick_color%02d", color + 1); - return weechat_color (color_name); } @@ -184,15 +201,28 @@ irc_nick_find_color_name (const char *nickname) { int color; char *nickname2, color_name[128]; + const char *forced_color; nickname2 = irc_nick_strdup_for_color (nickname); + + /* look if color is forced */ + forced_color = weechat_hashtable_get (irc_config_hashtable_nick_color_force, + (nickname2) ? nickname2 : nickname); + if (forced_color) + { + if (nickname2) + free (nickname2); + return forced_color; + } + + /* hash nickname to get color */ color = irc_nick_hash_color ((nickname2) ? nickname2 : nickname); if (nickname2) free (nickname2); + /* return color name */ snprintf (color_name, sizeof (color_name), "weechat.color.chat_nick_color%02d", color + 1); - return weechat_config_color (weechat_config_get (color_name)); } @@ -493,9 +523,9 @@ irc_nick_new (struct t_irc_server *server, struct t_irc_channel *channel, irc_nick_set_prefixes (server, new_nick, prefixes); new_nick->away = away; if (weechat_strcasecmp (new_nick->name, server->nick) == 0) - new_nick->color = IRC_COLOR_CHAT_NICK_SELF; + new_nick->color = strdup (IRC_COLOR_CHAT_NICK_SELF); else - new_nick->color = irc_nick_find_color (new_nick->name); + new_nick->color = strdup (irc_nick_find_color (new_nick->name)); /* add nick to end of list */ new_nick->prev_nick = channel->last_nick; @@ -539,10 +569,12 @@ irc_nick_change (struct t_irc_server *server, struct t_irc_channel *channel, if (nick->name) free (nick->name); nick->name = strdup (new_nick); + if (nick->color) + free (nick->color); if (nick_is_me) - nick->color = IRC_COLOR_CHAT_NICK_SELF; + nick->color = strdup (IRC_COLOR_CHAT_NICK_SELF); else - nick->color = irc_nick_find_color (nick->name); + nick->color = strdup (irc_nick_find_color (nick->name)); /* add nick in nicklist */ irc_nick_nicklist_add (server, channel, nick); @@ -616,6 +648,8 @@ irc_nick_free (struct t_irc_server *server, struct t_irc_channel *channel, free (nick->host); if (nick->prefixes) free (nick->prefixes); + if (nick->color) + free (nick->color); free (nick); diff --git a/src/plugins/irc/irc-nick.h b/src/plugins/irc/irc-nick.h index d1d787652..ed283da96 100644 --- a/src/plugins/irc/irc-nick.h +++ b/src/plugins/irc/irc-nick.h @@ -36,7 +36,7 @@ struct t_irc_nick char prefix[2]; /* current prefix (higher prefix set in */ /* prefixes) */ int away; /* 1 if nick is away */ - const char *color; /* color for nickname in chat window */ + char *color; /* color for nickname in chat window */ struct t_irc_nick *prev_nick; /* link to previous nick on channel */ struct t_irc_nick *next_nick; /* link to next nick on channel */ }; |