1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-10 19:53:13 +02:00

Merge branch 'buffer-auto-renumber'

This commit is contained in:
Sebastien Helleu
2013-12-11 18:54:06 +01:00
8 changed files with 983 additions and 419 deletions
+183 -87
View File
@@ -473,6 +473,35 @@ COMMAND_CALLBACK(bar)
return WEECHAT_RC_OK;
}
/*
* Checks if the buffer number is valid (in range 1 to GUI_BUFFER_NUMBER_MAX).
*
* If the number is not valid, a warning is displayed.
*
* Returns:
* 1: buffer number is valid
* 0: buffer number is invalid
*/
int
command_buffer_check_number (long number)
{
if ((number < 1) || (number > GUI_BUFFER_NUMBER_MAX))
{
/* invalid number */
gui_chat_printf (NULL,
_("%sError: buffer number %d is out of range "
"(it must be between 1 and %d)"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
number,
GUI_BUFFER_NUMBER_MAX);
return 0;
}
/* number is OK */
return 1;
}
/*
* Displays a local variable for a buffer.
*/
@@ -512,9 +541,9 @@ COMMAND_CALLBACK(buffer)
{
struct t_gui_buffer *ptr_buffer, *ptr_buffer2, *ptr_prev_buffer;
struct t_gui_buffer *weechat_buffer;
long number, number1, number2;
long number, number1, number2, numbers[3];
char *error, *value, *pos, *str_number1, *pos_number2;
int i, target_buffer, error_main_buffer, num_buffers;
int i, error_main_buffer, num_buffers, count, prev_number;
/* make C compiler happy */
(void) data;
@@ -553,42 +582,24 @@ COMMAND_CALLBACK(buffer)
{
if (string_strcasecmp (argv[2], "-all") == 0)
gui_buffer_clear_all ();
else if (string_strcasecmp (argv[2], "-merged") == 0)
{
for (ptr_buffer = gui_buffers; ptr_buffer;
ptr_buffer = ptr_buffer->next_buffer)
{
if ((ptr_buffer->number == buffer->number)
&& (ptr_buffer->type == GUI_BUFFER_TYPE_FORMATTED))
{
gui_buffer_clear (ptr_buffer);
}
}
}
else
{
for (i = 2; i < argc; i++)
{
error = NULL;
number = strtol (argv[i], &error, 10);
if (error && !error[0])
ptr_buffer = (string_strcasecmp (argv[i], "-merged") == 0) ?
buffer : gui_buffer_search_by_number_or_name (argv[i]);
if (ptr_buffer)
{
for (ptr_buffer = gui_buffers; ptr_buffer;
ptr_buffer = ptr_buffer->next_buffer)
for (ptr_buffer2 = gui_buffers; ptr_buffer2;
ptr_buffer2 = ptr_buffer2->next_buffer)
{
if ((ptr_buffer->number == number)
&& (ptr_buffer->type == GUI_BUFFER_TYPE_FORMATTED))
if ((ptr_buffer2->number == ptr_buffer->number)
&& (ptr_buffer2->type == GUI_BUFFER_TYPE_FORMATTED))
{
gui_buffer_clear (ptr_buffer);
gui_buffer_clear (ptr_buffer2);
}
}
}
else
{
ptr_buffer = gui_buffer_search_by_full_name (argv[i]);
if (ptr_buffer)
gui_buffer_clear (ptr_buffer);
}
}
}
}
@@ -605,28 +616,41 @@ COMMAND_CALLBACK(buffer)
if (string_strcasecmp (argv[1], "move") == 0)
{
COMMAND_MIN_ARGS(3, "buffer move");
error = NULL;
number = strtol (((argv[2][0] == '+') || (argv[2][0] == '-')) ?
argv[2] + 1 : argv[2],
&error, 10);
if (error && !error[0])
if (strcmp (argv[2], "-") == 0)
{
if (argv[2][0] == '+')
gui_buffer_move_to_number (buffer,
buffer->number + ((int) number));
else if (argv[2][0] == '-')
gui_buffer_move_to_number (buffer,
buffer->number - ((int) number));
else
gui_buffer_move_to_number (buffer, (int) number);
gui_buffer_move_to_number (buffer, 1);
}
else if (strcmp (argv[2], "+") == 0)
{
number = last_gui_buffer->number + 1;
if (command_buffer_check_number (number))
gui_buffer_move_to_number (buffer, number);
}
else
{
/* invalid number */
gui_chat_printf (NULL,
_("%sError: incorrect buffer number"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
return WEECHAT_RC_OK;
error = NULL;
number = strtol (((argv[2][0] == '+') || (argv[2][0] == '-')) ?
argv[2] + 1 : argv[2],
&error, 10);
if (error && !error[0]
&& (number >= INT_MIN) && (number <= INT_MAX))
{
if (argv[2][0] == '+')
number = buffer->number + number;
else if (argv[2][0] == '-')
number = buffer->number - number;
number = (int)number;
if (command_buffer_check_number (number))
gui_buffer_move_to_number (buffer, number);
}
else
{
/* invalid number */
gui_chat_printf (NULL,
_("%sError: incorrect buffer number"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
return WEECHAT_RC_OK;
}
}
return WEECHAT_RC_OK;
@@ -640,33 +664,10 @@ COMMAND_CALLBACK(buffer)
ptr_buffer = NULL;
ptr_buffer2 = NULL;
/* first buffer for swap */
number = strtol (argv[2], &error, 10);
if (error && !error[0])
ptr_buffer = gui_buffer_search_by_number (number);
else
{
ptr_buffer = gui_buffer_search_by_full_name (argv[2]);
if (!ptr_buffer)
ptr_buffer = gui_buffer_search_by_partial_name (NULL, argv[2]);
}
/* second buffer for swap */
if (argc > 3)
{
number = strtol (argv[3], &error, 10);
if (error && !error[0])
ptr_buffer2 = gui_buffer_search_by_number (number);
else
{
ptr_buffer2 = gui_buffer_search_by_full_name (argv[3]);
if (!ptr_buffer2)
ptr_buffer2 = gui_buffer_search_by_partial_name (NULL, argv[3]);
}
}
else
ptr_buffer2 = buffer;
/* search buffers to swap */
ptr_buffer = gui_buffer_search_by_number_or_name (argv[2]);
ptr_buffer2 = (argc > 3) ?
gui_buffer_search_by_number_or_name (argv[3]) : buffer;
if (!ptr_buffer || !ptr_buffer2)
{
/* invalid buffer name/number */
@@ -676,7 +677,7 @@ COMMAND_CALLBACK(buffer)
return WEECHAT_RC_OK;
}
gui_buffer_swap (ptr_buffer, ptr_buffer2);
gui_buffer_swap (ptr_buffer->number, ptr_buffer2->number);
return WEECHAT_RC_OK;
}
@@ -728,13 +729,55 @@ COMMAND_CALLBACK(buffer)
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
return WEECHAT_RC_OK;
}
if (!command_buffer_check_number ((int)number))
return WEECHAT_RC_ERROR;
}
}
gui_buffer_unmerge (buffer, (int) number);
gui_buffer_unmerge (buffer, (int)number);
return WEECHAT_RC_OK;
}
/* renumber buffers */
if (string_strcasecmp (argv[1], "renumber") == 0)
{
if (CONFIG_BOOLEAN(config_look_buffer_auto_renumber))
{
gui_chat_printf (NULL,
_("%sError: renumbering is allowed only if option "
"weechat.look.buffer_auto_renumber is off"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
return WEECHAT_RC_OK;
}
for (i = 0; i < 3; i++)
{
if (argc >= i + 3)
{
error = NULL;
numbers[i] = strtol (argv[i + 2], &error, 10);
if (!error || error[0])
{
/* invalid number */
gui_chat_printf (NULL,
_("%sError: incorrect buffer number"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
return WEECHAT_RC_OK;
}
if ((i == 2) && !command_buffer_check_number ((int)numbers[i]))
return WEECHAT_RC_OK;
}
else
numbers[i] = -1;
}
/*
* renumber the buffers; if we are renumbering all buffers (no numbers
* given), start at number 1
*/
gui_buffer_renumber ((int)numbers[0], (int)numbers[1],
(argc == 2) ? 1 : (int)numbers[2]);
return WEECHAT_RC_OK;
}
/* close buffer */
if (string_strcasecmp (argv[1], "close") == 0)
{
@@ -945,12 +988,35 @@ COMMAND_CALLBACK(buffer)
number = strtol (argv[1] + 1, &error, 10);
if (error && !error[0])
{
target_buffer = buffer->number - (int) number;
if (target_buffer < 1)
target_buffer = (last_gui_buffer) ?
last_gui_buffer->number + target_buffer : 1;
gui_buffer_switch_by_number (gui_current_window,
target_buffer);
if (number <= 0)
return WEECHAT_RC_OK;
count = 0;
prev_number = gui_current_window->buffer->number;
ptr_buffer = gui_current_window->buffer;
while (1)
{
ptr_buffer = ptr_buffer->prev_buffer;
if (!ptr_buffer)
ptr_buffer = last_gui_buffer;
/* if we have looped on all buffers, exit the loop */
if (ptr_buffer == gui_current_window->buffer)
break;
if ((ptr_buffer->number != gui_current_window->buffer->number)
&& (ptr_buffer->number != prev_number))
{
/* increase count each time we discover a different number */
count++;
if (count == number)
{
gui_buffer_switch_by_number (gui_current_window,
ptr_buffer->number);
break;
}
}
prev_number = ptr_buffer->number;
}
}
else
{
@@ -971,11 +1037,35 @@ COMMAND_CALLBACK(buffer)
number = strtol (argv[1] + 1, &error, 10);
if (error && !error[0])
{
target_buffer = buffer->number + (int) number;
if (last_gui_buffer && target_buffer > last_gui_buffer->number)
target_buffer -= last_gui_buffer->number;
gui_buffer_switch_by_number (gui_current_window,
target_buffer);
if (number <= 0)
return WEECHAT_RC_OK;
count = 0;
prev_number = gui_current_window->buffer->number;
ptr_buffer = gui_current_window->buffer;
while (1)
{
ptr_buffer = ptr_buffer->next_buffer;
if (!ptr_buffer)
ptr_buffer = gui_buffers;
/* if we have looped on all buffers, exit the loop */
if (ptr_buffer == gui_current_window->buffer)
break;
if ((ptr_buffer->number != gui_current_window->buffer->number)
&& (ptr_buffer->number != prev_number))
{
/* increase count each time we discover a different number */
count++;
if (count == number)
{
gui_buffer_switch_by_number (gui_current_window,
ptr_buffer->number);
break;
}
}
prev_number = ptr_buffer->number;
}
}
else
{
@@ -6213,6 +6303,7 @@ command_init ()
" || move|merge <number>"
" || swap <number1>|<name1> [<number2>|<name2>]"
" || unmerge [<number>|-all]"
" || renumber [<number1> [<number2> [<start>]]]"
" || close [<n1>[-<n2>]|<name>]"
" || notify <level>"
" || localvar"
@@ -6234,6 +6325,8 @@ command_init ()
"buffers)\n"
" unmerge: unmerge buffer from other buffers which have "
"same number\n"
"renumber: renumber a range of buffers (works only if "
"option weechat.look.buffer_auto_renumber is off)\n"
" close: close buffer (number/range or name is optional)\n"
" notify: set notify level for current buffer: this "
"level determines whether buffer will be added to "
@@ -6273,11 +6366,14 @@ command_init ()
" /buffer #weechat\n"
" jump to next buffer:\n"
" /buffer +1"),
"clear -merged|-all|%(buffers_numbers)|%(buffers_plugins_names)"
"clear -merged|-all|%(buffers_numbers)|"
"%(buffers_plugins_names)"
" || move %(buffers_numbers)"
" || swap %(buffers_numbers)"
" || merge %(buffers_numbers)"
" || unmerge %(buffers_numbers)|-all"
" || renumber %(buffers_numbers) %(buffers_numbers) "
"%(buffers_numbers)"
" || close %(buffers_plugins_names)"
" || list"
" || notify reset|none|highlight|message|all"
+34
View File
@@ -84,7 +84,9 @@ struct t_config_option *config_look_bar_more_left;
struct t_config_option *config_look_bar_more_right;
struct t_config_option *config_look_bar_more_up;
struct t_config_option *config_look_bar_more_down;
struct t_config_option *config_look_buffer_auto_renumber;
struct t_config_option *config_look_buffer_notify_default;
struct t_config_option *config_look_buffer_position;
struct t_config_option *config_look_buffer_search_case_sensitive;
struct t_config_option *config_look_buffer_search_force_default;
struct t_config_option *config_look_buffer_search_regex;
@@ -383,6 +385,21 @@ config_change_mouse (void *data, struct t_config_option *option)
}
}
/*
* Callback for changes on option "weechat.look.buffer_auto_renumber".
*/
void
config_change_buffer_auto_renumber (void *data, struct t_config_option *option)
{
/* make C compiler happy */
(void) data;
(void) option;
if (gui_buffers && CONFIG_BOOLEAN(config_look_buffer_auto_renumber))
gui_buffer_renumber (-1, -1, 1);
}
/*
* Callback for changes on option "weechat.look.buffer_notify_default".
*/
@@ -1974,6 +1991,14 @@ config_weechat_init_options ()
N_("string displayed when bar can be scrolled down "
"(for bars with filling different from \"horizontal\")"),
NULL, 0, 0, "++", NULL, 0, NULL, NULL, &config_change_buffer_content, NULL, NULL, NULL);
config_look_buffer_auto_renumber = config_file_new_option (
weechat_config_file, ptr_section,
"buffer_auto_renumber", "boolean",
N_("automatically renumber buffers to have only consecutive numbers "
"and start with number 1; if disabled, gaps between buffer numbers "
"are allowed and the first buffer can have a number > 1"),
NULL, 0, 0, "on", NULL, 0, NULL, NULL,
&config_change_buffer_auto_renumber, NULL, NULL, NULL);
config_look_buffer_notify_default = config_file_new_option (
weechat_config_file, ptr_section,
"buffer_notify_default", "integer",
@@ -1984,6 +2009,15 @@ config_weechat_init_options ()
"none=never display in hotlist"),
"none|highlight|message|all", 0, 0, "all", NULL, 0,
NULL, NULL, &config_change_buffer_notify_default, NULL, NULL, NULL);
config_look_buffer_position = config_file_new_option (
weechat_config_file, ptr_section,
"buffer_position", "integer",
N_("position of a new buffer: end = after the end of list (number = "
"last number + 1) (default), first_gap = at first available "
"number in the list (after the end of list if no number is "
"available); this option is used only if the buffer has no layout "
"number"),
"end|first_gap", 0, 0, "end", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
config_look_buffer_search_case_sensitive = config_file_new_option (
weechat_config_file, ptr_section,
"buffer_search_case_sensitive", "boolean",
+8
View File
@@ -37,6 +37,12 @@ enum t_config_look_align_end_of_lines
CONFIG_LOOK_ALIGN_END_OF_LINES_MESSAGE,
};
enum t_config_look_buffer_position
{
CONFIG_LOOK_BUFFER_POSITION_END = 0,
CONFIG_LOOK_BUFFER_POSITION_FIRST_GAP,
};
enum t_config_look_buffer_search_where
{
CONFIG_LOOK_BUFFER_SEARCH_PREFIX = 0,
@@ -108,7 +114,9 @@ extern struct t_config_option *config_look_bar_more_left;
extern struct t_config_option *config_look_bar_more_right;
extern struct t_config_option *config_look_bar_more_up;
extern struct t_config_option *config_look_bar_more_down;
extern struct t_config_option *config_look_buffer_auto_renumber;
extern struct t_config_option *config_look_buffer_notify_default;
extern struct t_config_option *config_look_buffer_position;
extern struct t_config_option *config_look_buffer_search_case_sensitive;
extern struct t_config_option *config_look_buffer_search_force_default;
extern struct t_config_option *config_look_buffer_search_regex;
+44 -4
View File
@@ -58,10 +58,10 @@ struct t_gui_bar_item *gui_bar_items = NULL; /* first bar item */
struct t_gui_bar_item *last_gui_bar_item = NULL; /* last bar item */
char *gui_bar_item_names[GUI_BAR_NUM_ITEMS] =
{ "input_paste", "input_prompt", "input_search", "input_text", "time",
"buffer_count", "buffer_plugin", "buffer_number", "buffer_name",
"buffer_modes", "buffer_filter", "buffer_zoom", "buffer_nicklist_count",
"scroll", "hotlist", "completion", "buffer_title", "buffer_nicklist",
"window_number"
"buffer_count", "buffer_last_number", "buffer_plugin", "buffer_number",
"buffer_name", "buffer_modes", "buffer_filter", "buffer_zoom",
"buffer_nicklist_count", "scroll", "hotlist", "completion", "buffer_title",
"buffer_nicklist", "window_number"
};
char *gui_bar_items_default_for_bars[][2] =
{ { GUI_BAR_DEFAULT_NAME_INPUT,
@@ -949,6 +949,31 @@ gui_bar_item_default_buffer_count (void *data, struct t_gui_bar_item *item,
(void) buffer;
(void) extra_info;
snprintf (buf, sizeof (buf), "%d", gui_buffers_count);
return strdup (buf);
}
/*
* Default item for last buffer number.
*/
char *
gui_bar_item_default_buffer_last_number (void *data,
struct t_gui_bar_item *item,
struct t_gui_window *window,
struct t_gui_buffer *buffer,
struct t_hashtable *extra_info)
{
char buf[32];
/* make C compiler happy */
(void) data;
(void) item;
(void) window;
(void) buffer;
(void) extra_info;
snprintf (buf, sizeof (buf), "%d",
(last_gui_buffer) ? last_gui_buffer->number : 0);
@@ -1891,6 +1916,21 @@ gui_bar_item_init ()
gui_bar_item_hook_signal ("buffer_closed",
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_COUNT]);
/* last buffer number */
gui_bar_item_new (NULL,
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_LAST_NUMBER],
&gui_bar_item_default_buffer_last_number, NULL);
gui_bar_item_hook_signal ("buffer_opened",
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_LAST_NUMBER]);
gui_bar_item_hook_signal ("buffer_closed",
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_LAST_NUMBER]);
gui_bar_item_hook_signal ("buffer_moved",
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_LAST_NUMBER]);
gui_bar_item_hook_signal ("buffer_merged",
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_LAST_NUMBER]);
gui_bar_item_hook_signal ("buffer_unmerged",
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_LAST_NUMBER]);
/* buffer plugin */
gui_bar_item_new (NULL,
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_PLUGIN],
+1
View File
@@ -28,6 +28,7 @@ enum t_gui_bar_item_weechat
GUI_BAR_ITEM_INPUT_TEXT,
GUI_BAR_ITEM_TIME,
GUI_BAR_ITEM_BUFFER_COUNT,
GUI_BAR_ITEM_BUFFER_LAST_NUMBER,
GUI_BAR_ITEM_BUFFER_PLUGIN,
GUI_BAR_ITEM_BUFFER_NUMBER,
GUI_BAR_ITEM_BUFFER_NAME,
+697 -299
View File
File diff suppressed because it is too large Load Diff
+9 -2
View File
@@ -20,6 +20,7 @@
#ifndef __WEECHAT_GUI_BUFFER_H
#define __WEECHAT_GUI_BUFFER_H 1
#include <limits.h>
#include <regex.h>
struct t_hashtable;
@@ -46,6 +47,10 @@ enum t_gui_buffer_notify
#define GUI_BUFFER_MAIN "weechat"
#define GUI_BUFFERS_MAX 10000
#define GUI_BUFFER_NUMBER_MAX (INT_MAX - 10000)
#define GUI_TEXT_SEARCH_DISABLED 0
#define GUI_TEXT_SEARCH_BACKWARD 1
#define GUI_TEXT_SEARCH_FORWARD 2
@@ -205,6 +210,7 @@ struct t_gui_buffer_visited
extern struct t_gui_buffer *gui_buffers;
extern struct t_gui_buffer *last_gui_buffer;
extern int gui_buffers_count;
extern struct t_gui_buffer_visited *gui_buffers_visited;
extern struct t_gui_buffer_visited *last_gui_buffer_visited;
extern int gui_buffers_visited_index;
@@ -276,6 +282,7 @@ extern struct t_gui_buffer *gui_buffer_search_by_full_name (const char *full_nam
extern struct t_gui_buffer *gui_buffer_search_by_partial_name (const char *plugin,
const char *name);
extern struct t_gui_buffer *gui_buffer_search_by_number (int number);
extern struct t_gui_buffer *gui_buffer_search_by_number_or_name (const char *string);
extern struct t_gui_buffer *gui_buffer_search_by_layout_number (int layout_number,
int layout_number_merge_order);
extern int gui_buffer_count_merged_buffers (int number);
@@ -288,9 +295,9 @@ extern void gui_buffer_switch_by_number (struct t_gui_window *window,
extern void gui_buffer_set_active_buffer (struct t_gui_buffer *buffer);
extern struct t_gui_buffer *gui_buffer_get_next_active_buffer (struct t_gui_buffer *buffer);
extern struct t_gui_buffer *gui_buffer_get_previous_active_buffer (struct t_gui_buffer *buffer);
extern void gui_buffer_renumber (int number1, int number2, int start_number);
extern void gui_buffer_move_to_number (struct t_gui_buffer *buffer, int number);
extern void gui_buffer_swap (struct t_gui_buffer *buffer1,
struct t_gui_buffer *buffer2);
extern void gui_buffer_swap (int number1, int number2);
extern void gui_buffer_merge (struct t_gui_buffer *buffer,
struct t_gui_buffer *target_buffer);
extern void gui_buffer_unmerge (struct t_gui_buffer *buffer, int number);
+7 -27
View File
@@ -342,8 +342,7 @@ gui_layout_buffer_save (struct t_gui_layout *layout)
void
gui_layout_buffer_apply (struct t_gui_layout *layout)
{
struct t_gui_buffer *ptr_buffer, *ptr_next_buffer;
int number, count_merged;
struct t_gui_buffer *ptr_buffer;
if (!layout)
return;
@@ -357,35 +356,16 @@ gui_layout_buffer_apply (struct t_gui_layout *layout)
/* sort buffers by layout number (without merge) */
gui_buffer_sort_by_layout_number ();
/* merge buffers */
ptr_buffer = gui_buffers->next_buffer;
while (ptr_buffer)
{
ptr_next_buffer = ptr_buffer->next_buffer;
if ((ptr_buffer->layout_number >= 1)
&& (ptr_buffer->layout_number == (ptr_buffer->prev_buffer)->layout_number))
{
gui_buffer_merge (ptr_buffer, ptr_buffer->prev_buffer);
}
ptr_buffer = ptr_next_buffer;
}
/* set appropriate active buffers */
number = 1;
while (number <= last_gui_buffer->number)
for (ptr_buffer = gui_buffers; ptr_buffer;
ptr_buffer = ptr_buffer->next_buffer)
{
count_merged = gui_buffer_count_merged_buffers (number);
if (count_merged > 1)
if ((gui_buffer_count_merged_buffers (ptr_buffer->number) > 1)
&& (ptr_buffer->layout_number == ptr_buffer->number)
&& (ptr_buffer->layout_number_merge_order == 0))
{
ptr_buffer = gui_buffer_search_by_layout_number (number, 0);
if (ptr_buffer && !ptr_buffer->active)
{
gui_buffer_set_active_buffer (ptr_buffer);
}
gui_buffer_set_active_buffer (ptr_buffer);
}
number++;
}
}