diff --git a/src/gui/gui-filter.c b/src/gui/gui-filter.c index 7e69fb38e..3b42eb66e 100644 --- a/src/gui/gui-filter.c +++ b/src/gui/gui-filter.c @@ -297,6 +297,57 @@ gui_filter_find_pos (struct t_gui_filter *filter) return NULL; } +/* + * Adds a filter to the list of filters (sorted by name). + */ + +void +gui_filter_add_to_list (struct t_gui_filter *filter) +{ + struct t_gui_filter *pos_filter; + + pos_filter = gui_filter_find_pos (filter); + if (pos_filter) + { + /* add filter before "pos_filter" */ + filter->prev_filter = pos_filter->prev_filter; + filter->next_filter = pos_filter; + if (pos_filter->prev_filter) + (pos_filter->prev_filter)->next_filter = filter; + else + gui_filters = filter; + pos_filter->prev_filter = filter; + } + else + { + /* add filter to end of list */ + filter->prev_filter = last_gui_filter; + filter->next_filter = NULL; + if (last_gui_filter) + last_gui_filter->next_filter = filter; + else + gui_filters = filter; + last_gui_filter = filter; + } +} + +/* + * Removes a filter from list of filters. + */ + +void +gui_filter_remove_from_list (struct t_gui_filter *filter) +{ + if (filter->prev_filter) + (filter->prev_filter)->next_filter = filter->next_filter; + if (filter->next_filter) + (filter->next_filter)->prev_filter = filter->prev_filter; + if (gui_filters == filter) + gui_filters = filter->next_filter; + if (last_gui_filter == filter) + last_gui_filter = filter->prev_filter; +} + /* * Creates a new filter. * @@ -307,7 +358,7 @@ struct t_gui_filter * gui_filter_new (int enabled, const char *name, const char *buffer_name, const char *tags, const char *regex) { - struct t_gui_filter *new_filter, *pos_filter; + struct t_gui_filter *new_filter; regex_t *regex1, *regex2; char *pos_tab, *regex_prefix, buf[512], str_error[512]; const char *ptr_start_regex, *pos_regex_message; @@ -431,30 +482,7 @@ gui_filter_new (int enabled, const char *name, const char *buffer_name, new_filter->regex_prefix = regex1; new_filter->regex_message = regex2; - /* add filter to filters list */ - pos_filter = gui_filter_find_pos (new_filter); - if (pos_filter) - { - /* add filter before "pos_filter" */ - new_filter->prev_filter = pos_filter->prev_filter; - new_filter->next_filter = pos_filter; - if (pos_filter->prev_filter) - (pos_filter->prev_filter)->next_filter = new_filter; - else - gui_filters = new_filter; - pos_filter->prev_filter = new_filter; - } - else - { - /* add filter to end of list */ - new_filter->prev_filter = last_gui_filter; - new_filter->next_filter = NULL; - if (last_gui_filter) - last_gui_filter->next_filter = new_filter; - else - gui_filters = new_filter; - last_gui_filter = new_filter; - } + gui_filter_add_to_list (new_filter); (void) hook_signal_send ("filter_added", WEECHAT_HOOK_SIGNAL_POINTER, new_filter); @@ -487,6 +515,10 @@ gui_filter_rename (struct t_gui_filter *filter, const char *new_name) free (filter->name); filter->name = strdup (new_name); + /* resort list of filters */ + gui_filter_remove_from_list (filter); + gui_filter_add_to_list (filter); + return 1; } @@ -527,15 +559,7 @@ gui_filter_free (struct t_gui_filter *filter) free (filter->regex_message); } - /* remove filter from filters list */ - if (filter->prev_filter) - (filter->prev_filter)->next_filter = filter->next_filter; - if (filter->next_filter) - (filter->next_filter)->prev_filter = filter->prev_filter; - if (gui_filters == filter) - gui_filters = filter->next_filter; - if (last_gui_filter == filter) - last_gui_filter = filter->prev_filter; + gui_filter_remove_from_list (filter); free (filter);