diff --git a/degesch.c b/degesch.c index 734f07e..5e3b4db 100644 --- a/degesch.c +++ b/degesch.c @@ -1323,6 +1323,7 @@ struct app_context bool isolate_buffers; ///< Isolate global/server buffers bool beep_on_highlight; ///< Beep on highlight bool logging; ///< Logging to file enabled + bool show_all_prefixes; ///< Show all prefixes before nicks struct str_map servers; ///< Our servers @@ -1444,6 +1445,14 @@ on_config_debug_mode_change (struct config_item_ *item) g_debug_mode = item->value.boolean; } +static void +on_config_show_all_prefixes_change (struct config_item_ *item) +{ + struct app_context *ctx = item->user_data; + ctx->show_all_prefixes = item->value.boolean; + refresh_prompt (ctx); +} + static void on_config_attribute_change (struct config_item_ *item); static void on_config_logging_change (struct config_item_ *item); @@ -1621,6 +1630,11 @@ static struct config_schema g_config_behaviour[] = .type = CONFIG_ITEM_BOOLEAN, .default_ = "on", .on_change = on_config_beep_on_highlight_change }, + { .name = "show_all_prefixes", + .comment = "Show all prefixes in front of nicknames", + .type = CONFIG_ITEM_BOOLEAN, + .default_ = "off", + .on_change = on_config_show_all_prefixes_change }, { .name = "logging", .comment = "Log buffer contents to file", .type = CONFIG_ITEM_BOOLEAN, @@ -3257,6 +3271,16 @@ irc_get_or_make_user_buffer (struct server *s, const char *nickname) return buffer; } +static void +irc_get_channel_user_prefix (struct server *s, + struct channel_user *channel_user, struct str *output) +{ + if (s->ctx->show_all_prefixes) + str_append (output, channel_user->prefixes.str); + else if (channel_user->prefixes.len) + str_append_c (output, channel_user->prefixes.str[0]); +} + // Note that this eats the user reference static void irc_channel_link_user (struct channel *channel, struct user *user, @@ -4571,6 +4595,23 @@ make_chanmode_postfix (struct channel *channel, struct str *modes) str_append_c (modes, iter.link->key[0]); } +static void +make_server_postfix_registered (struct buffer *buffer, struct str *output) +{ + struct server *s = buffer->server; + if (buffer->type == BUFFER_CHANNEL) + { + struct server *s = buffer->server; + struct channel_user *channel_user = + irc_channel_get_user (buffer->channel, s->irc_user); + if (channel_user) + irc_get_channel_user_prefix (s, channel_user, output); + } + str_append (output, s->irc_user->nickname); + if (s->irc_user_mode.len) + str_append_printf (output, "(%s)", s->irc_user_mode.str); +} + static void make_server_postfix (struct buffer *buffer, struct str *output) { @@ -4581,18 +4622,7 @@ make_server_postfix (struct buffer *buffer, struct str *output) else if (s->state != IRC_REGISTERED) str_append (output, "(unregistered)"); else - { - if (buffer->type == BUFFER_CHANNEL) - { - struct channel_user *channel_user = - irc_channel_get_user (buffer->channel, s->irc_user); - if (channel_user) - str_append (output, channel_user->prefixes.str); - } - str_append (output, s->irc_user->nickname); - if (s->irc_user_mode.len) - str_append_printf (output, "(%s)", s->irc_user_mode.str); - } + make_server_postfix_registered (buffer, output); } static void make_prompt (struct app_context *ctx, struct str *output) @@ -4724,18 +4754,20 @@ irc_is_highlight (struct server *s, const char *message) return result; } -static const char * +static char * irc_get_privmsg_prefix (struct server *s, struct user *user, const char *target) { + struct str prefix; + str_init (&prefix); if (user && irc_is_channel (s, target)) { struct channel *channel; struct channel_user *channel_user; if ((channel = str_map_find (&s->irc_channels, target)) && (channel_user = irc_channel_get_user (channel, user))) - return channel_user->prefixes.str; + irc_get_channel_user_prefix (s, channel_user, &prefix); } - return ""; + return str_steal (&prefix); } // --- Mode processor ---------------------------------------------------------- @@ -5770,6 +5802,24 @@ irc_sync_channel_user (struct server *s, struct channel *channel, } } +static char * +make_channel_users_list (struct server *s, struct channel *channel) +{ + struct str_vector v; + str_vector_init (&v); + LIST_FOR_EACH (struct channel_user, iter, channel->users) + { + struct str item; + str_init (&item); + irc_get_channel_user_prefix (s, iter, &item); + str_append (&item, iter->user->nickname); + str_vector_add_owned (&v, str_steal (&item)); + } + char *result = join_str_vector (&v, ' '); + str_vector_free (&v); + return result; +} + static void irc_process_names (struct server *s, struct channel *channel) { @@ -5800,14 +5850,7 @@ irc_process_names (struct server *s, struct channel *channel) str_map_free (&present); str_vector_reset (&channel->names_buf); - struct str_vector v; - str_vector_init (&v); - LIST_FOR_EACH (struct channel_user, iter, channel->users) - str_vector_add_owned (&v, - xstrdup_printf ("%s%s", iter->prefixes.str, iter->user->nickname)); - char *all_users = join_str_vector (&v, ' '); - str_vector_free (&v); - + char *all_users = make_channel_users_list (s, channel); struct buffer *buffer = str_map_find (&s->irc_buffer_map, channel->name); if (buffer) {