]> jfr.im git - irc/weechat/weechat.git/commitdiff
core: sort filters by name (closes #1695)
authorSébastien Helleu <redacted>
Sat, 17 Sep 2022 09:07:22 +0000 (11:07 +0200)
committerSébastien Helleu <redacted>
Sat, 17 Sep 2022 09:07:22 +0000 (11:07 +0200)
ChangeLog.adoc
src/gui/gui-filter.c

index 7cf0f30f13672b64ba8ae4be9aef478406e05056..132ad39be7624fce62570496ad7dd3354f27bd2c 100644 (file)
@@ -22,6 +22,7 @@ New features::
 
   * core: add option `-save` in command `/upgrade` (issue #1630)
   * core: add option weechat.look.highlight_disable_regex and buffer property "highlight_disable_regex" (issue #1798)
+  * core: sort filters by name (issue #1695)
   * api: rename function string_build_with_split_string to string_rebuild_split_string, add arguments "index_start" and "index_end"
   * api: add info "uptime_current"
   * api: add function crypto_hash_file
index 356770879be4f285073cd0f57c092c05d15729d9..7e69fb38e886b8ce28662befc1d98a5ed00ce92f 100644 (file)
@@ -277,6 +277,26 @@ gui_filter_new_error (const char *name, const char *error)
         error);
 }
 
+/*
+ * Searches for position of filter in list (to keep filters sorted by name).
+ */
+
+struct t_gui_filter *
+gui_filter_find_pos (struct t_gui_filter *filter)
+{
+    struct t_gui_filter *ptr_filter;
+
+    for (ptr_filter = gui_filters; ptr_filter;
+         ptr_filter = ptr_filter->next_filter)
+    {
+        if (string_strcasecmp (filter->name, ptr_filter->name) < 0)
+            return ptr_filter;
+    }
+
+    /* position not found */
+    return NULL;
+}
+
 /*
  * Creates a new filter.
  *
@@ -287,7 +307,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;
+    struct t_gui_filter *new_filter, *pos_filter;
     regex_t *regex1, *regex2;
     char *pos_tab, *regex_prefix, buf[512], str_error[512];
     const char *ptr_start_regex, *pos_regex_message;
@@ -412,13 +432,29 @@ gui_filter_new (int enabled, const char *name, const char *buffer_name,
         new_filter->regex_message = regex2;
 
         /* add filter to filters list */
-        new_filter->prev_filter = last_gui_filter;
-        if (last_gui_filter)
-            last_gui_filter->next_filter = new_filter;
+        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
-            gui_filters = new_filter;
-        last_gui_filter = new_filter;
-        new_filter->next_filter = NULL;
+        {
+            /* 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;
+        }
 
         (void) hook_signal_send ("filter_added",
                                  WEECHAT_HOOK_SIGNAL_POINTER, new_filter);