summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/command.c100
-rw-r--r--src/gui/gui-common.c85
-rw-r--r--src/gui/gui.h1
3 files changed, 174 insertions, 12 deletions
diff --git a/src/common/command.c b/src/common/command.c
index bcd8b3031..a94cc44d7 100644
--- a/src/common/command.c
+++ b/src/common/command.c
@@ -832,37 +832,113 @@ weechat_cmd_alias (char *arguments)
int
weechat_cmd_buffer (int argc, char **argv)
{
- int number;
+ t_gui_buffer *ptr_buffer;
+ long number;
char *error;
if ((argc == 0) || ((argc == 1) && (strcasecmp (argv[0], "list") == 0)))
{
- /* list opened bufferss */
- gui_printf (NULL, "buffer list -- NOT DEVELOPED!\n");
+ /* list opened buffers */
+
+ irc_display_prefix (NULL, PREFIX_INFO);
+ gui_printf (NULL, _("Opened buffers:\n"));
+
+ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
+ {
+ irc_display_prefix (NULL, PREFIX_INFO);
+ gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, "[");
+ gui_printf (NULL, "%d", ptr_buffer->number);
+ gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, "] ");
+
+ if (ptr_buffer->dcc)
+ gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL, "DCC\n");
+ else if (BUFFER_IS_SERVER (ptr_buffer))
+ {
+ gui_printf (NULL, _("Server: "));
+ gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL,
+ "%s\n", SERVER(ptr_buffer)->name);
+ }
+ else if (BUFFER_IS_CHANNEL (ptr_buffer))
+ {
+ gui_printf (NULL, _("Channel: "));
+ gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL,
+ "%s", CHANNEL(ptr_buffer)->name);
+ gui_printf (NULL, _(" (server: "));
+ gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL,
+ "%s", SERVER(ptr_buffer)->name);
+ gui_printf (NULL, ")\n");
+ }
+ else if (BUFFER_IS_PRIVATE (ptr_buffer))
+ {
+ gui_printf (NULL, _("Private with: "));
+ gui_printf_color (NULL, COLOR_WIN_CHAT_NICK,
+ "%s", CHANNEL(ptr_buffer)->name);
+ gui_printf (NULL, _(" (server: "));
+ gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL,
+ "%s", SERVER(ptr_buffer)->name);
+ gui_printf (NULL, ")\n");
+ }
+ }
}
else
{
if (strcasecmp (argv[0], "move") == 0)
{
/* move buffer to another number in the list */
- gui_printf (NULL, "buffer move -- NOT DEVELOPED!\n");
+
+ if (argc < 2)
+ {
+ gui_printf (NULL, _("%s missing arguments for \"%s\" command\n"),
+ WEECHAT_ERROR, "buffer");
+ return -1;
+ }
+
+ error = NULL;
+ number = strtol (((argv[1][0] == '+') || (argv[1][0] == '-')) ? argv[1] + 1 : argv[1],
+ &error, 10);
+ if ((error) && (error[0] == '\0'))
+ {
+ if (argv[1][0] == '+')
+ gui_move_buffer_to_number (gui_current_window,
+ gui_current_window->buffer->number + ((int) number));
+ else if (argv[1][0] == '-')
+ gui_move_buffer_to_number (gui_current_window,
+ gui_current_window->buffer->number - ((int) number));
+ else
+ gui_move_buffer_to_number (gui_current_window, (int) number);
+ }
+ else
+ {
+ /* invalid number */
+ gui_printf (NULL, _("%s incorrect buffer number\n"),
+ WEECHAT_ERROR);
+ return -1;
+ }
}
else
{
+ /* jump to buffer by number */
+
+ error = NULL;
number = strtol (argv[0], &error, 10);
- if (error)
+ if ((error) && (error[0] == '\0'))
{
- gui_printf (NULL, _("%s incorrect buffer number\n"),
- WEECHAT_ERROR);
- return -1;
+ if (!gui_switch_to_buffer_by_number (gui_current_window, (int) number))
+ {
+ gui_printf (NULL,
+ _("%s buffer \"%s\" not found for \"%s\" command\n"),
+ WEECHAT_ERROR, argv[0], "buffer");
+ return -1;
+ }
}
- if (!gui_switch_to_buffer_by_number (gui_current_window, number))
+ else
{
- gui_printf (NULL,
- _("%s buffer \"%s\" not found for \"%s\" command\n"),
- WEECHAT_ERROR, argv[0], "buffer");
+ /* invalid number */
+ gui_printf (NULL, _("%s incorrect buffer number\n"),
+ WEECHAT_ERROR);
return -1;
}
+
}
}
return 0;
diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c
index 147f583ce..ac6b1cc54 100644
--- a/src/gui/gui-common.c
+++ b/src/gui/gui-common.c
@@ -672,3 +672,88 @@ gui_switch_to_buffer_by_number (t_gui_window *window, int number)
/* buffer not found */
return NULL;
}
+
+/*
+ * gui_switch_to_buffer_by_number: switch to another buffer with number
+ */
+
+void
+gui_move_buffer_to_number (t_gui_window *window, int number)
+{
+ t_gui_buffer *ptr_buffer;
+ int i;
+
+ /* buffer number is already ok ? */
+ if (number == window->buffer->number)
+ return;
+
+ if (number < 1)
+ number = 1;
+
+ /* remove buffer from list */
+ if (window->buffer == gui_buffers)
+ {
+ gui_buffers = window->buffer->next_buffer;
+ gui_buffers->prev_buffer = NULL;
+ }
+ if (window->buffer == last_gui_buffer)
+ {
+ last_gui_buffer = window->buffer->prev_buffer;
+ last_gui_buffer->next_buffer = NULL;
+ }
+ if (window->buffer->prev_buffer)
+ (window->buffer->prev_buffer)->next_buffer = window->buffer->next_buffer;
+ if (window->buffer->next_buffer)
+ (window->buffer->next_buffer)->prev_buffer = window->buffer->prev_buffer;
+
+ if (number == 1)
+ {
+ gui_buffers->prev_buffer = window->buffer;
+ window->buffer->prev_buffer = NULL;
+ window->buffer->next_buffer = gui_buffers;
+ gui_buffers = window->buffer;
+ }
+ else
+ {
+ /* assign new number to all buffers */
+ i = 1;
+ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
+ {
+ ptr_buffer->number = i++;
+ }
+
+ /* search for new position in the list */
+ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
+ {
+ if (ptr_buffer->number == number)
+ break;
+ }
+ if (ptr_buffer)
+ {
+ /* insert before buffer found */
+ window->buffer->prev_buffer = ptr_buffer->prev_buffer;
+ window->buffer->next_buffer = ptr_buffer;
+ if (ptr_buffer->prev_buffer)
+ (ptr_buffer->prev_buffer)->next_buffer = window->buffer;
+ ptr_buffer->prev_buffer = window->buffer;
+ }
+ else
+ {
+ /* number not found (too big)? => add to end */
+ window->buffer->prev_buffer = last_gui_buffer;
+ window->buffer->next_buffer = NULL;
+ last_gui_buffer->next_buffer = window->buffer;
+ last_gui_buffer = window->buffer;
+ }
+
+ }
+
+ /* assign new number to all buffers */
+ i = 1;
+ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
+ {
+ ptr_buffer->number = i++;
+ }
+
+ gui_redraw_buffer (window->buffer);
+}
diff --git a/src/gui/gui.h b/src/gui/gui.h
index 8d9286a3a..ddf7422d2 100644
--- a/src/gui/gui.h
+++ b/src/gui/gui.h
@@ -257,6 +257,7 @@ extern void gui_move_previous_word (t_gui_buffer *);
extern void gui_move_next_word (t_gui_buffer *);
extern void gui_buffer_insert_string (t_gui_buffer *, char *, int);
extern t_gui_buffer *gui_switch_to_buffer_by_number (t_gui_window *, int);
+extern void gui_move_buffer_to_number (t_gui_window *, int);
/* GUI dependant functions */
extern int gui_assign_color (int *, char *);
extern int gui_get_color_by_name (char *);