[gimp] Bug 759316 - "Recently used" menu not updated with gegl filters



commit ac50da2ad4220f8dcf060574e27b0047f104d2ff
Author: Michael Natterer <mitch gimp org>
Date:   Wed Dec 30 11:53:52 2015 +0100

    Bug 759316 - "Recently used" menu not updated with gegl filters
    
    This preparation commit only moves code around and renames it, the
    history is still a list of plug-ins only:
    
    - move app/core/gimp-filter-history.c
      to app/plug-in/gimppluginmanager-history.c and clean it up
    - move the actions that create the submenus under "Filters"
      from the "plug-in" to the "filters" action group
    - move the code that creates and updates the history actions
      to the "filters" action group
    - add menu setup code for the "filters" menu
    - move the "history-changed" signal from GimpPlugInManager to Gimp

 app/actions/filters-actions.c           |  290 ++++++++++++++++++++++++++++++-
 app/actions/filters-commands.c          |   64 +++++++
 app/actions/filters-commands.h          |    7 +
 app/actions/plug-in-actions.c           |  242 +-------------------------
 app/actions/plug-in-commands.c          |   74 +-------
 app/actions/plug-in-commands.h          |   18 ++-
 app/config/gimpcoreconfig.c             |   16 +-
 app/config/gimpcoreconfig.h             |    2 +-
 app/config/gimprc-blurbs.h              |    4 +-
 app/core/Makefile.am                    |    2 +
 app/core/gimp-filter-history.c          |  137 +++++++++++++++
 app/core/gimp-filter-history.h          |   35 ++++
 app/core/gimp.c                         |   27 +++
 app/core/gimp.h                         |  180 ++++++++++---------
 app/menus/Makefile.am                   |    2 +
 app/menus/filters-menu.c                |   63 +++++++
 app/menus/filters-menu.h                |   26 +++
 app/menus/image-menu.c                  |    2 +
 app/menus/plug-in-menus.c               |    4 +-
 app/plug-in/Makefile.am                 |    2 -
 app/plug-in/gimppluginmanager-history.c |  125 -------------
 app/plug-in/gimppluginmanager-history.h |   35 ----
 app/plug-in/gimppluginmanager.c         |   40 +----
 app/plug-in/gimppluginmanager.h         |    4 -
 menus/image-menu.xml.in                 |   48 +++---
 25 files changed, 811 insertions(+), 638 deletions(-)
---
diff --git a/app/actions/filters-actions.c b/app/actions/filters-actions.c
index 15815e1..0583ea5 100644
--- a/app/actions/filters-actions.c
+++ b/app/actions/filters-actions.c
@@ -24,11 +24,15 @@
 
 #include "actions-types.h"
 
+#include "core/gimp-filter-history.h"
 #include "core/gimpimage.h"
 #include "core/gimplayermask.h"
 
+#include "plug-in/gimppluginprocedure.h" /* FIXME history */
+
 #include "widgets/gimpactiongroup.h"
 #include "widgets/gimphelp-ids.h"
+#include "widgets/gimpuimanager.h"
 
 #include "actions.h"
 #include "filters-actions.h"
@@ -37,6 +41,60 @@
 #include "gimp-intl.h"
 
 
+/*  local function prototypes  */
+
+static void   filters_actions_history_changed (Gimp            *gimp,
+                                               GimpActionGroup *group);
+
+
+/*  private variables  */
+
+static const GimpActionEntry filters_menu_actions[] =
+{
+  { "filters-menu",                 NULL, NC_("filters-action",
+                                              "Filte_rs")          },
+  { "filters-recent-menu",          NULL, NC_("filters-action",
+                                              "Recently Used")     },
+  { "filters-blur-menu",            NULL, NC_("filters-action",
+                                              "_Blur")             },
+  { "filters-noise-menu",           NULL, NC_("filters-action",
+                                              "_Noise")            },
+  { "filters-edge-detect-menu",     NULL, NC_("filters-action",
+                                              "Edge-De_tect")      },
+  { "filters-enhance-menu",         NULL, NC_("filters-action",
+                                              "En_hance")          },
+  { "filters-combine-menu",         NULL, NC_("filters-action",
+                                              "C_ombine")          },
+  { "filters-generic-menu",         NULL, NC_("filters-action",
+                                              "_Generic")          },
+  { "filters-light-shadow-menu",    NULL, NC_("filters-action",
+                                              "_Light and Shadow") },
+  { "filters-distorts-menu",        NULL, NC_("filters-action",
+                                              "_Distorts")         },
+  { "filters-artistic-menu",        NULL, NC_("filters-action",
+                                              "_Artistic")         },
+  { "filters-decor-menu",           NULL, NC_("filters-action",
+                                              "_Decor")            },
+  { "filters-map-menu",             NULL, NC_("filters-action",
+                                              "_Map")              },
+  { "filters-render-menu",          NULL, NC_("filters-action",
+                                              "_Render")           },
+  { "filters-render-clouds-menu",   NULL, NC_("filters-action",
+                                              "_Clouds")           },
+  { "filters-render-fractals-menu", NULL, NC_("filters-action",
+                                              "_Fractals")         },
+  { "filters-render-nature-menu",   NULL, NC_("filters-action",
+                                              "_Nature")           },
+  { "filters-render-noise-menu",    NULL, NC_("filters-action",
+                                              "N_oise")            },
+  { "filters-render-pattern-menu",  NULL, NC_("filters-action",
+                                              "_Pattern")          },
+  { "filters-web-menu",             NULL, NC_("filters-action",
+                                              "_Web")              },
+  { "filters-animation-menu",       NULL, NC_("filters-action",
+                                              "An_imation")        }
+};
+
 static const GimpStringActionEntry filters_actions[] =
 {
   { "filters-alien-map", GIMP_STOCK_GEGL,
@@ -447,19 +505,47 @@ static const GimpStringActionEntry filters_actions[] =
   { "filters-wind", GIMP_STOCK_GEGL,
     NC_("filters-action", "W_ind..."), NULL, NULL,
     "gegl:wind",
-    NULL /* FIXME GIMP_HELP_FILTER_WIND */ },
+    NULL /* FIXME GIMP_HELP_FILTER_WIND */ }
+};
+
+static const GimpEnumActionEntry filters_repeat_actions[] =
+{
+  { "filters-repeat", "system-run",
+    NC_("filters-action", "Re_peat Last"), "<primary>F",
+    NC_("filters-action",
+        "Rerun the last used filter using the same settings"),
+    GIMP_RUN_WITH_LAST_VALS, FALSE,
+    GIMP_HELP_FILTER_REPEAT },
+
+  { "filters-reshow", GIMP_STOCK_RESHOW_FILTER,
+    NC_("filters-action", "R_e-Show Last"), "<primary><shift>F",
+    NC_("filters-action", "Show the last used filter dialog again"),
+    GIMP_RUN_INTERACTIVE, FALSE,
+    GIMP_HELP_FILTER_RESHOW }
 };
 
+
 void
 filters_actions_setup (GimpActionGroup *group)
 {
-  gint i;
+  GimpPlugInActionEntry *entries;
+  gint                   n_entries;
+  gint                   i;
+
+  gimp_action_group_add_actions (group, "filters-action",
+                                 filters_menu_actions,
+                                 G_N_ELEMENTS (filters_menu_actions));
 
   gimp_action_group_add_string_actions (group, "filters-action",
                                         filters_actions,
                                         G_N_ELEMENTS (filters_actions),
                                         G_CALLBACK (filters_filter_cmd_callback));
 
+  gimp_action_group_add_enum_actions (group, "filters-action",
+                                      filters_repeat_actions,
+                                      G_N_ELEMENTS (filters_repeat_actions),
+                                      G_CALLBACK (filters_repeat_cmd_callback));
+
   for (i = 0; i < G_N_ELEMENTS (filters_actions); i++)
     {
       const GimpStringActionEntry *entry = &filters_actions[i];
@@ -471,6 +557,38 @@ filters_actions_setup (GimpActionGroup *group)
         gimp_action_group_set_action_tooltip (group, entry->name,
                                               description);
     }
+
+  n_entries = gimp_filter_history_size (group->gimp);
+
+  entries = g_new0 (GimpPlugInActionEntry, n_entries);
+
+  for (i = 0; i < n_entries; i++)
+    {
+      entries[i].name        = g_strdup_printf ("filter-recent-%02d", i + 1);
+      entries[i].icon_name   = NULL;
+      entries[i].label       = "";
+      entries[i].accelerator = "";
+      entries[i].tooltip     = NULL;
+      entries[i].procedure   = NULL;
+      entries[i].help_id     = GIMP_HELP_FILTER_RESHOW;
+    }
+
+  gimp_action_group_add_plug_in_actions (group, entries, n_entries,
+                                         G_CALLBACK (filters_history_cmd_callback));
+
+  for (i = 0; i < n_entries; i++)
+    {
+      gimp_action_group_set_action_visible (group, entries[i].name, FALSE);
+      g_free ((gchar *) entries[i].name);
+    }
+
+  g_free (entries);
+
+  g_signal_connect_object (group->gimp, "filter-history-changed",
+                           G_CALLBACK (filters_actions_history_changed),
+                           group, 0);
+
+  filters_actions_history_changed (group->gimp, group);
 }
 
 void
@@ -593,4 +711,172 @@ filters_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("filters-wind",                    writable);
 
 #undef SET_SENSITIVE
+
+  {
+    GimpPlugInProcedure *proc = gimp_filter_history_nth (group->gimp, 0);
+    gint                 i;
+
+    if (proc && gimp_plug_in_procedure_get_sensitive (proc, drawable))
+      {
+        gimp_action_group_set_action_sensitive (group, "filters-repeat", TRUE);
+        gimp_action_group_set_action_sensitive (group, "filters-reshow", TRUE);
+      }
+    else
+      {
+        gimp_action_group_set_action_sensitive (group, "filters-repeat", FALSE);
+        gimp_action_group_set_action_sensitive (group, "filters-reshow", FALSE);
+      }
+
+    for (i = 0; i < gimp_filter_history_length (group->gimp); i++)
+      {
+        gchar    *name = g_strdup_printf ("filter-recent-%02d", i + 1);
+        gboolean  sensitive;
+
+        proc = gimp_filter_history_nth (group->gimp, i);
+
+        sensitive = gimp_plug_in_procedure_get_sensitive (proc, drawable);
+
+        gimp_action_group_set_action_sensitive (group, name, sensitive);
+
+        g_free (name);
+      }
+  }
+}
+
+static GimpActionGroup *
+filters_actions_get_plug_in_group (GimpActionGroup *group)
+{
+  GList *list;
+
+  for (list = gimp_ui_managers_from_name ("<Image>");
+       list;
+       list = g_list_next (list))
+    {
+      GimpUIManager *manager = list->data;
+
+      /* if this is our UI manager */
+      if (gimp_ui_manager_get_action_group (manager, "filters") == group)
+        return gimp_ui_manager_get_action_group (manager, "plug-in");
+    }
+
+  /* this happens during initial UI manager construction */
+  return NULL;
+}
+
+static void
+filters_actions_history_changed (Gimp            *gimp,
+                                 GimpActionGroup *group)
+{
+  GimpPlugInProcedure *proc;
+  GimpActionGroup     *plug_in_group;
+  gint                 i;
+
+  plug_in_group = filters_actions_get_plug_in_group (group);
+
+  proc = gimp_filter_history_nth (gimp, 0);
+
+  if (proc)
+    {
+      const gchar *label;
+      gchar       *repeat;
+      gchar       *reshow;
+      gboolean     sensitive = FALSE;
+
+      label = gimp_plug_in_procedure_get_label (proc);
+
+      /*  copy the sensitivity of the plug-in procedure's actual action
+       *  instead of calling filters_actions_update() because doing the
+       *  latter would set the sensitivity of this image's action on
+       *  all images' actions. See bug #517683.
+       */
+      if (plug_in_group)
+        {
+          GtkAction *actual_action =
+            gtk_action_group_get_action (GTK_ACTION_GROUP (plug_in_group),
+                                         gimp_object_get_name (proc));
+          if (actual_action)
+            sensitive = gtk_action_get_sensitive (actual_action);
+        }
+
+      repeat = g_strdup_printf (_("Re_peat \"%s\""),  label);
+      reshow = g_strdup_printf (_("R_e-Show \"%s\""), label);
+
+      gimp_action_group_set_action_label (group, "filters-repeat", repeat);
+      gimp_action_group_set_action_label (group, "filters-reshow", reshow);
+
+      gimp_action_group_set_action_sensitive (group, "filters-repeat",
+                                              sensitive);
+      gimp_action_group_set_action_sensitive (group, "filters-reshow",
+                                              sensitive);
+
+      g_free (repeat);
+      g_free (reshow);
+    }
+  else
+    {
+      gimp_action_group_set_action_label (group, "filters-repeat",
+                                          _("Repeat Last"));
+      gimp_action_group_set_action_label (group, "filters-reshow",
+                                          _("Re-Show Last"));
+
+      gimp_action_group_set_action_sensitive (group, "filters-repeat", FALSE);
+      gimp_action_group_set_action_sensitive (group, "filters-reshow", FALSE);
+    }
+
+  for (i = 0; i < gimp_filter_history_length (gimp); i++)
+    {
+      GtkAction   *action;
+      const gchar *label;
+      gchar       *name;
+      gboolean     sensitive = FALSE;
+
+      name = g_strdup_printf ("filter-recent-%02d", i + 1);
+      action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), name);
+      g_free (name);
+
+      proc = gimp_filter_history_nth (gimp, i);
+
+      if (proc->menu_label)
+        {
+          label = dgettext (gimp_plug_in_procedure_get_locale_domain (proc),
+                            proc->menu_label);
+        }
+      else
+        {
+          label = gimp_plug_in_procedure_get_label (proc);
+        }
+
+      /*  see comment above  */
+      if (plug_in_group)
+        {
+          GtkAction *actual_action =
+            gtk_action_group_get_action (GTK_ACTION_GROUP (plug_in_group),
+                                         gimp_object_get_name (proc));
+          if (actual_action)
+            sensitive = gtk_action_get_sensitive (actual_action);
+        }
+
+      g_object_set (action,
+                    "visible",   TRUE,
+                    "sensitive", sensitive,
+                    "procedure", proc,
+                    "label",     label,
+                    "icon-name", gimp_plug_in_procedure_get_icon_name (proc),
+                    "tooltip",   gimp_plug_in_procedure_get_blurb (proc),
+                    NULL);
+    }
+
+  for (; i < gimp_filter_history_size (gimp); i++)
+    {
+      GtkAction *action;
+      gchar     *name = g_strdup_printf ("filter-recent-%02d", i + 1);
+
+      action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), name);
+      g_free (name);
+
+      g_object_set (action,
+                    "visible",   FALSE,
+                    "procedure", NULL,
+                    NULL);
+    }
 }
diff --git a/app/actions/filters-commands.c b/app/actions/filters-commands.c
index 6635154..5cbc894 100644
--- a/app/actions/filters-commands.c
+++ b/app/actions/filters-commands.c
@@ -25,15 +25,19 @@
 #include "actions-types.h"
 
 #include "core/gimp.h"
+#include "core/gimp-filter-history.h"
 #include "core/gimpcontext.h"
 #include "core/gimpimage.h"
 #include "core/gimptoolinfo.h"
 
+#include "pdb/gimpprocedure.h" /* FIXME history */
+
 #include "tools/gimpoperationtool.h"
 #include "tools/tool_manager.h"
 
 #include "actions.h"
 #include "filters-commands.h"
+#include "plug-in-commands.h" /* FIXME history */
 
 #include "gimp-intl.h"
 
@@ -93,3 +97,63 @@ filters_filter_cmd_callback (GtkAction   *action,
       g_free (label);
     }
 }
+
+void
+filters_repeat_cmd_callback (GtkAction *action,
+                             gint       value,
+                             gpointer   data)
+{
+  GimpPlugInProcedure *procedure;
+  Gimp                *gimp;
+  GimpDisplay         *display;
+  GimpRunMode          run_mode;
+  return_if_no_gimp (gimp, data);
+  return_if_no_display (display, data);
+
+  run_mode = (GimpRunMode) value;
+
+  procedure = gimp_filter_history_nth (gimp, 0);
+
+  if (procedure)
+    {
+      GimpValueArray *args;
+      gint            n_args;
+
+      args = gimp_procedure_get_arguments (GIMP_PROCEDURE (procedure));
+
+      g_value_set_int (gimp_value_array_index (args, 0), run_mode);
+
+      n_args = plug_in_collect_display_args (action, display,
+                                             GIMP_PROCEDURE (procedure)->args,
+                                             args, 1);
+
+      plug_in_procedure_execute (procedure, gimp, display, args, n_args);
+
+      gimp_value_array_unref (args);
+    }
+}
+
+void
+filters_history_cmd_callback (GtkAction           *action,
+                              GimpPlugInProcedure *procedure,
+                              gpointer             data)
+{
+  Gimp           *gimp;
+  GimpDisplay    *display;
+  GimpValueArray *args;
+  gint            n_args;
+  return_if_no_gimp (gimp, data);
+  return_if_no_display (display, data);
+
+  args = gimp_procedure_get_arguments (GIMP_PROCEDURE (procedure));
+
+  g_value_set_int (gimp_value_array_index (args, 0), GIMP_RUN_INTERACTIVE);
+
+  n_args = plug_in_collect_display_args (action, display,
+                                         GIMP_PROCEDURE (procedure)->args,
+                                         args, 1);
+
+  plug_in_procedure_execute (procedure, gimp, display, args, n_args);
+
+  gimp_value_array_unref (args);
+}
diff --git a/app/actions/filters-commands.h b/app/actions/filters-commands.h
index 744b49e..5cb2b0d 100644
--- a/app/actions/filters-commands.h
+++ b/app/actions/filters-commands.h
@@ -23,5 +23,12 @@ void   filters_filter_cmd_callback (GtkAction   *action,
                                     const gchar *operation,
                                     gpointer     data);
 
+void   filters_repeat_cmd_callback  (GtkAction           *action,
+                                     gint                 value,
+                                     gpointer             data);
+void   filters_history_cmd_callback (GtkAction           *action,
+                                     GimpPlugInProcedure *proc,
+                                     gpointer             data);
+
 
 #endif /* __FILTERS_COMMANDS_H__ */
diff --git a/app/actions/plug-in-actions.c b/app/actions/plug-in-actions.c
index 9c6f3f9..6bdbc19 100644
--- a/app/actions/plug-in-actions.c
+++ b/app/actions/plug-in-actions.c
@@ -34,7 +34,6 @@
 
 #include "plug-in/gimppluginmanager.h"
 #include "plug-in/gimppluginmanager-help-domain.h"
-#include "plug-in/gimppluginmanager-history.h"
 #include "plug-in/gimppluginmanager-locale-domain.h"
 #include "plug-in/gimppluginmanager-menu-branch.h"
 #include "plug-in/gimppluginprocedure.h"
@@ -68,8 +67,6 @@ static void     plug_in_actions_menu_path_added      (GimpPlugInProcedure *proc,
 static void     plug_in_actions_add_proc             (GimpActionGroup     *group,
                                                       GimpPlugInProcedure *proc);
 
-static void     plug_in_actions_history_changed      (GimpPlugInManager   *manager,
-                                                      GimpActionGroup     *group);
 static gboolean plug_in_actions_check_translation    (const gchar         *original,
                                                       const gchar         *translated);
 static void     plug_in_actions_build_path           (GimpActionGroup     *group,
@@ -81,49 +78,6 @@ static void     plug_in_actions_build_path           (GimpActionGroup     *group
 
 static const GimpActionEntry plug_in_actions[] =
 {
-  { "plug-in-menu",                NULL, NC_("plug-in-action",
-                                             "Filte_rs")          },
-  { "plug-in-recent-menu",         NULL, NC_("plug-in-action",
-                                             "Recently Used")     },
-  { "plug-in-blur-menu",           NULL, NC_("plug-in-action",
-                                             "_Blur")             },
-  { "plug-in-noise-menu",          NULL, NC_("plug-in-action",
-                                             "_Noise")            },
-  { "plug-in-edge-detect-menu",    NULL, NC_("plug-in-action",
-                                             "Edge-De_tect")      },
-  { "plug-in-enhance-menu",        NULL, NC_("plug-in-action",
-                                             "En_hance")          },
-  { "plug-in-combine-menu",        NULL, NC_("plug-in-action",
-                                             "C_ombine")          },
-  { "plug-in-generic-menu",        NULL, NC_("plug-in-action",
-                                             "_Generic")          },
-  { "plug-in-light-shadow-menu",   NULL, NC_("plug-in-action",
-                                             "_Light and Shadow") },
-  { "plug-in-distorts-menu",       NULL, NC_("plug-in-action",
-                                             "_Distorts")         },
-  { "plug-in-artistic-menu",       NULL, NC_("plug-in-action",
-                                             "_Artistic")         },
-  { "plug-in-decor-menu",          NULL, NC_("plug-in-action",
-                                             "_Decor")            },
-  { "plug-in-map-menu",            NULL, NC_("plug-in-action",
-                                             "_Map")              },
-  { "plug-in-render-menu",         NULL, NC_("plug-in-action",
-                                             "_Render")           },
-  { "plug-in-render-clouds-menu",  NULL, NC_("plug-in-action",
-                                             "_Clouds")           },
-  { "plug-in-render-fractals-menu", NULL, NC_("plug-in-action",
-                                             "_Fractals")         },
-  { "plug-in-render-nature-menu",  NULL, NC_("plug-in-action",
-                                             "_Nature")           },
-  { "plug-in-render-noise-menu",   NULL, NC_("plug-in-action",
-                                             "N_oise")            },
-  { "plug-in-render-pattern-menu", NULL, NC_("plug-in-action",
-                                             "_Pattern")          },
-  { "plug-in-web-menu",            NULL, NC_("plug-in-action",
-                                             "_Web")              },
-  { "plug-in-animation-menu",      NULL, NC_("plug-in-action",
-                                             "An_imation")        },
-
   { "plug-in-reset-all", GIMP_STOCK_RESET,
     NC_("plug-in-action", "Reset all _Filters"), NULL,
     NC_("plug-in-action", "Reset all plug-ins to their default settings"),
@@ -131,43 +85,19 @@ static const GimpActionEntry plug_in_actions[] =
     GIMP_HELP_FILTER_RESET_ALL }
 };
 
-static const GimpEnumActionEntry plug_in_repeat_actions[] =
-{
-  { "plug-in-repeat", "system-run",
-    NC_("plug-in-action", "Re_peat Last"), "<primary>F",
-    NC_("plug-in-action",
-        "Rerun the last used plug-in using the same settings"),
-    GIMP_RUN_WITH_LAST_VALS, FALSE,
-    GIMP_HELP_FILTER_REPEAT },
-
-  { "plug-in-reshow", GIMP_STOCK_RESHOW_FILTER,
-    NC_("plug-in-action", "R_e-Show Last"), "<primary><shift>F",
-    NC_("plug-in-action", "Show the last used plug-in dialog again"),
-    GIMP_RUN_INTERACTIVE, FALSE,
-    GIMP_HELP_FILTER_RESHOW }
-};
-
 
 /*  public functions  */
 
 void
 plug_in_actions_setup (GimpActionGroup *group)
 {
-  GimpPlugInManager     *manager = group->gimp->plug_in_manager;
-  GimpPlugInActionEntry *entries;
-  GSList                *list;
-  gint                   n_entries;
-  gint                   i;
+  GimpPlugInManager *manager = group->gimp->plug_in_manager;
+  GSList            *list;
 
   gimp_action_group_add_actions (group, "plug-in-action",
                                  plug_in_actions,
                                  G_N_ELEMENTS (plug_in_actions));
 
-  gimp_action_group_add_enum_actions (group, "plug-in-action",
-                                      plug_in_repeat_actions,
-                                      G_N_ELEMENTS (plug_in_repeat_actions),
-                                      G_CALLBACK (plug_in_repeat_cmd_callback));
-
   for (list = gimp_plug_in_manager_get_menu_branches (manager);
        list;
        list = g_slist_next (list))
@@ -204,38 +134,6 @@ plug_in_actions_setup (GimpActionGroup *group)
   g_signal_connect_object (group->gimp->pdb, "unregister-procedure",
                            G_CALLBACK (plug_in_actions_unregister_procedure),
                            group, 0);
-
-  n_entries = gimp_plug_in_manager_history_size (manager);
-
-  entries = g_new0 (GimpPlugInActionEntry, n_entries);
-
-  for (i = 0; i < n_entries; i++)
-    {
-      entries[i].name        = g_strdup_printf ("plug-in-recent-%02d", i + 1);
-      entries[i].icon_name   = NULL;
-      entries[i].label       = "";
-      entries[i].accelerator = "";
-      entries[i].tooltip     = NULL;
-      entries[i].procedure   = NULL;
-      entries[i].help_id     = GIMP_HELP_FILTER_RESHOW;
-    }
-
-  gimp_action_group_add_plug_in_actions (group, entries, n_entries,
-                                         G_CALLBACK (plug_in_history_cmd_callback));
-
-  for (i = 0; i < n_entries; i++)
-    {
-      gimp_action_group_set_action_visible (group, entries[i].name, FALSE);
-      g_free ((gchar *) entries[i].name);
-    }
-
-  g_free (entries);
-
-  g_signal_connect_object (manager, "history-changed",
-                           G_CALLBACK (plug_in_actions_history_changed),
-                           group, 0);
-
-  plug_in_actions_history_changed (manager, group);
 }
 
 void
@@ -246,7 +144,6 @@ plug_in_actions_update (GimpActionGroup *group,
   GimpPlugInManager *manager  = group->gimp->plug_in_manager;
   GimpDrawable      *drawable = NULL;
   GSList            *list;
-  gint               i;
 
   if (image)
     drawable = gimp_image_get_active_drawable (image);
@@ -267,32 +164,6 @@ plug_in_actions_update (GimpActionGroup *group,
                                                   sensitive);
         }
     }
-
-  if (manager->history &&
-      gimp_plug_in_procedure_get_sensitive (manager->history->data, drawable))
-    {
-      gimp_action_group_set_action_sensitive (group, "plug-in-repeat", TRUE);
-      gimp_action_group_set_action_sensitive (group, "plug-in-reshow", TRUE);
-    }
-  else
-    {
-      gimp_action_group_set_action_sensitive (group, "plug-in-repeat", FALSE);
-      gimp_action_group_set_action_sensitive (group, "plug-in-reshow", FALSE);
-    }
-
-  for (list = manager->history, i = 0; list; list = list->next, i++)
-    {
-      GimpPlugInProcedure *proc = list->data;
-      gchar               *name = g_strdup_printf ("plug-in-recent-%02d",
-                                                   i + 1);
-      gboolean             sensitive;
-
-      sensitive = gimp_plug_in_procedure_get_sensitive (proc, drawable);
-
-      gimp_action_group_set_action_sensitive (group, name, sensitive);
-
-      g_free (name);
-    }
 }
 
 
@@ -522,115 +393,6 @@ plug_in_actions_add_proc (GimpActionGroup     *group,
     }
 }
 
-static void
-plug_in_actions_history_changed (GimpPlugInManager *manager,
-                                 GimpActionGroup   *group)
-{
-  GimpPlugInProcedure *proc;
-  gint                 i;
-
-  proc = gimp_plug_in_manager_history_nth (manager, 0);
-
-  if (proc)
-    {
-      GtkAction   *actual_action;
-      const gchar *label;
-      gchar       *repeat;
-      gchar       *reshow;
-      gboolean     sensitive = FALSE;
-
-      label = gimp_plug_in_procedure_get_label (proc);
-
-      /*  copy the sensitivity of the plug-in procedure's actual action
-       *  instead of calling plug_in_actions_update() because doing the
-       *  latter would set the sensitivity of this image's action on
-       *  all images' actions. See bug #517683.
-       */
-      actual_action = gtk_action_group_get_action (GTK_ACTION_GROUP (group),
-                                                   gimp_object_get_name (proc));
-      if (actual_action)
-        sensitive = gtk_action_get_sensitive (actual_action);
-
-      repeat = g_strdup_printf (_("Re_peat \"%s\""),  label);
-      reshow = g_strdup_printf (_("R_e-Show \"%s\""), label);
-
-      gimp_action_group_set_action_label (group, "plug-in-repeat", repeat);
-      gimp_action_group_set_action_label (group, "plug-in-reshow", reshow);
-
-      gimp_action_group_set_action_sensitive (group,
-                                              "plug-in-repeat", sensitive);
-      gimp_action_group_set_action_sensitive (group,
-                                              "plug-in-reshow", sensitive);
-
-      g_free (repeat);
-      g_free (reshow);
-    }
-  else
-    {
-      gimp_action_group_set_action_label (group, "plug-in-repeat",
-                                          _("Repeat Last"));
-      gimp_action_group_set_action_label (group, "plug-in-reshow",
-                                          _("Re-Show Last"));
-
-      gimp_action_group_set_action_sensitive (group, "plug-in-repeat", FALSE);
-      gimp_action_group_set_action_sensitive (group, "plug-in-reshow", FALSE);
-    }
-
-  for (i = 0; i < gimp_plug_in_manager_history_length (manager); i++)
-    {
-      GtkAction   *action;
-      GtkAction   *actual_action;
-      const gchar *label;
-      gchar       *name;
-      gboolean     sensitive = FALSE;
-
-      name = g_strdup_printf ("plug-in-recent-%02d", i + 1);
-      action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), name);
-      g_free (name);
-
-      proc = gimp_plug_in_manager_history_nth (manager, i);
-
-      if (proc->menu_label)
-        {
-          label = dgettext (gimp_plug_in_procedure_get_locale_domain (proc),
-                            proc->menu_label);
-        }
-      else
-        {
-          label = gimp_plug_in_procedure_get_label (proc);
-        }
-
-      /*  see comment above  */
-      actual_action = gtk_action_group_get_action (GTK_ACTION_GROUP (group),
-                                                   gimp_object_get_name (proc));
-      if (actual_action)
-        sensitive = gtk_action_get_sensitive (actual_action);
-
-      g_object_set (action,
-                    "visible",   TRUE,
-                    "sensitive", sensitive,
-                    "procedure", proc,
-                    "label",     label,
-                    "icon-name", gimp_plug_in_procedure_get_icon_name (proc),
-                    "tooltip",   gimp_plug_in_procedure_get_blurb (proc),
-                    NULL);
-    }
-
-  for (; i < gimp_plug_in_manager_history_size (manager); i++)
-    {
-      GtkAction *action;
-      gchar     *name = g_strdup_printf ("plug-in-recent-%02d", i + 1);
-
-      action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), name);
-      g_free (name);
-
-      g_object_set (action,
-                    "visible",   FALSE,
-                    "procedure", NULL,
-                    NULL);
-    }
-}
-
 static gboolean
 plug_in_actions_check_translation (const gchar *original,
                                    const gchar *translated)
diff --git a/app/actions/plug-in-commands.c b/app/actions/plug-in-commands.c
index aba0d97..3efd5bb 100644
--- a/app/actions/plug-in-commands.c
+++ b/app/actions/plug-in-commands.c
@@ -28,6 +28,7 @@
 #include "actions-types.h"
 
 #include "core/gimp.h"
+#include "core/gimp-filter-history.h"
 #include "core/gimp-utils.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
@@ -39,7 +40,6 @@
 
 #include "plug-in/gimppluginmanager.h"
 #include "plug-in/gimppluginmanager-data.h"
-#include "plug-in/gimppluginmanager-history.h"
 
 #include "pdb/gimpprocedure.h"
 
@@ -63,11 +63,13 @@
 
 /*  local function prototypes  */
 
+#if 0
 static void  plug_in_procedure_execute     (GimpPlugInProcedure *procedure,
                                             Gimp                *gimp,
                                             GimpDisplay         *display,
                                             GimpValueArray      *args,
                                             gint                 n_args);
+#endif
 
 static gint  plug_in_collect_data_args     (GtkAction       *action,
                                             GimpObject      *object,
@@ -85,11 +87,13 @@ static gint  plug_in_collect_item_args     (GtkAction       *action,
                                             GParamSpec     **pspecs,
                                             GimpValueArray  *args,
                                             gint             n_args);
+#if 0
 static gint  plug_in_collect_display_args  (GtkAction       *action,
                                             GimpDisplay     *display,
                                             GParamSpec     **pspecs,
                                             GimpValueArray  *args,
                                             gint             n_args);
+#endif
 static void  plug_in_reset_all_response    (GtkWidget       *dialog,
                                             gint             response_id,
                                             Gimp            *gimp);
@@ -194,66 +198,6 @@ plug_in_run_cmd_callback (GtkAction           *action,
 }
 
 void
-plug_in_repeat_cmd_callback (GtkAction *action,
-                             gint       value,
-                             gpointer   data)
-{
-  GimpPlugInProcedure *procedure;
-  Gimp                *gimp;
-  GimpDisplay         *display;
-  GimpRunMode          run_mode;
-  return_if_no_gimp (gimp, data);
-  return_if_no_display (display, data);
-
-  run_mode = (GimpRunMode) value;
-
-  procedure = gimp_plug_in_manager_history_nth (gimp->plug_in_manager, 0);
-
-  if (procedure)
-    {
-      GimpValueArray *args;
-      gint            n_args;
-
-      args = gimp_procedure_get_arguments (GIMP_PROCEDURE (procedure));
-
-      g_value_set_int (gimp_value_array_index (args, 0), run_mode);
-
-      n_args = plug_in_collect_display_args (action, display,
-                                             GIMP_PROCEDURE (procedure)->args,
-                                             args, 1);
-
-      plug_in_procedure_execute (procedure, gimp, display, args, n_args);
-
-      gimp_value_array_unref (args);
-    }
-}
-
-void
-plug_in_history_cmd_callback (GtkAction           *action,
-                              GimpPlugInProcedure *procedure,
-                              gpointer             data)
-{
-  Gimp           *gimp;
-  GimpDisplay    *display;
-  GimpValueArray *args;
-  gint            n_args;
-  return_if_no_gimp (gimp, data);
-  return_if_no_display (display, data);
-
-  args = gimp_procedure_get_arguments (GIMP_PROCEDURE (procedure));
-
-  g_value_set_int (gimp_value_array_index (args, 0), GIMP_RUN_INTERACTIVE);
-
-  n_args = plug_in_collect_display_args (action, display,
-                                         GIMP_PROCEDURE (procedure)->args,
-                                         args, 1);
-
-  plug_in_procedure_execute (procedure, gimp, display, args, n_args);
-
-  gimp_value_array_unref (args);
-}
-
-void
 plug_in_reset_all_cmd_callback (GtkAction *action,
                                 gpointer   data)
 {
@@ -289,7 +233,8 @@ plug_in_reset_all_cmd_callback (GtkAction *action,
 
 /*  private functions  */
 
-static void
+/* FIXME history */
+void
 plug_in_procedure_execute (GimpPlugInProcedure *procedure,
                            Gimp                *gimp,
                            GimpDisplay         *display,
@@ -319,7 +264,7 @@ plug_in_procedure_execute (GimpPlugInProcedure *procedure,
       if (GIMP_PROCEDURE (procedure)->num_args  >= 2  &&
           GIMP_IS_PARAM_SPEC_IMAGE_ID (GIMP_PROCEDURE (procedure)->args[1]))
         {
-          gimp_plug_in_manager_history_add (gimp->plug_in_manager, procedure);
+          gimp_filter_history_add (gimp, procedure);
         }
     }
 }
@@ -414,7 +359,8 @@ plug_in_collect_item_args (GtkAction       *action,
   return n_args;
 }
 
-static gint
+/* FIXME history */
+gint
 plug_in_collect_display_args (GtkAction       *action,
                               GimpDisplay     *display,
                               GParamSpec     **pspecs,
diff --git a/app/actions/plug-in-commands.h b/app/actions/plug-in-commands.h
index d99a0f8..94bdf83 100644
--- a/app/actions/plug-in-commands.h
+++ b/app/actions/plug-in-commands.h
@@ -22,15 +22,21 @@
 void   plug_in_run_cmd_callback       (GtkAction           *action,
                                        GimpPlugInProcedure *proc,
                                        gpointer             data);
-void   plug_in_repeat_cmd_callback    (GtkAction           *action,
-                                       gint                 value,
-                                       gpointer             data);
-void   plug_in_history_cmd_callback   (GtkAction           *action,
-                                       GimpPlugInProcedure *proc,
-                                       gpointer             data);
 
 void   plug_in_reset_all_cmd_callback (GtkAction           *action,
                                        gpointer             data);
 
 
+/* FIXME history */
+void  plug_in_procedure_execute     (GimpPlugInProcedure *procedure,
+                                     Gimp                *gimp,
+                                     GimpDisplay         *display,
+                                     GimpValueArray      *args,
+                                     gint                 n_args);
+gint  plug_in_collect_display_args  (GtkAction       *action,
+                                     GimpDisplay     *display,
+                                     GParamSpec     **pspecs,
+                                     GimpValueArray  *args,
+                                     gint             n_args);
+
 #endif /* __PLUG_IN_COMMANDS_H__ */
diff --git a/app/config/gimpcoreconfig.c b/app/config/gimpcoreconfig.c
index 09536d7..38c8a98 100644
--- a/app/config/gimpcoreconfig.c
+++ b/app/config/gimpcoreconfig.c
@@ -97,7 +97,7 @@ enum
   PROP_UNDO_LEVELS,
   PROP_UNDO_SIZE,
   PROP_UNDO_PREVIEW_SIZE,
-  PROP_PLUG_IN_HISTORY_SIZE,
+  PROP_FILTER_HISTORY_SIZE,
   PROP_PLUGINRC_PATH,
   PROP_LAYER_PREVIEWS,
   PROP_LAYER_PREVIEW_SIZE,
@@ -454,9 +454,9 @@ gimp_core_config_class_init (GimpCoreConfigClass *klass)
                                  GIMP_VIEW_SIZE_LARGE,
                                  GIMP_PARAM_STATIC_STRINGS |
                                  GIMP_CONFIG_PARAM_RESTART);
-  GIMP_CONFIG_INSTALL_PROP_INT (object_class, PROP_PLUG_IN_HISTORY_SIZE,
-                                "plug-in-history-size",
-                                PLUG_IN_HISTORY_SIZE_BLURB,
+  GIMP_CONFIG_INSTALL_PROP_INT (object_class, PROP_FILTER_HISTORY_SIZE,
+                                "plug-in-history-size", /* compat name */
+                                FILTER_HISTORY_SIZE_BLURB,
                                 0, 256, 10,
                                 GIMP_PARAM_STATIC_STRINGS |
                                 GIMP_CONFIG_PARAM_RESTART);
@@ -749,8 +749,8 @@ gimp_core_config_set_property (GObject      *object,
         gimp_config_sync (g_value_get_object (value),
                           G_OBJECT (core_config->default_grid), 0);
       break;
-    case PROP_PLUG_IN_HISTORY_SIZE:
-      core_config->plug_in_history_size = g_value_get_int (value);
+    case PROP_FILTER_HISTORY_SIZE:
+      core_config->filter_history_size = g_value_get_int (value);
       break;
     case PROP_UNDO_LEVELS:
       core_config->levels_of_undo = g_value_get_int (value);
@@ -930,8 +930,8 @@ gimp_core_config_get_property (GObject    *object,
     case PROP_DEFAULT_GRID:
       g_value_set_object (value, core_config->default_grid);
       break;
-    case PROP_PLUG_IN_HISTORY_SIZE:
-      g_value_set_int (value, core_config->plug_in_history_size);
+    case PROP_FILTER_HISTORY_SIZE:
+      g_value_set_int (value, core_config->filter_history_size);
       break;
     case PROP_UNDO_LEVELS:
       g_value_set_int (value, core_config->levels_of_undo);
diff --git a/app/config/gimpcoreconfig.h b/app/config/gimpcoreconfig.h
index e83d02a..c0ae721 100644
--- a/app/config/gimpcoreconfig.h
+++ b/app/config/gimpcoreconfig.h
@@ -81,7 +81,7 @@ struct _GimpCoreConfig
   gint                    levels_of_undo;
   guint64                 undo_size;
   GimpViewSize            undo_preview_size;
-  gint                    plug_in_history_size;
+  gint                    filter_history_size;
   gchar                  *plug_in_rc_path;
   gboolean                layer_previews;
   GimpViewSize            layer_preview_size;
diff --git a/app/config/gimprc-blurbs.h b/app/config/gimprc-blurbs.h
index 76a4ab5..fd51d9f 100644
--- a/app/config/gimprc-blurbs.h
+++ b/app/config/gimprc-blurbs.h
@@ -270,8 +270,8 @@ _("When enabled, the X server is queried for the mouse's current position " \
   "be slower.  Conversely, on some X servers enabling this option results " \
   "in faster painting.")
 
-#define PLUG_IN_HISTORY_SIZE_BLURB \
-"How many recently used plug-ins to keep on the Filters menu."
+#define FILTER_HISTORY_SIZE_BLURB \
+"How many recently used filters and plug-ins to keep on the Filters menu."
 
 #define PLUG_IN_PATH_BLURB \
 "Sets the plug-in search path."
diff --git a/app/core/Makefile.am b/app/core/Makefile.am
index d0cea1e..c4ce10f 100644
--- a/app/core/Makefile.am
+++ b/app/core/Makefile.am
@@ -37,6 +37,8 @@ libappcore_a_sources = \
        gimp-contexts.h                         \
        gimp-edit.c                             \
        gimp-edit.h                             \
+       gimp-filter-history.c                   \
+       gimp-filter-history.h                   \
        gimp-gradients.c                        \
        gimp-gradients.h                        \
        gimp-gui.c                              \
diff --git a/app/core/gimp-filter-history.c b/app/core/gimp-filter-history.c
new file mode 100644
index 0000000..3292432
--- /dev/null
+++ b/app/core/gimp-filter-history.c
@@ -0,0 +1,137 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995-2003 Spencer Kimball and Peter Mattis
+ *
+ * gimp-filter-history.c
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include "libgimpbase/gimpbase.h"
+
+#include "core-types.h"
+
+#include "config/gimpcoreconfig.h"
+
+#include "gimp.h"
+#include "gimp-filter-history.h"
+
+#include "plug-in/gimppluginmanager.h"
+#include "plug-in/gimppluginprocedure.h"
+
+
+guint
+gimp_filter_history_size (Gimp *gimp)
+{
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), 0);
+
+  return MAX (1, gimp->config->filter_history_size);
+}
+
+guint
+gimp_filter_history_length (Gimp *gimp)
+{
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), 0);
+
+  return g_list_length (gimp->filter_history);
+}
+
+GimpPlugInProcedure *
+gimp_filter_history_nth (Gimp  *gimp,
+                         gint   n)
+{
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+
+  return g_list_nth_data (gimp->filter_history, n);
+}
+
+void
+gimp_filter_history_add (Gimp                *gimp,
+                         GimpPlugInProcedure *procedure)
+{
+  GList *link;
+  gint   history_size;
+
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+  g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (procedure));
+
+  /* return early if the procedure is already at the top */
+  if (gimp->filter_history && gimp->filter_history->data == procedure)
+    return;
+
+  history_size = gimp_filter_history_size (gimp);
+
+  link = g_list_find (gimp->filter_history, procedure);
+
+  if (link)
+    {
+      gimp->filter_history = g_list_delete_link (gimp->filter_history, link);
+      gimp->filter_history = g_list_prepend (gimp->filter_history, procedure);
+    }
+  else
+    {
+      gimp->filter_history = g_list_prepend (gimp->filter_history,
+                                             g_object_ref (procedure));
+    }
+
+  link = g_list_nth (gimp->filter_history, history_size);
+
+  if (link)
+    {
+      gimp->filter_history = g_list_remove_link (gimp->filter_history, link);
+      g_object_unref (link->data);
+      g_list_free (link);
+    }
+
+  gimp_filter_history_changed (gimp);
+}
+
+void
+gimp_filter_history_remove (Gimp                *gimp,
+                            GimpPlugInProcedure *procedure)
+{
+  GList *link;
+
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+  g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (procedure));
+
+  link = g_list_find (gimp->filter_history, procedure);
+
+  if (link)
+    {
+      gimp->filter_history = g_list_delete_link (gimp->filter_history, link);
+      g_object_unref (procedure);
+
+      gimp_filter_history_changed (gimp);
+    }
+}
+
+void
+gimp_filter_history_clear (Gimp *gimp)
+{
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+  if (gimp->filter_history)
+    {
+      g_list_free_full (gimp->filter_history, (GDestroyNotify) g_object_unref);
+      gimp->filter_history = NULL;
+
+      gimp_filter_history_changed (gimp);
+    }
+}
+
+
diff --git a/app/core/gimp-filter-history.h b/app/core/gimp-filter-history.h
new file mode 100644
index 0000000..3796d5c
--- /dev/null
+++ b/app/core/gimp-filter-history.h
@@ -0,0 +1,35 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimp-filter-history.h
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_FILTER_HISTORY_H__
+#define __GIMP_FILTER_HISTORY_H__
+
+
+guint                 gimp_filter_history_size   (Gimp                *gimp);
+guint                 gimp_filter_history_length (Gimp                *gimp);
+GimpPlugInProcedure * gimp_filter_history_nth    (Gimp                *gimp,
+                                                  gint                 n);
+void                  gimp_filter_history_add    (Gimp                *gimp,
+                                                  GimpPlugInProcedure *procedure);
+void                  gimp_filter_history_remove (Gimp                *gimp,
+                                                  GimpPlugInProcedure *procedure);
+void                  gimp_filter_history_clear  (Gimp                *gimp);
+
+
+#endif /* __GIMP_FILTER_HISTORY_H__ */
diff --git a/app/core/gimp.c b/app/core/gimp.c
index 1fbb40b..3f61060 100644
--- a/app/core/gimp.c
+++ b/app/core/gimp.c
@@ -44,6 +44,7 @@
 
 #include "gimp.h"
 #include "gimp-contexts.h"
+#include "gimp-filter-history.h"
 #include "gimp-gradients.h"
 #include "gimp-memsize.h"
 #include "gimp-modules.h"
@@ -93,6 +94,7 @@ enum
   RESTORE,
   EXIT,
   BUFFER_CHANGED,
+  FILTER_HISTORY_CHANGED,
   IMAGE_OPENED,
   LAST_SIGNAL
 };
@@ -186,6 +188,16 @@ gimp_class_init (GimpClass *klass)
                   gimp_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
 
+  gimp_signals[FILTER_HISTORY_CHANGED] =
+    g_signal_new ("filter-history-changed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GimpClass,
+                                   filter_history_changed),
+                  NULL, NULL,
+                  gimp_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
   gimp_signals[IMAGE_OPENED] =
     g_signal_new ("image-opened",
                   G_TYPE_FROM_CLASS (klass),
@@ -348,6 +360,8 @@ gimp_dispose (GObject *object)
   if (gimp->tool_preset_factory)
     gimp_data_factory_data_free (gimp->tool_preset_factory);
 
+  gimp_filter_history_clear (gimp);
+
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
@@ -577,6 +591,11 @@ gimp_get_memsize (GimpObject *object,
   memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->plug_in_manager),
                                       gui_size);
 
+  memsize += gimp_g_list_get_memsize_foreach (gimp->filter_history,
+                                              (GimpMemsizeFunc)
+                                              gimp_object_get_memsize,
+                                              gui_size);
+
   memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->image_table), 0);
   memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->item_table),  0);
 
@@ -1437,6 +1456,14 @@ gimp_message_literal (Gimp                *gimp,
 }
 
 void
+gimp_filter_history_changed (Gimp *gimp)
+{
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+  g_signal_emit (gimp, gimp_signals[FILTER_HISTORY_CHANGED], 0);
+}
+
+void
 gimp_image_opened (Gimp  *gimp,
                   GFile *file)
 {
diff --git a/app/core/gimp.h b/app/core/gimp.h
index b560822..6ae8997 100644
--- a/app/core/gimp.h
+++ b/app/core/gimp.h
@@ -76,6 +76,8 @@ struct _Gimp
 
   GimpPlugInManager      *plug_in_manager;
 
+  GList                  *filter_history;
+
   GimpContainer          *images;
   guint32                 next_guide_ID;
   guint32                 next_sample_point_ID;
@@ -128,99 +130,103 @@ struct _GimpClass
 {
   GimpObjectClass  parent_class;
 
-  void     (* initialize)     (Gimp               *gimp,
-                               GimpInitStatusFunc  status_callback);
-  void     (* restore)        (Gimp               *gimp,
-                               GimpInitStatusFunc  status_callback);
-  gboolean (* exit)           (Gimp               *gimp,
-                               gboolean            force);
+  void     (* initialize)             (Gimp               *gimp,
+                                       GimpInitStatusFunc  status_callback);
+  void     (* restore)                (Gimp               *gimp,
+                                       GimpInitStatusFunc  status_callback);
+  gboolean (* exit)                   (Gimp               *gimp,
+                                       gboolean            force);
+
+  void     (* buffer_changed)         (Gimp               *gimp);
 
-  void     (* buffer_changed) (Gimp               *gimp);
+  void     (* filter_history_changed) (Gimp               *gimp);
 
   /*  emitted if an image is loaded and opened with a display  */
-  void     (* image_opened)   (Gimp               *gimp,
-                               GFile              *file);
+  void     (* image_opened)           (Gimp               *gimp,
+                                       GFile              *file);
 };
 
 
-GType          gimp_get_type             (void) G_GNUC_CONST;
-
-Gimp         * gimp_new                  (const gchar         *name,
-                                          const gchar         *session_name,
-                                          GFile               *default_folder,
-                                          gboolean             be_verbose,
-                                          gboolean             no_data,
-                                          gboolean             no_fonts,
-                                          gboolean             no_interface,
-                                          gboolean             use_shm,
-                                          gboolean             use_cpu_accel,
-                                          gboolean             console_messages,
-                                          gboolean             show_playground,
-                                          GimpStackTraceMode   stack_trace_mode,
-                                          GimpPDBCompatMode    pdb_compat_mode);
-void           gimp_set_show_gui         (Gimp                *gimp,
-                                          gboolean             show_gui);
-gboolean       gimp_get_show_gui         (Gimp                *gimp);
-
-void           gimp_load_config          (Gimp                *gimp,
-                                          GFile               *alternate_system_gimprc,
-                                          GFile               *alternate_gimprc);
-void           gimp_initialize           (Gimp                *gimp,
-                                          GimpInitStatusFunc   status_callback);
-void           gimp_restore              (Gimp                *gimp,
-                                          GimpInitStatusFunc   status_callback);
-gboolean       gimp_is_restored          (Gimp                *gimp);
-
-void           gimp_exit                 (Gimp                *gimp,
-                                          gboolean             force);
-
-GList        * gimp_get_image_iter       (Gimp                *gimp);
-GList        * gimp_get_display_iter     (Gimp                *gimp);
-GList        * gimp_get_image_windows    (Gimp                *gimp);
-GList        * gimp_get_paint_info_iter  (Gimp                *gimp);
-GList        * gimp_get_tool_info_iter   (Gimp                *gimp);
-
-void           gimp_set_global_buffer    (Gimp                *gimp,
-                                          GimpBuffer          *buffer);
-
-GimpImage    * gimp_create_image         (Gimp                *gimp,
-                                          gint                 width,
-                                          gint                 height,
-                                          GimpImageBaseType    type,
-                                          GimpPrecision        precision,
-                                          gboolean             attach_comment);
-
-void           gimp_set_default_context  (Gimp                *gimp,
-                                          GimpContext         *context);
-GimpContext  * gimp_get_default_context  (Gimp                *gimp);
-
-void           gimp_set_user_context     (Gimp                *gimp,
-                                          GimpContext         *context);
-GimpContext  * gimp_get_user_context     (Gimp                *gimp);
-
-GimpToolInfo * gimp_get_tool_info        (Gimp                *gimp,
-                                          const gchar         *tool_name);
-
-void           gimp_message              (Gimp                *gimp,
-                                          GObject             *handler,
-                                          GimpMessageSeverity  severity,
-                                          const gchar         *format,
-                                          ...) G_GNUC_PRINTF (4, 5);
-void           gimp_message_valist       (Gimp                *gimp,
-                                          GObject             *handler,
-                                          GimpMessageSeverity  severity,
-                                          const gchar         *format,
-                                          va_list              args) G_GNUC_PRINTF (4, 0);
-void           gimp_message_literal      (Gimp                *gimp,
-                                          GObject             *handler,
-                                          GimpMessageSeverity  severity,
-                                          const gchar         *message);
-
-void           gimp_image_opened         (Gimp                *gimp,
-                                          GFile               *file);
-
-GFile        * gimp_get_temp_file        (Gimp                *gimp,
-                                          const gchar         *extension);
+GType          gimp_get_type               (void) G_GNUC_CONST;
+
+Gimp         * gimp_new                    (const gchar         *name,
+                                            const gchar         *session_name,
+                                            GFile               *default_folder,
+                                            gboolean             be_verbose,
+                                            gboolean             no_data,
+                                            gboolean             no_fonts,
+                                            gboolean             no_interface,
+                                            gboolean             use_shm,
+                                            gboolean             use_cpu_accel,
+                                            gboolean             console_messages,
+                                            gboolean             show_playground,
+                                            GimpStackTraceMode   stack_trace_mode,
+                                            GimpPDBCompatMode    pdb_compat_mode);
+void           gimp_set_show_gui           (Gimp                *gimp,
+                                            gboolean             show_gui);
+gboolean       gimp_get_show_gui           (Gimp                *gimp);
+
+void           gimp_load_config            (Gimp                *gimp,
+                                            GFile               *alternate_system_gimprc,
+                                            GFile               *alternate_gimprc);
+void           gimp_initialize             (Gimp                *gimp,
+                                            GimpInitStatusFunc   status_callback);
+void           gimp_restore                (Gimp                *gimp,
+                                            GimpInitStatusFunc   status_callback);
+gboolean       gimp_is_restored            (Gimp                *gimp);
+
+void           gimp_exit                   (Gimp                *gimp,
+                                            gboolean             force);
+
+GList        * gimp_get_image_iter         (Gimp                *gimp);
+GList        * gimp_get_display_iter       (Gimp                *gimp);
+GList        * gimp_get_image_windows      (Gimp                *gimp);
+GList        * gimp_get_paint_info_iter    (Gimp                *gimp);
+GList        * gimp_get_tool_info_iter     (Gimp                *gimp);
+
+void           gimp_set_global_buffer      (Gimp                *gimp,
+                                            GimpBuffer          *buffer);
+
+GimpImage    * gimp_create_image           (Gimp                *gimp,
+                                            gint                 width,
+                                            gint                 height,
+                                            GimpImageBaseType    type,
+                                            GimpPrecision        precision,
+                                            gboolean             attach_comment);
+
+void           gimp_set_default_context    (Gimp                *gimp,
+                                            GimpContext         *context);
+GimpContext  * gimp_get_default_context    (Gimp                *gimp);
+
+void           gimp_set_user_context       (Gimp                *gimp,
+                                            GimpContext         *context);
+GimpContext  * gimp_get_user_context       (Gimp                *gimp);
+
+GimpToolInfo * gimp_get_tool_info          (Gimp                *gimp,
+                                            const gchar         *tool_name);
+
+void           gimp_message                (Gimp                *gimp,
+                                            GObject             *handler,
+                                            GimpMessageSeverity  severity,
+                                            const gchar         *format,
+                                            ...) G_GNUC_PRINTF (4, 5);
+void           gimp_message_valist         (Gimp                *gimp,
+                                            GObject             *handler,
+                                            GimpMessageSeverity  severity,
+                                            const gchar         *format,
+                                            va_list              args) G_GNUC_PRINTF (4, 0);
+void           gimp_message_literal        (Gimp                *gimp,
+                                            GObject             *handler,
+                                            GimpMessageSeverity  severity,
+                                            const gchar         *message);
+
+void           gimp_filter_history_changed (Gimp                *gimp);
+
+void           gimp_image_opened           (Gimp                *gimp,
+                                            GFile               *file);
+
+GFile        * gimp_get_temp_file          (Gimp                *gimp,
+                                            const gchar         *extension);
 
 
 #endif  /* __GIMP_H__ */
diff --git a/app/menus/Makefile.am b/app/menus/Makefile.am
index 96b3b49..32968bb 100644
--- a/app/menus/Makefile.am
+++ b/app/menus/Makefile.am
@@ -20,6 +20,8 @@ libappmenus_a_SOURCES = \
        dockable-menu.h         \
        file-menu.c             \
        file-menu.h             \
+       filters-menu.c          \
+       filters-menu.h          \
        image-menu.c            \
        image-menu.h            \
        plug-in-menus.c         \
diff --git a/app/menus/filters-menu.c b/app/menus/filters-menu.c
new file mode 100644
index 0000000..8d3f9a6
--- /dev/null
+++ b/app/menus/filters-menu.c
@@ -0,0 +1,63 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include "menus-types.h"
+
+#include "core/gimp.h"
+#include "core/gimp-filter-history.h"
+
+#include "widgets/gimpuimanager.h"
+
+#include "filters-menu.h"
+
+
+/*  public functions  */
+
+void
+filters_menu_setup (GimpUIManager *manager,
+                    const gchar   *ui_path)
+{
+  guint merge_id;
+  gint  i;
+
+  g_return_if_fail (GIMP_IS_UI_MANAGER (manager));
+  g_return_if_fail (ui_path != NULL);
+
+  merge_id = gtk_ui_manager_new_merge_id (GTK_UI_MANAGER (manager));
+
+  for (i = 0; i < gimp_filter_history_size (manager->gimp); i++)
+    {
+      gchar *action_name;
+      gchar *action_path;
+
+      action_name = g_strdup_printf ("filter-recent-%02d", i + 1);
+      action_path = g_strdup_printf ("%s/Filters/Recently Used/Filters",
+                                     ui_path);
+
+      gtk_ui_manager_add_ui (GTK_UI_MANAGER (manager), merge_id,
+                             action_path, action_name, action_name,
+                             GTK_UI_MANAGER_MENUITEM,
+                             FALSE);
+
+      g_free (action_name);
+      g_free (action_path);
+    }
+}
diff --git a/app/menus/filters-menu.h b/app/menus/filters-menu.h
new file mode 100644
index 0000000..7f8f969
--- /dev/null
+++ b/app/menus/filters-menu.h
@@ -0,0 +1,26 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __FILTERS_MENU_H__
+#define __FILTERS_MENU_H__
+
+
+void   filters_menu_setup (GimpUIManager *manager,
+                           const gchar   *ui_path);
+
+
+#endif /* __FILTERS_MENU_H__ */
diff --git a/app/menus/image-menu.c b/app/menus/image-menu.c
index 0dc49f4..52b9152 100644
--- a/app/menus/image-menu.c
+++ b/app/menus/image-menu.c
@@ -24,6 +24,7 @@
 #include "menus-types.h"
 
 #include "file-menu.h"
+#include "filters-menu.h"
 #include "image-menu.h"
 #include "plug-in-menus.h"
 #include "window-menu.h"
@@ -42,6 +43,7 @@ image_menu_setup (GimpUIManager *manager,
   file_menu_setup (manager, ui_path);
   windows_menu_setup (manager, ui_path);
   plug_in_menus_setup (manager, ui_path);
+  filters_menu_setup (manager, ui_path);
 
   path = g_strconcat (ui_path, "/View", NULL);
   window_menu_setup (manager, "view", path);
diff --git a/app/menus/plug-in-menus.c b/app/menus/plug-in-menus.c
index 322a9b2..9bcf41d 100644
--- a/app/menus/plug-in-menus.c
+++ b/app/menus/plug-in-menus.c
@@ -98,12 +98,12 @@ plug_in_menus_setup (GimpUIManager *manager,
 
   merge_id = gtk_ui_manager_new_merge_id (GTK_UI_MANAGER (manager));
 
-  for (i = 0; i < manager->gimp->config->plug_in_history_size; i++)
+  for (i = 0; i < manager->gimp->config->filter_history_size; i++)
     {
       gchar *action_name;
       gchar *action_path;
 
-      action_name = g_strdup_printf ("plug-in-recent-%02d", i + 1);
+      action_name = g_strdup_printf ("filter-recent-%02d", i + 1);
       action_path = g_strdup_printf ("%s/Filters/Recently Used/Plug-Ins",
                                      ui_path);
 
diff --git a/app/plug-in/Makefile.am b/app/plug-in/Makefile.am
index b28fec5..b8585f4 100644
--- a/app/plug-in/Makefile.am
+++ b/app/plug-in/Makefile.am
@@ -48,8 +48,6 @@ libappplug_in_a_SOURCES = \
        gimppluginmanager-file.h                \
        gimppluginmanager-help-domain.c         \
        gimppluginmanager-help-domain.h         \
-       gimppluginmanager-history.c             \
-       gimppluginmanager-history.h             \
        gimppluginmanager-locale-domain.c       \
        gimppluginmanager-locale-domain.h       \
        gimppluginmanager-menu-branch.c         \
diff --git a/app/plug-in/gimppluginmanager.c b/app/plug-in/gimppluginmanager.c
index 7078219..d5c7e26 100644
--- a/app/plug-in/gimppluginmanager.c
+++ b/app/plug-in/gimppluginmanager.c
@@ -32,6 +32,7 @@
 #include "config/gimpcoreconfig.h"
 
 #include "core/gimp.h"
+#include "core/gimp-filter-history.h"
 #include "core/gimp-memsize.h"
 #include "core/gimpmarshal.h"
 
@@ -45,7 +46,6 @@
 #include "gimppluginmanager.h"
 #include "gimppluginmanager-data.h"
 #include "gimppluginmanager-help-domain.h"
-#include "gimppluginmanager-history.h"
 #include "gimppluginmanager-locale-domain.h"
 #include "gimppluginmanager-menu-branch.h"
 #include "gimppluginshm.h"
@@ -59,12 +59,10 @@ enum
   PLUG_IN_OPENED,
   PLUG_IN_CLOSED,
   MENU_BRANCH_ADDED,
-  HISTORY_CHANGED,
   LAST_SIGNAL
 };
 
 
-static void     gimp_plug_in_manager_dispose     (GObject    *object);
 static void     gimp_plug_in_manager_finalize    (GObject    *object);
 
 static gint64   gimp_plug_in_manager_get_memsize (GimpObject *object,
@@ -119,17 +117,6 @@ gimp_plug_in_manager_class_init (GimpPlugInManagerClass *klass)
                   G_TYPE_STRING,
                   G_TYPE_STRING);
 
-  manager_signals[HISTORY_CHANGED] =
-    g_signal_new ("history-changed",
-                  G_TYPE_FROM_CLASS (klass),
-                  G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (GimpPlugInManagerClass,
-                                   history_changed),
-                  NULL, NULL,
-                  gimp_marshal_VOID__VOID,
-                  G_TYPE_NONE, 0);
-
-  object_class->dispose          = gimp_plug_in_manager_dispose;
   object_class->finalize         = gimp_plug_in_manager_finalize;
 
   gimp_object_class->get_memsize = gimp_plug_in_manager_get_memsize;
@@ -141,16 +128,6 @@ gimp_plug_in_manager_init (GimpPlugInManager *manager)
 }
 
 static void
-gimp_plug_in_manager_dispose (GObject *object)
-{
-  GimpPlugInManager *manager = GIMP_PLUG_IN_MANAGER (object);
-
-  gimp_plug_in_manager_history_clear (manager);
-
-  G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
 gimp_plug_in_manager_finalize (GObject *object)
 {
   GimpPlugInManager *manager = GIMP_PLUG_IN_MANAGER (object);
@@ -239,7 +216,6 @@ gimp_plug_in_manager_get_memsize (GimpObject *object,
                                                gimp_object_get_memsize,
                                                gui_size);
   memsize += gimp_g_slist_get_memsize (manager->plug_in_stack, 0);
-  memsize += gimp_g_slist_get_memsize (manager->history,       0);
 
   memsize += 0; /* FIXME manager->shm */
   memsize += gimp_object_get_memsize (GIMP_OBJECT (manager->interpreter_db),
@@ -361,7 +337,7 @@ gimp_plug_in_manager_add_procedure (GimpPlugInManager   *manager,
           manager->export_procs = g_slist_remove (manager->export_procs, tmp_proc);
 
           /* and from the history */
-          gimp_plug_in_manager_history_remove (manager, tmp_proc);
+          gimp_filter_history_remove (manager->gimp, tmp_proc);
 
           g_object_unref (tmp_proc);
 
@@ -396,8 +372,8 @@ gimp_plug_in_manager_remove_temp_proc (GimpPlugInManager      *manager,
   manager->plug_in_procedures = g_slist_remove (manager->plug_in_procedures,
                                                 procedure);
 
-  gimp_plug_in_manager_history_remove (manager,
-                                       GIMP_PLUG_IN_PROCEDURE (procedure));
+  gimp_filter_history_remove (manager->gimp,
+                              GIMP_PLUG_IN_PROCEDURE (procedure));
 
   gimp_pdb_unregister_procedure (manager->gimp->pdb,
                                  GIMP_PROCEDURE (procedure));
@@ -461,11 +437,3 @@ gimp_plug_in_manager_plug_in_pop (GimpPlugInManager *manager)
   else
     manager->current_plug_in = NULL;
 }
-
-void
-gimp_plug_in_manager_history_changed (GimpPlugInManager *manager)
-{
-  g_return_if_fail (GIMP_IS_PLUG_IN_MANAGER (manager));
-
-  g_signal_emit (manager, manager_signals[HISTORY_CHANGED], 0);
-}
diff --git a/app/plug-in/gimppluginmanager.h b/app/plug-in/gimppluginmanager.h
index 5f42b86..83db14e 100644
--- a/app/plug-in/gimppluginmanager.h
+++ b/app/plug-in/gimppluginmanager.h
@@ -55,7 +55,6 @@ struct _GimpPlugInManager
   GimpPlugIn        *current_plug_in;
   GSList            *open_plug_ins;
   GSList            *plug_in_stack;
-  GSList            *history;
 
   GimpPlugInShm     *shm;
   GimpInterpreterDB *interpreter_db;
@@ -77,7 +76,6 @@ struct _GimpPlugInManagerClass
                               GFile             *file,
                               const gchar       *menu_path,
                               const gchar       *menu_label);
-  void (* history_changed)   (GimpPlugInManager *manager);
 };
 
 
@@ -110,7 +108,5 @@ void    gimp_plug_in_manager_plug_in_push         (GimpPlugInManager   *manager,
                                                    GimpPlugIn          *plug_in);
 void    gimp_plug_in_manager_plug_in_pop          (GimpPlugInManager   *manager);
 
-void    gimp_plug_in_manager_history_changed      (GimpPlugInManager   *manager);
-
 
 #endif  /* __GIMP_PLUG_IN_MANAGER_H__ */
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index b04bdfb..9a4e1b1 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -642,15 +642,15 @@
       <menuitem action="context-colors-swap" />
     </menu>
 
-    <menu action="plug-in-menu" name="Filters">
-      <menuitem action="plug-in-repeat" />
-      <menuitem action="plug-in-reshow" />
-      <menu action="plug-in-recent-menu" name="Recently Used">
-        <placeholder name="Plug-Ins" />
+    <menu action="filters-menu" name="Filters">
+      <menuitem action="filters-repeat" />
+      <menuitem action="filters-reshow" />
+      <menu action="filters-recent-menu" name="Recently Used">
+        <placeholder name="Filters" />
       </menu>
       <menuitem action="plug-in-reset-all" />
       <separator />
-      <menu action="plug-in-blur-menu" name="Blur">
+      <menu action="filters-blur-menu" name="Blur">
        <menuitem action="filters-gaussian-blur" />
        <menuitem action="filters-pixelize" />
        <menuitem action="filters-gaussian-blur-selective" />
@@ -660,14 +660,14 @@
          <menuitem action="filters-motion-blur-zoom" />
        </placeholder>
       </menu>
-      <menu action="plug-in-enhance-menu" name="Enhance">
+      <menu action="filters-enhance-menu" name="Enhance">
         <menuitem action="filters-antialias" />
         <menuitem action="filters-deinterlace" />
         <menuitem action="filters-noise-reduction" />
         <menuitem action="filters-red-eye-removal" />
         <menuitem action="filters-unsharp-mask" />
       </menu>
-      <menu action="plug-in-distorts-menu" name="Distorts">
+      <menu action="filters-distorts-menu" name="Distorts">
        <menuitem action="filters-apply-lens" />
        <menuitem action="filters-emboss" />
        <menuitem action="filters-engrave" />
@@ -683,7 +683,7 @@
         <menuitem action="filters-whirl-pinch" />
         <menuitem action="filters-wind" />
       </menu>
-      <menu action="plug-in-light-shadow-menu" name="Light and Shadow">
+      <menu action="filters-light-shadow-menu" name="Light and Shadow">
         <placeholder name="Light">
          <menuitem action="filters-supernova" />
          <menuitem action="filters-lens-flare" />
@@ -696,7 +696,7 @@
         <separator />
         <placeholder name="Glass" />
       </menu>
-      <menu action="plug-in-noise-menu" name="Noise">
+      <menu action="filters-noise-menu" name="Noise">
         <menuitem action="filters-noise-cie-lch" />
         <menuitem action="filters-noise-hsv" />
         <menuitem action="filters-noise-hurl" />
@@ -705,20 +705,20 @@
         <menuitem action="filters-noise-slur" />
         <menuitem action="filters-noise-spread" />
       </menu>
-      <menu action="plug-in-edge-detect-menu" name="Edge-Detect">
+      <menu action="filters-edge-detect-menu" name="Edge-Detect">
         <menuitem action="filters-difference-of-gaussians" />
         <menuitem action="filters-edge" />
         <menuitem action="filters-edge-laplace" />
         <menuitem action="filters-edge-sobel" />
       </menu>
-      <menu action="plug-in-generic-menu" name="Generic">
+      <menu action="filters-generic-menu" name="Generic">
         <menuitem action="filters-convolution-matrix" />
         <menuitem action="filters-distance-map" />
         <menuitem action="drawable-dilate" />
         <menuitem action="drawable-erode" />
       </menu>
-      <menu action="plug-in-combine-menu" name="Combine" />
-      <menu action="plug-in-artistic-menu" name="Artistic">
+      <menu action="filters-combine-menu" name="Combine" />
+      <menu action="filters-artistic-menu" name="Artistic">
        <menuitem action="filters-apply-canvas" />
        <menuitem action="filters-cartoon" />
        <menuitem action="filters-cubism" />
@@ -727,8 +727,8 @@
        <menuitem action="filters-photocopy" />
        <menuitem action="filters-softglow" />
       </menu>
-      <menu action="plug-in-decor-menu" name="Decor" />
-      <menu action="plug-in-map-menu" name="Map">
+      <menu action="filters-decor-menu" name="Decor" />
+      <menu action="filters-map-menu" name="Map">
         <menuitem action="filters-bump-map" />
         <menuitem action="filters-displace" />
         <menuitem action="filters-fractal-trace" />
@@ -737,18 +737,18 @@
         <menuitem action="filters-tile-paper" />
         <menuitem action="filters-tile-seamless" />
       </menu>
-      <menu action="plug-in-render-menu" name="Render">
-        <menu action="plug-in-render-clouds-menu" name="Clouds" />
-        <menu action="plug-in-render-fractals-menu" name="Fractals" />
-        <menu action="plug-in-render-nature-menu" name="Nature" />
-        <menu action="plug-in-render-noise-menu" name="Noise">
+      <menu action="filters-render-menu" name="Render">
+        <menu action="filters-render-clouds-menu" name="Clouds" />
+        <menu action="filters-render-fractals-menu" name="Fractals" />
+        <menu action="filters-render-nature-menu" name="Nature" />
+        <menu action="filters-render-noise-menu" name="Noise">
          <menuitem action="filters-noise-cell" />
          <menuitem action="filters-noise-perlin" />
          <menuitem action="filters-plasma" />
          <menuitem action="filters-noise-simplex" />
          <menuitem action="filters-noise-solid" />
        </menu>
-        <menu action="plug-in-render-pattern-menu" name="Pattern">
+        <menu action="filters-render-pattern-menu" name="Pattern">
          <menuitem action="filters-checkerboard" />
          <menuitem action="filters-diffraction-patterns" />
          <menuitem action="filters-grid" />
@@ -757,10 +757,10 @@
        </menu>
         <separator />
       </menu>
-      <menu action="plug-in-web-menu" name="Web">
+      <menu action="filters-web-menu" name="Web">
         <menuitem action="filters-semi-flatten" />
       </menu>
-      <menu action="plug-in-animation-menu" name="Animation" >
+      <menu action="filters-animation-menu" name="Animation" >
         <placeholder name="Animators" />
         <separator />
       </menu>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]