From a4bb3a48a2e51f3ec51a89e23d4831c50ad40fa5 Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 1 May 2024 21:47:55 +0200 Subject: [PATCH] libgimp: reimplement gimp_procedure_run_config() for public usage. Previous gimp_procedure_run_config() was in fact only good for private usage inside the various run() methods for the different GimpProcedure subtypes. The problem with this implementation is that the returned config object is not complete. For instance, for a GimpLoadProcedure, the "run-mode" and "file" properties are not part of the config object so you cannot call a GimpLoadProcedure with any of the gimp_procedure_run*() functions. Note: we had some working usage, e.g. in file-openraster, but only because it was running the load procedure as a GimpPDBProcedure whose returned config object was indeed always complete! As a consequence, I rename gimp_procedure_run_config() as an internal-only function _gimp_procedure_create_run_config() and I create a new gimp_procedure_run_config() which always return a full config with all arguments. --- libgimp/gimpbatchprocedure.c | 2 +- libgimp/gimpexportprocedure.c | 2 +- libgimp/gimpimageprocedure.c | 2 +- libgimp/gimploadprocedure.c | 2 +- libgimp/gimpprocedure.c | 56 +++++++++++++++++++++++++++---- libgimp/gimpprocedure.h | 6 ++-- libgimp/gimpprocedureconfig.c | 6 ++-- libgimp/gimpthumbnailprocedure.c | 2 +- libgimp/gimpvectorloadprocedure.c | 2 +- 9 files changed, 62 insertions(+), 18 deletions(-) diff --git a/libgimp/gimpbatchprocedure.c b/libgimp/gimpbatchprocedure.c index 4a1d754802..accb0c90b0 100644 --- a/libgimp/gimpbatchprocedure.c +++ b/libgimp/gimpbatchprocedure.c @@ -161,7 +161,7 @@ gimp_batch_procedure_run (GimpProcedure *procedure, gimp_value_array_append (remaining, value); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); _gimp_procedure_config_begin_run (config, NULL, run_mode, remaining); gimp_value_array_unref (remaining); diff --git a/libgimp/gimpexportprocedure.c b/libgimp/gimpexportprocedure.c index 52105c26ff..2812feb1b8 100644 --- a/libgimp/gimpexportprocedure.c +++ b/libgimp/gimpexportprocedure.c @@ -366,7 +366,7 @@ gimp_export_procedure_run (GimpProcedure *procedure, gimp_value_array_append (remaining, value); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); if (export_proc->priv->export_metadata) { mimetype = (gchar *) gimp_file_procedure_get_mime_types (GIMP_FILE_PROCEDURE (procedure)); diff --git a/libgimp/gimpimageprocedure.c b/libgimp/gimpimageprocedure.c index 6151dffb3a..aed66c110c 100644 --- a/libgimp/gimpimageprocedure.c +++ b/libgimp/gimpimageprocedure.c @@ -174,7 +174,7 @@ gimp_image_procedure_run (GimpProcedure *procedure, gimp_value_array_append (remaining, value); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); _gimp_procedure_config_begin_run (config, image, run_mode, remaining); return_values = image_proc->priv->run_func (procedure, diff --git a/libgimp/gimploadprocedure.c b/libgimp/gimploadprocedure.c index 56426ba28d..deddf13052 100644 --- a/libgimp/gimploadprocedure.c +++ b/libgimp/gimploadprocedure.c @@ -206,7 +206,7 @@ gimp_load_procedure_run (GimpProcedure *procedure, gimp_value_array_append (remaining, value); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); mimetype = (gchar *) gimp_file_procedure_get_mime_types (GIMP_FILE_PROCEDURE (procedure)); if (mimetype != NULL) diff --git a/libgimp/gimpprocedure.c b/libgimp/gimpprocedure.c index 020aa1f812..d3236db71e 100644 --- a/libgimp/gimpprocedure.c +++ b/libgimp/gimpprocedure.c @@ -130,6 +130,12 @@ static GimpProcedureConfig * gimp_procedure_real_create_config (GimpProcedure GParamSpec **args, gint n_args); +static GimpProcedureConfig * + gimp_procedure_create_config_with_prefix (GimpProcedure *procedure, + const gchar *prefix, + GParamSpec **args, + gint n_args); + static GimpValueArray * gimp_procedure_new_arguments (GimpProcedure *procedure); static gboolean gimp_procedure_validate_args (GimpProcedure *procedure, GParamSpec **param_specs, @@ -510,7 +516,7 @@ gimp_procedure_real_run (GimpProcedure *procedure, image = GIMP_VALUES_GET_IMAGE (args, 1); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); _gimp_procedure_config_begin_run (config, image, run_mode, args); retvals = procedure->priv->run_func (procedure, config, @@ -540,11 +546,22 @@ static GimpProcedureConfig * gimp_procedure_real_create_config (GimpProcedure *procedure, GParamSpec **args, gint n_args) +{ + return gimp_procedure_create_config_with_prefix (procedure, + "GimpProcedureConfigRun", + args, n_args); +} + +static GimpProcedureConfig * +gimp_procedure_create_config_with_prefix (GimpProcedure *procedure, + const gchar *prefix, + GParamSpec **args, + gint n_args) { gchar *type_name; GType type; - type_name = g_strdup_printf ("GimpProcedureConfig-%s", + type_name = g_strdup_printf ("%s-%s", prefix, gimp_procedure_get_name (procedure)); type = g_type_from_name (type_name); @@ -1992,6 +2009,29 @@ gimp_procedure_run_config (GimpProcedure *procedure, return return_vals; } +/** + * _gimp_procedure_create_run_config: + * @procedure: A #GimpProcedure + * + * Create a #GimpConfig with properties that match @procedure's arguments, to be + * used in the run() method for @procedure. + * + * This is an internal function to be used only by libgimp code. + * + * Returns: (transfer full): The new #GimpConfig. + * + * Since: 3.0 + **/ +GimpProcedureConfig * +_gimp_procedure_create_run_config (GimpProcedure *procedure) +{ + g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure), NULL); + + return GIMP_PROCEDURE_GET_CLASS (procedure)->create_config (procedure, + procedure->priv->args, + procedure->priv->n_args); +} + GimpValueArray * _gimp_procedure_run_array (GimpProcedure *procedure, GimpValueArray *args) @@ -2022,7 +2062,7 @@ _gimp_procedure_run_array (GimpProcedure *procedure, GimpValueArray *complete; /* if saved defaults exist, they override GParamSpec */ - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); if (gimp_procedure_config_load_default (config, NULL)) config_class = G_OBJECT_GET_CLASS (config); else @@ -2125,7 +2165,8 @@ gimp_procedure_extension_ready (GimpProcedure *procedure) * gimp_procedure_create_config: * @procedure: A #GimpProcedure * - * Create a #GimpConfig with properties that match @procedure's arguments. + * Create a #GimpConfig with properties that match @procedure's arguments, to be + * used in [method@Procedure.run_config] method. * * Returns: (transfer full): The new #GimpConfig. * @@ -2136,9 +2177,10 @@ gimp_procedure_create_config (GimpProcedure *procedure) { g_return_val_if_fail (GIMP_IS_PROCEDURE (procedure), NULL); - return GIMP_PROCEDURE_GET_CLASS (procedure)->create_config (procedure, - procedure->priv->args, - procedure->priv->n_args); + return gimp_procedure_create_config_with_prefix (procedure, + "GimpProcedureConfig", + procedure->priv->args, + procedure->priv->n_args); } diff --git a/libgimp/gimpprocedure.h b/libgimp/gimpprocedure.h index 57ac0c2937..8506bec583 100644 --- a/libgimp/gimpprocedure.h +++ b/libgimp/gimpprocedure.h @@ -251,8 +251,10 @@ GimpProcedureConfig * /* Internal use */ -G_GNUC_INTERNAL GimpValueArray * _gimp_procedure_run_array (GimpProcedure *procedure, - GimpValueArray *args); +G_GNUC_INTERNAL GimpProcedureConfig * _gimp_procedure_create_run_config (GimpProcedure *procedure); + +G_GNUC_INTERNAL GimpValueArray * _gimp_procedure_run_array (GimpProcedure *procedure, + GimpValueArray *args); G_END_DECLS diff --git a/libgimp/gimpprocedureconfig.c b/libgimp/gimpprocedureconfig.c index 7270c3fb7e..7623763b1b 100644 --- a/libgimp/gimpprocedureconfig.c +++ b/libgimp/gimpprocedureconfig.c @@ -535,10 +535,10 @@ _gimp_procedure_config_get_values (GimpProcedureConfig *config, /* The config will have 1 additional property: "procedure". */ g_return_if_fail (n_pspecs == n_values + n_aux_args + 1); - for (i = 1; i < n_pspecs; i++) + for (i = 0; i < n_values; i++) { - GParamSpec *pspec = pspecs[i]; - GValue *value = gimp_value_array_index (values, i - 1); + GParamSpec *pspec = pspecs[i + 1]; + GValue *value = gimp_value_array_index (values, i); g_object_get_property (G_OBJECT (config), pspec->name, value); } diff --git a/libgimp/gimpthumbnailprocedure.c b/libgimp/gimpthumbnailprocedure.c index e606bef3f8..1c7d585cfa 100644 --- a/libgimp/gimpthumbnailprocedure.c +++ b/libgimp/gimpthumbnailprocedure.c @@ -164,7 +164,7 @@ gimp_thumbnail_procedure_run (GimpProcedure *procedure, gimp_value_array_append (remaining, value); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); _gimp_procedure_config_begin_run (config, NULL, GIMP_RUN_NONINTERACTIVE, remaining); gimp_value_array_unref (remaining); diff --git a/libgimp/gimpvectorloadprocedure.c b/libgimp/gimpvectorloadprocedure.c index c9ebdf0847..6b781ebe19 100644 --- a/libgimp/gimpvectorloadprocedure.c +++ b/libgimp/gimpvectorloadprocedure.c @@ -210,7 +210,7 @@ gimp_vector_load_procedure_run (GimpProcedure *procedure, gimp_value_array_append (remaining, value); } - config = gimp_procedure_create_config (procedure); + config = _gimp_procedure_create_run_config (procedure); mimetype = (gchar *) gimp_file_procedure_get_mime_types (GIMP_FILE_PROCEDURE (procedure)); if (mimetype != NULL)