[gimp] libgimp: change GimpPlugIn and GimpProcedures so temp procs work



commit d64c0ebd30a6fcc4a890623ef6ac08cbbfbed299
Author: Michael Natterer <mitch gimp org>
Date:   Tue Jul 30 21:02:58 2019 +0200

    libgimp: change GimpPlugIn and GimpProcedures so temp procs work

 libgimp/gimp.c                  |  2 +-
 libgimp/gimp.def                | 10 ++++++----
 libgimp/gimpplugin-private.h    |  4 ++--
 libgimp/gimpplugin.c            | 39 ++++++++++++++++++++++-----------------
 libgimp/gimpplugin.h            |  8 ++++----
 libgimp/gimpprocedure-private.c | 18 +++++++++++++++---
 libgimp/gimpprocedure-private.h |  3 ++-
 libgimp/gimpprocedure.c         | 34 ++++++++++++++++++++++++++++++----
 libgimp/gimpprocedure.h         |  7 ++++++-
 9 files changed, 88 insertions(+), 37 deletions(-)
---
diff --git a/libgimp/gimp.c b/libgimp/gimp.c
index c710cf2820..569fe9b750 100644
--- a/libgimp/gimp.c
+++ b/libgimp/gimp.c
@@ -2699,7 +2699,7 @@ gimp_temp_proc_run (GPProcRun *proc_run)
     {
       GimpProcedure *procedure;
 
-      procedure = gimp_plug_in_get_procedure (PLUG_IN, proc_run->name);
+      procedure = gimp_plug_in_get_temp_procedure (PLUG_IN, proc_run->name);
 
       if (procedure)
         {
diff --git a/libgimp/gimp.def b/libgimp/gimp.def
index cfeb7256d7..4dddd112ce 100644
--- a/libgimp/gimp.def
+++ b/libgimp/gimp.def
@@ -619,13 +619,13 @@ EXPORTS
        gimp_patterns_set_popup
        gimp_pencil
        gimp_plug_in_add_menu_branch
-       gimp_plug_in_add_procedure
+       gimp_plug_in_add_temp_procedure
        gimp_plug_in_create_procedure
-       gimp_plug_in_get_procedure
-       gimp_plug_in_get_procedures
+       gimp_plug_in_get_temp_procedure
+       gimp_plug_in_get_temp_procedures
        gimp_plug_in_get_type
        gimp_plug_in_info_set_callbacks
-       gimp_plug_in_remove_procedure
+       gimp_plug_in_remove_temp_procedure
        gimp_plug_in_set_help_domain
        gimp_plug_in_set_translation_domain
        gimp_plugin_domain_register
@@ -660,6 +660,8 @@ EXPORTS
        gimp_procedure_get_menu_label
        gimp_procedure_get_menu_paths
        gimp_procedure_get_name
+       gimp_procedure_get_plug_in
+       gimp_procedure_get_proc_type
        gimp_procedure_get_return_values
        gimp_procedure_get_type
        gimp_procedure_new
diff --git a/libgimp/gimpplugin-private.h b/libgimp/gimpplugin-private.h
index cf1d0a52ad..38da2435f8 100644
--- a/libgimp/gimpplugin-private.h
+++ b/libgimp/gimpplugin-private.h
@@ -34,8 +34,6 @@ struct _GimpPlugInMenuBranch
 
 struct _GimpPlugInPrivate
 {
-  GList *procedures;
-
   gchar *translation_domain_name;
   GFile *translation_domain_path;
 
@@ -43,6 +41,8 @@ struct _GimpPlugInPrivate
   GFile *help_domain_uri;
 
   GList *menu_branches;
+
+  GList *temp_procedures;
 };
 
 
diff --git a/libgimp/gimpplugin.c b/libgimp/gimpplugin.c
index 591875802c..b3c888c30d 100644
--- a/libgimp/gimpplugin.c
+++ b/libgimp/gimpplugin.c
@@ -24,6 +24,7 @@
 
 #include "gimp.h"
 #include "gimpplugin-private.h"
+#include "gimpprocedure-private.h"
 
 
 /**
@@ -66,10 +67,10 @@ gimp_plug_in_finalize (GObject *object)
   GimpPlugIn *plug_in = GIMP_PLUG_IN (object);
   GList      *list;
 
-  if (plug_in->priv->procedures)
+  if (plug_in->priv->temp_procedures)
     {
-      g_list_free_full (plug_in->priv->procedures, g_object_unref);
-      plug_in->priv->procedures = NULL;
+      g_list_free_full (plug_in->priv->temp_procedures, g_object_unref);
+      plug_in->priv->temp_procedures = NULL;
     }
 
   g_clear_pointer (&plug_in->priv->translation_domain_name, g_free);
@@ -160,53 +161,57 @@ gimp_plug_in_create_procedure (GimpPlugIn    *plug_in,
 }
 
 void
-gimp_plug_in_add_procedure (GimpPlugIn    *plug_in,
-                            GimpProcedure *procedure)
+gimp_plug_in_add_temp_procedure (GimpPlugIn    *plug_in,
+                                 GimpProcedure *procedure)
 {
   g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
   g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
 
-  plug_in->priv->procedures = g_list_prepend (plug_in->priv->procedures,
-                                              g_object_ref (procedure));
+  plug_in->priv->temp_procedures = g_list_prepend (plug_in->priv->temp_procedures,
+                                                   g_object_ref (procedure));
+
+  _gimp_procedure_register (procedure);
 }
 
 void
-gimp_plug_in_remove_procedure (GimpPlugIn  *plug_in,
-                               const gchar *name)
+gimp_plug_in_remove_temp_procedure (GimpPlugIn  *plug_in,
+                                    const gchar *name)
 {
   GimpProcedure *procedure;
 
   g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
   g_return_if_fail (name != NULL);
 
-  procedure = gimp_plug_in_get_procedure (plug_in, name);
+  procedure = gimp_plug_in_get_temp_procedure (plug_in, name);
 
   if (procedure)
     {
-      plug_in->priv->procedures = g_list_remove (plug_in->priv->procedures,
-                                                 procedure);
+      _gimp_procedure_unregister (procedure);
+
+      plug_in->priv->temp_procedures = g_list_remove (plug_in->priv->temp_procedures,
+                                                      procedure);
       g_object_unref (procedure);
     }
 }
 
 GList *
-gimp_plug_in_get_procedures (GimpPlugIn *plug_in)
+gimp_plug_in_get_temp_procedures (GimpPlugIn *plug_in)
 {
   g_return_val_if_fail (GIMP_IS_PLUG_IN (plug_in), NULL);
 
-  return plug_in->priv->procedures;
+  return plug_in->priv->temp_procedures;
 }
 
 GimpProcedure *
-gimp_plug_in_get_procedure (GimpPlugIn  *plug_in,
-                            const gchar *name)
+gimp_plug_in_get_temp_procedure (GimpPlugIn  *plug_in,
+                                 const gchar *name)
 {
   GList *list;
 
   g_return_val_if_fail (GIMP_IS_PLUG_IN (plug_in), NULL);
   g_return_val_if_fail (name != NULL, NULL);
 
-  for (list = plug_in->priv->procedures; list; list = g_list_next (list))
+  for (list = plug_in->priv->temp_procedures; list; list = g_list_next (list))
     {
       GimpProcedure *procedure = list->data;
 
diff --git a/libgimp/gimpplugin.h b/libgimp/gimpplugin.h
index a92305c1d2..2e61501836 100644
--- a/libgimp/gimpplugin.h
+++ b/libgimp/gimpplugin.h
@@ -90,13 +90,13 @@ void            gimp_plug_in_add_menu_branch        (GimpPlugIn    *plug_in,
 GimpProcedure * gimp_plug_in_create_procedure       (GimpPlugIn    *plug_in,
                                                      const gchar   *name);
 
-void            gimp_plug_in_add_procedure          (GimpPlugIn    *plug_in,
+void            gimp_plug_in_add_temp_procedure     (GimpPlugIn    *plug_in,
                                                      GimpProcedure *procedure);
-void            gimp_plug_in_remove_procedure       (GimpPlugIn    *plug_in,
+void            gimp_plug_in_remove_temp_procedure  (GimpPlugIn    *plug_in,
                                                      const gchar   *name);
 
-GList         * gimp_plug_in_get_procedures         (GimpPlugIn    *plug_in);
-GimpProcedure * gimp_plug_in_get_procedure          (GimpPlugIn    *plug_in,
+GList         * gimp_plug_in_get_temp_procedures    (GimpPlugIn    *plug_in);
+GimpProcedure * gimp_plug_in_get_temp_procedure     (GimpPlugIn    *plug_in,
                                                      const gchar   *name);
 
 
diff --git a/libgimp/gimpprocedure-private.c b/libgimp/gimpprocedure-private.c
index 65c2d71403..07ecc7c419 100644
--- a/libgimp/gimpprocedure-private.c
+++ b/libgimp/gimpprocedure-private.c
@@ -34,13 +34,14 @@
 #include "gimpprocedure-private.h"
 
 
+extern GIOChannel *_writechannel;
+
+
 /*  public functions  */
 
 void
 _gimp_procedure_register (GimpProcedure *procedure)
 {
-  extern GIOChannel *_writechannel;
-
   GParamSpec   **args;
   GParamSpec   **return_vals;
   gint           n_args;
@@ -65,7 +66,7 @@ _gimp_procedure_register (GimpProcedure *procedure)
   proc_install.date         = (gchar *) gimp_procedure_get_date (procedure);
   proc_install.menu_label   = (gchar *) gimp_procedure_get_menu_label (procedure);
   proc_install.image_types  = (gchar *) gimp_procedure_get_image_types (procedure);
-  proc_install.type         = GIMP_PLUGIN;
+  proc_install.type         = gimp_procedure_get_proc_type (procedure);
   proc_install.nparams      = n_args;
   proc_install.nreturn_vals = n_return_vals;
   proc_install.params       = g_new0 (GPParamDef, n_args);
@@ -103,3 +104,14 @@ _gimp_procedure_register (GimpProcedure *procedure)
                                  list->data);
     }
 }
+
+void
+_gimp_procedure_unregister (GimpProcedure *procedure)
+{
+  GPProcUninstall proc_uninstall;
+
+  proc_uninstall.name = (gchar *) gimp_procedure_get_name (procedure);
+
+  if (! gp_proc_uninstall_write (_writechannel, &proc_uninstall, NULL))
+    gimp_quit ();
+}
diff --git a/libgimp/gimpprocedure-private.h b/libgimp/gimpprocedure-private.h
index 76b117eb05..35e9971ec0 100644
--- a/libgimp/gimpprocedure-private.h
+++ b/libgimp/gimpprocedure-private.h
@@ -24,7 +24,8 @@
 G_BEGIN_DECLS
 
 
-void _gimp_procedure_register (GimpProcedure *procedure);
+void _gimp_procedure_register   (GimpProcedure *procedure);
+void _gimp_procedure_unregister (GimpProcedure *procedure);
 
 
 G_END_DECLS
diff --git a/libgimp/gimpprocedure.c b/libgimp/gimpprocedure.c
index 4309313cc7..5bd67ee840 100644
--- a/libgimp/gimpprocedure.c
+++ b/libgimp/gimpprocedure.c
@@ -51,6 +51,9 @@ gimp_pdb_error_quark (void)
 
 struct _GimpProcedurePrivate
 {
+  GimpPlugIn       *plug_in;        /* the procedure's plug-in        */
+  GimpPDBProcType   proc_type;      /* procedure type                 */
+
   gchar            *name;           /* procedure name                 */
   gchar            *menu_label;
   gchar            *blurb;          /* Short procedure description    */
@@ -113,6 +116,7 @@ gimp_procedure_finalize (GObject *object)
   GimpProcedure *procedure = GIMP_PROCEDURE (object);
   gint           i;
 
+  g_clear_object  (&procedure->priv->plug_in);
   g_clear_pointer (&procedure->priv->name, g_free);
 
   gimp_procedure_free_strings (procedure);
@@ -146,22 +150,44 @@ gimp_procedure_finalize (GObject *object)
 /*  public functions  */
 
 GimpProcedure  *
-gimp_procedure_new (const gchar *name,
-                    GimpRunFunc  run_func)
+gimp_procedure_new (GimpPlugIn      *plug_in,
+                    const gchar     *name,
+                    GimpPDBProcType  proc_type,
+                    GimpRunFunc      run_func)
 {
   GimpProcedure *procedure;
 
+  g_return_val_if_fail (GIMP_IS_PLUG_IN (plug_in), NULL);
   g_return_val_if_fail (name != NULL, NULL);
+  g_return_val_if_fail (proc_type != GIMP_INTERNAL, NULL);
   g_return_val_if_fail (run_func != NULL, NULL);
 
   procedure = g_object_new (GIMP_TYPE_PROCEDURE, NULL);
 
-  procedure->priv->name     = g_strdup (name);
-  procedure->priv->run_func = run_func;
+  procedure->priv->plug_in   = g_object_ref (plug_in);
+  procedure->priv->proc_type = proc_type;
+  procedure->priv->name      = g_strdup (name);
+  procedure->priv->run_func  = run_func;
 
   return procedure;
 }
 
+GimpPlugIn *
+gimp_procedure_get_plug_in (GimpProcedure *procedure)
+{
+  g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure), NULL);
+
+  return procedure->priv->plug_in;
+}
+
+GimpPDBProcType
+gimp_procedure_get_proc_type (GimpProcedure *procedure)
+{
+  g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure), GIMP_PLUGIN);
+
+  return procedure->priv->proc_type;
+}
+
 void
 gimp_procedure_set_strings (GimpProcedure *procedure,
                             const gchar   *menu_label,
diff --git a/libgimp/gimpprocedure.h b/libgimp/gimpprocedure.h
index 7eab533f44..ebea525068 100644
--- a/libgimp/gimpprocedure.h
+++ b/libgimp/gimpprocedure.h
@@ -58,9 +58,14 @@ struct _GimpProcedureClass
 
 GType            gimp_procedure_get_type           (void) G_GNUC_CONST;
 
-GimpProcedure  * gimp_procedure_new                (const gchar       *name,
+GimpProcedure  * gimp_procedure_new                (GimpPlugIn        *plug_in,
+                                                    const gchar       *name,
+                                                    GimpPDBProcType    proc_type,
                                                     GimpRunFunc        run_func);
 
+GimpPlugIn     * gimp_procedure_get_plug_in        (GimpProcedure     *procedure);
+GimpPDBProcType  gimp_procedure_get_proc_type      (GimpProcedure     *procedure);
+
 void             gimp_procedure_set_strings        (GimpProcedure     *procedure,
                                                     const gchar       *menu_label,
                                                     const gchar       *blurb,


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