[gimp] Issue #6767: sensitivity API NO_IMAGE not working in Python.



commit 3ce0e66321a5c8eced0b7dcb9a6c99e20313ea1f
Author: Jehan <jehan girinstud io>
Date:   Thu Apr 29 23:53:35 2021 +0200

    Issue #6767: sensitivity API NO_IMAGE not working in Python.
    
    When GIMP_PROCEDURE_SENSITIVE_NO_IMAGE is set on a GimpImageProcedure,
    add GIMP_PARAM_NO_VALIDATE to the param spec flags, allowing to pass a
    NULL image.

 libgimp/gimpimageprocedure.c | 30 ++++++++++++++++++++++++++----
 libgimp/gimpprocedure.c      | 17 +++++++++++++----
 libgimp/gimpprocedure.h      | 17 ++++++++++-------
 3 files changed, 49 insertions(+), 15 deletions(-)
---
diff --git a/libgimp/gimpimageprocedure.c b/libgimp/gimpimageprocedure.c
index 05c068610b..565d01e085 100644
--- a/libgimp/gimpimageprocedure.c
+++ b/libgimp/gimpimageprocedure.c
@@ -43,6 +43,9 @@ static GimpProcedureConfig *
               gimp_image_procedure_create_config (GimpProcedure        *procedure,
                                                   GParamSpec          **args,
                                                   gint                  n_args);
+static gboolean
+            gimp_image_procedure_set_sensitivity (GimpProcedure        *procedure,
+                                                  gint                  sensitivity_mask);
 
 
 G_DEFINE_TYPE_WITH_PRIVATE (GimpImageProcedure, gimp_image_procedure,
@@ -57,11 +60,12 @@ gimp_image_procedure_class_init (GimpImageProcedureClass *klass)
   GObjectClass       *object_class    = G_OBJECT_CLASS (klass);
   GimpProcedureClass *procedure_class = GIMP_PROCEDURE_CLASS (klass);
 
-  object_class->constructed      = gimp_image_procedure_constructed;
-  object_class->finalize         = gimp_image_procedure_finalize;
+  object_class->constructed        = gimp_image_procedure_constructed;
+  object_class->finalize           = gimp_image_procedure_finalize;
 
-  procedure_class->run           = gimp_image_procedure_run;
-  procedure_class->create_config = gimp_image_procedure_create_config;
+  procedure_class->run             = gimp_image_procedure_run;
+  procedure_class->create_config   = gimp_image_procedure_create_config;
+  procedure_class->set_sensitivity = gimp_image_procedure_set_sensitivity;
 }
 
 static void
@@ -175,6 +179,24 @@ gimp_image_procedure_create_config (GimpProcedure  *procedure,
                                                              n_args);
 }
 
+static gboolean
+gimp_image_procedure_set_sensitivity (GimpProcedure *procedure,
+                                      gint           sensitivity_mask)
+{
+  GParamSpec *pspec;
+
+  g_return_val_if_fail (GIMP_IS_IMAGE_PROCEDURE (procedure), FALSE);
+
+  pspec = gimp_procedure_find_argument (procedure, "image");
+  g_return_val_if_fail (pspec, FALSE);
+
+  if (sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_NO_IMAGE)
+    pspec->flags |= GIMP_PARAM_NO_VALIDATE;
+  else
+    pspec->flags &= ~GIMP_PARAM_NO_VALIDATE;
+
+  return TRUE;
+}
 
 /*  public functions  */
 
diff --git a/libgimp/gimpprocedure.c b/libgimp/gimpprocedure.c
index 2eae229e62..e56e035a8c 100644
--- a/libgimp/gimpprocedure.c
+++ b/libgimp/gimpprocedure.c
@@ -733,13 +733,22 @@ void
 gimp_procedure_set_sensitivity_mask (GimpProcedure *procedure,
                                      gint           sensitivity_mask)
 {
+  gboolean success = TRUE;
+
   g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
 
-  procedure->priv->sensitivity_mask = sensitivity_mask;
+  if (GIMP_PROCEDURE_GET_CLASS (procedure)->set_sensitivity)
+    success = GIMP_PROCEDURE_GET_CLASS (procedure)->set_sensitivity (procedure,
+                                                                     sensitivity_mask);
 
-  if (procedure->priv->installed)
-    _gimp_pdb_set_proc_sensitivity_mask (gimp_procedure_get_name (procedure),
-                                         procedure->priv->sensitivity_mask);
+  if (success)
+    {
+      procedure->priv->sensitivity_mask = sensitivity_mask;
+
+      if (procedure->priv->installed)
+        _gimp_pdb_set_proc_sensitivity_mask (gimp_procedure_get_name (procedure),
+                                             procedure->priv->sensitivity_mask);
+    }
 }
 
 /**
diff --git a/libgimp/gimpprocedure.h b/libgimp/gimpprocedure.h
index c52f8adb0b..6e614009b5 100644
--- a/libgimp/gimpprocedure.h
+++ b/libgimp/gimpprocedure.h
@@ -104,15 +104,18 @@ struct _GimpProcedureClass
 {
   GObjectClass parent_class;
 
-  void                  (* install)       (GimpProcedure         *procedure);
-  void                  (* uninstall)     (GimpProcedure         *procedure);
+  void                  (* install)         (GimpProcedure         *procedure);
+  void                  (* uninstall)       (GimpProcedure         *procedure);
 
-  GimpValueArray      * (* run)           (GimpProcedure         *procedure,
-                                           const GimpValueArray  *args);
+  GimpValueArray      * (* run)             (GimpProcedure         *procedure,
+                                             const GimpValueArray  *args);
 
-  GimpProcedureConfig * (* create_config) (GimpProcedure         *procedure,
-                                           GParamSpec           **args,
-                                           gint                   n_args);
+  GimpProcedureConfig * (* create_config)   (GimpProcedure         *procedure,
+                                             GParamSpec           **args,
+                                             gint                   n_args);
+
+  gboolean              (* set_sensitivity) (GimpProcedure         *procedure,
+                                             gint                   sensitivity_mask);
 
   /* Padding for future expansion */
   /*< private >*/


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