core: add text search in buffers with free content (task #13051)

This commit is contained in:
Sebastien Helleu 2014-03-29 17:06:36 +01:00
parent 29364768c6
commit db000cd3b0
4 changed files with 64 additions and 31 deletions

View File

@ -15,6 +15,7 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
== Version 0.4.4 (under dev)
* core: add text search in buffers with free content (task #13051)
* core: add buffer property "clear"
* core: fix add of filter on OS X when regex for message is empty (filter regex
ending with "\t")

View File

@ -429,7 +429,8 @@ gui_chat_display_word_raw (struct t_gui_window *window, struct t_gui_line *line,
if (gui_window_current_emphasis)
{
gui_window_emphasize (GUI_WINDOW_OBJECTS(window)->win_chat,
x, window->win_chat_cursor_y,
x - window->scroll->start_col,
window->win_chat_cursor_y,
size_on_screen);
}
}
@ -1550,6 +1551,8 @@ void
gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line,
int y)
{
char *ptr_data, *message_with_search;
/* reset color & style for a new line */
gui_chat_reset_style (window, line, 0, 1,
GUI_COLOR_CHAT_INACTIVE_WINDOW,
@ -1558,16 +1561,37 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line,
window->win_chat_cursor_x = 0;
window->win_chat_cursor_y = y;
gui_window_current_emphasis = 0;
gui_chat_clrtoeol (window);
if (gui_chat_display_word_raw (window, line, line->data->message,
/* emphasize text (if searching text) */
ptr_data = line->data->message;
message_with_search = NULL;
if ((window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
&& (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE)
&& (!window->buffer->text_search_regex
|| window->buffer->text_search_regex_compiled))
{
message_with_search = gui_color_emphasize (ptr_data,
window->buffer->input_buffer,
window->buffer->text_search_exact,
window->buffer->text_search_regex_compiled);
if (message_with_search)
ptr_data = message_with_search;
}
/* display the line */
if (gui_chat_display_word_raw (window, line, ptr_data,
window->win_chat_width, 0,
CONFIG_BOOLEAN(config_look_color_inactive_message),
0) < window->win_chat_width)
{
gui_window_clrtoeol (GUI_WINDOW_OBJECTS(window)->win_chat);
}
if (message_with_search)
free (message_with_search);
}
/*

View File

@ -580,8 +580,7 @@ gui_input_search_text (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED))
{
gui_window_search_start (window);
gui_input_search_signal (buffer);
@ -634,8 +633,7 @@ gui_input_search_switch_case (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
window->buffer->text_search_exact ^= 1;
gui_window_search_restart (window);
@ -654,8 +652,7 @@ gui_input_search_switch_regex (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
window->buffer->text_search_regex ^= 1;
gui_window_search_restart (window);
@ -673,9 +670,12 @@ gui_input_search_switch_where (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
/* it's not possible to change that in a buffer with free content */
if (window->buffer->type == GUI_BUFFER_TYPE_FREE)
return;
if (window->buffer->text_search_where == GUI_TEXT_SEARCH_IN_MESSAGE)
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_PREFIX;
else if (window->buffer->text_search_where == GUI_TEXT_SEARCH_IN_PREFIX)
@ -697,8 +697,7 @@ gui_input_search_previous (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
(void) gui_window_search_text (window);
@ -715,8 +714,7 @@ gui_input_search_next (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD;
(void) gui_window_search_text (window);
@ -733,8 +731,7 @@ gui_input_search_stop (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
gui_window_search_stop (window);
gui_input_search_signal (buffer);

View File

@ -1571,29 +1571,38 @@ gui_window_search_text (struct t_gui_window *window)
void
gui_window_search_start (struct t_gui_window *window)
{
window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
window->buffer->text_search =
(window->buffer->type == GUI_BUFFER_TYPE_FORMATTED) ?
GUI_TEXT_SEARCH_BACKWARD : GUI_TEXT_SEARCH_FORWARD;
if ((window->buffer->text_search_where == 0)
|| CONFIG_BOOLEAN(config_look_buffer_search_force_default))
{
/* set default search values */
window->buffer->text_search_exact = CONFIG_BOOLEAN(config_look_buffer_search_case_sensitive);
window->buffer->text_search_regex = CONFIG_BOOLEAN(config_look_buffer_search_regex);
switch (CONFIG_INTEGER(config_look_buffer_search_where))
if (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
{
case CONFIG_LOOK_BUFFER_SEARCH_PREFIX:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_PREFIX;
break;
case CONFIG_LOOK_BUFFER_SEARCH_MESSAGE:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
break;
case CONFIG_LOOK_BUFFER_SEARCH_PREFIX_MESSAGE:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_PREFIX | GUI_TEXT_SEARCH_IN_MESSAGE;
break;
default:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
break;
switch (CONFIG_INTEGER(config_look_buffer_search_where))
{
case CONFIG_LOOK_BUFFER_SEARCH_PREFIX:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_PREFIX;
break;
case CONFIG_LOOK_BUFFER_SEARCH_MESSAGE:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
break;
case CONFIG_LOOK_BUFFER_SEARCH_PREFIX_MESSAGE:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_PREFIX | GUI_TEXT_SEARCH_IN_MESSAGE;
break;
default:
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
break;
}
}
else
window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
}
window->buffer->text_search_found = 0;
gui_input_search_compile_regex (window->buffer);
if (window->buffer->text_search_input)
@ -1616,7 +1625,9 @@ gui_window_search_restart (struct t_gui_window *window)
{
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
window->buffer->text_search =
(window->buffer->type == GUI_BUFFER_TYPE_FORMATTED) ?
GUI_TEXT_SEARCH_BACKWARD : GUI_TEXT_SEARCH_FORWARD;
window->buffer->text_search_found = 0;
gui_input_search_compile_regex (window->buffer);
if (gui_window_search_text (window))