1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-01 23:36:37 +02:00

core: move nick coloring from irc plugin to core (closes #262)

Options moved from irc.conf to weechat.conf:

* "irc.look.nick_color_force" moved to "weechat.look.nick_color_force"
* "irc.look.nick_color_hash" moved to "weechat.look.nick_color_hash"
* "irc.look.nick_color_stop_chars" moved to
  "weechat.look.nick_color_stop_chars"

New info (for API function "info_get"):

* "nick_color" (replaces "irc_nick_color")
* "nick_color_name" (replaced "irc_nick_color_name")

Info "irc_nick_color" and "irc_nick_color_name" are now deprecated.

And a bug has been fixed in nick coloring: stop chars are removed before
looking at a forced color.
This commit is contained in:
Sébastien Helleu
2016-04-05 07:56:43 +02:00
parent e80ff72b97
commit fabd48cc6c
49 changed files with 1196 additions and 869 deletions
+122
View File
@@ -37,6 +37,7 @@
#include "weechat.h"
#include "wee-config.h"
#include "wee-hashtable.h"
#include "wee-hook.h"
#include "wee-log.h"
#include "wee-network.h"
@@ -148,6 +149,9 @@ struct t_config_option *config_look_key_bind_safe;
struct t_config_option *config_look_key_grab_delay;
struct t_config_option *config_look_mouse;
struct t_config_option *config_look_mouse_timer_delay;
struct t_config_option *config_look_nick_color_force;
struct t_config_option *config_look_nick_color_hash;
struct t_config_option *config_look_nick_color_stop_chars;
struct t_config_option *config_look_nick_prefix;
struct t_config_option *config_look_nick_suffix;
struct t_config_option *config_look_paste_auto_add_newline;
@@ -307,6 +311,9 @@ struct t_config_look_word_char_item *config_word_chars_highlight = NULL;
int config_word_chars_highlight_count = 0;
struct t_config_look_word_char_item *config_word_chars_input = NULL;
int config_word_chars_input_count = 0;
char **config_nick_colors = NULL;
int config_num_nick_colors = 0;
struct t_hashtable *config_hashtable_nick_color_force = NULL;
/*
@@ -659,6 +666,74 @@ config_compute_prefix_max_length_all_buffers ()
}
}
/*
* Sets nick colors using option "weechat.color.chat_nick_colors".
*/
void
config_set_nick_colors ()
{
if (config_nick_colors)
{
string_free_split (config_nick_colors);
config_nick_colors = NULL;
config_num_nick_colors = 0;
}
config_nick_colors = string_split (
CONFIG_STRING(config_color_chat_nick_colors),
",", 0, 0,
&config_num_nick_colors);
}
/*
* Callback for changes on option "weechat.look.nick_color_force".
*/
void
config_change_look_nick_color_force (const void *pointer, void *data,
struct t_config_option *option)
{
char **items, *pos;
int num_items, i;
/* make C compiler happy */
(void) pointer;
(void) data;
(void) option;
if (!config_hashtable_nick_color_force)
{
config_hashtable_nick_color_force = hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
}
else
{
hashtable_remove_all (config_hashtable_nick_color_force);
}
items = string_split (CONFIG_STRING(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';
hashtable_set (config_hashtable_nick_color_force,
items[i],
pos + 1);
}
}
string_free_split (items);
}
}
/*
* Callback for changes on options "weechat.look.nick_prefix" and
* "weechat.look.nick_suffix".
@@ -1047,6 +1122,7 @@ config_change_nick_colors (const void *pointer, void *data,
(void) data;
(void) option;
config_set_nick_colors ();
gui_color_buffer_display ();
}
@@ -1208,6 +1284,8 @@ config_weechat_init_after_read ()
/* apply filters on all buffers */
gui_filter_all_buffers ();
config_change_look_nick_color_force (NULL, NULL, NULL);
}
/*
@@ -2926,6 +3004,37 @@ config_weechat_init_options ()
"wait this delay before processing event"),
NULL, 1, 10000, "100", NULL, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
config_look_nick_color_force = config_file_new_option (
weechat_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\"); look up for nicks is with "
"exact case then lower case, so it's possible to use only lower "
"case for nicks in this option"),
NULL, 0, 0, "", NULL, 0,
NULL, NULL, NULL,
&config_change_look_nick_color_force, NULL, NULL,
NULL, NULL, NULL);
config_look_nick_color_hash = config_file_new_option (
weechat_config_file, ptr_section,
"nick_color_hash", "integer",
N_("hash algorithm used to find the color for a nick: djb2 = variant "
"of djb2 (position of letters matters: anagrams of a nick have "
"different color), sum = sum of letters"),
"djb2|sum", 0, 0, "sum", NULL, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
config_look_nick_color_stop_chars = config_file_new_option (
weechat_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, NULL,
NULL, NULL, NULL,
NULL, NULL, NULL);
config_look_nick_prefix = config_file_new_option (
weechat_config_file, ptr_section,
"nick_prefix", "string",
@@ -4387,4 +4496,17 @@ config_weechat_free ()
config_word_chars_input = NULL;
config_word_chars_input_count = 0;
}
if (config_nick_colors)
{
string_free_split (config_nick_colors);
config_nick_colors = NULL;
config_num_nick_colors = 0;
}
if (config_hashtable_nick_color_force)
{
hashtable_free (config_hashtable_nick_color_force);
config_hashtable_nick_color_force = NULL;
}
}
+13
View File
@@ -53,6 +53,12 @@ enum t_config_look_buffer_search_where
CONFIG_LOOK_BUFFER_SEARCH_PREFIX_MESSAGE,
};
enum t_config_look_nick_color_hash
{
CONFIG_LOOK_NICK_COLOR_HASH_DJB2 = 0,
CONFIG_LOOK_NICK_COLOR_HASH_SUM,
};
enum t_config_look_prefix_align
{
CONFIG_LOOK_PREFIX_ALIGN_NONE = 0,
@@ -193,6 +199,9 @@ extern struct t_config_option *config_look_key_bind_safe;
extern struct t_config_option *config_look_key_grab_delay;
extern struct t_config_option *config_look_mouse;
extern struct t_config_option *config_look_mouse_timer_delay;
extern struct t_config_option *config_look_nick_color_force;
extern struct t_config_option *config_look_nick_color_hash;
extern struct t_config_option *config_look_nick_color_stop_chars;
extern struct t_config_option *config_look_nick_prefix;
extern struct t_config_option *config_look_nick_suffix;
extern struct t_config_option *config_look_paste_auto_add_newline;
@@ -338,7 +347,11 @@ extern struct t_config_look_word_char_item *config_word_chars_highlight;
extern int config_word_chars_highlight_count;
extern struct t_config_look_word_char_item *config_word_chars_input;
extern int config_word_chars_input_count;
extern char **config_nick_colors;
extern int config_num_nick_colors;
extern struct t_hashtable *config_hashtable_nick_color_force;
extern void config_set_nick_colors ();
extern struct t_config_option *config_weechat_debug_get (const char *plugin_name);
extern int config_weechat_debug_set (const char *plugin_name,
const char *value);
+2
View File
@@ -36,11 +36,13 @@ gui-layout.c gui-layout.h
gui-line.c gui-line.h
gui-main.h
gui-mouse.c gui-mouse.h
gui-nick.c gui-nick.h
gui-nicklist.c gui-nicklist.h
gui-window.c gui-window.h)
include_directories(${CMAKE_BINARY_DIR})
add_library(weechat_gui_common STATIC ${LIB_GUI_COMMON_SRC})
list(APPEND STATIC_LIBS weechat_gui_common)
if(ENABLE_NCURSES)
subdirs(curses)
+2
View File
@@ -56,6 +56,8 @@ lib_weechat_gui_common_a_SOURCES = gui-bar.c \
gui-main.h \
gui-mouse.c \
gui-mouse.h \
gui-nick.c \
gui-nick.h \
gui-nicklist.c \
gui-nicklist.h \
gui-window.c \
+1 -1
View File
@@ -81,7 +81,7 @@ add_executable(${EXECUTABLE} ${WEECHAT_CURSES_MAIN_SRC})
add_dependencies(${EXECUTABLE} weechat_gui_curses)
# Due to circular references, we must link two times with libweechat_core.a
# Due to circular references, we must link two times with libweechat_core.a and libweechat_gui_common.a
target_link_libraries(${EXECUTABLE} ${STATIC_LIBS} weechat_gui_curses ${EXTRA_LIBS} ${STATIC_LIBS})
# Create a symbolic link weechat-curses -> weechat
+259
View File
@@ -0,0 +1,259 @@
/*
* gui-nick.c - nick functions (used by all GUI)
*
* Copyright (C) 2003-2016 Sébastien Helleu <flashcode@flashtux.org>
*
* This file is part of WeeChat, the extensible chat client.
*
* WeeChat 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 3 of the License, or
* (at your option) any later version.
*
* WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include "../core/weechat.h"
#include "../core/wee-config.h"
#include "../core/wee-hashtable.h"
#include "../core/wee-string.h"
#include "../core/wee-utf8.h"
#include "gui-nick.h"
#include "gui-color.h"
/*
* Hashes a nickname to find color.
*
* Returns a number which is the index of color in the nicks colors of option
* "weechat.color.chat_nick_colors".
*/
int
gui_nick_hash_color (const char *nickname)
{
unsigned long color;
const char *ptr_nick;
if (!nickname || !nickname[0])
return 0;
if (!config_nick_colors)
config_set_nick_colors ();
if (config_num_nick_colors == 0)
return 0;
ptr_nick = nickname;
color = 0;
switch (CONFIG_INTEGER(config_look_nick_color_hash))
{
case CONFIG_LOOK_NICK_COLOR_HASH_DJB2:
/* variant of djb2 hash */
color = 5381;
while (ptr_nick && ptr_nick[0])
{
color ^= (color << 5) + (color >> 2) + utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
}
break;
case CONFIG_LOOK_NICK_COLOR_HASH_SUM:
/* sum of letters */
color = 0;
while (ptr_nick && ptr_nick[0])
{
color += utf8_char_int (ptr_nick);
ptr_nick = utf8_next_char (ptr_nick);
}
break;
}
return (color % config_num_nick_colors);
}
/*
* Gets forced color for a nick.
*
* Returns the name of color (for example: "green"), NULL if no color is forced
* for nick.
*/
const char *
gui_nick_get_forced_color (const char *nickname)
{
const char *forced_color;
char *nick_lower;
if (!nickname || !nickname[0])
return NULL;
forced_color = hashtable_get (config_hashtable_nick_color_force, nickname);
if (forced_color)
return forced_color;
nick_lower = strdup (nickname);
if (nick_lower)
{
string_tolower (nick_lower);
forced_color = hashtable_get (config_hashtable_nick_color_force,
nick_lower);
free (nick_lower);
}
return forced_color;
}
/*
* Duplicates a nick and stops at first char in list (using option
* weechat.look.nick_color_stop_chars).
*
* Note: result must be freed after use.
*/
char *
gui_nick_strdup_for_color (const char *nickname)
{
int char_size, other_char_seen;
char *result, *pos, utf_char[16];
if (!nickname)
return NULL;
result = malloc (strlen (nickname) + 1);
pos = result;
other_char_seen = 0;
while (nickname[0])
{
char_size = utf8_char_size (nickname);
memcpy (utf_char, nickname, char_size);
utf_char[char_size] = '\0';
if (strstr (CONFIG_STRING(config_look_nick_color_stop_chars),
utf_char))
{
if (other_char_seen)
{
pos[0] = '\0';
return result;
}
}
else
{
other_char_seen = 1;
}
memcpy (pos, utf_char, char_size);
pos += char_size;
nickname += char_size;
}
pos[0] = '\0';
return result;
}
/*
* Finds a color code for a nick (according to nick letters).
*
* Returns a WeeChat color code (that can be used for display).
*/
const char *
gui_nick_find_color (const char *nickname)
{
int color;
char *nickname2;
const char *forced_color, *str_color;
if (!nickname || !nickname[0])
return gui_color_get_custom ("default");
if (!config_nick_colors)
config_set_nick_colors ();
if (config_num_nick_colors == 0)
return gui_color_get_custom ("default");
nickname2 = gui_nick_strdup_for_color (nickname);
/* look if color is forced */
forced_color = gui_nick_get_forced_color (
(nickname2) ? nickname2 : nickname);
if (forced_color)
{
forced_color = gui_color_get_custom (forced_color);
if (forced_color && forced_color[0])
{
if (nickname2)
free (nickname2);
return forced_color;
}
}
/* hash nickname to get color */
color = gui_nick_hash_color ((nickname2) ? nickname2 : nickname);
if (nickname2)
free (nickname2);
/* return color */
str_color = gui_color_get_custom (config_nick_colors[color]);
return (str_color[0]) ? str_color : gui_color_get_custom ("default");
}
/*
* Finds a color name for a nick (according to nick letters).
*
* Returns the name of a color (for example: "green").
*/
const char *
gui_nick_find_color_name (const char *nickname)
{
int color;
char *nickname2;
const char *forced_color;
static char *default_color = "default";
if (!nickname || !nickname[0])
return default_color;
if (!config_nick_colors)
config_set_nick_colors ();
if (config_num_nick_colors == 0)
return default_color;
nickname2 = gui_nick_strdup_for_color (nickname);
/* look if color is forced */
forced_color = gui_nick_get_forced_color (
(nickname2) ? nickname2 : nickname);
if (forced_color)
{
if (nickname2)
free (nickname2);
return forced_color;
}
/* hash nickname to get color */
color = gui_nick_hash_color ((nickname2) ? nickname2 : nickname);
if (nickname2)
free (nickname2);
/* return color name */
return config_nick_colors[color];
}
+26
View File
@@ -0,0 +1,26 @@
/*
* Copyright (C) 2003-2016 Sébastien Helleu <flashcode@flashtux.org>
*
* This file is part of WeeChat, the extensible chat client.
*
* WeeChat 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 3 of the License, or
* (at your option) any later version.
*
* WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef WEECHAT_GUI_NICK_H
#define WEECHAT_GUI_NICK_H 1
extern const char *gui_nick_find_color (const char *nickname);
extern const char *gui_nick_find_color_name (const char *nickname);
#endif /* WEECHAT_GUI_NICK_H */
+14 -149
View File
@@ -83,9 +83,6 @@ struct t_config_option *irc_config_look_join_auto_add_chantype;
struct t_config_option *irc_config_look_msgbuffer_fallback;
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_color_force;
struct t_config_option *irc_config_look_nick_color_hash;
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_nick_mode;
struct t_config_option *irc_config_look_nick_mode_empty;
@@ -150,11 +147,9 @@ struct t_config_option *irc_config_network_whois_double_nick;
struct t_config_option *irc_config_server_default[IRC_SERVER_NUM_OPTIONS];
struct t_hook *irc_config_hook_config_nick_colors = NULL;
char **irc_config_nick_colors = NULL;
int irc_config_num_nick_colors = 0;
struct t_hook *irc_config_hook_config_nick_color_options = NULL;
struct t_hook *irc_config_hook_config_chat_nick_colors = NULL;
struct t_hashtable *irc_config_hashtable_display_join_message = NULL;
struct t_hashtable *irc_config_hashtable_nick_color_force = NULL;
struct t_hashtable *irc_config_hashtable_nick_prefixes = NULL;
struct t_hashtable *irc_config_hashtable_color_mirc_remap = NULL;
char **irc_config_nicks_hide_password = NULL;
@@ -233,28 +228,6 @@ irc_config_compute_nick_colors ()
irc_nick_nicklist_set_color_all ();
}
/*
* Sets nick colors using option "weechat.color.chat_nick_colors".
*/
void
irc_config_set_nick_colors ()
{
if (irc_config_nick_colors)
{
weechat_string_free_split (irc_config_nick_colors);
irc_config_nick_colors = NULL;
irc_config_num_nick_colors = 0;
}
irc_config_nick_colors =
weechat_string_split (
weechat_config_string (
weechat_config_get ("weechat.color.chat_nick_colors")),
",", 0, 0,
&irc_config_num_nick_colors);
}
/*
* Checks if channel modes arguments must be displayed or hidden
* (according to option irc.look.item_channel_modes_hide_args).
@@ -295,7 +268,7 @@ irc_config_display_channel_modes_arguments (const char *modes)
}
/*
* Callback for changes on option "weechat.color.chat_nick_colors".
* Callback for changes on options changing nick colors.
*/
int
@@ -308,7 +281,6 @@ irc_config_change_nick_colors_cb (const void *pointer, void *data,
(void) option;
(void) value;
irc_config_set_nick_colors ();
irc_config_compute_nick_colors ();
return WEECHAT_RC_OK;
@@ -565,71 +537,6 @@ irc_config_change_look_highlight_tags_restrict (const void *pointer, void *data,
}
}
/*
* Callback for changes on option "irc.look.nick_color_force".
*/
void
irc_config_change_look_nick_color_force (const void *pointer, void *data,
struct t_config_option *option)
{
char **items, *pos;
int num_items, i;
/* make C compiler happy */
(void) pointer;
(void) data;
(void) option;
if (!irc_config_hashtable_nick_color_force)
{
irc_config_hashtable_nick_color_force = weechat_hashtable_new (
32,
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 ();
}
/*
* Callback for changes on options that change nick colors.
*/
void
irc_config_change_look_nick_colors (const void *pointer, void *data,
struct t_config_option *option)
{
/* make C compiler happy */
(void) pointer;
(void) data;
(void) option;
irc_config_compute_nick_colors ();
}
/*
* Callback for changes on option "irc.look.item_display_server".
*/
@@ -2530,11 +2437,6 @@ irc_config_init ()
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
irc_config_hashtable_nick_color_force = weechat_hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
irc_config_hashtable_nick_prefixes = weechat_hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
@@ -2821,39 +2723,6 @@ irc_config_init ()
"of server)"),
"none|next|near_server", 0, 0, "none", NULL, 0,
NULL, NULL, NULL, 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\"); look up for nicks is with "
"exact case then lower case, so it's possible to use only lower "
"case for nicks in this option"),
NULL, 0, 0, "", NULL, 0,
NULL, NULL, NULL,
&irc_config_change_look_nick_color_force, NULL, NULL,
NULL, NULL, NULL);
irc_config_look_nick_color_hash = weechat_config_new_option (
irc_config_file, ptr_section,
"nick_color_hash", "integer",
N_("hash algorithm used to find the color for a nick: djb2 = variant "
"of djb2 (position of letters matters: anagrams of a nick have "
"different color), sum = sum of letters"),
"djb2|sum", 0, 0, "sum", NULL, 0,
NULL, NULL, NULL,
&irc_config_change_look_nick_colors, 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, NULL,
&irc_config_change_look_nick_colors, NULL, NULL,
NULL, NULL, NULL);
irc_config_look_nick_completion_smart = weechat_config_new_option (
irc_config_file, ptr_section,
"nick_completion_smart", "integer",
@@ -3396,7 +3265,10 @@ irc_config_init ()
}
irc_config_section_server = ptr_section;
irc_config_hook_config_nick_colors = weechat_hook_config (
irc_config_hook_config_nick_color_options = weechat_hook_config (
"weechat.look.nick_color_*",
&irc_config_change_nick_colors_cb, NULL, NULL);
irc_config_hook_config_chat_nick_colors = weechat_hook_config (
"weechat.color.chat_nick_colors",
&irc_config_change_nick_colors_cb, NULL, NULL);
@@ -3420,7 +3292,6 @@ irc_config_read ()
{
irc_notify_new_for_all_servers ();
irc_config_change_look_display_join_message (NULL, NULL, NULL);
irc_config_change_look_nick_color_force (NULL, NULL, NULL);
irc_config_change_look_nicks_hide_password (NULL, NULL, NULL);
irc_config_change_color_nick_prefixes (NULL, NULL, NULL);
irc_config_change_color_mirc_remap (NULL, NULL, NULL);
@@ -3452,16 +3323,16 @@ irc_config_free ()
{
weechat_config_free (irc_config_file);
if (irc_config_hook_config_nick_colors)
if (irc_config_hook_config_nick_color_options)
{
weechat_unhook (irc_config_hook_config_nick_colors);
irc_config_hook_config_nick_colors = NULL;
weechat_unhook (irc_config_hook_config_nick_color_options);
irc_config_hook_config_nick_color_options = NULL;
}
if (irc_config_nick_colors)
if (irc_config_hook_config_chat_nick_colors)
{
weechat_string_free_split (irc_config_nick_colors);
irc_config_nick_colors = NULL;
irc_config_num_nick_colors = 0;
weechat_unhook (irc_config_hook_config_chat_nick_colors);
irc_config_hook_config_chat_nick_colors = NULL;
}
if (irc_config_nicks_hide_password)
@@ -3477,12 +3348,6 @@ irc_config_free ()
irc_config_hashtable_display_join_message = NULL;
}
if (irc_config_hashtable_nick_color_force)
{
weechat_hashtable_free (irc_config_hashtable_nick_color_force);
irc_config_hashtable_nick_color_force = NULL;
}
if (irc_config_hashtable_nick_prefixes)
{
weechat_hashtable_free (irc_config_hashtable_nick_prefixes);
-14
View File
@@ -62,12 +62,6 @@ enum t_irc_config_look_notice_as_pv
IRC_CONFIG_LOOK_NOTICE_AS_PV_ALWAYS,
};
enum t_irc_config_look_nick_color_hash
{
IRC_CONFIG_LOOK_NICK_COLOR_HASH_DJB2 = 0,
IRC_CONFIG_LOOK_NICK_COLOR_HASH_SUM,
};
enum t_irc_config_look_nick_mode
{
IRC_CONFIG_LOOK_NICK_MODE_NONE = 0,
@@ -128,9 +122,6 @@ extern struct t_config_option *irc_config_look_join_auto_add_chantype;
extern struct t_config_option *irc_config_look_msgbuffer_fallback;
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_color_force;
extern struct t_config_option *irc_config_look_nick_color_hash;
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_nick_mode;
extern struct t_config_option *irc_config_look_nick_mode_empty;
@@ -189,17 +180,12 @@ extern struct t_config_option *irc_config_network_whois_double_nick;
extern struct t_config_option *irc_config_server_default[];
extern char **irc_config_nick_colors;
extern int irc_config_num_nick_colors;
extern struct t_hashtable *irc_config_hashtable_display_join_message;
extern struct t_hashtable *irc_config_hashtable_nick_color_force;
extern struct t_hashtable *irc_config_hashtable_nick_prefixes;
extern struct t_hashtable *irc_config_hashtable_color_mirc_remap;
extern char **irc_config_nicks_hide_password;
extern int irc_config_num_nicks_hide_password;
extern void irc_config_set_nick_colors ();
extern int irc_config_display_channel_modes_arguments (const char *modes);
extern int irc_config_server_check_value_cb (const void *pointer, void *data,
struct t_config_option *option,
+4 -2
View File
@@ -847,12 +847,14 @@ irc_info_init ()
&irc_info_info_irc_nick_from_host_cb, NULL, NULL);
weechat_hook_info (
"irc_nick_color",
N_("get nick color code"),
N_("get nick color code "
"(*deprecated* since version 1.5, replaced by \"nick_color\")"),
N_("nickname"),
&irc_info_info_irc_nick_color_cb, NULL, NULL);
weechat_hook_info (
"irc_nick_color_name",
N_("get nick color name"),
N_("get nick color name "
"(*deprecated* since version 1.5, replaced by \"nick_color_name\")"),
N_("nickname"),
&irc_info_info_irc_nick_color_name_cb, NULL, NULL);
weechat_hook_info (
+2 -176
View File
@@ -92,130 +92,6 @@ irc_nick_is_nick (const char *string)
return 1;
}
/*
* Duplicates a nick and stops at first char in list (using option
* irc.look.nick_color_stop_chars).
*
* Note: result must be freed after use.
*/
char *
irc_nick_strdup_for_color (const char *nickname)
{
int char_size, other_char_seen;
char *result, *pos, utf_char[16];
result = malloc (strlen (nickname) + 1);
pos = result;
other_char_seen = 0;
while (nickname[0])
{
char_size = weechat_utf8_char_size (nickname);
memcpy (utf_char, nickname, char_size);
utf_char[char_size] = '\0';
if (strstr (weechat_config_string (irc_config_look_nick_color_stop_chars),
utf_char))
{
if (other_char_seen)
{
pos[0] = '\0';
return result;
}
}
else
{
other_char_seen = 1;
}
memcpy (pos, utf_char, char_size);
pos += char_size;
nickname += char_size;
}
pos[0] = '\0';
return result;
}
/*
* Hashes a nickname to find color.
*
* Returns a number which is the index of color in the nicks colors of option
* "weechat.color.chat_nick_colors".
*/
int
irc_nick_hash_color (const char *nickname)
{
unsigned long color;
const char *ptr_nick;
if (!irc_config_nick_colors)
irc_config_set_nick_colors ();
if (irc_config_num_nick_colors == 0)
return 0;
ptr_nick = nickname;
color = 0;
switch (weechat_config_integer (irc_config_look_nick_color_hash))
{
case IRC_CONFIG_LOOK_NICK_COLOR_HASH_DJB2:
/* variant of djb2 hash */
color = 5381;
while (ptr_nick && ptr_nick[0])
{
color ^= (color << 5) + (color >> 2) + weechat_utf8_char_int (ptr_nick);
ptr_nick = weechat_utf8_next_char (ptr_nick);
}
break;
case IRC_CONFIG_LOOK_NICK_COLOR_HASH_SUM:
/* sum of letters */
color = 0;
while (ptr_nick && ptr_nick[0])
{
color += weechat_utf8_char_int (ptr_nick);
ptr_nick = weechat_utf8_next_char (ptr_nick);
}
break;
}
return (color % irc_config_num_nick_colors);
}
/*
* Gets forced color for a nick.
*
* Returns the name of color (for example: "green"), NULL if no color is forced
* for nick.
*/
const char *
irc_nick_get_forced_color (const char *nickname)
{
const char *forced_color;
char *nick_lower;
if (!nickname)
return NULL;
forced_color = weechat_hashtable_get (irc_config_hashtable_nick_color_force,
nickname);
if (forced_color)
return forced_color;
nick_lower = strdup (nickname);
if (nick_lower)
{
weechat_string_tolower (nick_lower);
forced_color = weechat_hashtable_get (irc_config_hashtable_nick_color_force,
nick_lower);
free (nick_lower);
}
return forced_color;
}
/*
* Finds a color code for a nick (according to nick letters).
*
@@ -225,34 +101,7 @@ irc_nick_get_forced_color (const char *nickname)
const char *
irc_nick_find_color (const char *nickname)
{
int color;
char *nickname2;
const char *forced_color, *str_color;
if (!irc_config_nick_colors)
irc_config_set_nick_colors ();
if (irc_config_num_nick_colors == 0)
return weechat_color ("default");
/* look if color is forced */
forced_color = irc_nick_get_forced_color (nickname);
if (forced_color)
{
forced_color = weechat_color (forced_color);
if (forced_color && forced_color[0])
return forced_color;
}
/* hash nickname to get color */
nickname2 = irc_nick_strdup_for_color (nickname);
color = irc_nick_hash_color ((nickname2) ? nickname2 : nickname);
if (nickname2)
free (nickname2);
/* return color */
str_color = weechat_color (irc_config_nick_colors[color]);
return (str_color[0]) ? str_color : weechat_color("default");
return weechat_info_get ("nick_color", nickname);
}
/*
@@ -264,30 +113,7 @@ irc_nick_find_color (const char *nickname)
const char *
irc_nick_find_color_name (const char *nickname)
{
int color;
char *nickname2;
const char *forced_color;
static char *default_color = "default";
if (!irc_config_nick_colors)
irc_config_set_nick_colors ();
if (irc_config_num_nick_colors == 0)
return default_color;
/* look if color is forced */
forced_color = irc_nick_get_forced_color (nickname);
if (forced_color)
return forced_color;
/* hash nickname to get color */
nickname2 = irc_nick_strdup_for_color (nickname);
color = irc_nick_hash_color ((nickname2) ? nickname2 : nickname);
if (nickname2)
free (nickname2);
/* return color name */
return irc_config_nick_colors[color];
return weechat_info_get ("nick_color_name", nickname);
}
/*
+43
View File
@@ -59,6 +59,7 @@
#include "../gui/gui-key.h"
#include "../gui/gui-layout.h"
#include "../gui/gui-line.h"
#include "../gui/gui-nick.h"
#include "../gui/gui-nicklist.h"
#include "../gui/gui-window.h"
#include "plugin.h"
@@ -785,6 +786,40 @@ plugin_api_info_color_rgb2term_cb (const void *pointer, void *data,
return value;
}
/*
* Returns nick color code for a nickname.
*/
const char *
plugin_api_info_nick_color_cb (const void *pointer, void *data,
const char *info_name,
const char *arguments)
{
/* make C compiler happy */
(void) pointer;
(void) data;
(void) info_name;
return gui_nick_find_color (arguments);
}
/*
* Returns nick color name for a nickname.
*/
const char *
plugin_api_info_nick_color_name_cb (const void *pointer, void *data,
const char *info_name,
const char *arguments)
{
/* make C compiler happy */
(void) pointer;
(void) data;
(void) info_name;
return gui_nick_find_color_name (arguments);
}
/*
* Returns WeeChat infolist "bar".
*
@@ -1855,6 +1890,14 @@ plugin_api_init ()
N_("RGB color converted to terminal color (0-255)"),
N_("rgb,limit (limit is optional and is set to 256 by default)"),
&plugin_api_info_color_rgb2term_cb, NULL, NULL);
hook_info (NULL, "nick_color",
N_("get nick color code"),
N_("nickname"),
&plugin_api_info_nick_color_cb, NULL, NULL);
hook_info (NULL, "nick_color_name",
N_("get nick color name"),
N_("nickname"),
&plugin_api_info_nick_color_name_cb, NULL, NULL);
/* WeeChat core infolist hooks */
hook_infolist (NULL, "bar",