mirror of
https://github.com/weechat/weechat.git
synced 2026-06-30 23:06:38 +02:00
Add buffer merging feature, with /buffer merge/unmerge (task #7404)
This commit is contained in:
+34
-164
@@ -22,6 +22,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "../weechat-plugin.h"
|
||||
#include "irc.h"
|
||||
@@ -33,10 +34,6 @@
|
||||
#include "irc-server.h"
|
||||
|
||||
|
||||
/* buffer for all servers (if using one buffer for all servers) */
|
||||
struct t_gui_buffer *irc_buffer_servers = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* irc_buffer_get_server_channel: get IRC server and channel pointers with a
|
||||
* buffer pointer
|
||||
@@ -66,12 +63,7 @@ irc_buffer_get_server_channel (struct t_gui_buffer *buffer,
|
||||
if (ptr_server->buffer == buffer)
|
||||
{
|
||||
if (server)
|
||||
{
|
||||
if (weechat_config_boolean (irc_config_look_one_server_buffer))
|
||||
*server = irc_current_server;
|
||||
else
|
||||
*server = ptr_server;
|
||||
}
|
||||
*server = ptr_server;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -115,156 +107,6 @@ irc_buffer_build_name (const char *server, const char *channel)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_buffer_get_server_prefix: return prefix, with server name if server
|
||||
* buffers are displayed in only one buffer
|
||||
*/
|
||||
|
||||
char *
|
||||
irc_buffer_get_server_prefix (struct t_irc_server *server, char *prefix_code)
|
||||
{
|
||||
static char buf[256];
|
||||
const char *prefix;
|
||||
|
||||
prefix = (prefix_code && prefix_code[0]) ?
|
||||
weechat_prefix (prefix_code) : NULL;
|
||||
|
||||
if (weechat_config_boolean (irc_config_look_one_server_buffer) && server)
|
||||
{
|
||||
snprintf (buf, sizeof (buf), "%s%s[%s%s%s]%s ",
|
||||
(prefix) ? prefix : "",
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_SERVER,
|
||||
server->name,
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT);
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf (buf, sizeof (buf), "%s",
|
||||
(prefix) ? prefix : "");
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_buffer_merge_servers: merge server buffers in one buffer
|
||||
*/
|
||||
|
||||
void
|
||||
irc_buffer_merge_servers ()
|
||||
{
|
||||
struct t_irc_server *ptr_server;
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
int number, number_selected;
|
||||
char charset_modifier[256];
|
||||
|
||||
irc_buffer_servers = NULL;
|
||||
irc_current_server = NULL;
|
||||
|
||||
/* choose server buffer with lower number (should be first created) */
|
||||
number_selected = -1;
|
||||
for (ptr_server = irc_servers; ptr_server;
|
||||
ptr_server = ptr_server->next_server)
|
||||
{
|
||||
if (ptr_server->buffer)
|
||||
{
|
||||
number = weechat_buffer_get_integer (ptr_server->buffer, "number");
|
||||
if ((number_selected == -1) || (number < number_selected))
|
||||
{
|
||||
irc_buffer_servers = ptr_server->buffer;
|
||||
irc_current_server = ptr_server;
|
||||
number_selected = number;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (irc_buffer_servers)
|
||||
{
|
||||
weechat_buffer_set (irc_buffer_servers,
|
||||
"name", IRC_BUFFER_ALL_SERVERS_NAME);
|
||||
weechat_buffer_set (irc_buffer_servers,
|
||||
"short_name", IRC_BUFFER_ALL_SERVERS_NAME);
|
||||
weechat_buffer_set (irc_buffer_servers,
|
||||
"localvar_set_server", IRC_BUFFER_ALL_SERVERS_NAME);
|
||||
weechat_buffer_set (irc_buffer_servers,
|
||||
"localvar_set_channel", IRC_BUFFER_ALL_SERVERS_NAME);
|
||||
snprintf (charset_modifier, sizeof (charset_modifier),
|
||||
"irc.%s", irc_current_server->name);
|
||||
weechat_buffer_set (irc_buffer_servers,
|
||||
"localvar_set_charset_modifier",
|
||||
charset_modifier);
|
||||
weechat_hook_signal_send ("logger_stop",
|
||||
WEECHAT_HOOK_SIGNAL_POINTER,
|
||||
irc_buffer_servers);
|
||||
weechat_hook_signal_send ("logger_start",
|
||||
WEECHAT_HOOK_SIGNAL_POINTER,
|
||||
irc_buffer_servers);
|
||||
|
||||
for (ptr_server = irc_servers; ptr_server;
|
||||
ptr_server = ptr_server->next_server)
|
||||
{
|
||||
if (ptr_server->buffer
|
||||
&& (ptr_server->buffer != irc_buffer_servers))
|
||||
{
|
||||
ptr_buffer = ptr_server->buffer;
|
||||
ptr_server->buffer = irc_buffer_servers;
|
||||
weechat_buffer_close (ptr_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
irc_server_set_buffer_title (irc_current_server);
|
||||
irc_server_buffer_set_highlight_words (irc_buffer_servers);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_buffer_split_server: split the server buffer into many buffers (one by server)
|
||||
*/
|
||||
|
||||
void
|
||||
irc_buffer_split_server ()
|
||||
{
|
||||
struct t_irc_server *ptr_server;
|
||||
char buffer_name[256], charset_modifier[256];
|
||||
|
||||
for (ptr_server = irc_servers; ptr_server;
|
||||
ptr_server = ptr_server->next_server)
|
||||
{
|
||||
if (ptr_server->buffer && (ptr_server != irc_current_server))
|
||||
{
|
||||
irc_server_create_buffer (ptr_server, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (irc_current_server)
|
||||
{
|
||||
snprintf (buffer_name, sizeof (buffer_name),
|
||||
"server.%s", irc_current_server->name);
|
||||
weechat_buffer_set (irc_current_server->buffer, "name", buffer_name);
|
||||
weechat_buffer_set (irc_current_server->buffer,
|
||||
"short_name", irc_current_server->name);
|
||||
weechat_buffer_set (irc_current_server->buffer,
|
||||
"localvar_set_server", irc_current_server->name);
|
||||
weechat_buffer_set (irc_current_server->buffer,
|
||||
"localvar_set_channel", irc_current_server->name);
|
||||
snprintf (charset_modifier, sizeof (charset_modifier),
|
||||
"irc.%s", irc_current_server->name);
|
||||
weechat_buffer_set (irc_current_server->buffer,
|
||||
"localvar_set_charset_modifier",
|
||||
charset_modifier);
|
||||
weechat_hook_signal_send ("logger_stop",
|
||||
WEECHAT_HOOK_SIGNAL_POINTER,
|
||||
irc_current_server->buffer);
|
||||
weechat_hook_signal_send ("logger_start",
|
||||
WEECHAT_HOOK_SIGNAL_POINTER,
|
||||
irc_current_server->buffer);
|
||||
}
|
||||
|
||||
irc_buffer_servers = NULL;
|
||||
irc_current_server = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_buffer_close_cb: callback called when a buffer is closed
|
||||
*/
|
||||
@@ -310,12 +152,40 @@ irc_buffer_close_cb (void *data, struct t_gui_buffer *buffer)
|
||||
irc_server_disconnect (ptr_server, 0);
|
||||
ptr_server->buffer = NULL;
|
||||
}
|
||||
if (irc_buffer_servers == buffer)
|
||||
irc_buffer_servers = NULL;
|
||||
if (ptr_server && (irc_current_server == ptr_server))
|
||||
irc_current_server = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_buffer_search_first_for_all_servers: search first server buffer that
|
||||
* will be used to merge all IRC
|
||||
* server buffers
|
||||
*/
|
||||
|
||||
struct t_gui_buffer *
|
||||
irc_buffer_search_first_for_all_servers ()
|
||||
{
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
struct t_irc_server *ptr_server;
|
||||
int number, number_found;
|
||||
|
||||
ptr_buffer = NULL;
|
||||
number_found = INT_MAX;
|
||||
|
||||
for (ptr_server = irc_servers; ptr_server;
|
||||
ptr_server = ptr_server->next_server)
|
||||
{
|
||||
if (ptr_server->buffer)
|
||||
{
|
||||
number = weechat_buffer_get_integer (ptr_server->buffer, "number");
|
||||
if (number < number_found)
|
||||
{
|
||||
number_found = number;
|
||||
ptr_buffer = ptr_server->buffer;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ptr_buffer;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user