1
0
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:
Sebastien Helleu
2009-06-10 12:40:05 +02:00
parent fd31dbb97e
commit 8d58b81d83
75 changed files with 3979 additions and 2325 deletions
+34 -164
View File
@@ -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;
}