summaryrefslogtreecommitdiffstats
path: root/app/plug-in/gimppluginmanager-query.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:23:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:23:22 +0000
commite42129241681dde7adae7d20697e7b421682fbb4 (patch)
treeaf1fe815a5e639e68e59fabd8395ec69458b3e5e /app/plug-in/gimppluginmanager-query.c
parentInitial commit. (diff)
downloadgimp-upstream.tar.xz
gimp-upstream.zip
Adding upstream version 2.10.22.upstream/2.10.22upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--app/plug-in/gimppluginmanager-query.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/app/plug-in/gimppluginmanager-query.c b/app/plug-in/gimppluginmanager-query.c
new file mode 100644
index 0000000..861a89a
--- /dev/null
+++ b/app/plug-in/gimppluginmanager-query.c
@@ -0,0 +1,162 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995-2003 Spencer Kimball and Peter Mattis
+ *
+ * plug-ins-query.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 <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gegl.h>
+
+#include "libgimpbase/gimpbase.h"
+
+#include "plug-in-types.h"
+
+#include "gimppluginmanager.h"
+#include "gimppluginmanager-query.h"
+#include "gimppluginprocedure.h"
+
+
+static gboolean
+match_string (GRegex *regex,
+ gchar *string)
+{
+ return g_regex_match (regex, string, 0, NULL);
+}
+
+gint
+gimp_plug_in_manager_query (GimpPlugInManager *manager,
+ const gchar *search_str,
+ gchar ***menu_strs,
+ gchar ***accel_strs,
+ gchar ***prog_strs,
+ gchar ***types_strs,
+ gchar ***realname_strs,
+ gint32 **time_ints)
+{
+ gint32 num_plugins = 0;
+ GSList *list;
+ GSList *matched = NULL;
+ gint i = 0;
+ GRegex *sregex = NULL;
+
+ g_return_val_if_fail (GIMP_IS_PLUG_IN_MANAGER (manager), 0);
+ g_return_val_if_fail (menu_strs != NULL, 0);
+ g_return_val_if_fail (accel_strs != NULL, 0);
+ g_return_val_if_fail (prog_strs != NULL, 0);
+ g_return_val_if_fail (types_strs != NULL, 0);
+ g_return_val_if_fail (realname_strs != NULL, 0);
+ g_return_val_if_fail (time_ints != NULL, 0);
+
+ *menu_strs = NULL;
+ *accel_strs = NULL;
+ *prog_strs = NULL;
+ *types_strs = NULL;
+ *realname_strs = NULL;
+ *time_ints = NULL;
+
+ if (search_str && ! strlen (search_str))
+ search_str = NULL;
+
+ if (search_str)
+ {
+ sregex = g_regex_new (search_str, G_REGEX_CASELESS | G_REGEX_OPTIMIZE, 0,
+ NULL);
+ if (! sregex)
+ return 0;
+ }
+
+ /* count number of plugin entries, then allocate arrays of correct size
+ * where we can store the strings.
+ */
+
+ for (list = manager->plug_in_procedures; list; list = g_slist_next (list))
+ {
+ GimpPlugInProcedure *proc = list->data;
+
+ if (proc->file && proc->menu_paths)
+ {
+ gchar *name;
+
+ if (proc->menu_label)
+ {
+ name = proc->menu_label;
+ }
+ else
+ {
+ name = strrchr (proc->menu_paths->data, '/');
+
+ if (name)
+ name = name + 1;
+ else
+ name = proc->menu_paths->data;
+ }
+
+ name = gimp_strip_uline (name);
+
+ if (! search_str || match_string (sregex, name))
+ {
+ num_plugins++;
+ matched = g_slist_prepend (matched, proc);
+ }
+
+ g_free (name);
+ }
+ }
+
+ *menu_strs = g_new (gchar *, num_plugins);
+ *accel_strs = g_new (gchar *, num_plugins);
+ *prog_strs = g_new (gchar *, num_plugins);
+ *types_strs = g_new (gchar *, num_plugins);
+ *realname_strs = g_new (gchar *, num_plugins);
+ *time_ints = g_new (gint, num_plugins);
+
+ matched = g_slist_reverse (matched);
+
+ for (list = matched; list; list = g_slist_next (list))
+ {
+ GimpPlugInProcedure *proc = list->data;
+ gchar *name;
+
+ if (proc->menu_label)
+ name = g_strdup_printf ("%s/%s",
+ (gchar *) proc->menu_paths->data,
+ proc->menu_label);
+ else
+ name = g_strdup (proc->menu_paths->data);
+
+ (*menu_strs)[i] = gimp_strip_uline (name);
+ (*accel_strs)[i] = NULL;
+ (*prog_strs)[i] = g_file_get_path (proc->file);
+ (*types_strs)[i] = g_strdup (proc->image_types);
+ (*realname_strs)[i] = g_strdup (gimp_object_get_name (proc));
+ (*time_ints)[i] = proc->mtime;
+
+ g_free (name);
+
+ i++;
+ }
+
+ g_slist_free (matched);
+
+ if (sregex)
+ g_regex_unref (sregex);
+
+ return num_plugins;
+}