diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2013-08-17 11:51:50 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2013-08-17 11:51:50 +0200 |
commit | 600ee3ddf37c070cab373346661d55718d2130b9 (patch) | |
tree | ff8c99c98ed7c4371eb4a6641a056d9b28ac6c71 /src | |
parent | c6249603368de12acfac60868d4bddd18d29abba (diff) | |
download | weechat-600ee3ddf37c070cab373346661d55718d2130b9.zip |
core: add search of regular expression in buffer, don't reset search type on a new search, select where to search (messages/prefixes)
Key changed in search context:
- ctrl+"r": switch search type: string/regex
New keys in search context:
- alt+"c": case (in)sensitive search
- tab: search in messages/prefixes/both
Diffstat (limited to 'src')
-rw-r--r-- | src/core/wee-command.c | 6 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-chat.c | 10 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-key.c | 16 | ||||
-rw-r--r-- | src/gui/gui-bar-item.c | 36 | ||||
-rw-r--r-- | src/gui/gui-buffer.c | 31 | ||||
-rw-r--r-- | src/gui/gui-buffer.h | 6 | ||||
-rw-r--r-- | src/gui/gui-color.c | 1 | ||||
-rw-r--r-- | src/gui/gui-input.c | 102 | ||||
-rw-r--r-- | src/gui/gui-input.h | 5 | ||||
-rw-r--r-- | src/gui/gui-line.c | 51 | ||||
-rw-r--r-- | src/gui/gui-line.h | 4 | ||||
-rw-r--r-- | src/gui/gui-window.c | 19 |
12 files changed, 226 insertions, 61 deletions
diff --git a/src/core/wee-command.c b/src/core/wee-command.c index dd2df49d4..f285cd73f 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -2507,6 +2507,10 @@ COMMAND_CALLBACK(input) gui_input_search_next (buffer); else if (string_strcasecmp (argv[1], "search_switch_case") == 0) gui_input_search_switch_case (buffer); + else if (string_strcasecmp (argv[1], "search_switch_regex") == 0) + gui_input_search_switch_regex (buffer); + else if (string_strcasecmp (argv[1], "search_switch_where") == 0) + gui_input_search_switch_where (buffer); else if (string_strcasecmp (argv[1], "search_stop") == 0) gui_input_search_stop (buffer); else if (string_strcasecmp (argv[1], "delete_previous_char") == 0) @@ -6523,6 +6527,8 @@ command_init () "completion\n" " search_text: search text in buffer\n" " search_switch_case: switch exact case for search\n" + " search_switch_regex: switch search type: string/regular expression\n" + " search_switch_where: switch search in messages/prefixes\n" " search_previous: search previous line\n" " search_next: search next line\n" " search_stop: stop search\n" diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c index e28dc92a6..b62dc52ff 100644 --- a/src/gui/curses/gui-curses-chat.c +++ b/src/gui/curses/gui-curses-chat.c @@ -1201,12 +1201,15 @@ gui_chat_display_line (struct t_gui_window *window, struct t_gui_line *line, ptr_data = (message_with_tags) ? message_with_tags : line->data->message; message_with_search = NULL; - if (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED) + 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, - NULL); + window->buffer->text_search_regex_compiled); if (message_with_search) ptr_data = message_with_search; } @@ -1321,8 +1324,7 @@ gui_chat_display_line (struct t_gui_window *window, struct t_gui_line *line, /* display marker if line is matching user search */ if (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED) { - if (gui_line_search_text (line, window->buffer->input_buffer, - window->buffer->text_search_exact)) + if (gui_line_search_text (window->buffer, line)) { gui_window_set_weechat_color (GUI_WINDOW_OBJECTS(window)->win_chat, GUI_COLOR_CHAT_TEXT_FOUND); diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c index 3d632886b..ef0bc7b92 100644 --- a/src/gui/curses/gui-curses-key.c +++ b/src/gui/curses/gui-curses-key.c @@ -223,7 +223,9 @@ gui_key_default_bindings (int context) { BIND(/* Enter */ "ctrl-M", "/input search_stop"); BIND(/* Enter */ "ctrl-J", "/input search_stop"); - BIND(/* ^R */ "ctrl-R", "/input search_switch_case"); + BIND(/* m-c */ "meta-c", "/input search_switch_case"); + BIND(/* ^R */ "ctrl-R", "/input search_switch_regex"); + BIND(/* tab */ "ctrl-I", "/input search_switch_where"); BIND(/* up */ "meta2-A", "/input search_previous"); BIND(/* down */ "meta2-B", "/input search_next"); } @@ -433,12 +435,16 @@ gui_key_flush (int paste) || (strcmp (input_old, gui_current_window->buffer->input_buffer) != 0))) { /* - * if current input is longer than old input, and that - * beginning of current input is exactly equal to old input, - * then do nothing (search will not find any result and can - * take some time on buffer with many lines..) + * if following conditions are all true, then do not search + * again (search will not find any result and can take some time + * on a buffer with many lines): + * - old search was not successful + * - searching a string (not a regex) + * - current input is longer than old input + * - beginning of current input is exactly equal to old input. */ if (!gui_current_window->buffer->text_search_found + && !gui_current_window->buffer->text_search_regex && (input_old != NULL) && (input_old[0]) && (gui_current_window->buffer->input_buffer != NULL) diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c index b7a601a84..d12c5a9f1 100644 --- a/src/gui/gui-bar-item.c +++ b/src/gui/gui-bar-item.c @@ -700,10 +700,7 @@ char * gui_bar_item_default_input_search (void *data, struct t_gui_bar_item *item, struct t_gui_window *window) { - char *text_search = N_("Text search"); - char *text_search_exact = N_("Text search (exact)"); - char *ptr_message, *buf; - int length; + char str_search[1024]; /* make C compiler happy */ (void) data; @@ -715,22 +712,21 @@ gui_bar_item_default_input_search (void *data, struct t_gui_bar_item *item, if (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED) return NULL; - ptr_message = (window->buffer->text_search_exact) ? - _(text_search_exact) : _(text_search); - length = 16 + strlen (ptr_message) + 1; - buf = malloc (length); - if (buf) - { - snprintf (buf, length, "%s%s", - (window->buffer->text_search_found - || !window->buffer->input_buffer - || !window->buffer->input_buffer[0]) ? - GUI_COLOR_CUSTOM_BAR_FG : - gui_color_get_custom (gui_color_get_name (CONFIG_COLOR(config_color_input_text_not_found))), - ptr_message); - } - - return buf; + snprintf (str_search, sizeof (str_search), "%s%s (%s %s,%s%s%s)", + (window->buffer->text_search_found + || !window->buffer->input_buffer + || !window->buffer->input_buffer[0]) ? + GUI_COLOR_CUSTOM_BAR_FG : + gui_color_get_custom (gui_color_get_name (CONFIG_COLOR(config_color_input_text_not_found))), + _("Search"), + (window->buffer->text_search_exact) ? "==" : "~", + (window->buffer->text_search_regex) ? "regex" : "str", + (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_PREFIX) ? "pre" : "", + ((window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_PREFIX) + && (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE)) ? "|" : "", + (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE) ? "msg" : ""); + + return strdup (str_search); } /* diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 5b33a8c58..daa461ac0 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -81,7 +81,8 @@ char *gui_buffer_properties_get_integer[] = "nicklist_count", "nicklist_groups_count", "nicklist_nicks_count", "nicklist_visible_count", "input", "input_get_unknown_commands", "input_size", "input_length", "input_pos", "input_1st_display", - "num_history", "text_search", "text_search_exact", "text_search_found", + "num_history", "text_search", "text_search_exact", "text_search_regex", + "text_search_where", "text_search_found", NULL }; char *gui_buffer_properties_get_string[] = @@ -91,7 +92,7 @@ char *gui_buffer_properties_get_string[] = NULL }; char *gui_buffer_properties_get_pointer[] = -{ "plugin", "highlight_regex_compiled", +{ "plugin", "text_search_regex_compiled", "highlight_regex_compiled", NULL }; char *gui_buffer_properties_set[] = @@ -538,6 +539,9 @@ gui_buffer_new (struct t_weechat_plugin *plugin, /* text search */ new_buffer->text_search = GUI_TEXT_SEARCH_DISABLED; new_buffer->text_search_exact = 0; + new_buffer->text_search_regex = 0; + new_buffer->text_search_regex_compiled = NULL; + new_buffer->text_search_where = 0; new_buffer->text_search_found = 0; new_buffer->text_search_input = NULL; @@ -895,6 +899,10 @@ gui_buffer_get_integer (struct t_gui_buffer *buffer, const char *property) return buffer->text_search; else if (string_strcasecmp (property, "text_search_exact") == 0) return buffer->text_search_exact; + else if (string_strcasecmp (property, "text_search_regex") == 0) + return buffer->text_search_regex; + else if (string_strcasecmp (property, "text_search_where") == 0) + return buffer->text_search_where; else if (string_strcasecmp (property, "text_search_found") == 0) return buffer->text_search_found; } @@ -958,6 +966,8 @@ gui_buffer_get_pointer (struct t_gui_buffer *buffer, const char *property) { if (string_strcasecmp (property, "plugin") == 0) return buffer->plugin; + else if (string_strcasecmp (property, "text_search_regex_compiled") == 0) + return buffer->text_search_regex_compiled; else if (string_strcasecmp (property, "highlight_regex_compiled") == 0) return buffer->highlight_regex_compiled; } @@ -2244,6 +2254,11 @@ gui_buffer_close (struct t_gui_buffer *buffer) free (buffer->input_undo_snap); if (buffer->text_search_input) free (buffer->text_search_input); + if (buffer->text_search_regex_compiled) + { + regfree (buffer->text_search_regex_compiled); + free (buffer->text_search_regex_compiled); + } if (buffer->highlight_words) free (buffer->highlight_words); if (buffer->highlight_regex) @@ -3225,6 +3240,9 @@ gui_buffer_hdata_buffer_cb (void *data, const char *hdata_name) HDATA_VAR(struct t_gui_buffer, num_history, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, text_search, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, text_search_exact, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_gui_buffer, text_search_regex, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_gui_buffer, text_search_regex_compiled, POINTER, 0, NULL, NULL); + HDATA_VAR(struct t_gui_buffer, text_search_where, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, text_search_found, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, text_search_input, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, highlight_words, STRING, 0, NULL, NULL); @@ -3398,6 +3416,12 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist, return 0; if (!infolist_new_var_integer (ptr_item, "text_search_exact", buffer->text_search_exact)) return 0; + if (!infolist_new_var_integer (ptr_item, "text_search_regex", buffer->text_search_regex)) + return 0; + if (!infolist_new_var_pointer (ptr_item, "text_search_regex_compiled", buffer->text_search_regex_compiled)) + return 0; + if (!infolist_new_var_integer (ptr_item, "text_search_where", buffer->text_search_where)) + return 0; if (!infolist_new_var_integer (ptr_item, "text_search_found", buffer->text_search_found)) return 0; if (!infolist_new_var_string (ptr_item, "text_search_input", buffer->text_search_input)) @@ -3600,6 +3624,9 @@ gui_buffer_print_log () log_printf (" num_history . . . . . . : %d", ptr_buffer->num_history); log_printf (" text_search . . . . . . : %d", ptr_buffer->text_search); log_printf (" text_search_exact . . . : %d", ptr_buffer->text_search_exact); + log_printf (" text_search_regex . . . : %d", ptr_buffer->text_search_regex); + log_printf (" text_search_regex_compiled: 0x%lx", ptr_buffer->text_search_regex_compiled); + log_printf (" text_search_where . . . : %d", ptr_buffer->text_search_where); log_printf (" text_search_found . . . : %d", ptr_buffer->text_search_found); log_printf (" text_search_input . . . : '%s'", ptr_buffer->text_search_input); log_printf (" highlight_words . . . . : '%s'", ptr_buffer->highlight_words); diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index e1704cf9f..f9de9c4b1 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -50,6 +50,9 @@ enum t_gui_buffer_notify #define GUI_TEXT_SEARCH_BACKWARD 1 #define GUI_TEXT_SEARCH_FORWARD 2 +#define GUI_TEXT_SEARCH_IN_MESSAGE 1 +#define GUI_TEXT_SEARCH_IN_PREFIX 2 + #define GUI_BUFFER_INPUT_BLOCK_SIZE 256 /* buffer structures */ @@ -158,6 +161,9 @@ struct t_gui_buffer /* text search */ int text_search; /* text search type */ int text_search_exact; /* exact search (case sensitive) ? */ + int text_search_regex; /* search with a regex */ + regex_t *text_search_regex_compiled; /* regex used to search */ + int text_search_where; /* search where? prefix and/or msg */ int text_search_found; /* 1 if text found, otherwise 0 */ char *text_search_input; /* input saved before text search */ diff --git a/src/gui/gui-color.c b/src/gui/gui-color.c index d9e4d3e8e..f5f65dcca 100644 --- a/src/gui/gui-color.c +++ b/src/gui/gui-color.c @@ -658,6 +658,7 @@ gui_color_emphasize (const char *string, if (regex) { /* search next match using the regex */ + regex_match.rm_so = -1; rc = regexec (regex, ptr_no_color, 1, ®ex_match, 0); /* diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index 831482134..a97f485f7 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -556,11 +556,47 @@ gui_input_search_text (struct t_gui_buffer *buffer) } /* - * Searches backward in buffer (default key: up during search). + * Compiles regex used to search text in buffer. */ void -gui_input_search_previous (struct t_gui_buffer *buffer) +gui_input_search_compile_regex (struct t_gui_buffer *buffer) +{ + int flags; + + /* remove the compiled regex */ + if (buffer->text_search_regex_compiled) + { + regfree (buffer->text_search_regex_compiled); + free (buffer->text_search_regex_compiled); + buffer->text_search_regex_compiled = NULL; + } + + /* compile regex */ + if (buffer->text_search_regex) + { + buffer->text_search_regex_compiled = malloc (sizeof (*buffer->text_search_regex_compiled)); + if (buffer->text_search_regex_compiled) + { + flags = REG_EXTENDED; + if (!buffer->text_search_exact) + flags |= REG_ICASE; + if (string_regcomp (buffer->text_search_regex_compiled, + buffer->input_buffer, flags) != 0) + { + free (buffer->text_search_regex_compiled); + buffer->text_search_regex_compiled = NULL; + } + } + } +} + +/* + * Switches case for search in buffer (default key: meta-c during search). + */ + +void +gui_input_search_switch_case (struct t_gui_buffer *buffer) { struct t_gui_window *window; @@ -568,17 +604,19 @@ gui_input_search_previous (struct t_gui_buffer *buffer) if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED) && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)) { - window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD; - (void) gui_window_search_text (window); + window->buffer->text_search_exact ^= 1; + gui_window_search_restart (window); + gui_input_search_signal (buffer); } } /* - * Searches forward in buffer (default key: down during search). + * Switches string/regex for search in buffer (default key: ctrl-R during + * search). */ void -gui_input_search_next (struct t_gui_buffer *buffer) +gui_input_search_switch_regex (struct t_gui_buffer *buffer) { struct t_gui_window *window; @@ -586,17 +624,18 @@ gui_input_search_next (struct t_gui_buffer *buffer) if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED) && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)) { - window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD; - (void) gui_window_search_text (window); + window->buffer->text_search_regex ^= 1; + gui_window_search_restart (window); + gui_input_search_signal (buffer); } } /* - * Switches case for search in buffer (default key: ctrl-R during search). + * Switches search in messages/prefixes (default key: tab during search). */ void -gui_input_search_switch_case (struct t_gui_buffer *buffer) +gui_input_search_switch_where (struct t_gui_buffer *buffer) { struct t_gui_window *window; @@ -604,13 +643,54 @@ gui_input_search_switch_case (struct t_gui_buffer *buffer) if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED) && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)) { - window->buffer->text_search_exact ^= 1; + 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) + window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE | GUI_TEXT_SEARCH_IN_PREFIX; + else + window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE; gui_window_search_restart (window); gui_input_search_signal (buffer); } } /* + * Searches backward in buffer (default key: up during search). + */ + +void +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)) + { + window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD; + (void) gui_window_search_text (window); + } +} + +/* + * Searches forward in buffer (default key: down during search). + */ + +void +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)) + { + window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD; + (void) gui_window_search_text (window); + } +} + +/* * Stops text search (default key: return during search). */ diff --git a/src/gui/gui-input.h b/src/gui/gui-input.h index 5d93cefcb..77961b6f5 100644 --- a/src/gui/gui-input.h +++ b/src/gui/gui-input.h @@ -44,9 +44,12 @@ extern void gui_input_return (struct t_gui_buffer *buffer); extern void gui_input_complete_next (struct t_gui_buffer *buffer); extern void gui_input_complete_previous (struct t_gui_buffer *buffer); extern void gui_input_search_text (struct t_gui_buffer *buffer); +extern void gui_input_search_compile_regex (struct t_gui_buffer *buffer); +extern void gui_input_search_switch_case (struct t_gui_buffer *buffer); +extern void gui_input_search_switch_regex (struct t_gui_buffer *buffer); +extern void gui_input_search_switch_where (struct t_gui_buffer *buffer); extern void gui_input_search_previous (struct t_gui_buffer *buffer); extern void gui_input_search_next (struct t_gui_buffer *buffer); -extern void gui_input_search_switch_case (struct t_gui_buffer *buffer); extern void gui_input_search_stop (struct t_gui_buffer *buffer); extern void gui_input_delete_previous_char (struct t_gui_buffer *buffer); extern void gui_input_delete_next_char (struct t_gui_buffer *buffer); diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c index a283312e0..92bb6f5ef 100644 --- a/src/gui/gui-line.c +++ b/src/gui/gui-line.c @@ -398,37 +398,70 @@ gui_line_get_next_displayed (struct t_gui_line *line) */ int -gui_line_search_text (struct t_gui_line *line, const char *text, - int case_sensitive) +gui_line_search_text (struct t_gui_buffer *buffer, struct t_gui_line *line) { char *prefix, *message; int rc; - if (!line || !line->data->message || !text || !text[0]) + if (!line || !line->data->message + || !buffer->input_buffer || !buffer->input_buffer[0]) + { return 0; + } rc = 0; - if (line->data->prefix) + if ((buffer->text_search_where & GUI_TEXT_SEARCH_IN_PREFIX) + && line->data->prefix) { prefix = gui_color_decode (line->data->prefix, NULL); if (prefix) { - if ((case_sensitive && (strstr (prefix, text))) - || (!case_sensitive && (string_strcasestr (prefix, text)))) + if (buffer->text_search_regex) + { + if (buffer->text_search_regex_compiled) + { + if (regexec (buffer->text_search_regex_compiled, + prefix, 0, NULL, 0) == 0) + { + rc = 1; + } + } + } + else if ((buffer->text_search_exact + && (strstr (prefix, buffer->input_buffer))) + || (!buffer->text_search_exact + && (string_strcasestr (prefix, buffer->input_buffer)))) + { rc = 1; + } free (prefix); } } - if (!rc) + if (!rc && (buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE)) { message = gui_color_decode (line->data->message, NULL); if (message) { - if ((case_sensitive && (strstr (message, text))) - || (!case_sensitive && (string_strcasestr (message, text)))) + if (buffer->text_search_regex) + { + if (buffer->text_search_regex_compiled) + { + if (regexec (buffer->text_search_regex_compiled, + message, 0, NULL, 0) == 0) + { + rc = 1; + } + } + } + else if ((buffer->text_search_exact + && (strstr (message, buffer->input_buffer))) + || (!buffer->text_search_exact + && (string_strcasestr (message, buffer->input_buffer)))) + { rc = 1; + } free (message); } } diff --git a/src/gui/gui-line.h b/src/gui/gui-line.h index 483e53fce..7004b6353 100644 --- a/src/gui/gui-line.h +++ b/src/gui/gui-line.h @@ -80,8 +80,8 @@ extern struct t_gui_line *gui_line_get_first_displayed (struct t_gui_buffer *buf extern struct t_gui_line *gui_line_get_last_displayed (struct t_gui_buffer *buffer); extern struct t_gui_line *gui_line_get_prev_displayed (struct t_gui_line *line); extern struct t_gui_line *gui_line_get_next_displayed (struct t_gui_line *line); -extern int gui_line_search_text (struct t_gui_line *line, const char *text, - int case_sensitive); +extern int gui_line_search_text (struct t_gui_buffer *buffer, + struct t_gui_line *line); extern int gui_line_match_regex (struct t_gui_line_data *line_data, regex_t *regex_prefix, regex_t *regex_message); diff --git a/src/gui/gui-window.c b/src/gui/gui-window.c index 1b4caf8cf..7e1fc4fb4 100644 --- a/src/gui/gui-window.c +++ b/src/gui/gui-window.c @@ -1502,9 +1502,7 @@ gui_window_search_text (struct t_gui_window *window) gui_line_get_last_displayed (window->buffer); while (ptr_line) { - if (gui_line_search_text (ptr_line, - window->buffer->input_buffer, - window->buffer->text_search_exact)) + if (gui_line_search_text (window->buffer, ptr_line)) { window->scroll->start_line = ptr_line; window->scroll->start_line_pos = 0; @@ -1527,9 +1525,7 @@ gui_window_search_text (struct t_gui_window *window) gui_line_get_first_displayed (window->buffer); while (ptr_line) { - if (gui_line_search_text (ptr_line, - window->buffer->input_buffer, - window->buffer->text_search_exact)) + if (gui_line_search_text (window->buffer, ptr_line)) { window->scroll->start_line = ptr_line; window->scroll->start_line_pos = 0; @@ -1553,8 +1549,10 @@ void gui_window_search_start (struct t_gui_window *window) { window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD; - window->buffer->text_search_exact = 0; + if (window->buffer->text_search_where == 0) + 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) { free (window->buffer->text_search_input); @@ -1577,6 +1575,7 @@ gui_window_search_restart (struct t_gui_window *window) window->scroll->start_line_pos = 0; window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD; window->buffer->text_search_found = 0; + gui_input_search_compile_regex (window->buffer); if (gui_window_search_text (window)) window->buffer->text_search_found = 1; else @@ -1599,6 +1598,12 @@ gui_window_search_stop (struct t_gui_window *window) { window->buffer->text_search = GUI_TEXT_SEARCH_DISABLED; window->buffer->text_search = 0; + if (window->buffer->text_search_regex_compiled) + { + regfree (window->buffer->text_search_regex_compiled); + free (window->buffer->text_search_regex_compiled); + window->buffer->text_search_regex_compiled = NULL; + } gui_input_delete_line (window->buffer); if (window->buffer->text_search_input) { |