summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2010-10-29 23:25:05 +0200
committerSebastien Helleu <flashcode@flashtux.org>2010-10-29 23:25:05 +0200
commitfcc209a8bf14da3ce4bb8b81feff9b4713fef002 (patch)
tree21975847c96927cd1ae8111b21ef656cc356e4d6 /src
parent90c99339b486ebf5d587e33e0d9d406deac9ea2d (diff)
downloadweechat-fcc209a8bf14da3ce4bb8b81feff9b4713fef002.zip
Add new option irc.look.nick_color_force
Diffstat (limited to 'src')
-rw-r--r--src/plugins/irc/irc-config.c94
-rw-r--r--src/plugins/irc/irc-config.h5
-rw-r--r--src/plugins/irc/irc-nick.c46
-rw-r--r--src/plugins/irc/irc-nick.h2
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 */
};