diff --git a/src/plugins/irc/irc-channel.c b/src/plugins/irc/irc-channel.c index d36e75ddb..1f9f53e46 100644 --- a/src/plugins/irc/irc-channel.c +++ b/src/plugins/irc/irc-channel.c @@ -330,7 +330,6 @@ irc_channel_create_buffer (struct t_irc_server *server, if (buffer_created) { - weechat_buffer_set (ptr_buffer, "input_multiline", "1"); if (!weechat_buffer_get_integer (ptr_buffer, "short_name_is_set")) weechat_buffer_set (ptr_buffer, "short_name", channel_name); } @@ -348,6 +347,13 @@ irc_channel_create_buffer (struct t_irc_server *server, } } + weechat_buffer_set ( + ptr_buffer, + "input_multiline", + (weechat_hashtable_has_key (server->cap_list, "batch") + && weechat_hashtable_has_key (server->cap_list, "draft/multiline")) ? + "1" : "0"); + weechat_buffer_set (ptr_buffer, "name", buffer_name); weechat_buffer_set (ptr_buffer, "localvar_set_type", (channel_type == IRC_CHANNEL_TYPE_CHANNEL) ? "channel" : "private"); diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index a5e9878a7..f4fab5a0c 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -1021,6 +1021,7 @@ IRC_PROTOCOL_CALLBACK(cap) if (!server->checking_cap_list) { weechat_hashtable_remove_all (server->cap_list); + irc_server_buffer_set_input_multiline (server, 0); server->checking_cap_list = 1; } @@ -1051,6 +1052,8 @@ IRC_PROTOCOL_CALLBACK(cap) { weechat_hashtable_set (server->cap_list, str_name, pos_value + 1); + if (strcmp (str_name, "draft/multiline") == 0) + irc_server_buffer_set_input_multiline (server, 1); free (str_name); } } @@ -1058,6 +1061,8 @@ IRC_PROTOCOL_CALLBACK(cap) { weechat_hashtable_set (server->cap_list, caps_enabled[j], NULL); + if (strcmp (caps_enabled[j], "draft/multiline") == 0) + irc_server_buffer_set_input_multiline (server, 1); } } weechat_string_free_split (caps_enabled); @@ -1109,9 +1114,10 @@ IRC_PROTOCOL_CALLBACK(cap) weechat_string_dyn_concat (str_caps_disabled, caps_supported[j] + 1, -1); - weechat_hashtable_remove (server->cap_list, caps_supported[j] + 1); + if (strcmp (caps_supported[j] + 1, "draft/multiline") == 0) + irc_server_buffer_set_input_multiline (server, 0); } else { @@ -1120,10 +1126,10 @@ IRC_PROTOCOL_CALLBACK(cap) weechat_string_dyn_concat (str_caps_enabled, caps_supported[j], -1); - weechat_hashtable_set (server->cap_list, caps_supported[j], NULL); - + if (strcmp (caps_supported[j], "draft/multiline") == 0) + irc_server_buffer_set_input_multiline (server, 1); if (strcmp (caps_supported[j], "sasl") == 0) sasl_to_do = 1; } @@ -1280,6 +1286,8 @@ IRC_PROTOCOL_CALLBACK(cap) { weechat_hashtable_remove (server->cap_ls, caps_removed[j]); weechat_hashtable_remove (server->cap_list, caps_removed[j]); + if (strcmp (caps_removed[j], "draft/multiline") == 0) + irc_server_buffer_set_input_multiline (server, 0); } weechat_string_free_split (caps_removed); } diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index c1b752e3c..74132984c 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -1588,6 +1588,29 @@ irc_server_get_default_msg (const char *default_msg, return msg; } +/* + * Sets "input_multiline" to 1 or 0, according to capability draft/multiline + * on all channels and private buffers. + */ + +void +irc_server_buffer_set_input_multiline (struct t_irc_server *server, + int multiline) +{ + struct t_irc_channel *ptr_channel; + + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->buffer) + { + weechat_buffer_set (ptr_channel->buffer, + "input_multiline", + (multiline) ? "1" : "0"); + } + } +} + /* * Allocates a new server and adds it to the servers queue. * @@ -5725,6 +5748,8 @@ irc_server_disconnect (struct t_irc_server *server, int switch_address, irc_server_set_buffer_title (server); + irc_server_buffer_set_input_multiline (server, 0); + server->disconnected = 1; /* send signal "irc_server_disconnected" with server name */ diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h index 979160b9b..3c3a574c9 100644 --- a/src/plugins/irc/irc-server.h +++ b/src/plugins/irc/irc-server.h @@ -383,6 +383,8 @@ extern char *irc_server_get_default_msg (const char *default_msg, struct t_irc_server *server, const char *channel_name, const char *target_nick); +extern void irc_server_buffer_set_input_multiline (struct t_irc_server *server, + int multiline); extern struct t_irc_server *irc_server_alloc (const char *name); extern struct t_irc_server *irc_server_alloc_with_url (const char *irc_url); extern void irc_server_apply_command_line_options (struct t_irc_server *server, diff --git a/tests/unit/plugins/irc/test-irc-protocol.cpp b/tests/unit/plugins/irc/test-irc-protocol.cpp index 3026ed00a..35781588e 100644 --- a/tests/unit/plugins/irc/test-irc-protocol.cpp +++ b/tests/unit/plugins/irc/test-irc-protocol.cpp @@ -807,6 +807,7 @@ TEST(IrcProtocolWithServer, batch) /* assume "batch" and "draft/multiline" capabilities are enabled in server */ hashtable_set (ptr_server->cap_list, "batch", NULL); hashtable_set (ptr_server->cap_list, "draft/multiline", NULL); + irc_server_buffer_set_input_multiline (ptr_server, 1); /* not enough parameters */ RECV(":server BATCH");